Teoria dei numeri e Crittografia: lezione del 4 aprile 2011

Teoria dei numeri e Crittografia: lezione del 4 aprile 2011
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=F1=1=mcd(Fn+2,Fn+1))
F3 = 2 = F22+0
(qn=2, rn=0)
quindi le divisioni sono in numero di n (abbiamo incidentalmente anche dimostrato che 2 numeri di
Fibonacci consecutivi sono coprimi perché mcd(Fn+1, Fn+2)=1).
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.
Da quanto precede si deduce che, 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:
2x-1  a < 2x da cui log2(a) < x, n log(a) = log(2)log2(a) < (log(2))x.
Essendo log(2) una costante, il numero n delle divisioni dell’algoritmo Euclideo è perciò di ordine
 O(x).
Ricordando che ogni divisione effettuata nell’algoritmo coinvolge numeri  a, quindi di lunghezza
 x, e si può effettuare perciò con l’algoritmo Div di complessità  O(x2), si ottiene che globalmente
l’algoritmo Euclideo delle divisioni successive ha complessità  O(x3).
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.