Teoria dei numeri e Crittografia: lezione del 19 ottobre 2011
La successione di Fibonacci.
La successione dei numeri di Fibonacci è la successione di numeri naturali Fn (n>0) definita
ponendo: F1=F2=1, Fn=Fn-1+Fn-2 per ogni n >2
Quindi F3=2; F4=3, F5=5, F6=8 etc…
Tale successione interviene in molti problemi combinatori.
Esempio. Per ogni naturale n, il numero delle parole di lunghezza n sull’alfabeto {0,1} che non
contengono 2 bits =1 consecutivi è Fn+2.
Per dimostrarlo basta usare la seconda forma del principio di induzione.
Per n=1 l’affermazione è banale: sono 2=F3 le parole in questione (le parole 0 e 1).
Sia n>1: supponiamo vera l’affermazione per ogni numero naturale k<n e dimostriamola per n.
Consideriamo una generica parola w di lunghezza n che non contiene 2 bits consecutivi =1.
Distinguiamo 2 casi:
1) se l’ultimo bit di w è 0, la parola w si ottiene da una parola di lunghezza n-1 (che non contiene 2
bits consecutivi =1) aggiungendo come ultimo bit 0. Per l’ipotesi induttiva i valori di w in questo
caso sono in numero di Fn+1
2) se l’ultimo bit è 1, la parola w si ottiene da una parola di lunghezza n-2 (che non contiene 2 bits
consecutivi =1) aggiungendo come penultimo bit 0 e come ultimo bit 1. Per l’ipotesi induttiva i
valori di w in questo caso sono in numero di Fn
In totale il numero di valori di w è Fn+Fn+1=Fn+2 .
Problema: trovare una formula algebrica per il calcolo del generico numero di Fibonacci Fn .
A tale scopo ricordiamo alcune classiche nozioni geometriche.
Se AB è un segmento di estremi A,B è di lunghezza a (con a reale >0), si chiama parte aurea di AB
un segmento AC (dove C è un punto interno ad AB) tale che la lunghezza x di AC sia media
proporzionale fra a e la lunghezza (a-x) del segmento CB:
a : x = x : (a-x)
e da ciò si ricava x2+ax-a2 = 0, da cui x = a(-1 5 )/2.
Essendo x>0, l’unico valore accettabile è x = a(-1+ 5 )/2, da cui si ottiene il valore del rapporto:
a/x = 2/(-1+ 5 )=( 5 +1)/21,61
(è il cosiddetto rapporto aureo o numero d’oro, indicato spesso con la lettera greca ).
Il concetto di parte aurea di un segmento ha molte applicazioni geometriche: per esempio il lato del
decagono regolare ha la stessa lunghezza della parte aurea del raggio della circonferenza
circoscritta.
Descriviamo alcune proprietà del numero d’oro :
1) Nel ragionamento precedente, poiché x è soluzione di x2+ax-a2 = 0, dividendo per x2 si ottiene
che  = a/x soddisfa l’identità:
1 +  - 2 = 0
da cui:
2 = 1+ (*)
2) Si ricava anche:
(1-)2 = 1-2+2
e tenendo conto di (*) si ottiene:
(1-)2 = 2- (**)
Il numero d’oro ha una stretta relazione con la successione dei numeri di Fibonacci Fn .
Calcolando le potenze di base  ad esponente naturale e confrontandole con alcuni valori di Fn,
osserviamo che:
F2=1 < 11,61 < F3=2 < 22,6 < F4=3 < 34,2 < F5=5
e si può congetturare che si abbia :
Fn+1 < n < Fn +2 (***) per ogni naturale n.
Possiamo dimostrare che ciò è vero, ragionando per induzione (IIa forma). Per n=1 abbiamo già
notato che (***) è vero.
Sia n>1: supponiamolo vero per tutti i k<n, e dimostriamolo vero per n; poiché (***) è in
particolare vero per k=(n-1),(n-2), si ha Fn < n -1< Fn +1 , Fn-1 < n -2< Fn , da cui, sommando, si
ha:
Fn+1 = Fn+Fn-1 < n –1 + n –2 < Fn+1+Fn = Fn+2
Ma dalla (**) segue che:
n –1 + n –2 = n –2(1+) = n
quindi la (***) é vera per n.
Dimostriamo ora la seguente formula algebrica per il calcolo del generico numero di Fibonacci:
Fn = [n – (1-)n]/ 5
per ogni naturale n.
Ragioniamo di nuovo per induzione (IIa forma). Per n=1 si ha:
[ – (1-)]/ 5 = (2-1) / 5 = 1 = F1
Sia n>1: supponiamo la formula vera per ogni k<n e dimostriamola per n; poiché è vera in
particolare per k=(n-1),(n-2), si ha:
Fn-1 = [n-1 – (1-)n-1]/ 5 , Fn-2 = [n-2 – (1-)n-2]/ 5
e sommando si ottiene (tenendo conto di (*) e (**)):
Fn-1 + Fn-2 = Fn = [n-2(1+) - (1-)n-2(2-)]/ 5 = [n – (1-)n]/ 5
come si voleva.
In effetti la formula ottenuta per il calcolo dei numeri di Fibonacci è poco utile, perché coinvolge
numeri irrazionali.
Dimostreremo ora che, dati 2 numeri naturali a,b con a>b, il numero n di divisioni effettuate
nell’algoritmo Euclideo è  log a (parte intera del logaritmo di a avente per base il numero
d’oro), e inoltre tale maggiorazione è ottimale, cioè per opportune scelte dei valori di a,b il numero
delle divisioni è proprio = log a (dunque questo è effettivamente il caso peggiore).
Siano a,b numeri naturali, con a>b. Effettuiamo le n divisioni successive dell’algoritmo Euclideo:
a=bq1+r1 (q10, 0<r1<b)
b=r1q2+r2 (q20, 0<r2<r1)
r1=r2q3+r3 (q30, 0<r3<r2)
.
.
.
rn-3=rn-2qn-1+rn-1 (qn-10, 0<rn-1<rn-2)
rn-2=rn-1qn+rn (qn0, rn=0)
rn-1=mcd(a,b)
Per costruzione si ha :
a > b > r1 > r2 > …….. > rn-1 > 0=rn
dunque i quozienti qi sono tutti non nulli (se fosse qi=0 si avrebbe ri-2=ri-1qi+ri, da cui ri-2=ri,
contraddizione perché ri-2<ri-1<ri); in particolare ogni quoziente qi è 1.
Poniamo per omogeneità di indici r0=b (in modo che la prima e la seconda divisione siano
rispettivamente a=r0q1+r1 , r0=r1q2+r2) e dimostriamo che si ha:
(****)
rn-j  Fj+1
per ogni j=1,2,…,n
Ragioniamo per induzione (IIa forma).
Per j=1 si ha (essendo rn-1>0) : rn-1  F2 = 1.
Sia j>1: supponiamolo vero per ogni k<j, e dimostriamolo vero per j.
Essendo vero in particolare per k=j-1,j-2, si ha:
rn-j+1  Fj , rn-j+2  Fj-1
Ricavando il resto rn-j dalla divisione numero n-j+2 si ha (tenendo conto che qn-j+21):
rn-j = rn-j+1qn-j+2+rn-j+2  rn-j+1+rn-j+2  Fj + Fj-1 = Fj+1
come si voleva.
In particolare, applicando la (****) per j=n, n-1, si ha:
b = r0  Fn+1 r1 Fn
e dalla prima divisione (essendo q11)
a=r0q1+r1 r0+r1Fn+1+Fn=Fn+2 .
Ma dalla (***) segue a Fn+2> n , da cui log a>n, dunque n  log a .
Tale maggiorazione è ottimale nel senso che per opportuni valori di a,b il numero n delle divisioni è
proprio = log a .
Precisamente poniamo a=Fn+2 , b=Fn+1 e , ricordando le eguaglianze che legano i numeri di
Fibonacci, osserviamo che le divisioni dell’algoritmo Euclideo in questo caso sono le seguenti:
Fn+2 = Fn+11+Fn (q1=1 , r1=Fn)
Fn+1 = Fn1+Fn -1 (q2=1 , r2=Fn-1)
.
.
F4 = F31+F2
(qn-1=1 , rn-1=F2)
F3 = 2 = F22+0
(qn=2, rn=0)
quindi le divisioni sono in numero di n (abbiamo incidentalmente anche dimostrato che
rn-1=F1=1=mcd(Fn+2,Fn+1) ossia che 2 numeri di Fibonacci consecutivi sono coprimi).
Ricordando che, per la (***), si ha:
Fn+1 <  n < Fn+2 <  n+1 < Fn+3
Si ricava che :
n < log (Fn+2) = log a < n+1
quindi n è proprio la parte intera del numero reale log a , ossia n= log a in questo caso
particolare.
Riassumendo: dati 2 numeri naturali a,b con a>b, se n é il numero di divisioni effettuate
nell’algoritmo Euclideo per il calcolo del mcd(a,b), si ha n log a (dove  é il numero d’oro).
Se x=L(a), y=L(b) si ha necessariamente x y ed inoltre (per definizione di lunghezza binaria):
2x-1  a < 2x da cui log2 a < x, n log a = log 2log2 a < kx (dove k= log 2 è una costante)
Si conclude che il numero n delle divisioni dell’algoritmo Euclideo di ordine O(x).
Ricordando che ogni divisione effettuata nell’algoritmo coinvolge dividendi tutti  a (quindi di
lunghezza  x), e si può effettuare perciò con l’algoritmo Div complessità di ordine O(x2), si ottiene
che globalmente l’algoritmo Euclideo delle divisioni successive ha complessità di ordine O(x3)
polinomiale (cubica).
Nota: con un ragionamento più raffinato (che omettiamo) che considera l’ordine di grandezza
(decrescente) dei numeri coinvolti nelle successive divisioni, si può dimostrare che in effetti
l’algoritmo Euclideo delle divisioni successive ha complessità O(x2).
Possiamo trovare anche un’altra interessante maggiorazione per il numero n di divisioni
dell’algoritmo Euclideo, stavolta in funzione del minore b fra i 2 numeri a,b.
Abbiamo già notato che, se n è il numero di divisioni nell’algoritmo Euclideo, si ha:
b Fn+1
(dove Fi indica il generico termine della successione di Fibonacci) ma sappiamo anche che:
 n-1 < Fn+1
dunque  n-1 < b, ossia (estraendo il logaritmo in base 10):
(n-1)log10  < log10 b
Poiché log10   0,206 > 1/5 si ottiene (n-1) < 5log10 b , n < (5log10 b)+1
Se t=L(b)10 è il numero di cifre nella rappresentazione di b in base 10 si ha :
10t-1  b< 10t
e dunque log10 b < t, da cui n<5t+1, ossia n  5t.
In pratica quindi il numero di divisioni nell’algoritmo Euclideo non è superiore al quintuplo del
numero di cifre (nella rappresentazione in base 10) del più piccolo dei numeri a,b.
Per esempio se a>b e se b (in base 10) ha 100 cifre, il numero di divisioni dell’algoritmo Euclideo
non è superiore a 500, qualunque sia il numero di cifre di a.