09.03.2014 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!