un metodo per il calcolo veloce dei numeri di fibonacci e di lucas
un metodo per il calcolo veloce dei numeri di fibonacci e di lucas
un metodo per il calcolo veloce dei numeri di fibonacci e di lucas
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Cristiano Teodoro<br />
(Ministero delle Com<strong>un</strong>icazioni – I.S.C.T.I.)<br />
UN METODO PER IL CALCOLO VELOCE DEI NUMERI<br />
DI FIBONACCI E DI LUCAS<br />
(A METHOD FOR FAST COMPUTATION OF FIBONACCI AND LUCAS NUMBERS)<br />
Sommario: viene descritto <strong>un</strong> algoritmo<br />
<strong>per</strong> <strong>il</strong> <strong>calcolo</strong> <strong>veloce</strong> del valore <strong>numeri</strong>co <strong>dei</strong><br />
<strong>numeri</strong> <strong>di</strong> Fibonacci e <strong>di</strong> Lucas alternativo<br />
all'algoritmo classico ma elementare, <strong>di</strong> esecuzione<br />
lenta <strong>per</strong> <strong>il</strong> <strong>calcolo</strong> <strong>di</strong> questi <strong>numeri</strong><br />
se <strong>di</strong> in<strong>di</strong>ce elevato. Tali <strong>numeri</strong> trovano riscontri<br />
ed applicazioni in vari campi della<br />
scienza e della tecnica, in particolare nel campo<br />
della moderna crittografia applicata alle<br />
telecom<strong>un</strong>icazioni.<br />
Abstract: this pa<strong>per</strong> presents a fast<br />
algorithm for esact computation of Fibonacci<br />
and Lucas numbers, in alternative of classic<br />
trivial algorithm especially slower for high<br />
numbers .<br />
Such numbers have <strong>di</strong>fferent references and<br />
applications in several scientific and technical<br />
fields, specifically in the modern cryptography<br />
applied to comm<strong>un</strong>ications.<br />
Questo breve articolo descrive <strong>un</strong> algoritmo <strong>per</strong><br />
<strong>il</strong> <strong>calcolo</strong> <strong>veloce</strong> del valore <strong>numeri</strong>co <strong>dei</strong> <strong>numeri</strong> <strong>di</strong><br />
Fibonacci e <strong>di</strong> Lucas.<br />
Un argomento della teoria <strong>dei</strong> <strong>numeri</strong> che ha<br />
trovato molte applicazioni [1] nei più <strong>di</strong>sparati campi<br />
della scienza e della tecnica, dalla matematica alla<br />
fisica, dalla chimica alla biologia, dalla ricerca o<strong>per</strong>ativa<br />
all’astronomia, ma soprattutto nella moderna<br />
crittografia, è quello riguardante le cosiddette Sequenze<br />
<strong>di</strong> Lucas che sono in generale delle successioni<br />
ricorrenti <strong>di</strong> <strong>numeri</strong> interi chiamati termini in<br />
cui ogni termine è definito come <strong>un</strong>a certa f<strong>un</strong>zione<br />
<strong>di</strong> quelli precedenti<br />
Diverse applicazioni <strong>di</strong> tali sequenze e <strong>dei</strong><br />
suddetti <strong>numeri</strong> si riscontrano nel campo delle telecom<strong>un</strong>icazioni,<br />
quali ad esempio <strong>il</strong> <strong>calcolo</strong> della capacità<br />
<strong>di</strong> informazione <strong>di</strong> <strong>un</strong>a sorgente <strong>di</strong>screta , l’analisi<br />
spettrale <strong>di</strong> segnali elettrici.<br />
Ma è soprattutto molto interessante <strong>il</strong> loro<br />
ut<strong>il</strong>izzo nel campo della moderna crittografia (ve<strong>di</strong><br />
[1], [2], [3], [4], [5], [6], [7], oltre a <strong>di</strong>versi altri Siti<br />
Internet).<br />
Questo breve articolo prendendo in considerazione<br />
due particolari sequenze descrive <strong>un</strong> algoritmo<br />
<strong>per</strong> <strong>il</strong> <strong>calcolo</strong> <strong>veloce</strong> del valore <strong>numeri</strong>co <strong>dei</strong> <strong>numeri</strong><br />
<strong>di</strong> Fibonacci e <strong>di</strong> Lucas.<br />
Prima <strong>di</strong> <strong>il</strong>lustrare l’algoritmo sarà opport<strong>un</strong>o<br />
<strong>per</strong> chi è <strong>di</strong>gi<strong>un</strong>o <strong>di</strong> questo argomento specifico<br />
<strong>di</strong>re in breve qualcosa su questi <strong>numeri</strong>.<br />
Pren<strong>di</strong>amo in esame due particolari sequenze<br />
o successioni ricorrenti <strong>di</strong> <strong>numeri</strong>, <strong>di</strong> cui si danno<br />
i primi 13 termini partendo dal primo termine :<br />
1 a successione:<br />
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,144, ……….<br />
2 a successione:<br />
2, 1, 3, 4, 7, 11, 18, 29, 47, 76, 123, 199, ……….<br />
Come si costruiscono i termini della successione<br />
seguenti a quelli mostrati?<br />
Definiamo innanzi tutto <strong>il</strong> termine generico<br />
della 1 a successione come U(k) dove k prende <strong>il</strong><br />
nome <strong>di</strong> in<strong>di</strong>ce.<br />
Detta successione può essere genericamente<br />
in<strong>di</strong>cata così:<br />
U(0),U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),<br />
U(9),U(10),U(11),U(12),.…………U(k), ………….<br />
E’ fac<strong>il</strong>e vedere, tenendo conto <strong>dei</strong> valori<br />
<strong>numeri</strong>ci mostrati, che U(k), ad esclusione <strong>dei</strong> primi<br />
due termini, è legato ai termini precedenti dalla seguente<br />
relazione:<br />
U(k) = U(k-1) + U(k-2)<br />
<strong>per</strong> cui, ad esempio, <strong>il</strong> termine U(13) seguente<br />
NOTE<br />
La Com<strong>un</strong>icazione - numero <strong>un</strong>ico 2001<br />
35
Cristiano Teodoro<br />
NOTE<br />
a U(12) =144 è <strong>il</strong> numero 233.<br />
Tale successione viene denominata sequenza<br />
<strong>di</strong> Fibonacci.<br />
Analogamente definiamo <strong>il</strong> termine generico<br />
della 2 a successione associata (companion sequence)<br />
alla sequenza <strong>di</strong> Fibonacci come V(k).<br />
Questa successione può essere in<strong>di</strong>cata come<br />
segue:<br />
V(0), V(1), V(2), V(3), V(4), V(5), V(6), V(7), V(8),<br />
V(9), V(10), V(11),…......…V(k)., ……............<br />
Anche <strong>per</strong> detta successione si vede che<br />
V(k) = V(k-1) + V(k-2) <strong>per</strong> cui allora <strong>il</strong> termine<br />
V(12) seguente a V(11) =199 è <strong>il</strong> numero 322.<br />
In effetti, se si osservano i valori <strong>numeri</strong>ci<br />
sopraelencati ci si accorge che ciasc<strong>un</strong> valore è dato<br />
dalla somma <strong>dei</strong> due valori imme<strong>di</strong>atamente ad esso<br />
precedenti.<br />
I generici termini U(k) e V(k) sono chiamati<br />
rispettivamente <strong>numeri</strong> <strong>di</strong> Fibonacci e <strong>numeri</strong> <strong>di</strong><br />
Lucas.<br />
Tra le <strong>di</strong>verse Sequenze <strong>di</strong> Lucas, vogliamo<br />
qui citare <strong>un</strong>a successione <strong>numeri</strong>ca ricorrente molto<br />
importante nella ricerca <strong>di</strong> <strong>numeri</strong> primi molto gran<strong>di</strong><br />
della forma 2 p -1, con p primo, chiamati <strong>numeri</strong> <strong>di</strong><br />
Mersenne e in<strong>di</strong>cati con <strong>il</strong> simbolo M p . Essa è la<br />
seguente: S(k) = S(k-1) 2 – 2 <strong>di</strong> cui <strong>il</strong> termine iniziale<br />
è 4.<br />
I primi cinque 5 termini <strong>di</strong> questa successione<br />
saranno <strong>per</strong>tanto 4, 14, 194, 37634, 1416317954.<br />
Con l’ut<strong>il</strong>izzo appropriato <strong>di</strong> tale successione,<br />
(i cui termini , se su<strong>per</strong>ano <strong>il</strong> valore <strong>numeri</strong>co M p<br />
preso in considerazione, sono calcolati “modulo M p ”<br />
e cioè quali resti della <strong>di</strong>visione <strong>di</strong> S(k) <strong>per</strong> M p ), sono<br />
stati sco<strong>per</strong>ti tutti i <strong>numeri</strong> primi più gran<strong>di</strong> calcolati<br />
sinora (primi <strong>di</strong> Mersenne) costituiti ad<strong>di</strong>rittura da<br />
m<strong>il</strong>ioni <strong>di</strong> cifre [8] .<br />
Ma torniamo ai <strong>numeri</strong> <strong>di</strong> Fibonacci e <strong>di</strong> Lucas<br />
argomento <strong>di</strong> questo breve articolo <strong>il</strong> cui scopo è<br />
solo quello <strong>di</strong> <strong>il</strong>lustrare <strong>un</strong> <strong>metodo</strong> alternativo e molto<br />
più efficiente rispetto a quello classico che ut<strong>il</strong>izza<br />
semplicemente la formule ricorrenti:<br />
U(k)=U(k-1) + U(k-2) con U(0) = 0 e U(1) =1 ;<br />
V(k) = V(k-1) + V(k-2) con V(0) =2 e V(1) =1<br />
<strong>per</strong> <strong>il</strong> <strong>calcolo</strong> rispettivamente del valore <strong>numeri</strong>co<br />
<strong>di</strong> U(k) e <strong>di</strong> V(k).<br />
L’efficienza del <strong>metodo</strong> viene messa in evidenza<br />
soprattutto quando si vanno a calcolare valori<br />
<strong>dei</strong> <strong>numeri</strong> <strong>di</strong> Fibonacci o <strong>di</strong> Lucas <strong>di</strong> in<strong>di</strong>ce grande.<br />
Naturalmente <strong>per</strong> detti <strong>numeri</strong>, a partire da<br />
valori <strong>numeri</strong>ci costituiti da più <strong>di</strong> 15 cifre, sarà necessario<br />
sv<strong>il</strong>uppare con <strong>un</strong> adeguato linguaggio programmi<br />
dotati <strong>di</strong> istruzioni <strong>per</strong> <strong>un</strong>a aritmetica a precisione<br />
multipla, cioè con <strong>un</strong>a precisione <strong>di</strong> <strong>calcolo</strong> molto<br />
su<strong>per</strong>iore a quella massima (doppia precisione) <strong>di</strong>sponib<strong>il</strong>e<br />
normalmente su <strong>un</strong> PC .<br />
L’algoritmo proposto si presta bene ad essere<br />
programmato e ut<strong>il</strong>izzato in aritmetica a precisione<br />
multipla.<br />
In questo articolo ci si limiterà <strong>per</strong>tanto ad<br />
<strong>il</strong>lustrare <strong>per</strong> ora le formule e le relazioni esistenti<br />
tra i <strong>numeri</strong> <strong>di</strong> Fibonacci e <strong>di</strong> Lucas <strong>di</strong> <strong>di</strong>verso in<strong>di</strong>ce<br />
che risultano le più adeguate allo scopo, cioè al <strong>calcolo</strong><br />
del valore <strong>numeri</strong>co <strong>di</strong> U(z) e <strong>di</strong> V(z) dove z è<br />
<strong>un</strong> in<strong>di</strong>ce anche <strong>di</strong> valore elevato, ( ad esempio z<br />
=1000 oppure z =10000 o z =250.000), rimandando<br />
ad altra occasione <strong>il</strong> programma completo, costituito<br />
da istruzioni espresse nel linguaggio QBASIC con<br />
cui si realizza <strong>il</strong> <strong>calcolo</strong> del valore esatto <strong>dei</strong> <strong>numeri</strong><br />
U(z) e V(z).<br />
Si fa presente che <strong>per</strong> valori dell’in<strong>di</strong>ce z grande<br />
i valori <strong>numeri</strong>ci <strong>di</strong> U(z) e V(z) possono esser<br />
composti da moltissime cifre ( se ad esempio U(100)<br />
è composto “solo” da 21 cifre, mentre U(100.000) è<br />
costituito da ben 20.899 cifre.<br />
Le formule e relazioni che si ut<strong>il</strong>izzano, ricavate<br />
da quelle riportate in [9] sono le seguenti:<br />
- <strong>per</strong> <strong>un</strong> in<strong>di</strong>ce z pari, posto z = 2·x<br />
U(z) = U(2·x) = U(x) · V(x)<br />
V(z) = V(2·x) = V(x) 2 – 2· (-1) x<br />
- <strong>per</strong> <strong>un</strong> in<strong>di</strong>ce z <strong>di</strong>spari, posto z = 2·x + 1 e tenendo<br />
conto delle seguente relazioni [9] :<br />
2 · U(k+h) = U(k) · V(h) + U(h) · V(k)<br />
2 · V(k+h) = V(k) · V(h) + 5 · U(K) 2<br />
considerando ora k = 2·x, h =1 si trova:<br />
2·U(z) = 2·U(2·x +1) = U(2·x)·V(1) + U(1)·V(2·x) =<br />
= U(2·x ) + V(2·x)<br />
2·V(z) = 2·V(2·x +1) =V(2·x )·V(1) + 5·U(2·x)·U(1)=<br />
= V(2·x ) + 5·U(2·x)<br />
in quanto U(1) = 1; V(1) = 1<br />
36<br />
La Com<strong>un</strong>icazione - numero <strong>un</strong>ico 2001
UN METODO PER IL CALCOLO VELOCE DEI NUMERI<br />
DI FIBONACCI E DI LUCAS<br />
(A METHOD FOR FAST COMPUTATION OF FIBONACCI AND LUCAS NUMBERS)<br />
ma:<br />
U(2·x) = U(x) · V(x) e V(2·x) = V(x) 2 – 2(-1) x<br />
<strong>per</strong> cui le formule suddette risulteranno così mo<strong>di</strong>ficate:<br />
2 · U(2·x +1) = U(x) · V(x) + V(x) 2 – 2(-1) x<br />
2 · V(2·x +1) = V(x) 2 + 5 · U(x) · V(x) – 2(-1) x<br />
Da queste formule si può vedere che i valori<br />
U(z) e V(z) <strong>di</strong>pendono esclusivamente dall’in<strong>di</strong>ce<br />
x e dai valori U(x) e V(x), dove x è la metà <strong>di</strong> z <strong>per</strong><br />
z pari, mentre x è dato da (z - 1) / 2 = INT(z / 2) <strong>per</strong><br />
z <strong>di</strong>spari .<br />
Consideriamo ora <strong>un</strong> qualsiasi in<strong>di</strong>ce z : posto<br />
x 0<br />
= z si può sempre trovare a partire da x 0<br />
<strong>un</strong>a successione<br />
limitata <strong>di</strong> in<strong>di</strong>ci <strong>di</strong> valore <strong>numeri</strong>co decrescente:<br />
x 0<br />
, x 1<br />
, x 2<br />
, x 3<br />
, x 4<br />
, x 5<br />
, …….. x k-1<br />
, x k<br />
, x k+1<br />
,…….x n-1<br />
, x n<br />
con x n<br />
= 1 ultimo termine, tale da rispettare le seguenti<br />
regole:<br />
se <strong>il</strong> generico in<strong>di</strong>ce x k<br />
è <strong>di</strong> valore pari si pone<br />
x k+1<br />
= x k<br />
/ 2,<br />
se x k<br />
è <strong>di</strong>spari si pone<br />
x k+1<br />
= (x k<br />
- 1) / 2<br />
Si mette in evidenza che <strong>il</strong> numero degli in<strong>di</strong>ci<br />
a partire da x 0<br />
= z sino a x n<br />
=1 risulta limitato ad <strong>un</strong><br />
valore pari al più piccolo intero maggiore od uguale a<br />
log(z) / log2, dove <strong>il</strong> simbolo log in<strong>di</strong>ca <strong>il</strong> logaritmo in<br />
base 10; ad esempio <strong>per</strong> <strong>un</strong> in<strong>di</strong>ce z =100.000 <strong>il</strong> numero<br />
totale degli in<strong>di</strong>ci è 17.<br />
Partendo dall’in<strong>di</strong>ce x n<br />
= 1 <strong>per</strong> <strong>il</strong> quale si ha<br />
U(x n<br />
) = 1 e V(x n<br />
) = 1 si possono calcolare con le<br />
formule date sopra i valori <strong>di</strong> U(x n-1<br />
- 1) e <strong>di</strong><br />
V(x n-1<br />
- 1) relativi all’in<strong>di</strong>ce x n-1<br />
, sia che esso risulti <strong>di</strong><br />
valore pari o <strong>di</strong> valore <strong>di</strong>spari.<br />
Proseguendo quin<strong>di</strong> passo a passo con gli<br />
altri in<strong>di</strong>ci x k<br />
<strong>di</strong> valore decrescente della successione<br />
relativa all’in<strong>di</strong>ce iniziale x 0<br />
= z, si arriverà ai valori<br />
cercati <strong>di</strong> U(x o<br />
) e <strong>di</strong> V(x o<br />
) con <strong>un</strong> ciclo limitato<br />
<strong>di</strong> iterazioni iz = |_ log(z)/log2_| .<br />
Pertanto ad ogni iterazione ut<strong>il</strong>izzando i valori<br />
U(x k<br />
) e V(x k<br />
) si passa ai valori U(x k-1<br />
) e V(x k-1<br />
)<br />
dove l’in<strong>di</strong>ce x k-1<br />
se è pari è <strong>il</strong> doppio dell’in<strong>di</strong>ce x k<br />
,<br />
se <strong>di</strong>spari è <strong>il</strong> doppio <strong>di</strong> x k<br />
aumentato <strong>di</strong> 1.<br />
Un semplice esempio chiarirà quanto detto.<br />
Si voglia trovare <strong>il</strong> valore <strong>di</strong> U(59) e <strong>di</strong> V(59).<br />
Partendo ad esempio da x 0<br />
= z = 59 , con<br />
U(0) = 1, V(0) = 1 e in<strong>di</strong>cando con <strong>il</strong> verso delle<br />
frecce l’andamento temporale delle iterazioni si può<br />
schematizzare così <strong>il</strong> proce<strong>di</strong>mento <strong>di</strong> <strong>calcolo</strong>:<br />
NOTE<br />
Iterazione x k U(x k ) V(x k )<br />
|--------------|---------------------|-------------------------|--------------------------------|<br />
- x 0 = 59 956722026041 2139295485799<br />
1 a x 1 = 29 514229 1149851<br />
2 a x 2 = 14 377 843<br />
3 a ? x 3 = 7 ? 13 ? 29<br />
4 a x 4 = 3 2 4<br />
5 a x 5 = 1 ? U(x 5 ) = 1 V(x 5 ) = 1<br />
La Com<strong>un</strong>icazione - numero <strong>un</strong>ico 2001<br />
37
Cristiano Teodoro<br />
Come già osservato l’algoritmo sopra accennato<br />
si presta bene ad essere sv<strong>il</strong>uppato in aritmetica<br />
a precisione multipla.<br />
Si potrebbe pensare <strong>di</strong> ut<strong>il</strong>izzare le formule <strong>di</strong><br />
Binet che sono delle formule compatte <strong>per</strong> <strong>il</strong> <strong>calcolo</strong><br />
<strong>di</strong> U(z) e <strong>di</strong> V(z); ma esse non risultano molto convenienti<br />
<strong>per</strong> <strong>il</strong> <strong>calcolo</strong> esatto <strong>di</strong> tutte la cifre <strong>di</strong> cui<br />
sono composti U(z) e V(z), anche <strong>per</strong> valori dell’in<strong>di</strong>ce<br />
z non molto gran<strong>di</strong>, in quanto esse presentano a<br />
denominatore V5 che è <strong>un</strong> numero irrazionale.<br />
Per finire si dà <strong>un</strong> esempio <strong>di</strong> paragone <strong>di</strong> tempo<br />
<strong>di</strong> esecuzione relativo al <strong>calcolo</strong> <strong>di</strong> U(z) e V(z)<br />
fra i due tipi <strong>di</strong> algoritmi: quello classico ma banale, e<br />
quello <strong>il</strong>lustrato nella presente nota, <strong>per</strong> <strong>un</strong> in<strong>di</strong>ce<br />
z =100.000 (centom<strong>il</strong>a)<br />
- col <strong>metodo</strong> classico, ut<strong>il</strong>izzando <strong>un</strong> normale<br />
PC (450 MHz) <strong>il</strong> tempo <strong>di</strong> esecuzione <strong>per</strong> <strong>il</strong> <strong>calcolo</strong><br />
del valore esatto <strong>di</strong> U(100.000), che è <strong>un</strong> numero<br />
costituito da 20899 cifre decimali, è risultato pari a 3<br />
ore e 48 minuti;<br />
- col presente algoritmo, sempre con l’ut<strong>il</strong>izzo<br />
dello stesso PC, <strong>il</strong> tempo <strong>di</strong> esecuzione <strong>per</strong> trovare<br />
non solo <strong>il</strong> valore <strong>di</strong> U(100.000) ma contemporaneamente<br />
anche quello <strong>di</strong> V(100.000) è risultato <strong>di</strong> 4<br />
minuti e 6 secon<strong>di</strong>..<br />
Tale <strong>di</strong>fferenza <strong>di</strong> tempi è fac<strong>il</strong>mente spiegab<strong>il</strong>e<br />
in quanto con l’algoritmo classico <strong>per</strong> trovare <strong>il</strong> valore<br />
<strong>di</strong> U(100.000) occorre effettuare pe<strong>di</strong>ssequamente<br />
<strong>il</strong> <strong>calcolo</strong> <strong>di</strong> tutti i precedenti <strong>numeri</strong> <strong>di</strong> Fibonacci ,<br />
con <strong>un</strong> ciclo <strong>di</strong> 100.000 iterazioni, mentre con<br />
l’algoritmo <strong>il</strong>lustrato è sufficiente, pur con calcoli aritmetici<br />
più complessi in ogni iterazione, <strong>un</strong> ciclo <strong>di</strong> sole<br />
16 iterazioni.<br />
NOTE<br />
RIFERIMENTI<br />
[1] P. F<strong>il</strong>ipponi: “I <strong>numeri</strong> <strong>di</strong> Fibonacci ” – Sistemi<br />
<strong>di</strong> Telecom<strong>un</strong>icazioni, n.12,<strong>di</strong>cembre 1989<br />
[2] A. Bosselaers, P. F<strong>il</strong>ipponi, B. Preneel : “Su alc<strong>un</strong>i<br />
aspetti <strong>numeri</strong>ci degli pseudoprimi <strong>di</strong><br />
Fibonacci”- Note Recensioni Notizie, v.38, n.1-2<br />
,gennaio-giugno 1989<br />
[3] P. F<strong>il</strong>ipponi, E. Montolivo : “Representation of<br />
natural numbers as sum of Fibonacci numbers:<br />
an application to modern cryptography” –<br />
Application of Fibonacci Numbers, v. 3, Kluwer<br />
Academic Publishers, Dordrecht (NL) 1990<br />
[4] A. Di Porto, P. F<strong>il</strong>ipponi, E. Montolivo: “On<br />
generalized Fibonacci pseudoprimes”-<br />
TheFibonacci Quaterly, v,29, novembre1990<br />
[5] “Lucas Sequences in Cryptography”- Sito<br />
internet htpp://www.amasci.com/~weidai/<br />
<strong>lucas</strong>.html<br />
[6] “Periods of Fibonacci Sequences Mod m”-<br />
Sito Internet htpp:/www.mathpages.com/home/<br />
kmath078.htm<br />
[7] “Lucas Sequences and cryptography”- Sito<br />
Internet tpp://saturn.hut.fi/~helger/crypto/link/<br />
public/luc.html<br />
[8] “ Mersenne Prime: Histoty, Theorems and List“-<br />
Sito Internet: tpp://www.utm.edu/research/primes/<br />
mersenne/index.html<br />
[9] P. Ribenboin - The little book of big primes:<br />
pagg. 38,39 – Springer-Verlag<br />
38<br />
La Com<strong>un</strong>icazione - numero <strong>un</strong>ico 2001