Lezione del 20 maggio 2008
Il test di primalità AKS si basa sul seguente risultato (di cui diamo solo l’enunciato):
Teorema AKS.
Siano n un intero >2, ed r un naturale coprimo con n, tale che ordrn>log22n (dove ordrn indica il
periodo di [n] nel gruppo Zr*) . Supponiamo inoltre che per ogni intero a tale che 1a  (r) log 2 n
(dove  (r) è la funzione di Eulero) si abbia:
(x+a)n xn+a (mod xr-1, n)
Allora: se n ha un fattore primo p>  (r) log 2 n , si ha che n è potenza di p.
Il test AKS si implementa nel modo seguente, dato in input un naturale n>1:
1) si testa se n è una potenza di base naturale con opportuno esponente naturale >1: in caso
affermativo si esce con output “n è composto”, altrimenti si prosegue al passo successivo
2) Si cerca il minimo naturale r coprimo con n tale che ordrn>log22n
3) Se esiste un divisore d di n, con d<n, nell’intervallo [2,  (r) log 2 n ] si esce con output “n è
composto”
4) Se per ogni naturale a con 1a  (r) log 2 n si ha (x+a)n xn+a (mod xr-1, n) si esce con output
“n è primo”, altrimenti si esce con output “n è composto”
Verifichiamo prima di tutto che il test AKS è un test di primalità deterministico, quindi che un input
n supera il test se e solo se n è primo.
Sia dunque n primo. Il passo 1) viene superato da n, in quanto n, essendo primo, non è potenza di
base naturale con esponente naturale opportuno >1.
Il passo 3) viene superato da n in quanto n non ha divisori propri diversi da 1 e da n.
Infine nel passo 4) si esce certamente con output “n è primo” come conseguenza dell’implicazione
() dell’ultimo teorema dimostrato (prima del Teorema AKS) in cui l’ipotesi a,n coprimi era
superflua: infatti da tale implicazione hsegue (x+a)n xn+a (mod n) e dunque a maggior ragione
(x+a)n xn+a (mod xr-1, n).
Viceversa se n è un input che fornisce output “n è primo”, dimostriamo che n è primo.
Per assurdo supponiamo che n superi il test AKS ma n non sia primo, e sia p un divisore primo di n,
con p<n.
Poiché n supera il passo 1), si ha che n non è potenza di base naturale con esponente naturale >1.
Poiché n supera il passo 3), il divisore primo p è >  (r) log 2 n e per il Teorema AKS si conclude
che n è potenza di p, con esponente naturale >1 (perché p<n), in contraddizione con il superamento
del passo 1).
Il problema della complessità di calcolo del test AKS è interamente legato al naturale r trovato nel
passo 2) (della cui esistenza ancora non siamo neanche formalmente certi).
Sarà utile il seguente risultato (di cui diamo solo l’enunciato):
Lemma AKS.
Se n>2 è un numero naturale, esiste un naturale rlog25n+1 coprimo con n, tale che ordrn>log22n
(dove ordrn è il periodo di [n] nel gruppo moltiplicativo Zr*).
Dunque r esiste certamente, e inoltre il minimo r con le proprietà richieste è di ordine polinomiale
rispetto alla lunghezza binaria k dell’input n (perché n<2k, log2n<k, esiste rk5+1, e il minimo r è
dunque di ordine O(k5)).
Dimostriamo allora che il test di primalità AKS ha globalmente complessità polinomiale nella
lunghezza binaria k dell’input n.
Abbiamo già visto in una lezione precedente che il passo 1) si esegue con complessità polinomiale,
con un test che verifica se n è potenza di opportuna base naturale ed opportuno esponente >1. .
La ricerca di r nel passo 2) si effettua facendo assumere ad r i valori successivi r=2,3…. e ad ogni
valore testando se r,n sono coprimi (algoritmo Euclideo), e se il periodo di [n] nel gruppo Zr* è
>log22n (calcolando le potenze [n]i con 1ilog22n e verificando che nessuna coincida con [1]):
poiché come visto il numero di valori di r da testare (per trovare quello utile) è di ordine O(k 5),
anche questo passo 2) ha complessità polinomiale.
Nel passo 3), l’esistenza di un divisore d di n, con d<n, nell’intervallo [2,  (r) log 2 n ] si effettua
facendo assumere al naturale d tutti i valori in [2,
 (r) log 2 n ] e per ognuno testando se d é un
divisore di n con d<n (il numero dei valori d da testare è <  (r) log 2 n <rlog2n<rk, quindi di ordine
O(k6)).
Nel passo 4), per ogni naturale a con 1a  (r) log 2 n si testa se (x+a)n xn+a (mod xr-1, n) (il
numero dei valori a da testare è come sopra di ordine O(k6)): tale congruenza si verifica calcolando
le riduzioni modulo (xr-1, n) di ambo i membri (per il primo membro (x+a)n si usa
l’esponenziazione modulare per i polinomi, di complessità polinomiale) e confrontando le riduzioni
ottenute.
Poiché tutti i passi dell’algoritmo AKS sono di complessità polinomiale, lo stesso si può dire per
l’intero algoritmo.
Algoritmi di fattorizzazione.
Sono algoritmi che, dato in input un naturale n>1, calcolano tutti i fattori primi di n: a tutt’oggi non
è stato trovato un algoritmo di fattorizzazione di complessità polinomiale.
Un algoritmo di fattorizzazione in genere cerca di decomporre n nel prodotto n=ab, dove a,b sono
naturali (non necessariamente primi) tali che 1<a,b<n (se a,b non esistono, si conclude che n è
primo). Una volta trovati a,b l’algoritmo viene riapplicato separatamente ad a,b per decomporli
ulteriormente (se possibile): dopo un numero finito di ripetute applicazioni dell’algoritmo, si
perviene al calcolo dei fattori primi di n.
Ovviamente un algoritmo “ingenuo” di fattorizzazione consiste (come nel test ingenuo di primalità)
nel testare, per ogni naturale a in [2, n ], se a è divisore di n, e in caso affermativo porre b=n/a: il
numero dei test da effettuare è di ordine esponenziale O( 2 k) se k è la lunghezza binaria di n.
Questo algoritmo trova un fattore a di n in tempi di calcolo ragionevoli solo se n ha un fattore
relativamente “piccolo”.
Illustriamo ora un algoritmo di fattorizzazione che invece è efficiente se n ha un fattore
relativamente “grande”.
Algoritmo di fattorizzazione di Fermat.
Supponiamo l’input n dispari: non è una limitazione in un algoritmo di fattorizzazione perché se n è
pari, con successive divisioni per 2 si può fattorizzare n nella forma n=2km, con m dispari, e
sostituire m al posto di n come input.
L’algoritmo si basa sul seguente risultato, il quale dimostra che fattorizzare n nel prodotto di 2
numeri naturali equivale sostanzialmente a rappresentare n come differenza di 2 quadrati:
Teorema (Fermat).
Sia n un naturale dispari, e siano:
S = { (a,b)NxN / ab, n=ab }
T = { (r,s)ZxZ / r>s0, n=r2-s2 }
Allora la funzione f : S  T definita da f(a,b)=((a+b)/2,(a-b)/2) è biunivoca.
Dimostrazione:
Si verifica facilmente che f(a,b)T se (a,b)S.
Per dimostrare che f è biunivoca, basta costruire la funzione inversa: definiamo f-1 : T  S ponendo
f-1(r,s)=(r+s,r-s) (si verifica facilmente che f-1(r,s)S se (r,s)T).
Si verifica infine che le composizioni ff-1, f-1f sono le funzioni identiche di T ed S.
Come conseguenza del teorema precedente, è possibile implementare un algoritmo di
fattorizzazione: dato in input un intero dispari n>1, per trovare una fattorizzazione di n nel prodotto
di 2 numeri naturali a,b, basta trovare una coppia (r,s)T (quindi r,s interi, r>s0, tali che n=r2-s2) e
porre (a,b)=f-1(r,s)=(r+s,r-s) (vedere la dimostrazione della surgettività di f nel teorema).
Per trovare una coppia (r,s)T, possiamo fissare un intero r>0, e cercare un intero s0 tale che si
abbia r2-n=s2 : se r2-n =0 allora s=0, n=r2, a=b=r; se invece r2-n >0 si può usare il test già esaminato
in precedenza per verificare se il numero naturale r2-n è un quadrato perfetto di base naturale
opportuna s.
Dovendo essere r2-n=s20, si ha r n , dunque il valore minimo da fissare per r è r= n .
Per quanto riguarda il valore massimo di r, notiamo che al crescere di r, cresce il valore
corrispondente di a (se esiste) nella coppia (a,b): se r1>r, e se n=r2-s2=r12-s12 , allora s1>s, dunque
a=r+s<a1=r1+s1 . Poiché in una fattorizzazione non banale di n (dispari) certamente é an/3 (perché
n=ab con b3), e ricordando che r=(a+b)/2, si ottiene che il valore massimo per r è la parte intera di
[(n/3)+3]/2=(n+9)/6.
Dunque, l’algoritmo di fattorizzazione di Fermat si può implementare nel modo seguente:
- input n intero dispari >1
- per r= n ,  n  +1,……, (n+9)/6 si testa se r2-n è un quadrato perfetto di base s0 e in
caso affermativo si esce con output “n=ab dove a=r+s, b=r-s”
- se nel ciclo precedente nessun test ha avuto esito positivo, si esce con output “n è primo”
Notiamo che ogni passo del ciclo ha complessità polinomiale (test del quadrato perfetto già
illustrato in una lezione precedente), ma il numero dei passi è maggiorato da funzioni esponenziali
nella lunghezza binaria k di n (perché n<2k , n < 2 k).
Notiamo anche, come già premesso, che il test di Fermat trova un fattore non banale di n in tempi
ragionevoli se n ha un fattore abbastanza “ grande” cioè  n , perché in tale caso, se n=ab, anche
b n , dunque r=(a+b)/2 n , ossia il valore r che nel ciclo permette di trovare la fattorizzazione
di n è “vicino” alla radice quadrata di n, e dunque (partendo dal valore iniziale r= n ) tale valore
viene trovato relativamente “presto”.
Esempio.
Se l’input é n=6077,  n =78, (n+9)/6=1014, il ciclo si dovrà eseguire per r=78, 79,…., 1014 e
si ha:
r=78  r2-n =7 (non quadrato)
r=79  r2-n =164 (non quadrato)
r=80  r2-n =323 (non quadrato)
r=81  r2-n =484 =222
ottenendo la fattorizzazione n=ab dove a=r+s=81+22=103, b=r-s=81-22=59.
Algoritmo di fattorizzazione  di Pollard.
Premettiamo alcune considerazioni su un argomento di Calcolo delle Probabilità.
Siano n,m numeri naturali con 1<n<m, S un insieme finito di cardinalità m e sia data una
successione finita di n termini scelti in S (anche non distinti):
a1, a2, ……, an
in modo che gli ai siano scelti random in modo “uniforme” (dal punto di vista della probabilità) fra
gli elementi di S (nel senso che per ogni indice i, ogni elemento dell’insieme S ha la stessa
probabilità di essere scelto come elemento ai).
Calcoliamo la probabilità che almeno 2 degli elementi della successione coincidano.
Calcoliamo dapprima la probabilità che tutti gli elementi della successione siano distinti.
Fissato a1, la probabilità che a2 sia diverso da a1 è (m-1)/m; fissati a1,a2 distinti, la probabilità che a3
sia diverso da a1 e da a2 è (m-2)/m , quindi la probabilità che a1, a2, a3 siano tutti distinti è il
prodotto [(m-1)/m][(m-2)/m]=(1-1/m)(1-2/m)
Iterando il ragionamento si ottiene che la probabilità che a1, a2, ….., an siano tutti distinti è il
prodotto:
(1-1/m)(1-2/m)……(1-(n-1)/m).
Dallo sviluppo in serie ex=1+x+x2/2!+…, possiamo approssimare 1+x con la funzione ex, di modo
che ogni fattore del prodotto precedente è approssimato (ponendo x= -i/m con i=1,….,n-1) dalla
n ( n -1)
e 2m

-i/m
funzione e . Dunque il prodotto è approssimato dalla funzione
(tenendo conto che la
soma 1+2+….+(n-1) coincide con n(n-1)/2): per n “grande” possiamo approssimare n(n-1) con n2,
di modo che la probabilità che tutti gli elementi della successione siano distinti è approssimata dalla

n2
2m e dunque la probabilità che almeno 2 degli elementi a1, a2, ….., an coincidano è
funzione e
(con approssimazione) la seguente funzione di n,m:
p(n,m)  1  e

n2
2m
Se allora fissiamo un valore di probabilità p con 0<p<1, il numero n degli elementi di una
successione per i quali sia p la probabilità che fra essi almeno 2 coincidano è approssimativamente:
1
)]
n  2m[log e (
1 p
In particolare per esempio se fissiamo una probabilità del 50% (p=0.5), si ottiene n  1,77 m ,
mentre se se fissiamo una probabilità del 90% (p=0.9), si ottiene n  2,14 m .
Dunque se scegliamo in successione in modo “random” elementi dell’insieme S:
a1, a2, a3, ………………..
il minimo indice n per cui l’elemento an coincide con almeno uno degli elementi che lo precedono è,
dal punto di vista probabilistico, di ordine O( m ).
Un’applicazione di tale teoria é appunto il cosiddetto “paradosso dei compleanni”: se sono scelte
random un numero n di persone con 1<n<365, la probabilità che almeno 2 fra esse compiano gli

n2
730
anni nello stesso giorno e mese dell’anno è  1  e
; inoltre, fissato un valore di probabilità p
con 0<p<1, il numero n di persone (scelte random) per le quali la probabilità che fra esse almeno 2
1
)]
compiano gli anni nello stesso giorno e mese dell’anno è  730[log e (
1 p
(tutto questo supponendo che giorno e mese di nascita degli esseri umani siano distribuiti in modo
uniforme fra i 365 giorni dell’anno, il che non è vero in pratica).
Per esempio se la probabilità fissata è del 50% (p=0,5), n  730[log e 2 ]  23: scegliendo 23
persone in modo random, la probabilità che fra esse almeno 2 compiano gli anni nello stesso giorno
e mese dell’anno è  50% (abbastanza paradossale…..).
Scegliendo invece 50 persone in modo random, la probabilità che almeno 2 fra esse compiano gli
anni nello stesso giorno e mese dell’anno è addirittura  97%.