Numeri palindromi e altre noiosità

Numeri palindromi e altri giochi matematici con le cifre di un numero mi hanno sempre attratto poco. Sarà per un problema di purezza del gioco, perché si gioca con proprietà che dipendono non solo dal numero stesso, ma anche dalla base numerica in cui sono espressi. O più semplicemente perché la mia mente non è mai stata abbastanza agile per pensare in basi diverse da 10, 2 e 16. Ho subìto invece il fascino dei criteri di divisibilità, che hanno almeno un fine pratico.
Numeri palindromi & co, però, anche se mi attraggono poco, non possono mancare in una rubrica di curiosità numeriche. Vediamone alcuni esempi.


Qui la lista degli articoli con esempi di programmazione Ruby.


Numeri palindromi

Come sono fatti i numeri palindromi? Analogamente alle parole (es: Annao alle frasi palindrome (es: Assalire torte e trote rilassa), un numero palindromo rimane invariato quando viene letto all’incontrario, da destra a sinistra. Esempio: 121.
La proprietà di essere palindromo dipende anche dalla base numerica in cui si esprime il numero. In base 2, infatti, il nostro 12110 diventa 11110012 e non è più palindromo.

Si tratta di una proprietà rara? No, per quanto sia sorprendente a prima vista, per ogni numero esiste sempre almeno una base numerica in cui ha una forma palindroma.
Il perché è semplice: se scelgo come base numerica N-1, allora N = 11N-1. Esempio: 13  =  12 + 1  =  1112.
Nel seguito non si considererà palindromo, anche se a rigore di definizione lo sarebbe, un numero espresso solo da una cifra.

Domanda: esistono numeri particolarmente ricchi di forme palindrome?

Qui serve un po’ di programmazione. Il linguaggio Ruby si presta particolarmente bene all’analisi dei numeri palindromi (in questo articolo, si trovano indicazioni sul come costruirsi un ambiente di programmazione Ruby).
Ecco come utilizzare i metodi offerti da Ruby per manipolare con grande semplicità un numero:

numero.to_s(b) converte infatti il numero nella stringa con la sua espressione in base b
.split ”
 trasforma invece la stringa in un vettore di singoli caratteri

.reverse inverte il vettore dall’ultimo elemento al primo
.join, infine, rimette insieme il vettore in una stringa

Fatta questa premessa, è abbastanza semplice scrivere un programma che esplori un intervallo di numeri (esempio da 11 a 1.000), per un certo numero di basi (da 2 a 36, il massimo consentito se per le cifre si utilizzano i simboli 0 … 9a … z).


Il codice
# numeri palindromi in più basi
# by p.p. 8giu18
#
maxnum, maxbase = 1000, 36
minnum, minbase = 11, 2
maxnp, maxn = 0, 0
conta = Array.new(maxbase,0)
(minnum .. maxnum).each do |n|
	np = 0
	(minbase .. maxbase).each do |b|
		nb = n.to_s(b).split ''
		next if nb != nb.reverse or nb.length == 1
		if np == 0 then print n, " palindromo in base:\n" end
		np += 1
		print  b, " ---> ", nb.join, "\n"
	end
	conta[np] +=1
	next if np == 0
	if np > 1 then print "numero di palindromi = ", np, "\n" end
	print "\n"
	if np > maxnp then maxnp = np; maxn = n end
end
print "\nmassimo numero di palindromi = ",maxnp," per n = ", maxn, "\n"
print "conta dei numeri di palindromi:\n", conta

Programma e stampa dei risultati possono essere scaricati da qui.

Bene, negli intervalli detti, il campione è il numero 300:

300 palindromo in base:
7 —> 606
8 —> 454
9 —> 363
13 —> 1a1
19 —> ff
24 —> cc
29 —> aa

Una vista di sintesi di come si presentano i numeri palindromi negli intervalli detti, si trova in fondo al file-risultato:

massimo numero di palindromi = 7 per n = 300
conta dei numeri di palindromi:
[133, 299, 273, 187, 64, 32, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Quindi 133 numeri non hanno rappresentazioni palindrome nelle basi da 2 a 36, 299 ne hanno una sola, 273 ne hanno due, e così via fino a un solo numero con sette rappresentazioni palindrome.

Allargando l’intervallo dei numeri esplorati fino a 1.000.000, troviamo un altro numero esprimibile come palindromo in 7 basi:

1477 palindromo in base:
6 —> 10501
13 —> 898
14 —> 777
16 —> 5c5
22 —> 313
25 —> 292
36 —> 151
numero di palindromi = 7

mentre la stragrande maggioranza dei numeri non ha rappresentazione palindroma nell’intervallo di basi considerate (da 2 a 36):

massimo numero di palindromi = 7 per n = 300
conta dei numeri di palindromi:
[923753, 69217, 5673, 1076, 202, 63, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Dai numeri palindromi ai numeri di Lychrel e il 196

Dipaniamo il mistero: il 196 non è un tram ma un numero, Lychrel deriva da Cheryl, nome della ragazza di Wade Van Landingham, che a questi numeri ha dedicato il sito p196.org. Lei si è sentita lusingata e gli ha detto sì:

She was so happy to have Lychrel Numbers named after her, she said yes. 🙂

Il problema è semplice. Partendo dal numero N:

si rovesciano le cifre di N e il numero ottenuto si somma a N
se il risultato non è palindromo, si ripete l’operazione precedente

Per molti numeri il processo si ferma in effetti rapidamente:

15 –> + 51 = 66
142 –> + 241 = 383
768 –> + 867 = 1.635 –> + 5361 = 6.996
6976 –> + 6796 = 13772 –> + 27731 = 41503 –> + 30514 = 72017 –> + 71027 = 143044 –> + 440341 = 583385

Per alcuni numeri, invece, il processo prosegue con valori generati via via crescenti, senza incappare in un palindromo. Il più piccolo numero con questa caratteristica è 196. Wikipedia attribuisce il miglior risultato ad oggiRomain Dolbeau, che sul suo sito riporta di aver raggiunto, nel febbraio del 2015, un numero con un miliardo di cifre e di palindromi nemmeno l’ombra.

Se qualcuno dovesse dimostrare, quindi, che da 196 (o da uno dei suoi simili: 295, 394, 493, 592, 689, 691, 788, 790, 879, …) non si arriva mai a un palindromo, avremmo trovato finalmente dei numeri di Lychrel in base 10.

Se dalla base decimale si passa alla base 2, invece, il numero 101102 (cioè 2210) è stato dimostrato che non porta a nessun palindromo e, quindi, è un numero di Lychrel.

Vista la complessità e la profondità delle analisi  svolte, mi sono tenuto alla larga da qualunque tentazione di giocare con il 196.

Creatività con le cifre

Altro tema classico tra le curiosità matematiche è quello di esprimere numeri utilizzando tutte le cifre decimali, oppure quelle da 1 a 9, una sola volta.
Mi sono fatto prendere anch’io da qualcosa del genere in attesa del capodanno di alcuni anni fa, con un conteggio alla rovescia:  987 + (6 – 5)*(-4+3) + 210 = 2010 !

Un altro problema che gioca con le cifre decimali venne proposto sul newsgroup rec.puzzles:

Is it possible to make a number and its square, using the digits from 1 trhough 9 exactly once?

Si tratta di trovare un numero che, insieme al suo quadrato, utilizzi le cifre da 1 a 9, ciascuna una volta sola.


Il codice
# Is it possible to make a number and its square, using the digits 
# from 1 trhough 9 exactly once?
# by p.p. 5 giugno 2018
#
n_min = (99999 ** 0.5).to_i + 1
n_max = 999
print "esploro da ", n_min, " a ", n_max, "\n"
(n_min .. n_max).each do |n|
	cifre = n.to_s.split('') + (n**2).to_s.split('')
	next if cifre.include? '0'
	next if cifre.length > cifre.uniq.length
	print "n = ", n, ", n^2 = ", n**2, "\n"
end

La logica è semplice:

  • si determinano gli estremi dell’intervallo numerico in cui cercare (3172 = 100.489 è il minimo per mettere insieme 9 cifre tra il numero e il suo quadrato, mentre 10002 = 1.000.000 è sicuramente troppo);
  • per ciascun numero nell’intervallo si costruisce l’array con le cifre utilizzate dal numero e dal suo quadrato: cifre = n.to_s.split(”) + (n**2).to_s.split(”)
  • infine, si salta il numero se contiene lo 0 (next if cifre.include? ‘0’) oppure se ci sono cifre duplicate (next if cifre.length > cifre.uniq.length).

Risultato del programma:

esploro da 317 a 999
n = 567, n^2 = 321489
n = 854, n^2 = 729316

Variazione sul tema

Una volta messa a punto la logica del programma, viene voglia di utilizzare il codice, con piccole modifiche, per esplorare altri problemi.

Partendo, ad esempio, dal fatto che:

12345 × 8 = 98760

in cui un numero e il suo multiplo 8x utilizzano tutte e dieci le cifre decimali (oltretutto in modo ordinato), ci si può chiedere in quanti modi si possa moltiplicare due numeri tra loro, utilizzando per i numeri stessi e il loro prodotto le cifre da 0 a 9, una volta sola.

I risultati

(1) n = 5694, 3n = 17082
(2) n = 6819, 3n = 20457
(3) n = 6918, 3n = 20754
(4) n = 8169, 3n = 24507
(5) n = 9168, 3n = 27504
(6) n = 3907, 4n = 15628
(7) n = 7039, 4n = 28156
(8) n = 9127, 4n = 36508
(9) n = 5817, 6n = 34902
(10) n = 3094, 7n = 21658
(11) n = 4093, 7n = 28651
(12) n = 9304, 7n = 65128
(13) n = 9403, 7n = 65821

(14) n = 594, 27n = 16038
(15) n = 495, 36n = 17820
(16) n = 402, 39n = 15678
(17) n = 396, 45n = 17820
(18) n = 715, 46n = 32890
(19) n = 367, 52n = 19084
(20) n = 297, 54n = 16038
(21) n = 927, 63n = 58401
(22) n = 345, 78n = 26910

Da notare:

  • (14) n = 594, 27n = 16038, (20) n = 297, 54n = 16038
  • (15) n = 495, 36n = 17820, (17) n = 396, 45n = 17820

I due programma Ruby sono reperibili nello stesso pacchetto compresso indicato in precedenza.


In fondo ci si può divertire anche con problemi a prima vista antipatici. Basta solo porsi un obiettivo divertente per allietare il viaggio verso la soluzione.
Ad esempio imparare a programmare in Ruby!

Scritto da:

Pasquale

Mi chiamo Pasquale Petrosino, radici campane, da alcuni anni sulle rive del lago di Lecco, dopo aver lungamente vissuto a Ivrea.
Ho attraversato 40 anni di tecnologia informatica, da quando progettavo hardware maneggiando i primi microprocessori, la memoria si misurava in kByte, e Ethernet era una novità fresca fresca, fino alla comparsa ed esplosione di Internet.
Tre passioni: la Tecnologia, la Matematica per diletto e le mie tre donne: la piccola Luna, Orsella e Valentina.
Potete contattarmi scrivendo a: p.petrosino@inchiostrovirtuale.it