Sei sulla pagina 1di 7

Lenigma dei numeri Lychrel un nuovo metodo

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

ALGORITMO VERIFICA PALINDROMO


Questa definizione ci permette un semplice algoritmo in PARI GP come segue.

/*
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););

while( num[i] == num[#num-i+1] && i < pos_centro,


i++;
);
if( i == pos_centro, ret=1;);
return(ret);
}

PROPRIETA' PER POTENZE DI 10

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

Tutti i numeri a due cifre da 11 a 99 hanno 9 palindromi, per cui:

#Pa(10^2)=19

Tutti i numeri a 3 cifre da 101 a 999 hanno 90 palindromi, per cui

#Pa(10^3)=109

La sequenza dei numeri palindromi per potenze di 10 a partire da 10^1 a 10^10 :

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.

SEQUENZA CHE TERMINA IN UN NUMERO PALINDROMO (Reverse and add)

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.

Facciamo un esempio. Prendiamo il numero 4893:

1) 4893 + 3984 = 8877

2) 8877 + 7788 = 16665

3) 16665 + 56661 = 73326

4) 73326 + 62337 = 135663

5) 135663 + 366531 = 502194

6) 502194 + 491205 = 993399

Occorrono 6 passi o step come si vede sopra.

Il numero di passi per giungere ad un palindromo va da pochi step a parecchi step magari con palindromi
con tantissime cifre; ad esempio:

- 56 arriva ad un palindromo in uno step

- 89 in 24 step. Per i numeri sotto 10 mila, 89 un record.

-10991 arriva ad un palindromo in 55 step

-1186060307891929990 ha 261 step ed il corrente record mondiale


Esistono per dei numeri, detti appunto di Lychrel, che non daranno mai tale risultato a meno che non vi
arrivano a numeri molto enormi. Quindi possono provocare dei loop infiniti in un algoritmo se non si pone
un test di arresto. Nessuno riuscito finora a dimostrare se essi terminano in un palindromo o meno, n
quali sono le caratteristiche per riconoscere un Lychrel Number.

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?

Abbiamo due problemi in gioco:


a) riuscire ad individuare i Lychrel Numbers candidati
b) individuato a) si ha finalmente un test di arresto per scartare i Lychrel nel processo "Reverse and add".

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.

b) Se x ha un numero pari di cifre allora s(x) un multiplo di 11

c) un numero palindromo con un numero pari di cifre multiplo di 11

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 Repunit con numero pari di 1 soddisfa la c).

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.

La conclusione quindi che la regola del multiplo di 11 da sola non sufficiente.

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)

Quindi abbiamo 1* 5 * 3 * 3 = 45 numeri che sfociano nei palindromi.

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 879 uno 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 ?

Abbiamo varie conseguenze:


1) Anche i numeri normali possono arrivare ad un palindromo con tale processo
2) Non tutti i numeri normali arrivano ad un palindromo ma possono andare in loop lo stesso. Uno di
essi 1186060307891929990 che cicla tra 219999978 e 659999934
3) I Lychrel se arrivano ad un palindromo lo fanno in vari step da 1 a pi, ma gli step non sono cos
numerosi

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.

I numeri normali hanno tre comportamenti possibili:


a) vanno verso un palindromo con entrambi i processi (non ci interessa)
b) vanno verso un palindromo solo col primo processo di "Reverse and add"
c) vanno in loop col secondo processo "Reverse and subtract the Lesser"

I numeri Lychrel hanno i seguenti comportamenti possibili:


d) vanno solo col secondo processo "Reverse and Subtract the Lesser" verso un palindromo
e) vanno in loop col primo processo "Reverse and add"

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.

MOTIVO DEGLI STEP


Se scriviamo s(x) = x + r(x) = sum(i=1,N,a[i]+a[N-i+1]) si comprende il motivo dei vari step nel processo
"Reverse and add" per la formazione del palindromo.

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.

PARTE DI ALGORITMO: ISLYCHREL()


Per ragionare inizialmente facciamo uso di un numero massimo di step, poi dopo leveremo questo vincolo.

contCheck=100; /* Dopo proveremo a valutarlo sul numero di cifre e lo elimineremo */

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

A COSA POSSONO SERVIRE I LYCHREL NUMBERS? PER LA CRITTOGRAFIA!


Ad esempio per trasmettere messaggi (Whatsapp, sms, email) su telefonini mobili, quindi con poca RAM, si
pu pensare di rendere pi robusta la sicurezza.

Si possono utilizzare le seguenti cose:


- un Time-based One Time Password (Tb-OTP) generato alla creazione della username
- un RGB color (tripletta di valori a 16 o 32 bit) per rendere ancora pi robusta la username
- nel criptaggio ad ogni messaggio in versione ASCII si aggiunge ad esso un numero Lychrel per
quadrandolo. Ad esempio usando il 196 (Lychrel seed) si pu formare
9 6 1 81 36 1 6561 1296 1 9 6.
I Lychrel sono un numero notevole (forse infiniti) e trovare la chiave giusta diventa molto difficoltoso.
- nella decriptazione occorre usare il numero reverse del Lychrel
- il ricevente deve per conoscere del mittente Tb-OTP e RGB color

COMPLETE ALGORITHM FOR LYCHREL

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););

while( num[i] == num[#num-i+1] && i < pos_centro,


i++;
);
if( i == pos_centro, ret=1;);
return(ret);
}

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