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 è loga (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 = loga (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 (q10, 0<r1<b) b=r1q2+r2 (q20, 0<r2<r1) r1=r2q3+r3 (q30, 0<r3<r2) . . . rn-3=rn-2qn-1+rn-1 (qn-10, 0<rn-1<rn-2) rn-2=rn-1qn+rn (qn0, 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+21): 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 q11) a=r0q1+r1 r0+r1Fn+1+Fn=Fn+2 . Ma dalla (***) segue aFn+2>n , da cui log(a)>n, dunque n loga . Tale maggiorazione è ottimale nel senso che per opportuni valori di a,b il numero n delle divisioni è proprio = loga . 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+11+Fn (q1=1 , r1=Fn) Fn+1 = Fn1+Fn -1 (q2=1 , r2=Fn-1) . . F4 = F31+F2 (qn-1=1 , rn-1=F1=1=mcd(Fn+2,Fn+1)) F3 = 2 = F22+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) = loga < n+1 quindi n è proprio la parte intera del numero reale loga , ossia n= loga 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 xy 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.