• Non ci sono risultati.

Teoria dei numeri e Crittografia: lezione dell’ 11 aprile 2011 Nota storica: il più grande numero primo conosciuto attualmente è il numero 243.112.609-1

N/A
N/A
Protected

Academic year: 2021

Condividi "Teoria dei numeri e Crittografia: lezione dell’ 11 aprile 2011 Nota storica: il più grande numero primo conosciuto attualmente è il numero 243.112.609-1"

Copied!
1
0
0

Testo completo

(1)

Teoria dei numeri e Crittografia: lezione dell’ 11 aprile 2011

Nota storica: il più grande numero primo conosciuto attualmente è il numero 2

43.112.609

-1 (è uno dei cosiddetti numeri di Mersenne della forma 2

n

-1, che studieremo in seguito). Esso ha 12.978.189 cifre (in base 10) ed è stato trovato nell’Agosto 2008 nell’ambito del progetto GIMPS (Great Internet Mersenne Primes Search: vedere il sito www.mersenne.org).

Un test di primalità è un algoritmo che permette di testare se un numero naturale a>1 dato in input è primo o no: l’output di un tale algoritmo è dunque “a è primo” oppure “a non è primo”..

Il più “ingenuo” dei test di primalità consiste ovviamente nell’effettuare le divisioni di a per i numeri naturali j=2,3,…,a-1 : se per uno di tali j la divisione ha resto 0 l’output è “a non è primo”;

in caso contrario l’output è “a è primo”. Se x=L(a) è la lunghezza binaria dell’input, ogni divisione ha complessità di ordine non superiore ad O(x

2

), ma il numero di divisioni, come funzione dell’input a, è f(a) = (a-2) (nel caso peggiore): poiché 2

x-1

-2  a-2 < 2

x

-2, se consideriamo il numero di divisioni come funzione g(x) della lunghezza binaria x, in termini di ordine si ha

O(2

x

) = O(2

x-1

-2)  O(g(x)) O(2

x

-2)=O(2

x

)

dunque il numero di divisioni ha ordine esponenziale e tale algoritmo non è perciò “efficiente”.

Osservazione. Il ragionamento applicato sopra si può applicare in tutte le situazioni simili: se una funzione f(a) dell’input a è di ordine lineare, la stessa funzione, considerata come funzione della lunghezza binaria x di a, è di ordine esponenziale O(2

x

); con lo stesso ragionamento si può dimostrare che più in generale se f(a) è di ordine polinomiale di grado m, allora la stessa funzione, considerata come funzione della lunghezza binaria x di a, è di ordine esponenziale O((2

m

)

x

).

Il test di primalità sopra esposto può essere reso più efficiente limitandosi per esempio ad input a dispari (un numero pari a non è primo tranne nel caso banale a=2) ed effettuando quindi le divisioni solo per i valori dispari j con 1<j<a, ma anche in questo caso il numero delle divisioni è di ordine lineare rispetto ad a, quindi di ordine esponenziale rispetto ad x.

Una efficienza ancora superiore si può ottenere con la seguente osservazione: se a non è primo esiste un suo divisore non banale 

a

(se infatti a=bc con b,c divisori non banali di a, e se per assurdo fosse b, c >

a

, seguirebbe a>(

a

)

2

, contraddizione). Dunque nell’algoritmo precedente si potrebbero effettuare solo le divisioni per i valori j con 1<j

a

quindi stavolta il numero di divisioni sarebbe di ordine O(

a

)<O(a) come funzione di a, ma purtroppo ancora di ordine esponenziale O((2

1/2

)

x

) come funzione di x .

Problema

1) Esiste un test di primalità di complessità non superiore alla polinomiale ?

Il problema è rimasto aperto per molto tempo: dagli esempi precedenti era chiaro come la strategia migliore fosse quella di trovare una proprietà “intrinseca” dei numeri primi che si potesse testare con un algoritmo di complessità polinomiale, e non quella di trovare un eventuale divisore non banale dell’input.

Il problema 1) è stato infine risolto nel 2003 da Agrawal, Kayal, Saxena nel loro articolo “Primes in P”, con la costruzione di un test di primalità di complessità polinomiale, ormai noto come “test AKS” (test di cui ci occuperemo in seguito).

I test di primalità (così come sono stati da noi finora) definiti sono test di primalità deterministici

nel senso che, dato in input un numero naturale a>1, essi forniscono come output “a è numero

primo” se e solo se l’input a è un numero primo.

(2)

Esistono però i cosiddetti test di primalità probabilistici nei quali vi è la scelta casuale di alcuni elementi utilizzati durante l’esecuzione dell’algoritmo e nei quali, se l’input a è primo, l’output è sempre (correttamente) “a è un numero primo”, ma se a non è primo l’output può essere talvolta (non correttamente) “a è un numero primo”, e la probabilità di tale errore è maggiorata da una costante C<1 indipendente sia dall’input che dagli elementi casuali. In questo caso eseguendo k volte il test sullo stesso input a, se l’output fosse tutte le volte “a è primo” si potrebbe dichiarare che l’input a è effettivamente un numero primo con una probabilità di errore maggiorata da C

k

(quantità che si può rendere piccola a piacere).

Sono ben noti da tempo test di primalità probabilistici di complessità polinomiale (come il test di Rabin-Miller, anche questo oggetto in futuro del nostro studio, nel quale la costante C è 1/4).

E’ anche utile notare che esistono test di primalità deterministici di complessità polinomiale, ma che sono validi solo per numeri naturali particolari (per esempio i numeri di Fermat della forma 2

n

+1, oppure i numeri di Mersenne della forma 2

n

-1): anche di questi test parleremo in seguito.

Un algoritmo di fattorizzazione è invece un algoritmo che, dato in input un numero naturale a>1, calcola tutti i fattori primi della sua fattorizzazione.

In generale un algoritmo di fattorizzazione si limita, dato l’input a>1, a cercare un divisore non banale b di a (se b non esiste si conclude che a è primo e che ha la sola fattorizzazione banale a=a): una volta trovato b si pone c = a/b in modo che si abbia a = bc, e si applica di nuovo l’algoritmo ai fattori b, c : così procedendo dopo un numero finito di passi l’algoritmo trova i fattori primi della fattorizzazione di a.

Illustreremo in seguito vari algoritmi di fattorizzazione più o meno efficienti (algoritmo di Fermat, algoritmo di Pollard etc….).

Problema

2) Esiste un algoritmo di fattorizzazione di complessità non superiore alla polinomiale ?

Al contrario del problema 1), il problema 2) attualmente non è stato risolto (e molti matematici sono

convinti che non abbia soluzione).

Riferimenti

Documenti correlati

[r]

Infatti basta per esempio scegliere m=minimo naturale ³j che sia multiplo di k-j : per tale scelta di m si ha allora b m =b 2m (perché m,2m³j, e perché 2mm (mod k-j),

[r]

Alcuni dei principali argomenti trattati nel corso saranno i seguenti: studio della Teoria dei Numeri (soprattutto l’aritmetica dei numeri interi e in particolare dei numeri

Quest’ultimo risultato dimostra che nella stima dell’ordine della somma di funzioni “prevale” quella di ordine maggiore (se gli ordini delle 2 funzioni sono confrontabili): se

Nella lezione precedente abbiamo detto che sceglieremo come operazione elementare (che funga da “unità di misura” della complessità di un algoritmo) l’operazione di somma sui

Il test di primalità sopra esposto può essere reso più efficiente limitandosi per esempio ad input a dispari (un numero pari a non è primo tranne nel caso banale a=2) ed

La dimostrazione precedente fornisce anche un algoritmo per il calcolo di una soluzione x (se essa esiste cioè se db): basta moltiplicare t (ottenuto dividendo b per d) per