Lezione del 14 marzo 2008 Per trovare il caso “peggiore” per il numero n di divisioni nell’algoritmo Euclideo, fissato il numero naturale n poniamo a=Fn+2 , b=Fn+1 ; 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 sono in numero di n (abbiamo incidentalmente anche dimostrato che mcd(Fn+1, Fn+2)=1 per ogni n, ossia che numeri di Fibonacci consecutivi sono coprimi). Ricordando che, per la (***) della lezione precedente, si ha: Fn+1 < n < Fn+2 < n+1 < Fn+3 Si ricava che : n < log (Fn+2) = loga < n+1 quindi n è il massimo intero che non supera loga, ossia n= loga in questo caso. Il maggiorante loga per il numero n di divisioni è dunque “ottimale” perché coincide con n nel caso peggiore. Nel caso generale, dati a,b con a>b, se k=L(a) è la lunghezza binaria dell’input a , si ha: 2k-1 a < 2k, log2a < k. ma si ha anche n loga, dunque n loga = log2log2a < (log2)k. Essendo log2 una costante, il numero n delle divisioni dell’algoritmo Euclideo è di ordine O(k) dove k è la dimensione dell’input a. Ricordando che ogni divisione (coinvolgendo numeri non maggiori di a) si effettua con un algoritmo di complessità O(k2), si ottiene che globalmente l’algoritmo Euclideo delle divisioni successive ha complessità polinomiale O(k3). 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(k2). Possiamo trovare anche un’altra 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 applicato ad a,b con a>b, si ha: b Fn+1 n-1 ma < Fn+1, dunque n-1 < b, ossia (estraendo il logaritmo in base 10): (n-1)log10 < log10b Poiché log100,206>1/5 si ottiene (n-1) < 5log10b , n < 5log10b+1 Se t è il numero di cifre nella rappresentazione di b in base 10 si ha : 10t-1 b< 10t e dunque log10b < 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. Algoritmo Euclideo esteso Vedremo ora che l’algoritmo Euclideo delle divisioni successive permette (con un’opportuna “estensione”) di calcolare anche il valore dei coefficienti interi relativi x,y tali che mcd(a,b)=ax+by. A tale scopo, se n è il numero delle divisioni dell’algoritmo Euclideo, costruiamo (mediante i quozienti qi delle divisioni) le 2 seguenti successioni di numeri interi 0: s0 ,s1,…..,sn,sn+1 ; t0,t1,….,tn,tn+1 ponendo s0=1, s1=0, si=si-2+si-1qi-1 (per ogni i>1); t0=0, t1=1, ti=ti-2+ti-1qi-1 (per ogni i>1) dove qi-1 è il quoziente della divisione numero (i-1) nell’algoritmo Euclideo. Verifichiamo che vale la seguente eguaglianza per ogni i=1,2,…,n: asi+1-bti+1 = (-1)i+1ri (dove ri è il resto della divisione numero i nell’algoritmo Euclideo) (ovviamente tale eguaglianza è equivalente alla (-1)i+1(asi+1-bti+1) = ri ottenuta moltiplicando ambo i membri per (-1)i+1). Usiamo il principio di induzione (IIa forma). Per i=1 l’eguaglianza è vera, in quanto dalla prima divisione dell’algoritmo Euclideo si ricava (-1)2r1=r1=a-bq1=as2-bt2 (notare che per costruzione si ha s2=1,t2=q1). Supponiamola vera per tutti gli indici j<i, e dimostriamola per i. Poiché per ipotesi è vera in particolare per j=i-2, j=i-1, si ricava (dalla divisione numero i): ri = ri-2 – ri-1qi = (-1)i-1(asi-1-bti-1)-(-1)i( asi-bti)qi = a((-1)i-1si-1-(-1)isiqi)+b((-1)i-1ti-1-(-1)itiqi) = = (-1)i+1(asi+1-bti+1) il che dimostra che la tesi è vera anche per l’indice i (per dedurre l’ultima eguaglianza basta distinguere i casi in cui i è pari o dispari e sfruttare la definizione dei termini si+1, ti+1) In particolare per i=n-1 otteniamo (-1)n(asn-btn) = a(-1)nsn+b(-1)n+1tn = rn-1 = mcd(a,b), e basta porre x=(-1)nsn ,y=(-1)n+1tn per avere i coefficienti interi relativi x, y tali che mcd(a,b)=ax+by . Calcoliamo la complessità computazionale dell’algoritmo Euclideo delle divisioni successive “esteso”, supponendo sempre a>b. Facciamo alcune osservazioni che saranno utili in seguito: 1) Dalla prima divisione dell’algoritmo Euclideo segue: a=bq1+r1bq1q1 (perché b1) dalla seconda divisione: a>b=r1q2+r2r1q2q2 e in generale qi≤a per ogni i=1,…..,n (si può anche affermare che qi<a tranne nel caso banale b=1). 2) Nelle successioni si, ti costruite nell’algoritmo Euclideo esteso, si ha: si-1ti - siti-1 = (-1)i+1 per ogni i=1,….,n+1. Ciò si dimostra usando il principio di induzione (IIa forma). Per i=1 è facile verificarlo. Supponiamolo vero per i e dimostriamolo per i+1; si ha: siti+1 - si+1ti = si(ti-1+tiqi)-(si-1+siqi)ti= -(si-1ti - siti-1) = (-1)(-1)i+1= (-1)i+2. In particolare per ogni i=1,….,n+1 il numero 1 è combinazione lineare di si, ti a coefficienti interi relativi (precisamente per i pari si ha 1 = siti-1+ti(-si-1), mentre per i dispari si ha 1 = si(-ti-1)+tisi-1) dunque si, ti sono coprimi per ogni i=1,….,n+1. 3) Dall’eguaglianza asi+1-bti+1 = (-1)i+1ri (già dimostrata valida per ogni i=1,….,n) in particolare per i=n si ottiene: asn+1-btn+1 = (-1)n+1rn =0 dunque: asn+1 = btn+1 Poiché sn+1, tn+1 sono numeri coprimi, e poiché sn+1btn+1, tn+1asn+1, si ha sn+1b, tn+1a (per una proprietà dei coprimi dimostrata prima) e in particolare sn+1≤b<a, tn+1≤a. Ma per costruzione si=si-2+si-1qi-1 si-1qi-1 si-1 ed analogamente ti ti-1 (per ogni i=1,….,n+1), ossia: si≤ sn+1≤b<a, ti ≤tn+1≤a per ogni i=1,….,n+1. In conclusione tutti i termini delle successioni si, ti sono ≤a . Ricordando che : si=si-2+si-1qi-1 ; ti=ti-2+ti-1qi-1 per ogni i>1 (oltre i termini s0,s1, t0, t1 predeterminati con valore costante) il calcolo dei 2(n-1) termini s2,….,sn+1,t2,….,tn+1 delle 2 successioni si ottiene (per ciascuno) da una somma ed un prodotto che coinvolgono numeri ≤a (per quanto osservato in precedenza), quindi con un algoritmo di complessità O(k+k2)=O(k2) se k=L(a) è la lunghezza binaria di a. Poiché n è di ordine O(k), questa “estensione” dell’algoritmo Euclideo ha complessità O(k3): si conclude che (avendo l’algoritmo Euclideo complessità O(k3)), questo algoritmo Euclideo esteso ha complessità globale polinomiale O(k3+k3)=O(k3). Nota: si può dimostrare che in effetti l’algoritmo Euclideo esteso ha complessità O(k2). Dati 2 numeri naturali a,b, in modo simmetrico alla definizione di mcd(a,b), si può definire il minimo comune multiplo mcm(a,b) come un numero naturale che è multiplo comune di a,b ed è divisore di tutti i naturali multipli comuni di a,b (in particolare è il minimo dei naturali multipli comuni di a,b). Non è però necessario costruire un algoritmo per calcolarlo, ma basta usare il seguente risultato: dati 2 numeri naturali a,b si ha mcm(a,b)=(ab)/mcd(a,b). Infatti, posto d=mcd(a,b), dimostriamo che il numero naturale m=ab/d ha le proprietà che caratterizzano il mcm(a,b). Si ha ab/d=b(a/d)=a(b/d), dove a/d, b/d sono naturali, quindi ab/d è multiplo comune di a,b. Se poi z è un naturale multiplo comune di a,b, allora az, bz, quindi (a/d)(z/d), (b/d)(z/d); ma a/d, b/d sono coprimi (per un risultato sui numeri coprimi), dunque, (per un altro risultato sui numeri coprimi) anche il prodotto (a/d)(b/d)=ab/d2 è divisore di z/d, da cui m=ab/d è divisore di z. Il risultato precedente implica che il calcolo del mcm(a,b) si può effettuare con un algoritmo di complessità polinomiale O(k3) dove k=L(a) (se a>b): basta utilizzare l’algoritmo di Euclide per calcolare d=mcd(a,b) (complessità O(k3)), calcolare il prodotto ab (di complessità O(k2)) e la divisione ab/d (di complessità O(k2). Il concetto di massimo comune divisore si può facilmente estendere al caso di un numero qualunque r>1 di numeri naturali a1, a2, …, ar: il mcd(a1, a2, …, ar) è un numero naturale d divisore comune di tutti gli ai e multiplo di tutti i naturali divisori comuni degli ai. E’ facile verificare che mcd(a1, a2, …, ar)=mcd(mcd(a1, a2, …, ar-1),ar), quindi si può ricondurre (con un procedimento iterativo) il calcolo al caso di 2 soli numeri naturali a,b. Analoghe considerazioni si possono fare per la definizione e il calcolo del mcm(a1,a2….,ar). Ovviamente se k è la massima lunghezza binaria degli ai, dovendosi effettuare (r-1) volte il calcolo del massimo comune divisore, la complessità totale dell’algoritmo è di ordine O(rk3): quindi tale complessità dipende dall’ordine del numero r dei naturali di cui si calcola il mcd . Numeri primi. Per ogni numero naturale a, i numeri naturali 1,a sono ovviamente divisori di a, detti divisori banali di a. Un numero naturale p è detto numero primo se p>1 e se gli unici divisori naturali di p sono quelli banali. Lemma. Se p, a1, a2, … ,an sono numeri naturali, con p numero primo, e se p(a1a2… an) allora pai per qualche i=1,2,..,n. Dimostrazione: Per induzione su n (Ia forma). Per n=1 la tesi è banale. Supponiamo la tesi vera per n e dimostriamola per n+1. Se p(a1a2… anan+1), dimostriamo che pai per qualche i=1,2,..,n,n+1. Distinguiamo 2 casi: - se pan+1 non vi è niente da dimostrare - se p non è divisore di an+1 allora 1=mcd(p,an+1) perché p è primo e p non è divisore di an+1, dunque p,an+1 sono coprimi e, applicando uno dei risultati sui numeri coprimi, da : p[(a1a2… an)an+1], segue p(a1a2… an); per l’ipotesi induttiva si ha allora pai per qualche i=1,2,..,n, cioè la tesi.