Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Ing. Rosario Turco, Prof. Maria Colonnese liceo classico De Bottis (Torre del Greco) -
Aprile 2017
ABSTRACT
Indagheremo sui numeri Lychrel che hanno una particolare propriet. Per farlo
inizieremo prima dai numeri palindromi e mostreremo una tecnica Reverse and
Subtract the Lesser per riconoscere i numeri Lychrel.
NUMERI PALINDROMI
I numeri palindromi sono altri numeri con interessanti propriet.
DEFINIZIONE
Un numero palindromo un numero intero per cui se a0 a1 a2... ak la sua rappresentazione in cifre in una
certa base b 2 (con a0 0), allora n palindromo se e solo se per ogni intero 0ik si ha a i=ak-i
/*
Crivello dei Palindromi
*/
Palindromi(start=0,end=1000000)=local(i=0, cont=0);{
for(i=start,end,
if(CheckPalindromo(i)==1,
print(i);
cont++;
);
);
print(" Trovati ", cont);
}
CheckPalindromo(num) = local(cont=0,ret=0,i=1);{
if(num==0, return(1););
num=digits(num);
qcentro = #num%2; /* quantit cifre al centro */
pos_centro = #num - #num\2;
if( qcentro==0,
if( num[pos_centro] != num[pos_centro+1],
return(0););
);
if( (#num-qcentro)%2 != 0, return(0););
Tutti i numeri da 0 a 9 sono palindromi. Per cui fino a 10^1 ce ne sono 10. Indicando #Pa(x) il numero di
palindromi da 1 a x si ha:
#Pa(10)=10
#Pa(10^2)=19
#Pa(10^3)=109
10,19,109,199,1099,1999,10999,19999,109999,199999 ...
Quindi facilmente regolare. Sono infiniti. Ai palindromi appartengono anche i numeri Repunit. Di questi si
possono vedere quanti sono pari, quanti dispari, quanti primi, quanti quadrati perfetti etc. (Vedi [1]).
NUMERI DI LYCHREL
Il nome un anagramma di Cheril, nome della fidanzata del matematico Van Landingham, che ha indagato
a fondo su un problema legato ai numeri palindromi.
Se si prende un numero qualsiasi e gli si aggiunge un numero ottenuto dal precedente ma scritto al
rovescio e si reitera tale procedimento, noto come "Reverse and add", anche sul numero ottenuto, si
ottiene una sequenza (detta thread) che spesso arriva ad un numero palindromo, in uno o pi step.
Il numero di passi per giungere ad un palindromo va da pochi step a parecchi step magari con palindromi
con tantissime cifre; ad esempio:
I cosiddetti numeri di "Lychrel genuini" (detti seed) tuttora noti sono solo 196, 879 e 1997. L'inverso di un
Lychrel number ancora un Lychrel number. I numeri che rientrano nel thread generati dai Lychrel seed
sono detti "Lychrel non genuini" (detti tecnicamente Lychrel kid).
Sono infiniti i Lychrel genuini? oppure sono infiniti i Lychrel non genuini?
In realt ci sono molti Lychrel candidati (Vedi [2]). Sono candidati perch non si dimostrato ancora se
terminano o no in un palindromo e a quanti step, sicuramente maggiore di 1000. Si sono fatti solo tentativi
euristici e statistici, ma nessuna dimostrazione teorica.
Come si riconoscono i Lychrel Number senza attendere il loop infinito? Basta che vadano scartati i numeri
non multipli di 11? Vedremo che ci non basta.
I ricercatori e i recordmen finora hanno usato un setaccio su tutti i numeri interi e scrivere su file i
numeri che terminano in un palindromo registrandone: il numero di partenza, il palindromo di arrivo, il
numero di step e il numero di digit (cifre) del palindromo. Se il numero di step maggiore di 1000 (il
record attuale 261) allora si arresta il procedimento "Reverse and add", senza registrare nulla su file.
Alcune propriet
Se indichiamo con x il numero, r(x) il reverse di x e con s(x) = x + r(x) allora valgono alcune semplici
propriet:
a) Se x congruo 0 mod 11 (multiplo di 11) allora anche r(x) e s(x) e le successive iterazioni si(x) saranno
multipli di 11. Non vero il contrario. Ad esempio 196 non multiplo di 11 e d degli si(x) multipli di 11
senza arrivare ad un palindromo.
Inoltre non detto che se x multiplo di 11 si arrivi ad un palindromo; ad esempio se provate 1378899379
divisibile per 11 ma non arriva ad un palindromo e quindi deve essere per forza un Lychrel candidato.
Queste propriet non sono sufficienti ad individuare un Lychrel number o a garantire che si arrivi ad un
palindromo.
Ad esempio 1495 non multiplo di 11 ed un Lychrel kid che soddisfa la b) ma non riesce ad arrivare ad
un palindromo. La b) non garantisce la a).
Una conseguenza della a) che se si arriva ad un palindromo esso anche multiplo di 11.
Un numero x non multiplo di 11 pu tra l'altro dar luogo a s(x) non multiplo di 11 ma che palindromo. Ad
esempio 135 non multiplo di 11, d luogo a 666 che palindromo ma non multiplo di 11.
CONSEGUENZE DI ORDINE
Trovato un Lychrel candidato, giocando sulle sue cifre si possono scartare altri Lychrel. Il nostro algoritmo
non si basa su questo ma vuole solo determinare in modo sicuro ed euristico i Lychrel di un intervallo
numerico.
Spiegheremo per cosa sono le Conseguenze di ordine. Prendiamo ad esempio 196. Ha una sola cifra a
sinistra rispetto al centro (il 9). Se giochiamo sulla prima l'ultima cifra stiamo ricavando Lychrel come
conseguenza di primo ordine. In questo caso lo scarto corretto se nella somma 7 (1+6=7) viene
mantenuto 7.
Vanno, quindi, scartati 295, 394, 493, 592, 691. Quindi una conseguenza di primo ordine mi ha consentito
di scartare almeno 5 numeri.
Se il numero di cifre rispetto al centro maggiore di uno sono possibili scarti di ordine superiore a uno,
una per ogni cifra a sinistra del centro.
Il discorso valido anche per i numeri NON Lychrel, perch si arriva ad uno stesso palindromo o comunque
in un palindromo.
Ad esempio 140669390 ha 6 come centro e 4 ordini da considerare permette una sola conseguenza di
ordine 1 (somma 1), 5 conseguenze di ordine 2 (somma 13), 3 conseguenze di ordine 3 (somma 3), 3
conseguenze di ordine 4.(somma 13)
IL NOSTRO METODO: INDIVIDUAZIONE DEI LYCHREL CON "REVERSE AND SUBTRACT THE LESSER"
Se prendete un numero candidato Lychrel e applicate un processo "Reverse and Subtract the Lesser", cio
lo rovesciate e dal maggiore sottraete l'altro, cos si arriva in vari step ad un palindromo. I Lychrel ci
arrivano pi rapidamente dei numeri normali. Questo fa venire in mente un metodo ancora euristico ma
veloce, almeno per individuare i numeri Lychrel candidati.
Esempio
Con 196
691 - 196 = 495
594 - 495 = 99 due step
Con 1997
7991 - 1997 = 5994
5994 - 4995 = 999 due step
Sempre con cifre 9 il palindromo. Forse abbiamo trovato una soluzione al problema del riconoscimento
dei Lychrel ?
L'idea potrebbe essere che se un numero Lychrel va verso un palindromo solo col secondo processo ma non
col primo processo, ad esempio con almeno 50 step ( o con un numero di step che dipende dal numero di
cifre), allora si trovata una caratteristica utile per individuarli. In una ricerca brutale su tutti i numeri
potrebbero esistere anche numeri normali che col secondo processo non vanno ad un palindromo e che si
devono scartare.
Se provate 295 esso arriva al palindromo 99 col secondo processo ma va in loop col primo! Quindi un
Lychrel! Esistono Lychrel che violano tale fatto? Va fatta qualche prova, alla ricerca di un controesempio.
Quello di sopra ci porta ad un algoritmo con test di arresto isLychrel(). E' un metodo euristico che
individua Lychrel candidati, ma lo fa velocemente perch un Lychrel col secondo processo arriva in pochi
step al palindromo mentre col primo processo si fanno solo 50 tentativi (poi i tentativi li tareremo sul
numero di cifre).
Per evitare che i numeri normali vadano in loop nel secondo processo (caso c), e non sono loro a
interessarci, li stoppiamo dopo 50 tentativi. Anche il caso a), quando i numeri normali vanno ad un
palindromo con entrambi i due processi, scartato.
Finch a[i]+a[N-i+1]<=9 allora il raggiungimento del palindromo avviene in pochi step, Quando la
condizione diventa a[i]+a[N-i+1]>9 allora aumentano gli step.
Il processo "Reverse and subtract the Lesser" evidenzia, invece, la distanza da un palindromo contenente
tutti 9.
SearchLychrel(start=0,end=1000000)=local(i=0, cont=0);{
for(i=start,end,
if( isLychrel(i)==1,
print(i);
);
);
}
isLychrel(num)=local(reverse=0,cont=0, num2=0,ret=0);{
num2=num;
while(CheckPalindromo(num)!=1,
reverse=ReverseNum(num);
num = max(num,reverse) - min(num,reverse) ;
cont++;
if(cont>contCheck, return(0););
);
cont=0;
ret=1;
num=num2;
while(CheckPalindromo(num)!=1 &&
cont<50 p=""> num = num + ReverseNum(num);
cont++;
);
if( ret==1 && cont>=50,
return(1);
);
return(0);
}
Otteniamo la seguente lista:
(10:11) gp > SearchLychrel(1,1050)
196, 295, 394, 493, 592, 689, 691, 788, 790, 879, 887, 978, 986, 1495
Qui abbiamo eliminato il massimo numero di step e lo tariamo sul numero di cifre.
SearchNotLychrel(start=0,end=1000000)=local(i=0);{
for(i=start,end,
if(isLychrel(i)!=1,
print(i);
);
);
}
SearchLychrel(start=0,end=1000000)=local(i=0);{
for(i=start,end,
if(isLychrel(i)==1,
print(i);
);
);
}
CheckPalindromo(num) = local(cont=0,ret=0,i=1);{
if(num==0, return(1););
num=digits(num);
qcentro = #num%2; /* quantit cifre al centro */
pos_centro = #num - #num\2;
if( qcentro==0,
if( num[pos_centro] != num[pos_centro+1],
return(0););
);
if( (#num-qcentro)%2 != 0, return(0););
ReverseNum(num)=local(appo=0,s=0);{
numero=digits(num);
pos_centro = #numero - #numero\2;
for(i=1,pos_centro,
appo=numero[i];
numero[i]=numero[#numero-i+1];
numero[#numero-i+1]=appo;
appo=0;
);
s=sum(i=1,#numero,numero[#numero-i+1]*10^(i-1));
return(s);
}
/*
"Reverse and subtract the lesser" process
to find Lychrel numbers - Rosario Turco
9/5/2016
*/
isLychrel(num)=local(reverse=0,cont=0, num2=0,ret=0);{
num2=num;
appo=digits(num);
maxStep=10*#appo + 10;
while(CheckPalindromo(num)!=1,
reverse=ReverseNum(num);
num = max(num,reverse) - min(num,reverse) ;
cont++;
if(cont>maxStep, return(0););
);
cont=0;
ret=1;
num=num2;
while(CheckPalindromo(num)!=1 &&
cont<50 p=""> num = num + ReverseNum(num);
cont++;
);
if( ret==1 && cont>=50,
return(1);
);
return(0);
}
NotLychrel(num)=local(cont=0);{
while(CheckPalindromo(num)!=1 &&
isLychrel(num)==0,
num = num + ReverseNum(num);
print(num);
cont++;
if(num%11==0, print(" multiplo di 11"););
if(num%11!=0, print(" NON multiplo di 11"););
);
if( cont < 1001,
numdigit = digits(num);
print("\nPalindromo : ", num);
if(num%11==0, print(" multiplo di 11"););
if(num%11!=0, print(" NON multiplo di 11"););
print("n. step : ", cont);
print("digits : ", #numdigit);
);
}
Riferimenti
[1] https://it.wikipedia.org/wiki/Numero_palindromo
[2] https://en.wikipedia.org/wiki/Lychrel_number