Universit`a degli Studi di Milano Bicocca

Università degli Studi di
Milano Bicocca
Facoltà di Scienze Matematiche Fisiche e Naturali
Corso di Laurea in Informatica
Problemi computazionalmente intrattabili e
alcune loro applicazioni in crittografia
SUPERVISORI: Dr. Alberto Leporati
Prof. Claudio Ferretti
Relazione della prova finale di:
Carlo Comin
Matr. n. 072278
Anno Accademico 2007/2008
Il contributo della tesi
Il contributo principale di questo lavoro consiste nel dare una esposizione personale, tecnica e sistematica di alcuni articoli e risultati riguardanti le relazioni tra la teoria della Complessità Computazionale,
i fondamenti della Crittografia moderna e la teoria dei Numeri. Proveremo alcuni fatti in modo indipendente o rielaborato rispetto a quanto
abbiamo trovato in letteratura. Nel fare questo vogliamo presentare una trattazione il più completa possibile, cercando di ricostruire in
modo personale tutti i dettagli (che negli articoli sono spesso tralasciati, sia per ragioni di spazio, sia perchè ritenuti verificabili più o
meno facilmente dagli esperti nel campo) degli argomenti studiati. In
questo modo speriamo di mostrare, da un lato, l’unità che crediamo
leghi Matematica e teoria della Complessità Computazionale, intesa
come scienza che studia la natura dei problemi effettivi e computazionalmente (in)trattabili, e, dall’altro, le importanti applicazioni che
emergono da tale unità, nel caso specifico in Crittografia.
Introduzione
La tesi è orginizzata nel seguente modo.
Nel “Capitolo 1 - Preliminari” vengono sommariamente fornite le denifinizioni rigorose dei concetti utilizzati nei capitoli successivi, inoltre
vengono dati gli enunciati di alcuni fatti basilari necessari per la completa comprensione dei contenuti. Nel primo paragrafo si danno gli
elementi di Teoria della Computabilità e Complessità: si chiarisce l’idea di macchina di Turing, di computazione con oracolo e si definiscono
le classi di complessità utili in seguito. Nel secondo paragrafo vengono
dati i prerequisiti di Teoria dei Numeri Elementare e le definizioni riguardanti i Campi di Numeri.
In questo primo capitolo, per la precisione nel terzo paragrafo, studiamo anche il metodo per decidere la primalità dovuto ad Agrawal,
Kayal e Saxena [3]. Il risultato di questi tre informatici indiani risolve
un problema che è rimasto aperto sin dalla nascita della teoria della
Complessità Computazionale (anni Sessanta e Settanta), anche se i matematici hanno cercato metodi informalmente efficienti per la primalità
sin dai tempi dell’antica Grecia con Eratostene di Cirene (276 a.C. - 194
a.C.) ed il suo famoso Crivello. Il metodo di Agrawal, Kayal e Saxena
è fenomenale non solo perchè risolve una questione rimasta aperta per
molto tempo, ma anche perchè sfrutta considerazioni molto ingegnose
e articolate ma matematicamente elementari, nel senso che viene usata
poca “teoria” rispetto alla pratica comune della Matematica moderna.
In particolare vengono sfruttati solo alcuni fatti sui polinomi ciclotomici, e ragionamenti di carattere combinatorio. Per questo motivo il
risultato è stato accolto con molto stupore dalla comunità dell’Informatica Teorica e anche dai matematici, sono significative le parole di
i
ii
Paul Leyland [8]: “Adesso tutti si chiedono quali altre cose [relativamente semplici] ci siano sempre sfuggite”. Questo ci fa capire come, in
questo campo, soluzioni molto ingegnose ma relativamente elementari
possono rimanere celate agli occhi di tutti gli esperti per intere decadi.
Nell’ultimo paragrafo del Capitolo 1 definiamo formalmente i problemi
intrattabili che sono materia di studio principale in questa tesi: vale a
dire il problema della fattorizzazione di interi, il problema del logaritmo discreto ed il problema di Diffie-Hellman.
Nel “Capitolo 2 - Fattorizzazione di Interi” studiamo i metodi per la
fattorizzazione di interi basati sulla tecnica del Crivello algoritmico:
vale a dire il Crivello Quadratico ed il Crivello su Campi di Numeri.
Questi due metodi costituiscono, ad oggi, lo stato dell’arte per quanto
riguarda gli algoritmi per la fattorizzazione di interi. L’analisi rigorosa
del tempo di calcolo asintotico di questi metodi è un problema ancora
aperto. In questo capitolo studiamo delle analisi euristiche, ovvero basate su congetture e assunzioni che non sono ancora state dimostrate
con rigore, ma che sono ritenute verosimilmente correte dagli esperti. Queste considerazioni euristiche portano ad un tempo di calcolo
asintotico sub-esponenziale. In merito a questo ci sembra interessante
l’osservazione di Crandall e Pomerance [14]: “In partica, non c’è alcuna ragione per non usare un metodo euristico [...] solo perchè i teorici
non sono ancora abbastanza in gamba da fornire una dimostrazione
rigorosa della correttezza e del tempo di calcolo.”
Nel “Capitolo 3 - Logaritmo Discreto” diamo una esposizione dettagliata di un risultato
teorico che si deve a Victor Shoup [28]: un limite
√
inferiore di Ω( n) per la complessità computazionale in tempo del problema del logaritmo discreto, relativamente al modello di calcolo degli
algoritmi generici. In breve, questo modello di calcolo studia la classe degli algoritmi che non sfruttano alcuna informazione riguardo alla
struttura algebrica del gruppo su cui si lavora e riguardo alla codifica
degli elementi del gruppo. Come vedremo, l’idea di base consiste nel
mostrare che se un algoritmo generico non trova una certa “collisione”
tra gli elementi del gruppo, allora non conosce nemmeno l’istanza del
problema che gli viene fornita in ingresso, e dunque non ha modo di
risolvere il problema. In seguito
si tratterà di mostrare che tale “colli√
sione” richiede tempo Ω( n) per essere trovata.
In secondo luogo, studiamo un algoritmo generico, il metodo Baby Step
Giant Step di Shanks, e un algoritmo non generico, l’Index Calculus.
Vedremo che quest’ultimo algoritmo si basa su considerazioni del tutto
simili a quelle che permettono di disegnare il Crivello Quadratico per
la fattorizzazione di interi.
In entrambi i capitoli 2 e 3 ci soffermiamo sulle applicazioni di questi
Introduzione
iii
problemi nella sicurezza di alcune primitive crittografiche, in particolare discutiamo sommariamente i ben noti RSA, ElGamal e lo scambio
di chiavi di Diffie-Hellman.
Nel “Capitolo 4 - Riduzioni tra problemi” ci proponiamo di studiare da un punto di vista teorico le relazioni di riducibilità tra i problemi
intrattabili studiati algoritmicamente nei capitoli precedenti. Discutiamo, per prima cosa, l’auto-riducibilità probabilistica, e la sua importanza nella scelta delle primitive crittografiche. In secondo luogo diamo
una esposizione auto-contenuta e personale
• della riduzione di Eric Bach [4], la quale afferma che il problema della fattorizzazione di interi si riduce in tempo atteso polinomiale, nel senso di riduzione di Turing-Cook, sia al problema
del calcolo della ϕ(·) di Eulero sia al problema del logaritmo
discreto sui sottogruppi ciclici di (Z/nZ)∗ , per n composto,
• della riduzione di Biham, Boneh, e Omer Reingold [6], la quale
afferma che la fattorizzazione degli interi di Blum è riducibile
al problema di Diffie-Hellman generalizzato a k ≥ 2 utenti.
Nell’ultimo capitolo, il “Capitolo 5 - Alcune considerazioni sperimentali”, proponiamo alcune implementazioni e test usando il linguaggio
PARI/GP. Tale linguaggio è stato inizialmente sviluppato da Henri Cohen come libreria C per eseguire in modo semplice computazioni con
numeri interi molto grandi e con strutture algebriche usate in Teoria
dei Numeri. In questo Capitolo 5, per prima cosa, prendiamo spunto
da un esercizio proposto in [17] (cioè “dimostrare che per ogni primo
r esiste solo un numero finito di numeri di Carmichael del tipo rqp ”)
per ottenere un algoritmo per la generazione di tutti e soli i numeri di
Carmichael del tipo rqp per r un primo fissato e r < q < p. Di tale
algoritmo diamo un’ analisi asintotica del tempo di calcolo e diamo una
implementazione seguita da alcuni test.
In secondo luogo, proponiamo una implementazione dell’algoritmo generico di Shanks per il Logaritmo Discreto, il metodo Baby Step Giant
Step, ed eseguiamo alcuni test per il tempo di calcolo.
Infine, testiamo il Crivello Quadratico per la fattorizzazione di interi implementato nella primitiva factorint() di PARI/GP generando
istanze pseudo-casuali di dimensione via via crescente.
iv
Ringraziamenti
Desidero ringraziare il mio relatore, il Dr. Alberto Leporati, e il mio
correlatore, il Prof. Claudio Ferretti, per avermi permesso di studiare in
questo lavoro di tesi argomenti per me affascinanti ed incredibilmente
appassionanti. Li ringrazio anche per la loro infinita disponibilità, per i
loro consigli sul Capitolo 5 e per le correzioni e osservazioni riguardanti
versioni preliminari e finali di tutto l’elaborato. Ringrazio tutti i miei
familiari perchè mi hanno sempre sostenuto e incoraggiato. Devo un
ringraziamento speciale a mia mamma, Marisa, e agli zii Loredana e
Ennio: vi ringrazio per tutto quello che fate per me, questa tesi è a voi
tre dedicata.
Indice
Il contributo della tesi
Introduzione
Ringraziamenti
i
i
iv
Capitolo 1. Preliminari
3
1. Computabilità e Complessità Computazionale
3
2. Teoria dei Numeri e Crittografia
7
3. Decidere la primalità in tempo polinomiale deterministico: il metodo AKS 13
4. Problemi Intrattabili
22
Capitolo 2. Fattorizzazione di Interi
1. Il Crivello di Eratostene
2. Il Crivello Quadratico
3. Il Crivello su Campi di Numeri
4. Applicazioni in Crittografia
25
25
30
37
47
Capitolo 3. Logaritmo Discreto
1. Il limite inferiore generico di Shoup
2. Un algoritmo generico: Baby-Step Giant-Step di Shanks
3. Un metodo non generico: l’Index Calculus
4. Applicazioni in Crittografia
51
51
56
56
57
Capitolo 4. Riduzioni tra problemi
1. Auto-riducibilità probabilistica
2. Relazioni di riducibilità tra problemi
59
59
61
Capitolo 5. Alcune considerazioni sperimentali
73
1. Un generatore di numeri di Carmichael con esattamente tre fattori primi 73
2. Alcuni test per il Logaritmo Discreto
77
3. Alcuni test per la Fattorizzazione di Interi
80
Bibliografia
83
1
CAPITOLO 1
Preliminari
Questo primo capitolo è organizzato in quattro sezioni. Nelle prime
due forniamo le definizioni e i fatti basilari su cui sono costruiti i capitoli
seguenti. Queste due sezioni possono essere inizialmente tralasciate dal
lettore esperto e possono essere usate come riferimento solo secondo
necessità. Nella Sezione 1 introduciamo alcuni concetti preliminari di
Teoria della Calcolabilità e Complessità Computazionale, mentre nella
Sezione 2 forniamo gli elementi di Teoria dei Numeri che usiamo nel
resto della tesi.
La Sezione 3, invece, contiene una esposizione dettagliata e completa
del metodo per decidere la primalità di Agrawal, Kayal e Saxena [3].
Per quanto riguarda questa sezione il nostro sforzo consiste nell’aver
dimostrato in dettaglio tutti i fatti che nell’articolo orginale vengono
tralasciati. La nostra speranza è quella di aver fornito una esposizione
del metodo AKS più accessibile e completa rispetto a quelle presenti in
letteratura. Infine nella Sezione 4 si trovano le definizioni formali dei
problemi intrattabili che tratteremo nei capitoli che seguiranno.
1. Computabilità e Complessità Computazionale
Storicamente possiamo collocare la nascita della Teoria della Computabilità negli anni trenta. Alonzo Church e Stephen Kleene introducono il Lambda Calcolo, e poco più tardi nel 1936 Alan Turing propone
indipendentemente un modello oggi noto come “macchina di Turing”.
Le macchine di Turing oggi sono alla base della Teoria della Complessità Computazionale, dato che costituiscono un modello matematico
della nozione comune di algoritmo pittosto comodo e vagamente simile
alle moderne macchine calcolatrici. Nella tesi non avremo mai a che
fare con i dettagli formali delle macchine di Turing, dato che daremo
descrizioni ad alto livello di tutti gli algoritmi. Risulta però fondamentale dare una definizione formale di tale modello per poter trattare le
classi di complessità, le riduzioni, e per chiarire che quando parleremo
di “algoritmo” ci riferiremo implicitamente ad una qualche macchina
di Turing. In altre parole, le descrizioni ad “alto livello” degli algoritmi
che tratteremo potranno essere viste come delle specifiche sommarie di
una macchina di Turing. Il vantaggio di questo punto di vista consiste nell’avere un modello matematico rigoroso dell’idea di algoritmo,
che altrimenti sarebbe lasciato alla nostra intuizione. In letteratura
3
4
1. PRELIMINARI
esistono molteplici definizioni formali delle macchine di Turing, ma si
rivelano del tutto equivalenti. Qui proponiamo la seguente.
Definizione 1.1 (Macchina di Turing deterministica, DTM). Una
macchina di Turing deterministica M è una settupla del tipo
M := (Q, Σ, Γ, δ, q0 , B, F )
dove
• Q è un insieme finito non vuoto detto insieme degli stati di
M.
• Σ è un insieme finito detto insieme dei simboli di ingresso.
• Γ è un insieme finito non vuoto detto insieme dei simboli di
nastro tale che Γ ⊃ Σ.
• δ è una funzione parziale del tipo δ : Q × Σ → Q × Γ × {L, R}
detta funzione di transizione.
• q0 è un elemento di Q detto stato iniziale di M.
• B è un elemento di Γ detto simbolo di blank.
• F è un inisieme finito detto insieme degli stati accettanti e
F ⊆ Q.
Definiamo ora il modo in cui una TM esegue una computazione.
Definizione 1.2 (Computazione di una DTM). Una descrizione
istantanea I di una DTM è una sequenza finita del tipo
I := X1 X2 . . . Xi−1 qXi . . . Xn
dove Xj ∈ Γ per ogni j e q ∈ Q. Una computazione C di una TM è
una sequenza finita o infinita di descrizioni istantanee
C := I0 , I1 , I2 , . . .
tale che
• I0 := q0 S1 . . . Sk per qualche k ∈ N e per S1 . . . Sk ∈ Σ∗ ;
S1 . . . Sk viene detto l’input della macchina di Turing e in tal
caso comunemente si dice che la macchina si trova nello stato
iniziale q0 e che la sua testina legge il primo simbolo in ingresso
S1 (a patto che S1 . . . Sk sia diverso dalla stringa vuota).
• Assumiamo che Ii = X1 X2 . . . Xi−1 qXi Xi+1 . . . Xn . Se δ(q, Xi )
= (p, Y, L) allora Ii+1 = X1 X2 . . . Xi−2 pXi−1 Y Xi+1 . . . Xn , altrimenti se δ(q, Xi) = (p, Y, R) allora Ii+1 = X1 X2 . . . Y qXi+1
. . . Xn , se δ(q, Xi ) non è definita allora Ii+1 non è definita,
vale a dire che C = I0 , . . . , Ii e diciamo che la macchina si
arresta dopo i passi.
• Il punto sopra presenta alcune eccezioni che, parlando informalmente, riguardano il caso in cui q si trovi a leggere X1 e
vada a sinistra o il caso in cui si trovi a leggere Xn e vada a
destra. La formalizzazione di questi casi particolari è diretta,
1. COMPUTABILITÀ E COMPLESSITÀ COMPUTAZIONALE
5
diciamo solo che si considerano descrizioni istantanee del tipo
qBX1 . . . Xn e X1 . . . Xn qB dove B è il simbolo di blank.
Se la macchina si arresta su uno stato accettante q ∈ F , diciamo che
la macchina accetta il suo ingresso S1 . . . Sk , in caso contrario diciamo
che la macchina rifiuta il suo ingresso.
Per quanto riguarda le macchine di Turing non deterministiche
(NTM) è sufficiente dire che una TM non deterministica è in tutto e per tutto uguale ad una TM deterministica con la sola eccezione che δ non è una funzione ma una relazione, formalmente δ ⊆
(Q × Σ) × (Q × Γ × {L, R}). Similmente, la definizione di computazione per una macchina di Turing non deterministica ricalca la Definizione
1.2 e si ottiene direttamente sostituendo le relazioni di uguaglianza, =,
con relazioni di appartenenza ad insiemi, ∈. Anche per le macchine
di Turing probabilistiche esistono diverse formalizzazioni tra loro equivalenti ma, per quanto ci riguarda, è sufficiente considerare una DTM
che ha la possibilità di usare una funzione, o relazione, δ ′ oltre a δ: δ ′
scrive sul nastro i simboli “0” oppure “1” scegliendo in modo casuale
uniforme. Equivalentemente possiamo considerare una macchina con
accesso ad un ulteriore nastro con simboli “0”, “1” già presenti e distribuiti in maniera casuale uniforme. Per una DTM o una NTM M,
diremo che un linguaggio L è deciso da M se M con ingresso l si arresta
su uno stato accettante quando e solo quando l ∈ L; considereremo il
contenuto del nastro nel momento dell’arresto come l’output di M, e
lo denoteremo con M(l) ↓. Denotiamo con M(l) ↑ il caso in cui M con
input l non si arresti mai. Nel caso delle macchine di Turing probabilistiche parleremo ancora di linguaggi decisi, ma sarà possibile che la
macchina commetta degli errori.
Ora esplicitiamo la notazione asintotica che useremo e diamo la definizione delle classi di complessità che citeremo nelle sezioni 3 e 4.
Definizione 1.3 (Notazione Asintotica). Sia f una funzione a valori reali e sia g una funzione a valori reali positivi, diciamo che f è O
grande di g, e scriviamo f = O(g), se esistono costanti positive M e c
tali che, per ogni x > M, |f (x)| ≤ c · g(x).
Definizione 1.4. Sia t(n) : N → N una funzione, definiamo le
seguenti classi di complessità
TIME(t(n)) := {L | L è un linguaggio deciso da una TM
Mdeterministica che si arresta su ogni input di
dimensione n in tempo O(t(n))}
Definiamo in modo del tutto analogo NTIME(t(n)), ma considerando
TM non deterministiche. Definiamo poi
[
[
NTIME(nk )
TIME(nk )
NP :=
P :=
k∈N
k∈N
6
1. PRELIMINARI
Definiamo
PrTIME(t(n), Y, N) := {L | L è un linguaggio deciso da una TM M
probabilistica in tempo O(t(n)) e M è tale che
se l ∈ L allora M(l) accetta con probabilità ≥ Y
se l 6∈ L allora M(l) accetta con probabilità ≤ N}
[
[
PrTIME(nk , 1/2, 0)
PrTIME(nk , 2/3, 1/3)
RP :=
BP P :=
k∈N
k∈N
Definiamo infine la classe ZPP come l’insieme dei linguaggi per i quali
esiste una macchina di Turing probabilistica che restituisce sempre la
risposta corretta, ma che ha solo tempo di calcolo atteso polinomiale.
In altre parole, per alcuni ingressi il tempo può essere sub-esponenziale
o esponenziale, ma in media è polinomiale.
Per una qualsiasi classe C denotiamo con co-C la classe che contiene
i linguaggi L tali che il linguaggio complemento di L appartiene a C.
Notiamo subito che le classi di complessità definite si riferiscono a
problemi di tipo decisionale mentre noi avremo a che fare anche con
problemi di calcolo di funzioni o relazioni, cioè problemi del tipo: dato
x calcolare f (x), o dato x calcolare y tale che (x, y) ∈ R, dove R è una
relazione. È possibile definire formalmente delle classi di complessità
per tali tipi di problemi che ricalcano in tutto e per tutto quelle viste, ad
esempio parallelamente a P ed NP si possono definire le classi note come
FP e FNP. Per non appesantire l’esposizione noi ci riferiremo solamente
alle classi decisionali P, NP, ... la versione effettiva di tali classi e dei
problemi considerati, di tipo decisionale o funzionale, risulterà sempre
evidente dal contesto.
Chiariamo ora informalmente cosa intendiamo per “problema relativo”
e per “oracolo”, concetti utilizzati nel Capitolo 4.
Definizione 1.5. Per qualsiasi problema A e B, siano essi di tipo
decisionale o funzionale, denotiamo con AB il problema A relativo a
B, vale a dire il problema di risolvere A avendo a disposizione una
scatola nera, chiamata oracolo, per B. Possiamo definire un oracolo
con un nastro supplementare n di una TM M tale che, ogniqualvolta
una stringa s viene scritta su n, M conosce in un singolo passo di
computazione se s ∈ B.
Nella Sezione 4 parleremo di riduzioni: ad essere precisi, intenderemo sempre riduzioni di Turing-Cook, di cui diamo una definizione
informale nella seguente.
Definizione 1.6. Diciamo che un problema, decisionale o funzionale, A è Turing-Cook riducibile ad un problema B relativamente alla
classe di complessità C se AB ∈ C, ovvero se esiste una macchina di
Turing M con accesso ad un oracolo per B che risolve A con un tempo
di calcolo e comportamento (deterministico, non deterministico, oppure
2. TEORIA DEI NUMERI E CRITTOGRAFIA
7
probabilistico) specificato dalla classe C. Denoteremo questo fatto con
la notazione A ≤C
T B, dove C è la classe di complessità e la lettera “T”
ci ricorda che si sta parlando di riduzioni di Turing-Cook.
Quando parleremo di complessità sub-esponenziale del tempo di
calcolo dei Crivelli per la fattorizzazione di interi, risulterà comoda la
seguente.
Definizione 1.7. Siano α, c costanti reali tali che c > 0 e 0 ≤ α ≤
1. Definiamo Ln [α, c] nel seguente modo
α
1−α c+o(1)
ln n
ln ln n
Ln [α, c] := O e
2. Teoria dei Numeri e Crittografia
La Teoria dei Numeri è un ramo della Matematica che studia, in
primo luogo, le proprietà dei numeri interi. I primi studi rigorosi risalgono all’antica Grecia: ad esempio negli Elementi di Euclide (300 a.C.)
troviamo una dimostrazione molto elegante e semplice dell’infinità dei
numeri primi. La teoria dei Numeri è rimasta per molto tempo materia di studio dei matematici puri e assolutamente priva di applicazioni.
Oggi, come è noto, costituisce anche le fondamenta su cui si basa gran
parte della Crittografia moderna: dalla difficoltà di alcuni problemi
dipende la sicurezza di metodi crittografici largamente diffusi. In questa sezione trattiamo la notazione che useremo nel resto della tesi, e
forniamo alcune definizioni e proposizioni preliminari.
2.1. Notazione. Indichiamo con N := {0, 1, 2, . . .} l’insieme dei
numeri naturali, con N0 := N \ {0}, con Z := {. . . , −2, −1, 0, 1, 2, . . .}
l’insieme dei numeri interi, con Q i numeri razionali, con R i numeri
reali e con C i numeri complessi. Denotiamo con mcd(a, b) il massimo
comune divisore tra gli interi a, b e con mcm(a, b) il minimo comune
multiplo. Scriviamo a | b se esiste c tale che b = c · a e a ≡ b (mod n)
per indicare che n | (a − b). Usiamo ak ||b quando ak | b e ak+1 ∤ b. Se
n ∈ Z e r ∈ N sono tali che mcd(n, r) = 1 allora usiamo la notazione
or (n) per indicare l’ordine di n modulo r, vale a dire il più piccolo intero
n!
positivo a tale che na ≡ 1 (mod r). Indichiamo con nk = (n−k)!k!
il
n
coefficiente binomiale per n “scelto” k con la convenzione che k = 0
quando k < 0 oppure k > n. Se S è un insieme denotiamo
con #S
a
la cardinalità di S. Se q è un primo denotiamo con q il simbolo di
Legendre se n ∈ N denotiamo con na il simbolo di Jacobi. Useremo
la notazione lg n per il logaritmo in base due, ln n per il logaritmo in
base naturale e log n per il logaritmo in base dieci.
8
1. PRELIMINARI
2.2. Alcune proposizioni. Per comprendere al meglio le dimostrazioni che verranno è bene ricordare alcuni fatti. Di questi, ci permettiamo di tralasciare le dimostrazioni che sono presenti in quasi tutti
i testi introduttivi di Teoria dei Numeri, come ad esempio [22].
Il seguente teorema introduce, da un punto di vista non costruttivo, il
problema della fattorizzazione di interi trattato nel Capitolo 2.
Teorema 2.1 (Teorema Fondamentale dell’Aritmetica). Ogni intero non nullo n si fattorizza in modo unico, a meno dell’ordine dei
fattori, come
n = ±pe11 · · · pekk
dove p1 , . . . , pk sono primi distinti e e1 , . . . , ek sono interi positivi.
Dimostrazione. [22] pagina 23, teorema 1.16.
Proposizione 2.2. x ≡ y (mod mi ) per ogni i = 1, . . . , n se e solo
se x ≡ y (mod mcm(m1 , . . . , mn )).
Dimostrazione. [22] pagina 49, punto (3) del teorema 2.3.
Proposizione 2.3. Sia p un numero primo dispari e α ≥ 1 un
intero. Allora x2 ≡ 1 (mod pα ) se e solo se x ≡ ±1 (mod pα ).
Dimostrazione. (⇒) La congruenza x2 ≡ 1 (mod pα ) equivale a
dire pα | (x − 1)(x + 1). Se, per assurdo, p dividesse entrambi x − 1 e
x+ 1 allora dividerebbe anche 2, contraddizione, e dunque p divide solo
uno dei due fattori, allora anche pα divide solo uno dei due fattori, e la
tesi segue. La direzione opposta (⇐) si verifica banalmente prendendo
il quadrato di entrambi i membri.
Teorema 2.4 (Teorema Cinese dei Resti). Siano m1 , . . . , mn n
numeri naturali a due a due coprimi, e a1 , . . . , an n numeri naturali
qualsiasi. Allora il sistema di congruenze
x ≡ ai
(mod mi ), per i = 1, . . . , n
ammette una e una sola soluzione modulo m1 m2 · · · mn .
Dimostrazione. [22] pagina 64, teorema 2.18.
Lavoreremo in seguito con il gruppo moltiplicativo delle unità dell’anello Z/nZ, che denotiamo con (Z/nZ)∗ . È interessante e utile vedere
dunque alcune note caratterizzazioni di tale gruppo. Consideriamo,
per ora, (Z/pZ)∗ per p primo.
Teorema 2.5. Per ogni primo p esiste una radice primitiva mod p.
Dimostrazione. [22], pagina 99, teorema 2.36.
È possibile estendere il risultato e provare che
Teorema 2.6 (Della radice primitiva). Esiste una radice primitiva
mod n se e solo se n = 1, 2, 4, pα, 2pα , per p primo dispari.
2. TEORIA DEI NUMERI E CRITTOGRAFIA
Dimostrazione. [22], pagina 104, teorema 2.41.
9
Il teorema della radice primitiva ci da quindi una condizione necessaria e sufficiente per la ciclicità di (Z/nZ)∗ . Notiamo inoltre che il
teorema cinese dei resti implica la seguente caratterizzazione dell’anello
Z/nZ e del suo gruppo moltiplicativo delle unità:
Teorema 2.7 (Caratterizzazione diQZ/nZ). Sia n un naturale positivo con fattorizzazione canonica n = i pei i . Allora Z/nZ è isomorfo
al seguente prodotto di anelli
Y
Z/pei i Z
Z/nZ ∼
=
i
∗
e in modo del tutto simile (Z/nZ) è isomorfo al seguente prodotto di
gruppi
Y
(Z/pei Z)∗
(Z/nZ)∗ ∼
=
i
i
Teorema 2.8 (Piccolo di Fermat). Sia a ∈ Z e p un numero primo.
Allora ap ≡ a (mod p). Se p ∤ a allora ap−1 ≡ 1 (mod p).
Dimostrazione. [22], teorema 2.7 a pagina 51.
Teorema 2.9 (di Euler-Fermat). Siano a ∈ Z e n ∈ N tali che
mcd(a, n) = 1. Allora aϕ(n) ≡ 1 (mod n).
Dimostrazione. [22], teorema 2.8 a pagina 51.
Concludiamo il paragrafo introducendo i numeri di Carmichael, che
mostreremo come costruire algoritmicamente nel Capitolo 5. Informalmente possiamo dire che un numero è di Carmichael se questo è un naturale composto che si comporta come un numero primo relativamente
al teorema di Fermat:
Definizione 2.1. Sia n un naturale composto. Se per ogni b ∈
Z/nZ tale che mcd(b, n) = 1 si ha bn−1 ≡ 1 (mod n) allora diciamo
che n è un numero di Carmichael.
I numeri di Carmichael hanno una certa importanza pratica: è ben
noto che il piccolo teorema di Fermat fornisce un metodo per decidere
se un numero è composto; per rendersene conto è sufficiente considerare la proposizione contro-nominale, infatti, dato il naturale n, possiamo scegliere in maniera casuale uniforme un intero 1 < b < n, e se
1 < mcd(b, n) < n oppure se bn−1 6≡ 1 (mod n) concludere che n deve essere composto. È evidente che un numero di Carmichael vanifica
questo test: per ogni base b, un numero di Carmichael viene dichiarato
“probabilmente primo” dal test di Fermat che abbiamo appena descritto, a meno che non si sia cosı̀ fortunati da indovinare un fattore non
banale di n quando si sceglie b.
10
1. PRELIMINARI
2.3. Funzioni Aritmetiche.
Definizione 2.2. Una funzione f si dice aritmetica se f : N → S
per qualche S ⊆ C. Una funzione aritmetica si dice additiva se per
ogni a, b ∈ N coprimi vale f (ab) = f (a) + f (b), si dice moltiplicativa
quando per ogni a, b ∈ N coprimi vale f (ab) = f (a)f (b).
Useremo le seguenti funzioni aritmetiche:
• La ϕ : N → N di Eulero, che definiamo come ϕ(n) := #{m ≤
n | m ∈ N, mcd(m, n) = 1} .
• ω : N → N che definiamo come il numero di primi distinti che
dividono n: ω(n) := #{p | n per p un numero primo}.
• π : N → N definita come π(n) := #{p ≤ n | p è un numero primo}.
Un fatto di fondamentale importanza legato alla funzione π(·) è il
Teorema dei Numeri Primi:
Teorema 2.10 (Teorema dei numeri Primi). Sia π(·) la funzione
aritmentica definita appena sopra. Vale il seguente limite
π(n)
lim
=1
n→∞ n/ ln n
2.4. Numeri Lisci. Nel Capitolo 2 useremo quanto segue.
Definizione 2.3. Chiamiamo N-lisci gli interi con fattori primi
esclusivamente minori o uguali al naturale N.
Per alcune considerazioni sul tempo di calcolo dei metodi basati
sul Crivello ci servirà la seguente stima sulla quantità dei numeri lisci,
formalizzata con la funzione ψ.
Teorema 2.11 (Canfield, Erdös e Pomerance [10]). Siano ψ(x, y) :=
x
#{1 ≤ n ≤ x | n è y-liscio} e u := ln
. Per ogni ǫ > 0, quando
ln y
u, x → ∞ in modo tale da rispettare u < (1 − ǫ) lnlnlnxx , vale ψ(x, x1/u ) =
xu−u+o(u) .
Dimostrazione. Corollario del teorema 3.1 in [10].
2.5. Le ipotesi di Riemann. Nel Capitolo 4 citeremo l’ipotesi
di Riemann generalizzata quando parleremo della riduzione di Gary
Miller. Qui diciamo sommariamente di cosa si tratta.
Definizione 2.4. La funzione Zeta di Riemann è definita, per s 6=
1 ∈ C, da
∞
X
1
ζ(s) :=
ns
n=1
Nota. Se s = 1 abbiamo la serie armonica,
come è noto diverge
R n+1che
−1
dato
con un confronto integrale con 1 x dx si trova Hn =
Pn che
−1
≥ ln(n + 1). In ogni caso il motivo per cui si considera s 6= 1
i=1 i
2. TEORIA DEI NUMERI E CRITTOGRAFIA
11
nella definizione della ζ è che tale punto risulta una singolarità, detto
a
polo di ordine 1, ovvero la funzione è del tipo z−z
+ g(z), a 6= 0, z0 = 1
0
dove g è derivabile in senso complesso in ogni z ∈ C appartenente al
dominio.
Congettura 2.1 (Ipotesi di Riemann, RH). Se ζ(s0) = 0 e ℜ(s0 ) >
0, allora esiste t ∈ R tale che s0 = 1/2 + it.
In altre parole, gli zeri s0 non banali cadono tutti sulla linea critica
ℜ(s0 ) = 1/2.
Definizione 2.5. Sia m un numero naturale. Un carattere di Dirichlet modulo m è una funzione non identicamente nulla χ : Z → C
tale che
(1) χ(ab) = χ(a)χ(b) per ogni a, b ∈ Z
(2) χ(a + m) = χ(a) per ogni a ∈ Z
Definizione 2.6. Una L-serie di Dirichlet è una funzione L : C →
C del tipo
∞
X
χ(s)
L(s, χ) :=
ns
n=1
dove χ è un carattere di Dirichlet.
Congettura 2.2 (Ipotesi di Riemann Estesa, GRH). Sia s ∈ C,
e sia L(s, χ) una L-serie di Dirichlet. Se L(s0 , χ) = 0 e ℜ(s0 ) > 0
allora esiste t ∈ R tale che s0 = 1/2 + it
Vale a dire che tutti gli zeri s0 con parte reale non negativa di
L(s0 , χ) hanno parte reale ℜ(s0 ) = 1/2.
2.6. Campi e Anelli di Numeri Algebrici. Il Crivello sui Campi di Numeri sfrutta alcune nozioni derivanti dalla teoria algebrica dei
numeri. Ai fini della sua trattazione risulta perciò fondamentale dare
alcune definizioni.
Definizione 2.7. Siano K e F campi (risp. anelli). Diciamo che K
estende F se F è un sottocampo (risp. sottoanello) di K, e ci riferiamo
a K/F con il termine “estensione di campi (risp. di anelli)”.
Definizione 2.8. Il grado dell’estensione di campi K/F, che denotiamo con [K : F], è la dimensione di K considerato come spazio vettoriale su F. Diciamo che K/F è finita se ha grado finito,
[K : F] < ∞.
Definizione 2.9. Diciamo che l’estensione di anelli R/S è finita
se R, considerato come modulo su S, è finitamente generato.
Definizione 2.10. Consideriamo un’ estensione K/F, e prendiamo
un sottoinsieme S ∈ K. Definiamo F(S) (risp. F[S]) come l’intersezione di tutti i sottocampi (risp. sottoanelli) di K che contengono F ∪ S.
Se #S = 1, diciamo che l’estensione F(S) (risp. F[S]) è semplice.
12
1. PRELIMINARI
Definizione 2.11. Se K/Q (risp. K/Z) è un’ estensione finita di
campi (risp. di anelli) , diciamo che K è un campo (risp. un anello)
di numeri (risp. di interi).
Definizione 2.12. Si consideri l’estensione di campi K/F. Un
elemento α ∈ K si dice algebrico su F se è radice di un qualche polinomio non nullo f ∈ F[x], ovvero se soddisfa l’equazione polinomiale
f (α) = 0. Supponiamo che K sia C. Se il campo F è Q diremo che α
è un numero algebrico. Se invece F è l’anello Z, e il polinomio di cui
α è radice risulta monico, allora chiameremo α un intero algebrico.
La proposizione 2.13 ci permette di caratterizzare gli elementi algebrici in relazione alle estensioni semplici. Premettiamo che useremo
un particolare omomorfismo di anelli Ψa , argomento del seguente lemma. Dato che comprendere questi ultimi fatti è fondamentale per poter
trattare il Crivello su Campi di Numeri, riportiamo per completezza
anche le dimostrazioni, chiarendo che sono solo leggeri adattamenti di
quelle presenti in [11].
Lemma 2.12. Sia K/F una estensione di campi e a ∈ K.
definisca l’applicazione Ψa : F[x] → K come
Ψa f (x) := f (a)
Si
Allora Ψa è un omomorfismo di anelli e la sua immagine coincide con
F[a]. Ψa è detto un omomorfismo valutazione.
Dimostrazione. Dato che (f + g)(a) = f (a) + g(a) e (f g)(a) =
f (a)g(a) per ogni f, g ∈ F[x], Φ è un omomorfismo di anelli. Inoltre
F ∪ {a} ⊆ ImΨa e ImΨa è un sottoanello di K, dunque F[a] ⊆ ImΨa .
Asseriamo che vale anche ImΨa ⊆ F[a], infatti sia q := Ψa (f ) ∈ ImΨa ,
P
i
f ∈ F[x] di grado δf , allora t = δf
i=0 ci a ∈ F[a] dove i ci sono tali che
Pδf
f (x) = i=0 ci xi .
Proposizione 2.13. Sia K/F una estensione di campi, e α ∈ K un
elemento algebrico
su F. Detto Ψα l’omomorfismo valutazione, KerΨα
è l’ideale p(x) di F[x] generato da un polinomio p irriducibile monico
in F[x], che chiamiamo polinomio minimo di α su F. Inoltre F(α) =
F[α], F(α) ∼
= F(x)/ p(x) , e {1, α, α2, . . . , αδp−1 } è una base di F[α].
Dimostrazione. Per il lemma 2.12 e il teorema fondamentale di
omomorfismo di anelli (cioè se H : R → S omomorfismo di anelli allora
ImH ∼
= R/KerH) si ha
F[α] = ImΨα ∼
(1)
= F[x]/KerΨα
Ma F[α] è sottoanello di un campo, dunque è un dominio di integrità.
Dunque KerΨα è un ideale primo dell’anello F[x] generato da un polinomio primo, ovvero irriducibile in F, dividendo per il coefficiente
direttivo abbiamo un polinomio monico, che è il polinomio di grado
3. DECIDERE LA PRIMALITÀ: IL METODO AKS
13
minimo annullato da α. Dato che Ψα è generato da un elemento irriducibile, il quoziente F[x]/KerΨα è un campo. Per l’isomorfismo (1)
anche F[α] è un campo. Dunque vale anche F(α) = F[α]. Resta da
mostrare che {1, α, α2, . . . , αδp−1 } è base di F[α] = F(α). Si supponga
che una combinazione lineare di tali elementi sia uguale a zero. Allora
il polinomio in f ∈ F[x] avente gli stessi coefficienti della combinazione
lineare è annullato da α, dunque appartiene a KerΨα , dunque è multiplo di p. Ma p ha grado δp > δp − 1 = δf dunque f deve essere il
polinomio nullo. Vale a dire che gli αi sono linearmente indipendenti.
Sia ora t ∈ F[α] e si consideri f ∈ F[x] tale che t = Ψα f (x) = f (α).
Dividiamo f (x) per p(x) ottenendo un polinomio quoziente q e un polinomio resto r tale che 0 ≤ δr < δp(x). Valutando in α e sapendo
che p(α) = 0 si ottiene t = f (α) = r(α), con δr ≤ δp − 1, che è
combinazione lineare degli αi.
Capiamo in questo modo che, quando α ∈ C è algebrico su Q, Q[α]
risulta essere un campo di numeri e ogni elemento si scrive in modo
unico come combinazione lineare delle potenze di α, vale a dire
(δp−1
)
X
Q[α] =
ci α i | ci ∈ Q
i=0
dove δp è il grado del polinomio minimo di α, e le operazioni di somma e prodotto di elementi in Q[α] risultano essere pressochè identiche
a quelle nell’anello dei polinomi. Notiamo che le considerazioni della proposizione 2.13 valgono anche quando consideriamo il campo dei
complessi e l’anello degli interi, K = C e F = Z, e supponiamo che
α sia una intero algebrico, ovvero che annulli un polinomio monico a
coefficienti interi. Come vedremo, nel Crivello su campi di numeri considereremo anche l’estensione C/Z e useremo gli anelli di interi Z[α]
, e dunque
nP ci interessa sapere
o che se α è un intero algebrico allora
δp−1
i
Z[α] =
dove δp è il grado del polinomio minimo
i=0 ci α | ci ∈ Z
di α, o che Z[α] = Z[x]/ p(x) .
3. Decidere la primalità in tempo polinomiale
deterministico: il metodo AKS
Il problema della primalità consiste nel distinguere i naturali primi
da quelli composti. Dimostrare in modo incondizionato l’esistenza di
un algoritmo con tempo di calcolo polinomiale-deterministico ha costituito una questione risolta solo recentemente in [3]. Anche se oggi
questo problema è a tutti gli effetti trattabile, è interessante perchè
dimostra come, in questo campo, soluzioni poi ritenute relativamente
elementari possono sfuggire per decenni agli occhi degli esperti.
Nello scenario dei linguaggi formali, chiamiamo PRIMES il linguaggio
dei numeri primi, cioè PRIMES := {p ∈ {0, 1}∗ | p è la rappresentazione
14
1. PRELIMINARI
binaria di un primo}. In questo paragrafo diamo un’esposizione autocontenuta dello stupefacente, ma elementare, risultato di Agrawal, Kayal e Saxena (AKS): PRIMES ∈ P [3]. Prima di procedere, diamo
una breve rassegna dei risultati “storici” riguardanti la complessità
computazionale di PRIMES.
• (Pratt-1975 [24]) Con i certificati di primalità succinti Pratt
dimostra PRIMES ∈ NP ∩ coNP.
• (Miller-1976 [19]) Assumendo l’ipotesi di Riemann generalizzata, PRIMES ∈ P .
• (Solovay, Strassen-1977 [29]) PRIMES ∈ coRP
• (Rabin-1980 [25]) Rabin propone un adattamento probabilitico dell’algoritmo di Miller, provando ancora che PRIMES ∈
coRP.
• (Adleman,Pomerance,Rumuley 1983 [1]) PRIMES ∈ QP.
• (Adleman,Huang-1992 [2]) PRIMES ∈ ZPP.
Iniziamo ora ad occuparci del metodo AKS, introducendo una semplice
generalizzazione del piccolo teorema di Fermat.
Lemma 3.1 ([3]). Siano a ∈ Z, n ∈ N, (a, n) = 1.
n primo ⇐⇒ (X + a)n ≡ X n + a
(mod n)
n
Dimostrazione.
Per 0 < i < n il coefficiente di X i in
(X + a) −
n n−i
n
(X + a) è i a . (Verso ⇒) Se n è primo allora n | i . (Verso ⇐)
Se n è composto, sia q un suo fattore primo e prendiamo k tale che
q k k n.
Fatto 1. Se q k k n allora q k ∤ nq .
Infatti, se nq /q k ∈ Z allora n(n−1)···(n−q+1)
∈ Z dunque q k+1 | n.
q k+1 (q−1)!
Dunque, dato che (a, n) = 1 implica q ∤ an−q , il coefficiente di X q non
si annulla, dunque (X + a)n − (X n + a) 6≡ 0 (mod n).
n
L’idea di AKS si basa sulle seguenti considerazioni
• Il Lemma 3.1 da una condizione necessaria e sufficiente molto
semplice per testare la primalità.
• Purtroppo valutare la parte sinistra della congruenza richiede
tempo Ω(n).
• Idea cruciale: scegliamo r in modo appropriato e riduciamo i
polinomi modulo X r − 1 e modulo n, ovvero
testiamo la condizione (X+a)n = X n +a
nell’anello
Z/nZ[X]
(X r − 1)
(∗)
Facciamo notare che d’ora in poi denoteremo le uguaglianze in
anelli del tipo sopra con la notazione
f (X) ≡ g(X) (mod h(X), n)
3. DECIDERE LA PRIMALITÀ: IL METODO AKS
15
ad esempio denoteremo la relazione (∗) con
(X + a)n ≡ X n + a
(mod X r − 1, n)
• Questione: se n è primo allora (∗) è vera. Il viceversa non
vale, tali numeri sono chiamati r-AKS pseudoprimi rispetto
alla base a.
• Soluzione: come dimostreremo, per un opportuno r = r(n), se
(∗) è vera per le ℓ basi 1, 2, . . . , ℓ, allora n è primo. Inoltre sia
r che ℓ sono O(poly(log n)).
Segue l’algoritmo cosı̀ come in [3], ricordiamo che la notazione
or (n) indica l’ordine di n modulo r, posto che mcd(n, r) = 1.
Algoritmo AKS, [3]
Input: un naturale n > 1
1.
Se n = ab per a ∈ N e b > 1 allora COMPOSTO.
2.
Trovare il più piccolo r tale che or (n) > lg2 n .
3.
Se (a, n) 6= 1, n per qualche a ≤ r allora COMPOSTO.
4.
Se n ≤ r allora PRIMO.
p
5.
Per ogni a = 1, 2, 3, . . . , ℓ := ⌊ ϕ(r) lg n⌋
se (X + a)n 6≡ X n + a (mod X r − 1, n) allora COMPOSTO.
6.
Allora PRIMO.
La prima questione che ci proponiamo di risolvere è mostrare che il
più piccolo r tale da soddisfare il passo 2 è r = O(poly(log n)). La tecnica adottata in [3] è elementare ma piuttosto ingegnosa, e sfrutta il
seguente Lemma, di cui diamo una dimostrazione completa espandendo
le considerazioni di Nair in [20].
Lemma 3.2. [20] Denotiamo con Mn il minimo comune multiplo
dei primi n numeri naturali. Per ogni n ≥ 7 vale Mn ≥ 2n .
Dimostrazione. Partiamo considerando una disuguaglianza per
22n
2
2n
2n
= (1 + 1)
=
2n X
2n
k=0
k
2n
≤ (2n + 1)
n
2n
dove è stato usato lo sviluppo del binomio
e
il
fatto
che
coeffin
è il 2n
2n
2n
2n
ciente binomiale più grande perchè 0 ≤ 1 ≤ . . . ≤ n e n+k =
2n
. Notiamo che sarebbe utile la seguente: (2n+1) 2n
| M2n , perchè
n−k
n
2n
allora risulterebbe M2n ≥ 2 , e avremmo la tesi almeno per i naturali
pari. Tuttavia si vede subito che, considerando un qualche 2n+1 primo,
la divisione citata non è vera. Ci chiediamo
però cosa
accadrebbe se fos2n
2n
sero vere le seguenti: (2n + 1) n | M2n+1 e n n | M2n . Necessaria
mente n(2n + 1) 2n
| M2n+1 perchè M2n | M2n+1 e mcd(n, 2n + 1) = 1.
n
Da questo seguirebbe M2n+1 ≥ n22n ≥ 22n+1 quando n ≥ 2, ovvero la tesi per i naturali dispari n ≥ 5, e seguirebbe M2n+2 ≥ M2n+1 ≥
16
1. PRELIMINARI
4·22n+1 = 22n+2 quando n ≥ 4, ovvero la tesi per i naturali pari n ≥ 10.
Dato che M8 ≥ 28 , la tesi sarebbe provata per tutti i naturali n ≥ 7.
Non resta che provare il seguente
Fatto 2. Per ogni n ≥ 1 (2n + 1) 2n
| M2n+1 e n 2n
| M2n .
n
n
Si tratta di accorgersi che
1
n(2n
n)
è l’integrale definito dello sviluppo
di un opportuno binomio. Consideriamo
Z 1
I(m, n) :=
xm−1 (1 − x)n−m dx, definito per ogni 1 ≤ m ≤ n
0
1
n
Se m = n allora I(n, n) =
1
n .
m(m
)
=
per parti si ottiene ancora
I(m, n) = (1 − x)n−m ·
=
n−m
m
xm 1
m 0
Quando 1 ≤ m < n, integrando
n−m
m
−
Ma d’altra parte (1 − x)
I(m, n) =
=
Pn−m
k=0
Pn−m
k=0
0
(n−m)!
· I(m + 1, n) =
n−m
R1
n!
(m−1)!
=
xm (1 − x)n−(m+1) dx
=
1
n
m(m
)
n−m
X
(−1)
k=0
⇓
R1
(−1)k
n−m
k
(−1)k
n−m
1
k
m+k
0
k
(1)
n−m k
x
k
xm+k−1 dx
(2)
e k ≤ n − m implica m + k ≤ n dunque (m+ k)|Mn dunque I(m, n) ·
n
Mn ∈ Z. Combinando (1),(2) si vede m m
| Mn . Ora se cambiamo
le variabili in n
2n e m
n, otteniamo n 2n
| M2n . Se cambiamo
n
2n
le variabili in
n
2n
+
1
e
m
n
+
1,
otteniamo
(2n
+
1)
=
n
2n+1
(n + 1) n+1 | M2n+1 .
Ricordiamo che in quanto segue usiamo la notazione lg n per il
logaritmo bianrio e or (n) per indicare l’ordine di n modulo r, posto che
mcd(n, r) = 1.
Lemma 3.3. [3]Esiste r ≤ ⌈lg5 n⌉ tale che or (n) > lg2 n, per n > 2.
Dimostrazione. Notiamo che
i
n 6≡ 1 (mod r) per ogni 1 ≤ i ≤ lg 2 n
2
or (n) > lg n ⇐⇒
(r, n) = 1
Una condizione sufficiente per la (1) è r ∤
(1)
(2)
⌊lg 2 n⌋
Y
i=1
(ni − 1) e una condizione
necessaria per la (2) è r ∤ nQ per ogni Q. Con questo in mente, fissiamo
3. DECIDERE LA PRIMALITÀ: IL METODO AKS
17
in modo arbitrario un naturale Q e consideriamo il più piccolo r che
non divide il prodotto
Q
n ·
⌊lg 2 n⌋
Y
i=1
(ni − 1) =: P
Certamente r soddisfa (1), ma vogliamo anche che (r, n) = 1 e r ≤
⌈lg 5 n⌉, mostriamo che questo è vero scegliendo Q in modo opportuno.
Se, per assurdo, r > ⌈lg5 n⌉ allora t | P per ogni t ≤ lg5 n, ma allora
M⌈lg5 n⌉ | P , allora
P⌊lg2 n⌋
1
2
2
M⌈lg5 n⌉ ≤ P < nQ+ i=1 i ≤ nQ+ 2 lg n(lg n+1)
4
≤
nlg n (scegliendo Q < lg2 n)
5
≤
2⌈lg n⌉ ( scrivendo n = 2lg n )
ma questo contraddice il Lemma 3.2 sul minimo comune multiplo,
r
| P.
dunque r ≤ ⌈lg5 n⌉. Assumiamo, ancora per assurdo, che (r,n)
Q αj
Sia r = j pj la fattorizzazione unica di r, allora ogni fattore priα
mo pj di r tale che pj j ∤ P deve dividere n. Ma allora se poniamo Q = ⌊lg⌈lg5 n⌉⌋, abbiamo che r | P perchè vale l’implicazioα
ne pj j < r < ⌈lg5 n⌉ =⇒ αj ≤ Q1. Questo è assurdo, dunque
r
∤ P . Ma r è il più piccolo numero con tale proprietà, di conseguenza
(r,n)
(r, n) = 1.
Dimostriamo la correttezza del metodo di AKS e proponiamo dimostrazioni complete dei fatti 3, 4, 5, 7 e 8, che vengono invece tralasciate
in [3].
Teorema 3.4. [3] L’algoritmo AKS è corretto, ovvero restituisce
PRIMO se e solo se n è primo.
Dimostrazione. (Verso =⇒) Se n é primo i passi 1,2,5 non restituiscono COMPOSTO, per il passo 3 vale infatti il Lemma 3.1, dunque
l’algoritmo deve restituire PRIMO al passo 4 oppure al passo 6.(Verso ⇐) Questa parte è la più lunga, in quanto vengono dimostrati vari
Lemmi. Assumiamo che l’algoritmo restituisca PRIMO al passo 6 (se
restituisce PRIMO al passo 4, è ovviamente corretto). Se or (n) > 1
allora or (p) > 1 per qualche primo p | n, e p > r altrimenti l’algoritmo sarebbe terminato ai passi 3 o 4, inoltre valgono le implicazioni
(n, r) = 1 =⇒ (p, r) = 1 =⇒ n, p ∈ (Z/rZ)∗ . Consideriamo fissati tali
p, r.
Definizione 3.1. Se f (X) è un polinomio a coefficienti interi e
m ∈ N, diciamo che m è introspettivo per f (X) se f (X)m ≡ f (X m )
(mod X r − 1, p).
Fatto 3.
1In
n
p
è introspettivo per X + a.
generale il più grande naturale del tipo mk ≤ B si ha con k ≤ ⌊lgB⌋
18
1. PRELIMINARI
Dimostrazione. L’algoritmo non ritorna COMPOSTO al passo
5, dunque n è introspettivo per X + a ogni 0 ≤ a ≤ ℓ, perchè se vale
la congruenza (*) modulo n, vale anche modulo p visto che p | n. Dato
che p è primo, per il Lemma 1, p è introspettivo per X + a, per ogni
0 ≤ a ≤ ℓ. In quanto segue consideriamo un cambiamento di variabile
k−1
del tipo X
X p . Il fatto che entrambi n e p siano introspettivi, e
k−1
che X r − 1 | X rp − 1 se k ≥ 1, motiva le seguenti implicazioni
n
n
(X p + a) p ≡ (X + a)n ≡ (X p ) p + a
n
k
⇓
n
k
(X p + a) p ≡ (X p ) p + a
(X
pk
n
p
pk
n
p
⇓
+ a) ≡ (X ) + a
(mod X r − 1, p)
(mod X p
k−1 r
− 1, p)
(mod X r − 1, p)
per ogni k ≥ 1. Se con la lunga divisione per polinomi, ovvero il classico
algoritmo per la divisione tra polinomi che è del tutto simile a quello
k
per la divisione tra interi, dividiamo X p per X r − 1 vediamo che vale
k
k
X p ≡ X p (mod r) (mod X r − 1, p). Dato che (p, r) = 1 per il piccolo
or (p)
teorema di Fermat allora X p
≡ X (mod X r − 1, p) e cosı̀ si ha la
tesi.
Lemma 3.5. [3] Se m, m′ sono introspettivi per f (x) allora anche
m · m′ è introspettivo per f .
Dimostrazione. Si procede in maniera diretta usando la definizione di introspettività e ricordandosi ad un certo punto di usare
X
X m e X r − 1 | X m·r − 1
Lemma 3.6. [3] Se m è introspettivo per f (x), g(x) allora m è
introspettivo per f (x) · g(x).
Dimostrazione. Si procede in maniera diretta usando la definizione di introspettività.
Prendiamo
i
n
I := {
pj | i, j ≥ 0}
p
Ir := {i
(mod r) | i ∈ I},
t := #Ir
ℓ
Y
P := { (x + a)ea | ea ≥ 0}
a=0
Per i Lemmi precedenti ogni numero in I è introspettivo per ogni polinomio in P . Ir è un sottogruppo di (Z/rZ)∗ (perchè è un sottoinsieme
finito chiuso rispetto al prodotto).
3. DECIDERE LA PRIMALITÀ: IL METODO AKS
19
Definizione 3.2. Denotiamo con Φr ∈ C[X] l’r-esimo polinomio
ciclotomico, definito come
ϕ(r)
Φr :=
Y
k=1
(x − ζk )
dove le ζk sono le radici primitive r-esime dell’unità in C.
Fatto 4. Φr è monico a coefficienti in Z.
Dimostrazione. Sia ζ ∈ C una radice r-esima primitiva dell’ur
nità. ζ i ha ordine (r,i)
, dunque ogni radice r-esima è una radice d-esima
primitiva, dove d è il suo ordine e d | r. Considerando la fattorizzazione
in fattori lineari di X r − 1 su C, possiamo dunque raggruppare le radici
d-esime primitive per ogni d | r, ottenendo
Y
Xr − 1
Xr − 1 =
Φd (X) =⇒ Φr (X) = Q
d|r Φ(X)
d|r
d6=r
Ma Φ1 (X) = X−1 è monico e a coefficienti in Z, e dunque per induzione
su r anche Φr (X) è monico a coefficienti in Z, essendo il quoziente di
una divisione tra polinomi monici a coefficienti interi.
Anche considerando il campo finito Fp possiamo prendere il campo
di spezzamento FS del polinomio X r − 1, e considerando le radici resime primitive in FS ha senso parlare del polinomio ciclotomico Φr (X)
su Fp , e varrà ancora la relazione ricorsiva per Φr (X) vista nel Fatto
4, cosı̀ Φr (X) | X r − 1.
Fatto 5. Φr si fattorizza su Fp in fattori irriducibili distinti di
grado or (p).
Dimostrazione. Che i fattori di Φr (X) siano distinti deriva da
Φr (X) | X r − 1 e mcd(X r − 1, rX r−1) = 1. Sia ζ una radice primitiva
k
primitiva r-esima. ζ ∈ Fpk ⇐⇒ ζ p −1 = 1 ⇐⇒ pk − 1 ≡ 0 (mod r)
e il più piccolo k che va bene è or (p). Dunque ζ ∈ Fpor (p) . Segue che il
grado del polinomio minimo di ζ è or (p). Per la generalità di ζ si può
concludere che Φr si spezza in fattori irriducubili di grado or (p), perchè
ogni suo fattore irriducibile è polinomio minimo di una qualche ζ. Sia ζ ∈ F una radice r-esima primitiva, e sia h(X) ∈ Fp il suo
polinomio minimo. Allora h(X) è irriducibile e h(X) | Φr (X) | X r − 1,
Fp [X]
e ha ordine or (p) per il Fatto 5. Inoltre FS = Fp (ζ) ∼
, dove
=
(h(X))
l’isomorfismo è g(X) 7−→ g(ζ). Se or (p) > 1 allora h(X) ha grado
maggiore di uno. Definiamo
G := {f
mod h(X), p | f ∈ P }
20
1. PRELIMINARI
vale a dire che G contiene i polinomi f ∈ P modulo h(X) (cioè, parlando rozzamente, i resti della divisione tra polinomi f (X)/h(X)) considerati con i coefficienti ridotti modulo p: G è un gruppo generato dagli
Fp [X]
elementi {X, X + 1, . . . , X + ℓ} del campo F := (h(X))
(si tratta di un
campo perchè p è un primo e h(X) è irriducibile) ed è un sottogruppo
di F ∗ .
t+ℓ
Lemma 3.7 ([3], Lenstra Jr.). #G ≥ t−1
Dimostrazione. Per quanto visto, X ∈ F :=
r-esima primitiva. Ci serve il seguente
Fp [X]
(h(X))
è una radice
Fatto 6. Polinomi di grado < t distinti in P , restano distinti anche
come elementi di G.
Dimostrazione. (Lenstra Jr.) Siano f (X), g(X) due polinomi
distinti di P di grado < t. Assumiamo per assurdo che f (X) ≡ g(X)
(mod h(X), p). Sia m ∈ Ir , allora f (X)m ≡ g(X)m (mod h(X), p)
dunque f (X m ) ≡ g(X m ) (mod h(X), p) dunque X m è una radice in F
del polinomio non nullo f − g ∈ P , per ogni m ∈ Ir . Ma (m, r) = 1
implica che X m è una radice primitiva r-esima in F , per la generalità
di m si può affermare dunque che f −g ha in F almeno t radici. Questo
è assurdo perchè f − g ha grado < t.
Dunque gli elementi X, X + 1, . . . , X + ℓ restano tutti distinti
in F
p
2
2
(anche
perchè
o
(p)
>
log
n
implica
r
>
log
n
dunque
ℓ
=⌊
ϕ(r)
log
n⌋
r
√
< r log n < r < p) e sono tutti non nulli in F perchè h(X) ha grado
or (p) > 1. Per
il Fatto 6 vi sono almeno ℓ + 1 polinomi lineari in G
ℓ+k
e almeno k polinomi lineari di grado k per ogni k < t. Dunque in
P
ℓ+k
polinomi distinti di grado < t. Resta solo da
totale almeno t−1
k=0
k
provare il seguente fatto.
Fatto 7.
t−1 X
ℓ+k
k=0
k
=
t+ℓ
t−1
Dimostrazione.
Èpiù semplice considerare t−1
t e dimostrare
P
t+ℓ+1
che tk=0 ℓ+k
=
.
Notiamo
che
il
binomio
a
destra
coincide con
k
t
il numero di multi-sottoinsiemi di multi-cardinalità t di un insieme di
cardinalità ℓ + 2; sia D l’insieme di tali multi-sottoinsiemi. La somma a
sinistra conta il numero di multi-sottoinsiemi di multi-cardinalità ≤ t di
un insieme di cardinalità ℓ+1; sia L l’insieme di tali multi-sottoinsiemi.
È possibile stabilire una biezione tra D e L. Facciamo riferimento a
elementi “numerati” del tipo 1, 2, . . . , ℓ + 1, ℓ + 2. (mappa D 7→ L) Sia
d ∈ D, se ℓ + 2 6∈ d allora d ∈ L. Se ℓ + 2 ∈ d allora consideriamo
il multi-insieme l ottenuto da d togliendo tutti gli ℓ + 2. Allora l ∈ L
e l ha multi-cardinalità t − m se m è la molteplicità di ℓ + 2 in d.
3. DECIDERE LA PRIMALITÀ: IL METODO AKS
21
(mappa L 7→ D) Sia l ∈ L, se l ha multi-cardinalità t allora l ∈ D. Se
invece ha multi-cardinalità k < t, allora consideriamo il multi-insieme
d ottenuto da l unendogli ℓ + 2 con molteplicità t − k, cosı̀ l ∈ D. Le
due associazioni sono una l’inversa dell’altra, dunque #D = #L. √
Lemma 3.8. [3] Se n non è potenza di un primo allora #G ≤ n t .
Dimostrazione. Prendiamo il seguente sottoinsieme di I,
√
n
I√t := {( )i · pj |0 ≤ i, j ≤ ⌊ t⌋}
p
√
Se n non è potenza di un primo allora #I√t = (⌊ t⌋ + 1)2 > t perciò esistono almeno due elementi m1 > m2 congrui modulo r, dunque X m1 ≡ X m2 (mod X r − 1, p). Se f (X) ∈ P allora f (X)m1 ≡
f (X m1 ) ≡ f (X m2 ) ≡ f (X)m2 (mod X r − 1, p) dunque f (X m2 ) ≡
f (X)m2 (mod h(X), p). Dunque l’elemento f (X) ∈ G, F è una radice
del polinomio Q := xm1 −xm2 , e per la generalità di f (X),√Q ha almeno
√
#G radici distinte in F . Ma allora #G ≤ m1 < ( np · p)⌊ t⌋ < n t , in
quanto m1 è grado di Q.
Ora vediamo perchè n deve essere primo.
√
ℓ + 1 + ⌊ t lg n⌋
√
≥
t ≥ or (n) > lg n =⇒ #G ≥
⌊ t lg n⌋
√
√
√
2⌊ t lg n⌋ + 1
ℓ + 1 + ⌊ t lg n⌋
√
√
≥
t ≤ ϕ(r) =⇒ ℓ ≥ ⌊ t lg n⌋ =⇒
⌊ t lg n⌋
⌊ t lg n⌋
√
√
⌊ t log n⌋+1
Fatto 8. 2⌊⌊√ttlglgn⌋+1
>
2
n⌋
t+ℓ
t−1
√
Dimostrazione. Sia a := ⌊ t lg n⌋.
a
}|
{
z
(a + 2)
(2a + 1) (2a)
2a + 1
···
=
a
a−1
1
a
Ma
2a+1−i
a−i
> 2, e a ≥ 2 implica a + 2 ≥ 4, dunque la tesi.
Pertanto
√
#G > 2⌊
t log n⌋+1
√
≥n
t
ma per il bound precedente questo implica che n è la potenza di un
primo. Dunque n è primo, altrimenti l’algoritmo avrebbe finito al passo
1.
22
1. PRELIMINARI
4. Problemi Intrattabili
Diamo le definizioni formali dei problemi che studieremo.
Il seguente è noto come il problema della fattorizzazione di interi.
FACTORING
Dato un naturale composto n trovarne un fattore d non banale,
vale a dire un 1 < d < n tale che d | n.
Ne segue la versione decisionale DFACTORING.
DFACTORING
Dato un naturale composto n e un naturale m tale che 1 < m < n,
decidere se esiste un fattore non banale d di n tale che 1 < d ≤ m.
Ci riferiremo a RSAP quando parleremo del critto-sistema RSA [26].
RSAP
Data la tripla (n, me mod n, e) per n, e ∈ N0 , m ∈ Z/nZ,
calcolare m mod n.
Chiamiamo GDLP il problema del logaritmo discreto su gruppi ciclici
qualsiasi, DLP il problema del logaritmo discreto sul gruppo (Z/pZ)∗
per p un primo e n-DLP il problema del logaritmo discreto su un
sottogruppo ciclico qualsiasi del gruppo (Z/nZ)∗ per n ∈ N0 . Formalizziamo solo GDLP poichè gli altri problemi sono del tutto simili.
GDLP
Dato il gruppo ciclico finito con n elementi Cn , dato un generatore
g di Cn , vale a dire Cn = {g, g 2, . . . , g n−1, g n }, e dato un elemento
a ∈ Cn , trovare l’unico naturale ℓ ∈ [1, n] tale che a = g ℓ
Formalizziamo infine il problema di Diffie-Hellman DHP e alcune
sue varianti, vale a dire il problema di Diffie-Hellman decisionale DDH
e il problema di Diffie-Hellman generalizzato GDHPk dove k ≥ 2 è un
intero.
DHP
Dato il gruppo ciclico finito con n elementi Cn , un generatore g di Cn ,
ed elementi g a e g b , determinare g ab
DDH
Dato il gruppo ciclico finito con n elementi Cn , un generatore g di Cn ,
ed elementi g a , g b e g c , decidere se g c = g ab , o equivalentemente se
c ≡ ab (mod n).
Il problema di Diffie-Hellman generalizzato considera il caso in cui ci
siano k ≥ 2 “utenti” che vogliono comunicare in maniera sicura. Ogni
utente
sceglie una chiave ai e può effettuare comunicazioni del tipo
Q
g i∈I ai . Diamo una formalizzazione di seguito.
GDHPk
4. PROBLEMI INTRATTABILI
23
Dato il gruppo ciclico finito Cn , un generatore g di Cn , un intero k ≥ 2,
un vettoreQ~a = (a1 , . . . , ak ) ∈ {1, . . . , n}k e gli elementi di Cn
del tipo g i∈I ai per ogni sottoinsieme
proprio I ⊂ {1, . . . , k},
Q
ai
i∈{1,...,k}
.
il problema consiste nel calcolare g
CAPITOLO 2
Fattorizzazione di Interi
Il problema della fattorizzazione di interi ha interessato molti matematici del passato. A riguardo è ben noto il pensiero di Gauss, presente
nell’articolo 329 delle sue Disquisitiones Arithmeticae (1801):
Il problema di distinguere i numeri primi da quelli
composti, e di scomporre questi ultimi nei loro fattori
primi è noto essere uno dei più importanti e utili dell’aritmetica. [...] ogni mezzo possibile dovrebbe essere
esplorato per la soluzione di un problema cosı̀ elegante
e cosı̀ celebrato. - Carl Friedrich Gauss (1777-1855)
È difficile però immaginare cosa Gauss possa intendere esattamente
per “soluzione”. Senza ombra di dubbio, la nascita della teoria della
complessità computazionale ha portato nuovi “mezzi”, per una più profonda comprensione di questo. Oggi possiamo parlare di “soluzione” in
riferimento alla classe di complessità a cui appartiene la versione decisionale del problema, DFACTORING. Tuttavia, stabilire tale classe
di appartenenza è un problema che sembra completamente fuori dalla
portata delle nostre conoscenze attuali. Lo stato dell’arte, per quanto riguarda i metodi di fattorizzazione, è costituito da metodi basati
sulla tecnica nota come Crivello1, ma, come vedremo, un’analisi rigorosa di tali metodi costituisce un problema aperto. In questo capitolo
studiamo i metodi basati su diversi tipi di Crivello, ovvero il Crivello Quadratico, noto in letteratura come QS, e il Crivello su campi di
numeri, noto come GNFS, esplicitando le assunzioni euristiche che rendono possibile un’analisi asintotica del tempo di calcolo. L’ esposizione
si basa su quella di Pomerance in [14], ma cerchiamo di espandere le
dimostrazioni che vengono tralasciate o solo abbozzate in [14], con lo
scopo di fornire una esposizione più chiara e dettagliata.
1. Il Crivello di Eratostene
1.1. Primalità e Fattorizzazione. Il primo algoritmo del Crivello si deve al matematico greco Eratostene di Cirene (276 a.C - 194
a.C.) e riguarda, in prima battuta, il problema della primalità. L’idea
è semplice: immaginiamo di voler determinare tutti i numeri primi minori o uguali di un certo n, allora non dobbiamo fare altro che scrivere
1Parleremo
sempre di Crivello “algoritmico”, non dei crivelli di Brun, ecc, che
vengono usati nella teoria analitica dei numeri.
25
26
2. FATTORIZZAZIONE DI INTERI
tutti i naturali in una lista, 2, 3, 4, 5, 6, 7, 8, 9, 10, . . ., cancellare tutti i
multipli non banali di due, 2, 3, 6 4, 5, 6 6, 7, 6 8, 9, 6 10, . . ., cancellare tutti
i multipli non banali di tre, 2, 3, 6 4, 5, 6 6, 7, 6 8, 6 9, 6 10, . . ., e reiterare
il procedimento fino a che non si siano√cancellati tutti i multipli non
banali di un primo minore o uguale a n. La formalizzazione dell’algoritmo in pseudo-codice è proposta di seguito.
Crivello di Eratostene per la Primalità
input: un naturale n
1.
Inizializzare il vettore P [i] a√
PRIMO per ogni 2 ≤ i ≤ n
2.
Per ciascun i ← 2, 3, 4, . . . , ⌊ n⌋
3.
Se P [i] = P RIMO
4.
j ← i2
5.
Ripetere finchè j ≤ n
6.
P [j] ← COMPOSTO
7.
j ←j+i
8.
Restituire P
È molto semplice modificare questo metodo per calcolare i fattori primi
di tutti i naturali minori o uguali a n: infatti è sufficiente predisporre
una lista per ogni naturale e aggiungervi i fattori man mano che si procede nel Crivello. Nello pseudo-codice che segue si assume che V sia un
vettore di dimensione n e che contenga in ogni posizione una struttura
dati avente due attributi, isPrime di tipo booleano e primePow di
tipo intero, e una lista (Factors). Per ogni 1 ≤ i ≤ n, V [i].Factors
conterrà il multi-insieme dei fattori primi di i. Ad esempio se i = 12,
alla terminazione dell’algoritmo avremo V [i].Factors ≡ [2, 3, 2]. Inoltre
se i = pα è la potenza perfetta di un primo, allora V [i].primePow varrà
p, altrimenti varrà 0, ad indicare che i è diviso da almeno due fattori
primi.
1. IL CRIVELLO DI ERATOSTENE
27
Crivello di Eratostene per la Fattorizzazione
Input: Il naturale n
1.
Per ciascun i ← 2, 3, . . . n
2.
inizializzare i campi isPrime e primePow del vettore V[i] a
V [i].isPrime ← vero e V [i].primePow ← 0
3.
Per ciascun i ← 2, 3, . . . n
4.
Se V [i].isPrime = vero
5.
j←i
6.
V [i].primePow ← i
7.
nextPow ← i2
8.
Finchè j ≤ n
9.
V [j].Factors.add(j)
10.
Se j > i
11.
V [j].isPrime ← falso
12.
Se j = nextPower
13.
V [j].primePow ← i
14.
nextPow ← nextPow · i
15.
j ←j+i
16.
Altrimenti, se V [i].primePow > 0
17.
j←i
18.
Finchè j ≤ n
19.
V [j].Factors.add(V [i].primePow)
20.
j ←j+i
21.
Restituire V
1.2. Trovare i numeri lisci. Il Crivello di Eratostene per la fattorizzazione completa può essere usato per trovare tutti i naturali in
[2, n] tali che i loro fattori primi siano minori o uguali ad un certo B,
ovvero i naturali B-lisci. Si tratta di notare che se crivelliamo solo i
primi minori o uguali di B e le potenze di tali primi, vale a dire i pα tali
che p ≤ B, allora i naturali B-lisci saranno tutti e soli quelli che alla
terminazione risulteranno uguali al prodotto dei fattori presenti nella
lista associatagli, in pseudo-codice diciamo gli i tali che
i=
Y
V [i].Factors.get(j)
j∈V [i].Factors
Naturalmente, se non siamo interessati alla fattorizzazione, possiamo
sostituire la lista con un intero prod che tiene conto del prodotto dei
fattori primi B-lisci. Dunque la modifica è minima, e viene proposta
di seguito.
28
2. FATTORIZZAZIONE DI INTERI
Crivello di Eratostene per numeri B-lisci
Input: I naturali n, B
1.
Per ciascun i ← 2, 3, . . . n
2.
V [i].isPrime ← vero, V [i].primePow ← 0,
V [i].product ← 1
3.
Per ciascun i ← 2, 3, . . . , n
4.
Se V [i].isPrime = vero e i ≤ B
5.
j←i
6.
V [i].primePow ← i
7.
nextPow ← i2
8.
Finchè j ≤ n
9.
V [j].product ← V [j].product · V [i].primePow
10.
Se j > i
11.
V [j].isPrime ← falso
12.
Se j = nextPower
13.
V [j].primePow ← i
14.
nextPow ← nextPow · i
15.
j ←j+i
16.
Altrimenti, se 0 < V [i].primePow ≤ B
17.
j←i
18.
Finchè j ≤ n
19.
V [j].product ← V [j].product · V [i].primePow
20.
j ← jn
+i
o
21.
Restituire i ∈ [2, n] i = V [i].product
Tale algoritmo potrebbe essere a sua volta lievemente modificato in
modo tale da svolgere tutte le operazioni aritmetiche con i logaritmi.
Il vantaggio principali sarebbe che i prodotti (cioè la variabile product) di tutti i naturali gestiti resterebbero “piccoli”, ed inoltre le
operazioni di prodotto diventerebbero somme. Tuttavia la complessità computazionale di un’aritmetica logaritmica esatta rimane alta:
per questo motivo si può lavorare con delle approssimazioni del tipo
log2 3 ≈ 2, log2 7 ≈ 3, . . . e accettare un errore di al più log2 B.
1.3. Complessità computazionale dei Crivelli. Analizzando
la prima versione del crivello di Eratostene proposta, ci rendiamo conto
che la complessità in tempo dell’algoritmo è legata al numero
di multipli
√
di p nell’intervallo [2, n], per ogni primo p preso in [2, n]. Pertanto il
numero di passi risulta essere limitato superiormente da
!
Xn
O
p
p≤n
È nota la seguente stima.
1. IL CRIVELLO DI ERATOSTENE
Teorema 1.1 (Mertens).
X1
p≤n
p
29
= ln ln n + O(1)
Dimostrazione. [16], teorema 427
Segue direttamente che
Corollario 1.2. La complessità in tempo del Crivello di Eratostene per la Primalità è O(n ln ln n).
La complessità dei crivelli per la fattorizzazione e per i numeri B-lisci è, similmente, legata al numero di multipli delle potenze
perfette di primi, pα . Nel crivello per la fattorizzazione risulta perP
n
tanto essere limitata da O
pα ≤n pα , e nel crivello per numeri BP
n
lisci da O
. Mostriamo ora che tra le potenze di primi
α
α
p ≤n, p≤B p
dominano i primi, nel senso specificato dalla seguente proposizione.
Proposizione 1.3.
X 1
= ln ln n + O(1)
pα
pα ≤n
Dimostrazione. Consideriamo la differenza
X 1
X1
∆ :=
−
pα p≤n p
pα ≤n
e mostriamo che ∆ converge a un limite
Da
seguirà
P questo
P finito.
1
1
l’esistenza di una costante C tale che pα ≤n pα =
p≤n p + C, che
combinata con la proposizione 1.1 equivale alla tesi. Abbiamo
∞ X
∞
X 1
X
1
∆=
<
α
p
mq
m=2 q=2
pα ≤n
(2)
α≥2
perchè tutti i termini della somma a sinistra compaiono nella serie
a destra e inoltre quest’ultima è a termini positivi, il che assicura la
convergenza assoluta. Notiamo che per ogni m fissato vale
∞
X
m
1
1
1
1
1
=
−1−
=
=
−
q
m
m−1
m
m(m − 1)
m−1 m
q=2
allora la serie in (2) risulta essere una serie telescopica, e si ottiene
pertanto
∞ X
∞
X
1
1 =1
=
q
m
m
−
1
m=2
m=2 q=2
30
2. FATTORIZZAZIONE DI INTERI
Come conseguenza immediata vediamo che anche i Crivelli di Eratostene per fattorizzare e per riconoscere numeri B-lisci hanno una complessità in tempo rispettivamente uguale a O(n ln ln n) e O(n ln ln B).
Riassumiamo quanto provato nella seguente
Proposizione 1.4. Consideriamo i Crivelli di Eratostene per primalità, fattorizzazione e rispettivamente per numeri B-lisci. Il numero medio di passi fondamentali eseguiti per ogni particolare intero
nell’intervallo [2, n] è O(ln ln n) e rispettivamente O(ln ln B).
Il Crivello di Eratostene è dunque molto efficiente in termini di
tempo medio, se vogliamo calcolare la primalità, la fattorizzazione, o
i numeri lisci in un certo intervallo. Purtroppo lo spazio utilizzato rimane sempre O(n), il che rende impraticabile l’algoritmo quando n è
molto grande decimali. Il problema può essere parzialmente affrontato
segmentando l’intervallo [2, n] in molti intervalli piccoli, ma la complessità ovviamente non si abbassa. Tuttavia tale metodo, in particolare
la versione per trovare numeri lisci, svolge una parte molto importante
nel Crivello quadratico, argomento della sezione che segue, e in alcuni
algoritmi per il problema del Logaritmo Discreto.
2. Il Crivello Quadratico
Definizione 2.1. Sia n un numero naturale. Le soluzioni della
congruenza x2 ≡ 1 (mod n) si dicono radici quadrate dell’unità modulo
n.
Proposizione 2.1. Ogni naturale dispari n ha esattamente 2ω(n)
radici quadrate dell’unità modulo n.
Q
αi
Dimostrazione. Sia n = ω(n)
i=1 pi , con αi > 0 per ogni i, la
fattorizzazione canonica di n. Per la proposizione 2.2 del Capitolo 1
x2 ≡ 1 (mod n) se e solo se, per ogni 1 ≤ i ≤ ω(n), x2 ≡ 1 (mod pαi i ).
Per la proposizione 2.3 del Capitolo 1 questo è vero se e solo se x ≡
±1 (mod pαi i ). Sia S l’insieme delle ω(n)-uple ad elementi in {−1, 1},
ovviamente |S| = 2ω(n) . Il Teorema Cinese dei Resti 2.4 del Capitolo 1
ci assicura che per ogni elemento s = (s1 , . . . , sω(n) ) ∈ S il sistema di
congruenze x ≡ si (mod pαi i ), per 1 ≤ i ≤ ω(n), ammette una e una
sola soluzione modulo n. Dato che per ipotesi pαi i > 2 e dunque 1 6≡ −1
(mod pαi i ), vi sono esattamente |S| = 2ω(n) radici quadrate dell’unità
modulo n, una per ogni s ∈ S.
Dalla proposizione 2.1 segue che ogni naturale dispari composto che
non è la potenza perfetta di un primo ha almeno quattro radici quadrate dell’unità modulo n, di cui due sono le banali 1 e −1. Questo
vuol dire che esisteranno sempre almeno due radici non banali del tipo
x 6≡ ±1 (mod n) tali che n | (x+ 1)(x−1); in altre parole alcuni fattori
di n saranno fattori di x + 1, ed altri di x − 1. Perciò mcd(x ± 1, n) sarà
2. IL CRIVELLO QUADRATICO
31
Figura 1. Una illustrazione della proposizione 2.1 nel
caso particolare n = pα q β r γ , per p, q, r primi distinti e
α, β, γ ≥ 1. Le soluzioni dei tre sistemi di congruenze
sono tre delle otto radici quadrate dell’unità modulo n
un fattore non banale di n, il nostro obiettivo. Affermiamo che trattare
solo i composti dispari che non sono potenze perfette di un primo non
ci fa perdere generalià: infatti, se n fosse pari, allora avremmo immediatamente il fattore non banale 2, se n fosse la potenza perfetta di un
1
primo, basterebbe estrarre ⌊n k ⌋, ad esempio con il metodo di Newton,
al più O(ln n) volte, e controllare se la k-esima potenza è n. Inoltre
sappiamo che il calcolo di mcd(x ± 1, n) richiede un tempo polinomiale
nel numero di bit di n. Riassumendo, abbiamo provato che
Fatto 9. Per risolvere il problema FACTORING è sufficiente
trovare radici quadrate non banali dell’unità modulo n, per n dispari e
con almeno due fattori primi distinti.
Con questo in mente, ci si può rendere conto che trovare tali radici
è equivalente a trovare due residui x e y (mod n) tali che
x2 ≡ y 2
(mod n) ,
(3)
x 6≡ ±y e mcd(xy, n) = 1, perchè allora (xy −1 )2 ≡ 1 (mod n) e
xy −1 6≡ ±1 (mod n), vale a dire che xy −1 è la radice cercata. In verità
potremmo anche usare direttamente la (3) per calcolare i fattori non
banali mcd(x ± y, n), come visto poco sopra. L’idea fondamentale del
crivello quadratico è proprio trovare soluzioni della (3) generando congruenze nella forma x2i ≡ ai (mod n) per i = 1, 2, 3, . . . e poi trovando
Q
un sottoinsieme di tali congruenze, diciamo per j ∈ I , tali che j∈I aj
32
2. FATTORIZZAZIONE DI INTERI
sia un quadrato perfetto, di modo che
Y
j∈I
x2j ≡
| {z }
x2
Y
aj
(mod n)
j∈I
| {z }
y2
Una questione importante è che la condizione x 6≡ ±y (mod n) viene a
tutti gli effetti ignorata: se questo porta un errore allora il metodo viene
re-iterato. Considerazioni seguenti implicheranno che in questo modo
l’errore può essere reso piccolo quanto vogliamo con rapidità esponenziale rispetto al numero di re-iterazioni.
Dobbiamo ancora stabilire come trovare in modo efficiente un sottoinsieme I tale che il prodotto degli aj , per j ∈ I, sia un quadrato perfetto.
Per fare questo, notiamo per prima cosa che se un certo āi ha un fattore
primo grande in relazione ai fattori primi degli altri ai , allora includere
tale āi nel sottoinsieme cercato non sembra una buona idea, perchè
sarebbe necessario avere anche un’altro āi ′ con lo stesso fattore primo
grande. Introduciamo dunque un limite superiore per i fattori primi
degli ai , chiamiamo tale limite B = B(n). In altre parole lavoreremo
solo con numeri B-lisci. Stimeremo il valore effettivo di B in seguito,
quando ci occuperemo della complessità computazionale del metodo in
analisi. Notiamo poi che ad ogni numero B-liscio possiamo associare
Q
ei
un vettore degli esponenti: ad m = π(B)
i=1 pi , con ei > 0 per ogni i,
associamo il vettore ad elementi nel campo di Galois, F2 , definito da
π(B)
(mod 2) ∈ F2
(4)
In questo modo m è un quadrato perfetto se e solo se ~v (m) è lo zero
π(B)
dello spazio vettoriale F2 . Si può notare una conseguenza per noi
fondamentale: considerando
l’insieme degli ai , per ogni sottoinsieme
Q
di indici I, il prodotto j∈I ai è un quadrato perfetto se e solo i vettoriPassociati ~v(aj ) sono linearmente dipendenti, vale a dire se e solo
se j∈I ~v (aj ) = 0. Detto questo, l’Algebra Lineare ci aiuta ancora:
possiamo affermare che un insieme di π(B) + 1 numeri B-lisci contiene
necessariamente un sottoinsieme che porta ad un quadrato perfetto,
perchè π(B) è la dimensione dello spazio vettoriale che emerge con la
definizione di ~v (m). Il calcolo effettivo di tale sottoinsieme si riduce quindi ad un problema di Algebra Lineare ben studiato, e quindi
possiamo usare un algoritmo ben noto in Algebra Lineare Numerica,
l’eliminazione di Gauss, di complessità O(B 3 ). In letteratura vengono
suggeriti anche altri metodi (Wiedmann [31] e Lanczos [30]) adatti a
matrici sparse che permettono di avere un tempo di calcolo O(BN)
dove N è il numero di posizioni non nulle della matrice. Il seguente
metodo a questo punto sembra promettente:
~v (m) := e1
(mod 2), e2
(mod 2), . . . , eπ(B)
2. IL CRIVELLO QUADRATICO
33
1.
2.
3.
4.
5.
6.
su input n, naturale dispari con almeno due fattori primi
calcolare B = B(n), per gestire numeri B-lisci
trovare π(B) + 1 numeri B lisci, x1 , . . . , xπ(B)+1
calcolare, per ogni 1 ≤ i ≤ π(B) + 1, l’ai tale che x2i ≡ ai (mod n)
generare i vettori associati agli ai definiti in (4)
e usare un algoritmo di Algebra Lineare Numerica per trovare un
sottoinsieme di vettori linearmente dipendenti, {~v(aj1 ), ~v(aj2 ), . . .}.
7. Detto I = {j1 , j2 , . . .} ⊆ {1, 2, . . . , π(B) + 1}
l’insieme
Q degli indiciQdei vettori trovati al passo 5, e definiti
x = j∈I xj e y 2 = j∈I aj , calcolare d = mcd(x − y, n) con
l’algoritmo di Euclide o simili.
8. restituire d.
Gli unici passi che presentano delle difficoltà non banali sono il 2 il
3 e il 5, anche se quest’ultimo abbiamo già detto essere affrontabile con
l’eliminazione di Gauss e altri algoritmi noti, dunque ci proponiamo
ora di chiarire i restanti due, insieme alla complessità computazionale
in tempo dell’algoritmo.
2.0.1. Trovare numeri B-lisci del tipo x2 (mod n). Un fatto noto, e
facile da provare, è che per ogni naturale dispari n esistono x, y > 0 tali
che n = x2 −y 2 . In particolare se n è tale che n = ab, con a, b ≥ 1, allora
si verifica subito ( a+b
)2 − n = ( a−b
)2 ≥ 0, dunque si vede anche che
2
2
√
a+b
≥ n 2. Pertanto, se vogliamo trovare buoni candidati ad essere
2
dei quadrati del tipo x2 ≡ y 2 (mod n) una buona idea è considerare i
naturali a partire dalla radice di n, vale a dire porre
√
xk+1 = ⌈ n⌉ + k
per k = 0, 1, 2, . . . Per calcolare quali tra questi sono effettivamente Blisci, usiamo il crivello di Eratostene per numeri lisci presentato nella
Sezione 1.2
√ di questo capitolo, dobbiamo notare che, fino a quando
xk+1 < ⌈ 2n⌉, il residuo da calcolare vale
x2k+1
(mod n) = x2k+1 − n
(5)
dunque è sufficiente crivellare solo sui primi, e sulle potenze di tali
primi, che dividono almeno uno degli x2k+1 − n, vale a dire i primi p per
cui x2k+1 ≡ n (mod p). Questo vuol dire considerare solo il primo 2 e i
primi dispari minori o uguali a B tali che n sia un residuo quadratico
modulo p, ovvero tali che per
il simbolo di Legendre, calcolabile in
tempo polinomiale, si abbia np = 1. Facciamo ora una assunzione
euristica sul numero di tali primi:
2tale
disuguaglianza è anche nota come AM-GM
34
2. FATTORIZZAZIONE DI INTERI
Congettura 2.1 (Pollard et al.). Sia Q := #{p ≤ B | np = 1}
il numero di primi minori o uguali di B tali che n sia un residuo quadratico modulo p. Q vale circa 21 π(B), ovvero, n è un residuo quadratico
modulo p per approssimativamente la metà dei primi p ≤ B.
√ È naturale allora chiedersi, fissati n e B, quanti numeri a partire da
⌈ n⌉ dobbiamo crivellare in media prima di avere un insieme di almeno
Q + 1 naturali B-lisci, in modo da garantire l’indipendenza lineare dei
vettori degli esponenti. Un risultato utile a questo proposito si trova
in [10] ed è il teorema 2.11 trattato nella sezione 2.4. Una applicazione
diretta del teorema ci porta ad assumere euristicamente la seguente:
Congettura 2.2 (Pollard, et al.). La probabilità che un residuo
del tipo x2 (mod n) sia B-liscio è approssimativamente u−u .
ln n
Dove, ricordiamo, u = ln
. Il motivo per cui possiamo solo speB
rare che 2.2 sia vera, è che il teorema 2.11 si dimostra sulla totalità
dell’intervallo [2, n], mentre noi consideriamo un sottoinsieme di tale
intervallo composto solo dai residui del tipo x2 (mod n): non sappiamo provare che la distribuzione dei numeri B-lisci rimane la stessa per
tale sottoinsieme. Inoltre dobbiamo fare una√ulteriore considerazione
√
sulla grandezza dei residui x2 (mod n): se n <√x < n + nǫ , per
0 < ǫ < 1, allora x2 − n = 2n1/2+ǫ + n2ǫ = O( n).
√ Dunque è più
plausibile applicare il teorema 2.11 all’intervallo [2, n], vale a dire,
ponendo u = 2lnlnnB .
Assumendo le euristiche 2.1 e 2.2 possiamo concludere che vale la
seguente:
Proposizione 2.2. Supponendo di usare il Crivello per numeri lisci sulla sequenza (5), i) il valore atteso di elementi da testare di tale
sequenza, prima di ottenere un numero B-liscio, è approssimativamente uu . ii) Sono necessari approssimativamente Q + 1 = 21 π(B) + 1
numeri lisci per ottenere la dipendenza lineare dei vettori esponenti
associati.
Dimostrazione. Per provare i) è sufficiente notare che si tratta
della media di una distribuzione geometrica di probabilità. Per provare
ii) basta notare che dalla euristica 2.2 segue che lo spazio vettoriale dei
vettori esponenti ha dimensione circa Q.
Come conseguenza immediata vediamo che dobbiamo testare con il
Crivello in totale circa
uu (Q + 1)
(6)
elementi della sequenza (5).
2.0.2. Stimare B minimizzando la Complessità in tempo. Combinando la (6), con la complessità media del Crivello per numeri lisci
2. IL CRIVELLO QUADRATICO
35
della proposizione 1.4, vediamo che il numero di passi fondamentali del
Crivello quadratico risulta approssimativamente
ln n
π(B)
eQ=
(7)
2 ln B
2
Ci chiediamo quale sia il valore di B = B(n) che minimizza tale espressione quando n è molto grande. Dobbiamo però tenere conto del fatto
che vi sono due vincoli contrapposti: se B è “piccolo” allora la frequenza attesa di numeri B-lisci, data da uu , sarà “grande”, in altre parole
trovare molti numeri B-lisci sarà difficile; viceversa sarà “grande” la
dimensione dello spazio vettoriale dei vettori associati Q, dato che per
il Teorema dei Numeri Primi vale Q ≈ 2 lnB B . Dunque non possiamo
concludere scegliendo valori troppo piccoli o troppo grandi per B, ma
dobbiamo trovare un minimo per valori “intermedi” di B; questo ci
suggerisce di cercare un punto a derivata nulla, mostriamo allora con
qualche considerazione che vale il seguente:
T (B) := uu (Q + 1) ln ln B, dove u =
Teorema 2.3. Sia Ln [α, c] come nella Definizione 1.7. Il tempo di
calcolo T (B) del Crivello Quadratico ha un punto di minimo approssimativamente in B = Ln [1/2, 1/2], inoltre con tale valore di B si ha
T (B) = Ln [1/2, 1]
Dimostrazione. Consideriamo il logaritmo del tempo di calcolo
T , e usiamo la seguente approssimazione
B
ln T (B) = u ln u + ln
+ 1 + ln ln ln B
2 ln B
= u ln u + ln B + o(ln B + u ln u)
≈ u ln u + ln B
Definiamo dunque A(B) := u ln u+ln B e cerchiamo il B che minimizza
∂A
A. Per fare questo calcoliamo la derivata ∂B
,
∂u
1
− ln n
∂A(B)
1
=
(ln u + 1) + =
(ln u + 1) +
2
∂B
∂B
B
B
2B ln B
Ponendo tale espressione uguale a 0, otteniamo
− ln n
1
⇐⇒
(ln u + 1) + = 0
2
B
2B ln B
2 ln2 B = ln n(ln u + 1)
⇐⇒
ln B = u(ln u + 1)
Prendendo il logaritmo di entrambi i membri della (11) segue che
ln ln B = ln u + o(ln(u)) ≈ ln u
ma d’altra parte vale
ln n
ln u = ln
= ln ln n − ln ln B − ln 2 ≈ ln ln n − ln ln B
2 ln B
(8)
(9)
(10)
(11)
36
2. FATTORIZZAZIONE DI INTERI
pertanto
ln ln B ≈ ln u ≈ ln ln n − ln ln B
vale a dire
ln ln B ≈
1
ln ln n
2
(12)
Ora consideriamo di nuovo l’equazione (10), e riscriviamola come
ln B ≈
r
1
ln n(ln ln n − ln ln B)
2
combinando con la (12) otteniamo
ln B ≈
1√
ln n ln ln n
2
(13)
√
1/2+o(1)
Questo prova che B = e ln n ln ln n
= Ln [1/2, 1/2]. Usiamo poi
l’approssimazione (13) in u =
ln n
,
2 ln B
u≈
r
ottenendo
ln n
ln ln n
(14)
Combinando la (13) e la (14) nella definizione di A(B) riusciamo a
vedere che
A(B) ≈
r
√
ln n 1
1√
ln n ln ln n ≈ ln n ln ln n
(ln ln n − ln ln ln n) +
ln ln n 2
2
√
1+o(1)
e dunque T (B) = e ln n ln ln n
= Ln [1/2, 1]
2.0.3. Sommario dell’Algoritmo. Riportiamo la descrizione ad alto
livello dell’algoritmo, come trattata da Pomerance [14].
3. IL CRIVELLO SU CAMPI DI NUMERI
37
Crivello Quadratico di Pomerance
Input:
√
1
1.
B ← ⌈e 2 ln n ln ln n ⌉
2.
p1 ← 2 e a1 ← 1
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Trovare i primi dispari p ≤ B tali che np = 1 e
memorizzarli nelle variabili p2 , p3 , . . . , pK
Per ciascun i = 1, 2, 3, . . . , K
trovare le radici ±ai tali che a2i ≡ n (mod pi )
S←∅
√
Crivellare la sequenza {x2k+1 − n}k , dove xk+1 = ⌈ n⌉ + k,
con il Crivello di Eratostene per trovare numeri B-lisci.
Se si trova un elemento B-liscio della sequenza,
diciamo b = x2 − n, allora S ← S ∪ (x, b).
Crivellare fino a che #S < K + 1.
Per ciascun (x, x2 − n) ∈ S
Q
ei
Stabilire la fattorizzazione canonica x2 − n = K
i=1 pi
~v (x2 − n) ← e1 (mod 2), . . . , eK (mod 2)
Con un algoritmo di Algebra Lineare numerica trovare un
sottoinsieme
non banale di vettori linearmente dipendenti, diciamo
P
2
~
v
(x
−
n)
=0
j∈I Q j
X ← j∈I xj (mod n)
qQ
2
Calcolare Y ←
j∈I (xj − n) (mod n)
servendosi della fattorizzazione trovata al passo 10
d ← mcd(X − Y, n)
Restituire d
3. Il Crivello su Campi di Numeri
Il Crivello sui Campi di Numeri è ad oggi l’algoritmo euristico più
veloce, in termini di complessità asintotica, per risolvere il problema
della fattorizzazione di interi. In verità la strategia adottata è simile a quella del Crivello quadratico, ma viene usato il macchinario
della teoria algebrica dei numeri. Ragioneremo infatti sulle strutture
matematiche introdotte nel Capitolo 1, Sezione 2.6. Sia dunque
f (x) := xd + cd−1 xd−1 + · · · + c1 x + c0 ∈ Z[x]
un polinomio monico e irriducibile e sia α ∈ C una sua radice, α è
un intero algebrico secondo la Definizione 2.12. Per la Proposizione 1
possiamo considerare gli elementi di Z[α] come gli elementi dell’insieme {ad−1 αd−1 + · · · + a1 α + a0 | ai ∈ Z}. Supponiamo che esista un
omomorfismo di anelli Φ : Z[α] → Z/nZ. Ci concentriamo ora sulle
coppie del tipo θ, Φ(θ) , dove θ ∈ Z[α]. Supponiamo di saper trovare
38
2. FATTORIZZAZIONE DI INTERI
k coppie, θ1 , Φ(θ1 ) , . . . , θk , Φ(θk ) , tali che
k
Y
θi = γ 2
(15)
i=1
per qualche γ ∈ Z[α], e tali che
k
Y
i=1
Φ(θi ) ≡ v 2
(mod n)
(16)
per qualche v ∈ Z/nZ. Se questo fosse il caso, allora potremmo fattorizzare n, infatti, detto u un intero tale che Φ(γ) ≡ u (mod n),
avremmo
!
k
k
Y
Y
2
2
2
u = Φ(γ) = Φ(γ ) = Φ
θi =
Φ(θi ) ≡ v 2 (mod n)
i=1
i=1
e dunque mcd(u − v, n) sarebbe un fattore di n. Il primo problema da
affrontare è stabilire f e l’omomorfismo Φ. Plausibilmente, se vogliamo
che esista un omomorfismo da Z[α] a Z/nZ, dovrà esistere una qualche
relazione tra il polinomio f (x) e il naturale n. Tale relazione è data
dal seguente
Fatto 10. Sia f il polinomio minimo dell’intero algebrico α. Se
esiste m ∈ Z tale che
f (m) ≡ 0
(mod n)
allora l’applicazione Φ : Z[α] → Z/nZ definita da
Φ
d−1
X
ai αi
i=1
!
:=
d−1
X
ai mi
(mod n)
i=1
è un omomorfismo di anelli.
Dimostrazione. Dalla proposizione 10 sappiamo che gli elementi
di Z[α] si sommano e si moltiplicano come se fossero polinomi nell’indeterminata α, dunque si verifica in modo diretto che per ogni h, g ∈ Z[α]
vale Φ(h + g) = Φ(h) + Φ(g) e Φ(hg) = Φ(h)Φ(g). Φ(1Z[α] ) = 1Z/nZ è
una conseguenza immediata della definizione di Φ.
Dunque potremmo operare nel seguente modo (in quanto segue
chiamiamo (?1), (?2), ecc... le questioni che restano da precisare)
3. IL CRIVELLO SU CAMPI DI NUMERI
39
1. Stabiliamo un intero positivo d = d(n), che sarà il grado di f (?1)
2. poniamo m ← ⌊n1/d ⌋
3. se, scrivendo n in base m si ha n = md + cd−1 md−1 + · · · + c0 ,
con 0 ≤ ci ≤ m − 1, allora poniamo il polinomio f uguale a
f ← xd + cd−1 xd−1 + · · · + c0 (?2)
Nota: In questo modo f (m) = n ≡ 0 (mod n), allora si applica la
proposizione 10, e dunque Φ è un omomorfismo di anelli.
4. Troviamo k coppie θi , Φ(θi ) tali che
valgano le condizioni (15) e (16) (?3)
5. Restituiamo mcd(Φ(γ) − v, n), dove γ 2 e v 2 sono i
valori delle condizioni (15) e (16) (?4)
Ma abbiamo tralasciato alcuni fatti. Il primo (?1) è che non sappiamo come scegliere d. La questione non è banale e ce ne occuperemo
quando tratteremo la complessità computazionale dell’algoritmo. In
secondo luogo (?2) nulla ci assicura che in generale al passo 3 si abbia
un polinomio monico, vale a dire che sia cd = 1, ma per n sufficientemente grande da rendere vera 2md > (m + 1)d , con m = ⌊n1/d ⌋, si
può concludere che n < 2md perchè vale sempre (m + 1)d > n; per tali
n dunque cd = 1. Una terza osservazione (?2) è che non sappiamo se
f sia irriducibile in Z, tuttavia la fattorizzazione di polinomi in Z[x] è
trattabile [12], e se f risulta riducibile possiamo appellarci ad alcuni
risultati di Brillhart [9] e affermare che se f (x) = h(x)g(x) è una fattorizzazione non banale di f allora n = h(m)g(m) è una fattorizzazione
non banale di n. Infine (?4)-(?5), non è ancora chiaro come portare a
termine in modo efficiente il passo 4 e l’estrazione di radice per elementi di Z[α], al passo 5. Notiamo subito che il compito 4 è simile ad un
passo del Crivello Quadratico, ed in effetti le tecniche per la risoluzione
si basano ancora sui vettori degli esponenti modulo due. Del passo 5
ci occuperemo in seguito.
3.1. Vettori degli Esponenti e quadrati simultanei in Z[α]
e Z. Ci proponiamo di risolvere la questione (?4). Il primo passo è
stabilire la forma degli elementi θi ∈ Z[α]: useremo solo elementi di
primo grado del tipo
θi = a − bα,
Φ(θi ) = a − bm
con a, b ∈ Z, mcd(a, b) = 1. Quello che vogliamo è dunque
trovare
Y un insieme S di coppie di interi coprimi (a, b) tale che
(i)
(a − bm) = v 2 , per qualche v ∈ Z
(a,b)∈S
(ii)
Y
(a,b)∈S
(a − bα) = γ 2 , per qualche γ ∈ Z[α]
La tecnica per trattare esclusivamente (i) consisterebbe nell’ usare un
crivello per numeri B lisci su G(a, b) := a − bm, crivellando la sequenza
40
2. FATTORIZZAZIONE DI INTERI
G(a, 1), G(a, 2), . . . , G(a, M), G(a + 1, 1), G(a + 1, 2), . . . , G(a + 1, M),
dove si intende 0 < |a|, b ≤ M, mcd(a, b) = 1 e M un bound tale da
garantire un numero sufficiente di numeri B-lisci affinchè valga (i) per
qualche S. In particolare, per i motivi visti nella trattazione del crivello
quadratico è sufficiente crivellare π(B) + 1 elementi, e poi usare vettori
esponenti modulo due per trovare una dipendenza lineare tra i vettori,
e dunque S tale da rendere vera (i).
A questo punto, il problema fondamentale è che tale S, soddisfacente (i), può non soddisfare (ii). Per superarlo, iniziamo introducendo
alcune nozioni sui polinomi simmetrici.
Definizione 3.1. Chiamiamo polinomio simmetrico elementare iesimo nelle incognite α1 , . . . , αd , per ogni i ∈ [1, d] ∩ N, il seguente
X
σi (α1 , . . . , αd ) :=
αj1 · · · αji
1≤j1 <...<ji ≤d
Definizione 3.2. Siano α1 = α, α2 , . . . , αd ∈ C le radici complesse
di f (x). La norma N(β) di un elemento β := s0 +s1 α+· · ·+sd−1 αd−1 ∈
Q[α], si ∈ Q è definita come
N(β) :=
d
Y
β(αi)
i=1
dove si intende β(αi ) = s0 + s1 αi + · · · + sd−1 αid−1 .
Proposizione 3.1. N(β) ∈ Q.
Dimostrazione. N(β) è un polinomio simmetrico nelle incognite
α1 , . . . , αd , vale a dire N(β)(α1 , . . . , αd ) = N(β)(αρ(1) , . . . , αρ(d) ) per
ogni permutazione ρ di {1, . . . , d}. Per il teorema fondamentale sui
polinomi simmetrici, N(β) si può scrivere in modo unico come polinomio a coefficienti in Q nei polinomi simmetrici elementari σ1 , . . . , σd .
È sufficiente provare il seguente
Fatto 11. σi (α1 , . . . , αd ) = (−1)d−i · cd−i dove cd−i ∈ Z è il
coefficiente (d − i)-esimo di f (x) = c0 + c1 x + . . . + cd−1 xd−1 + xd .
Dimostrazione. Le αQ
1 , . . . , αd sono tutte e sole le radici complesse di f (x), dunque f (x) = i (x − αi ). Dunque espandendo il prodotto
si vede che
c0 = (−1)d α1 · · · αd = (−1)d σd
X
(−1)d−1 αj1 · · · αjd−1 = (−1)d−1 σd−1
c1 =
1≤j1 <...<jd−1 ≤d
..
.
cd−1 = −α1 − . . . − αd = −σ1
Il che implica la tesi se si moltiplica ambo i membri di ogni equazione
per (−1)d−k , con k opportuno.
3. IL CRIVELLO SU CAMPI DI NUMERI
41
Corollario 3.2. Una condizione necessaria affinchè valga (ii) è
Y
N(a − bα) = u2 ,
per qualche u ∈ Z (∗)
(a,b)∈S
Dimostrazione. Argomentando in modo simile alla proposizione
appena vista si vede che a, b ∈ Z implica N(a − bα) ∈ Z. Inoltre la
norma è moltiplicativa, vale a dire N(ββ ′ ) = N(β)N(β ′ ). Dunque la
tesi.
Vediamo ora come sia possibile verificare simultaneamente (*) e (i):
Fatto 12. Sia F (x, y) = xd + cd−1 xd−1 y + · · · + c0 y d la forma
omogenea di f (x). Allora N(a − bα) = F (a, b).
Dimostrazione.
d
Y
N(a − bα) =
(a − bαi )
i=1
d
Y
(a/b − αi )
= b
d
i=1
d
= b f (a/b),
d
Y
perchè f (x) =
(a − bαi )
i=1
= F (a, b)
Dunque è possibile crivellare per numeri B-lisci la sequenza derivante dal polinomio in due variabili
F (a, b) · G(a, b)
e associare ad ogni elemento della sequenza un vettore degli esponenti che contenga nella prima metà delle coordinate gli esponenti della
fattorizzazione di F (a, b), e nella seconda metà gli esponenti della fattorizzazione di G(a, b), ragionando sempre nel campo di Galois F2 .
Resta il seguente problema
Fatto 13. La condizione (*) è necessaria ma non sufficiente per
(ii).
Dimostrazione. Un contro-esempio è il seguente: se f (x) = x2 +1
e se si considera Z[i], allora quando a ∈ Z è un non-quadrato, lo è anche
a ∈ Z[i], ma N(a) = a2 .
42
2. FATTORIZZAZIONE DI INTERI
Per superare anche questo intoppo, vengono, in primis, introdotti
dei vettori esponenti del tipo ~v (a − bα) := (vp,r (a − bα))p,r , tali vettori possono essere visti come matrici π(B) × B oppure come vettori di
lunghezza π(B)B. Poi, l’idea fondamentale, dovuta a Pollard, Adelman ed altri, è trovare due nuove condizioni necessarie (Lemma 3.4 e
Lemma 3.5) tali che la loro congiunzione implichi euristicamente la (ii).
Stabilire la validità di questa congettura, che formalizziamo in Congettura 3.1, è un problema aperto. Iniziamo l’esposizione della tecnica
definendo formalmente ~v.
Definizione 3.3 (Pollard). Per ogni primo p, sia
R(p) := {r ∈ [0, p − 1] ∩ N | f (r) ≡ 0 (mod p)}
Proposizione 3.3. Siano a, b ∈ Z, mcd(a, b) = 1, allora
F (a, b) ≡ 0 (mod p) ⇐⇒ a ≡ br
(mod p),
per qualche r ∈ R(p)
Dimostrazione. Se p | b allora F (a, b) ≡ ad ≡ 0 (mod p) ⇐⇒
p | ad ⇐⇒ p|a. Se p ∤ b allora F (a, b) = bd f (a/b) ≡ 0 (mod p) ⇐⇒
ab−1 (mod p) ∈ R(p). Dunque la tesi.
Q
Definizione 3.4 (Pollard). Sia F (a, b) = p≤B pe(p) la fattorizzazione canonica di F (a, b) ∈ Z, per ogni p ≤ B primo e ogni r ∈ R(p)
definiamo
0
se a 6≡ br (mod p)
vp,r (a − bα) :=
e(p) (mod 2) se a ≡ br (mod p)
La prima condizione di Pollard, che non dimostriamo dato che ne
esiste in letteratura una prova dettagliata, è la seguente
Lemma 3.4 (Pollard). Sia I l’anello degli interi algebrici appartenenti a Q[α] (cioè I è l’anello degli elementi di Q[α] che sono radici di
un qualche polinomio monico in Z[x] a coefficienti interi). Se S è un
insieme di coppie
Q di interi coprimi tale che per ogni (a, b) ∈ S F (a, b) è
B-liscio, e se (a,b)∈S (a − bα) è il quadrato di un elemento in I, allora
X
~v (a − bα) ≡ ~0 (mod 2)
(17)
(a,b)∈S
Dimostrazione. Una dimostrazione dettagliata, ma piuttosto lunga, si trova in [14]. Per questo motivo ci permettiamo di ometterla. Segue la seconda condizione di Pomerance.
Lemma 3.5 (Pomerance). Sia f un polinomio monico e irriducibile
in Z[x], e sia α una radice complessa di f . Sia q un primo dispari e
sia s un intero tale che f (s) ≡ 0 (mod q) e f ′ (s) 6≡ 0 (mod q). Sia
S un insieme di coppie di interi coprimi (a, b) tale che q non divide
3. IL CRIVELLO SU CAMPI DI NUMERI
Q
alcun a − bs per (a, b) ∈ S e f ′ (α)2 (a,b)∈S a−bs
q
in Z[α]. Allora
Y a − bs =1
q
43
= 1 è un quadrato
(18)
(a,b)∈S
Dimostrazione. Come spiega Pomerance in [14], si tratta solo
di considerare l’omomorfismo φq Z[α] → Zq che manda α in s mod q.
Infatti per ipotesi esiste γ ∈ Z[α] tale che
Y
f ′ (α)2
(a − bα) = γ 2
(a,b)∈S
e sempre usando le ipotesi vale
Y
φq (γ 2 ) ≡ f ′ (s)
(a − bs) 6= 0 (mod q)
(a,b)∈S
dunque
φq (γ 2 )
q
=
φq (γ)2
q
′
2
= 1 e dato che ( f (s)
) = 1 abbiamo
q
Y a − bs =
q
(a,b)∈S
Q
(a,b)∈S (a
q
− bs)
!
=1
Formuliamo ora la congettura e le considerazioni finali che permettono di concludere la correttezza del metodo di fattorizzazione.
Congettura 3.1. Se k è sufficientemente grande, euristicamente
k = ⌊3 ln n⌋, e se q1 , . . . , qk sono primi dispari che non dividono N(a −
bα) per (a, b) ∈ S e se vale sj ∈ R(qj ) per j = 1, . . . , k con f ′ (sj ) 6≡ 0
(mod qj ), allora
Y
(17) e (18) =⇒
(a − bα) = γ 2
per qualche γ ∈ I
(a,b)∈S
A questo punto, assumendo di conoscere γ 2 , il metodo consiste nel
prendere f ′ (α)2 γ 2 , dato che vale la seguente
Proposizione 3.6 (Pomerance, Weiss). Sia I l’anello degli interi
algebrici appartenenti a Q[α], e sia β ∈ I. Sia f (x) un polinomio
monico irriducibile in Z[x], con radice complessa α. Allora f ′ (α)β ∈
Z[α].
Dimostrazione. Pomerance [14].
44
2. FATTORIZZAZIONE DI INTERI
3.2. L’algoritmo NFS. Riassumiamo ora l’algoritmo NFS di Pomerance, come in [14] .
Il crivello sui campi di numeri
input: un naturale dispari n che non è potenza perfetta di un primo
1.
[Inizializzazione]
2
1.1
d ← ⌊(3 ln n/ ln ln n)1/3 ⌋, cosı̀ d2d < n
1.2
B ← ⌊exp((8/9)1/3 (ln n)1/3 (ln ln n)2/3 )⌋
1.3
m ← ⌊n1/d ⌋
1.4
scrivere n in base m: n = md + cd−1 md−1 + · · · + c0
1.5
f (x) ← xd + cd−1 xd−1 + · · · + c0
1.6
provare a fattorizzare f (x) in fattori irriducibili su Z con un
algoritmo di fattorizzazione per polinomi
1.7
Se f (x) = g(x)h(x) è una fattorizzazione non banale di f
1.8
allora restituire n = g(m)h(m), fattorizzazione non banale di n
1.9
F (x, y) ← xd + cd−1 xd−1 y + · · · + c0 y d
1.10
G(x, y) ← x − my
1.11
Per ogni primo p ≤ B
1.12
R(p) ← {r ∈ [0, p − 1] ∩ N | f (r) ≡ 0 (mod p)}
1.13
k ← ⌊3 ln n⌋
1.14
Calcolare i primi k primi q1 , q2 , . . . , qk > B tali che esista sj ∈ R(qj )
per cuiPf ′ (sj ) 6≡ 0 (mod p), e memorizzare le k coppie (qj , sj )
1.15
B ′ ← p≤B #R(p)
1.16
V ← 1 + π(B) + B ′ + k
1.17
M ←B
2.
[Il Crivello]
2.1
Usare un crivello per trovare un insieme S ′ di coppie di interi coprimi (a, b)
tali che 0 < |a|, b ≤ M e F (a, b)G(a, b) B-liscio, finchè non si ha #S ′ > V
(Euristica: se S ′ non viene trovato riprovare incrementando M oppure B)
3.
Definizione della matrice
3.1
Istanziare una matrice binaria di dimensioni V × #S ′ con una riga
per coppia (a, b)
3.2
Calcolare il vettore esponente ~v (a − bα) avente V coordinate come segue:
3.3
Porre la prima coordinata di ~v a 1 se G(a, b) < 0, altrimenti porre 0
3.4
Per ogni p1 , . . . , pπ(B) ≤ B, se pγi || |G(a, b)|, porre la
coordinata i + 1-esima di ~v a 0 se γ è pari, altrimenti porre 1
3.5
Per ogni (pi , rj ), con pi ≤ B l’i-esimo primo e rj ∈ R(pi ) il
j-esimo elemento di R(pi ), porre la coordinata relativa a p, r, ovvero
la (1 + π(B) + (i − 1)#R(pi ) + j)-esima, a 1 se vp,r (a − bα) è dispari,
altrimenti porre a 0
3.6
Porre le rimanenti
kcoordinate, ovvero quelle relative alle coppie
a−bsj
(qj , sj ) a 1 se
= −1, altrimenti porre a 0
qj
3.7
Porre il vettore esponente ~v (a − bα) appena definito come la prossima riga
non acora definita della matrice istanziata al passo 3.1
3. IL CRIVELLO SU CAMPI DI NUMERI
45
4. Algebra Lineare
4.1 P
Usando un algoritmo di Algebra Lineare, trovare S ⊆ S ′ non vuoto tale che
v (a − bα) ≡ 0 (mod 2)
(a,b)∈S ~
5. Radici Quadrate
Q
5.1 Usando la fattorizzazione canonica del quadrato (a,b)∈S (a − bm),
Q
trovare v mod n tale che (a,b)∈S (a − bm) ≡ v 2 (mod n)
Q
5.2 Calcolare una radice quadrata γ ∈ Z[α] di f ′ (α)2 (a,b)∈S (a − bα)
e calcolare u ← φ(γ) (mod n) con la sostituzione α
m
6. Fattorizzazione
6.1 Restituire mcd(u − f ′ (m)v, n)
Nota. Radici Quadrate in Z[α]
Ci occupiamo di far notare il passo 5.2 dell’algoritmo, ovvero la seguente questione: dato un elemento γ 2 ∈ Z[α], determinare γ. Il problema
di trovare un algoritmo dimostrabilmente efficiente e generale non è
del tutto chiuso, ed in effetti esistono diversi approcci in letteratura
ma alcuni non sono generali, come il metodo di Couveignes [13], ed
altri sono euristici, come il metodo di Montgomery poi rielaborato da
Nguyen [21]. Tuttavia secondo Pomerance [14] quest’ultimo sembra
essere, nella pratica, il migliore.
3.3. Complessità Computazionale. L’analisi del tempo di calcolo del crivello su campi di numeri e del parametro ottimale d si basa
sul seguente teorema di Pomerance.
Teorema 3.7 (Pomerance). Si supponga che m1 , m2 , . . . sia una
sequenza di interi in [1, X] ∩ N, per qualche X ∈ N, ognuno scelto indipendentemente e con distribuzione uniforme. Sia N il minimo intero
tale che una qualche sottosequenza non vuota di m1 , m2 , . . . , mN abbia
√
come prodotto un quadrato. Allora il valore atteso di N è LX (1/2, 2).
È evidente che in realtà la sequenza m1 , m2 , . . . del crivello non è
casuale, ma assumere euristicamente che il comportamento effettivo
della sequenza non sia molto diverso da quello casuale semplifica notevolmente l’analisi, che altrimenti resterebbe un problema difficilmente
affrontabile. Stabilire la correttezza di questa semplificazione euristica
è un problema aperto.
Il seguente teorema stabilisce la complessità computazionale del crivello
sui campi di numeri.
Teorema 3.8 (Pollard). Sia Ln [α, c] definita nella Definizione 1.7.
Il tempo di calcolo T (d) del crivello sui campi di numeri, in funzione
del parametro d, ha un punto di minimo approssimativamente in d ≈
1/3
e con tale d risulta T (d) ≈ Ln [1/3, (64/9)1/3 ].
3 lnlnlnnn
Dimostrazione. Nel crivello su campi di numeri la sequenza m1 , m2 , . . .
è formata da interi della forma F (a, b)G(a, b) al variare di |a|, b ≤ M.
46
2. FATTORIZZAZIONE DI INTERI
Ricordiamo che vale F (x, y) = xd + cd−1 xd−1 y + · · · + c0 y d e G(x, y) =
x − my, inoltre m, cj ≤ n1/d per ogni coefficiente cj di F . Dunque
d+1
|F (a, b)G(a, b)| ≤ X se poniamo X := 2(d + 1)n2/d M
√ . Per il teorema 3.8 dunque ci aspettiamo che bastino LX [1/2, 2] coppie
(a, b)
√
per avere un quadrato. Dunque deve essere M 2 = LX [1/2, 2], e cosı̀,
usando la definizione di L· [·, ·] possiamo scrivere
√
√
d+1
d+1
X = 2(d + 1)n2/d (M 2 ) 2 = 2(d + 1)n2/d ( 2 + o(1))(e ln X ln ln X ) 2
⇓
r
2
1
ln(X) ≈ ln(2(d + 1)) + ln n + (d + 1)
ln X ln ln X
d
2
Per n e d sufficientemente grandi possiamo dunque approssimare con
r
1
2
ln X ln ln X
ln X ≈ ln n + d
d
2
Il nostro scopo è approssimare un d che minimizza X = X(d), per
n fissato, dunque ha senso considerare l’equazione ln X = d2 ln n +
q
d 12 ln X ln ln X, e imporre nulla la derivata parziale ∂d X = 0. Cosı̀
otteniamo le equazioni
r
1
−2
d(∂d X)(1 + lnlnX)
∂d X
q = 2 ln n +
ln X ln ln X +
0=
X
d
2
1
ln X ln ln X
4X
2
⇓
d = (2 ln n)1/2 ((1/2) ln X ln ln X)−1/4
D’altra parte per n sufficientemente grande vale anche
ln X ≈
2
ln n
d
cosı̀ sostituendo d si ottiene l’approssimazione
ln X ≈ 2(2 ln n)1/2 ((1/2) ln X ln ln X)1/4 ⇒ (ln X)3/4 ≈ 2(2 ln n)1/2 ((1/2) ln ln X)1/4
dunque
3
4
ln ln X ≈ 21 ln ln n, e ri-sostituendo si ottiene
(ln X)3/4 ≈ 2(2 ln n)1/2 ((1/3) ln ln n)1/4
⇓
ln X ≈
4
31/3
(ln n)
2/3
(ln ln n)
1/3
ed≈
3 ln n
ln ln n
1/3
4. APPLICAZIONI IN CRITTOGRAFIA
47
Abbiamo dunque la seguente espressione per il tempo di calcolo del
crivello su campi di numeri:
!
!
1/3
√
64
+ o(1) (ln n)1/3 (ln ln n)2/3 )
T (d) = LX [1/2, 2] ≈ exp
9
= Ln [1/3, (64/9)1/3 ]
4. Applicazioni in Crittografia
4.1. Una funzione one-way. Lo scopo di questo paragrafo è dimostrare il Teorema 4.2: questa proposizione mostra la grande importanza del problema della fattorizzazione nei fondamenti delle primitive
crittografiche e compare come esercizio lasciato al lettore in [15]. Prima di procedere ricordiamo la definizione di funzione debolmente e
fortemente one way, che dobbiamo ancora a [15].
Definizione 4.1 (Funzione one-way, [15]). Sia f una funzione del
tipo f : {0, 1}∗ → {0, 1}∗, e sia Un una variabile aleatoria distribuita
uniformemente a valori in {0, 1}n . Diciamo che f è fortemente oneway se valgono le seguenti
(1) Esiste una TM polinomiale-deterministica A tale che, su input
x, A si arresta con f (x) sul nastro, in simboli A(x) ↓= f (x).
(2) Per ogni TM polinomiale-probabilistica A′ , per ogni funzione polinomiale positiva p(·) e per tutti gli n sufficientemente
grandi, la probabilità che A′ inverta f è p-trascurabile, vale a
dire
1
P A′ (Un , 1n ) ↓∈ f −1 (f (Un )) <
p(n)
Diciamo invece che f è debolmente one-way se valgono le seguenti
(1) Identica alla condizione (1) delle funzioni fortemente one-way
(2) Esiste una funzione polinomiale p(·) tale che per ogni TM
polinomiale-probabilistica A′ e per tutti gli n sufficientemente
grandi la probabilità che A′ non inverta f non è p-trascurabile,
vale a dire
1
P A′ (Un , 1n ) ↓6∈ f −1 (f (Un )) >
p(n)
Un fatto di fondamentale importanza, che è dimostrato in dettaglio in [15] è che è possibile costruire in tempo polinomiale funzioni
fortemente one-way partendo da funzioni debolmente one-way, questo
ci permette di ragionare solo sulle funzioni debolmente one-way, su cui
risulta più comodo fare considerazioni.
48
2. FATTORIZZAZIONE DI INTERI
Denotiamo con ℘n l’insieme dei primi con esattamente n cifre binarie.
Pn e Qn saranno sempre variabili aleatorie uniformi a valori in ℘n .
Congettura 4.1 (Assunzione sulla fattorizzazione di semiprimi,
FA). Per ogni algoritmo probabilistico A polinomiale in tempo, per ogni
polinomio positivo p(·) e per ogni n > n0 la probabilità che A fattorizzi
vale
1
P A(Pn · Qn ) ↓∈ {Pn , Qn } <
p(n)
Lemma 4.1. La probabilità che un numero naturale con esattamente
n cifre binarie, scelto in maniera uniforme, sia primo è definitivamente
maggiore di 1/n.
Dimostrazione. Chiamiamo πn il numero di primi con esattamente n cifre binarie. La probabilità in analisi è dunque pari a πn /2n−1 .
Per il Teorema dei Numeri Primi (cioè π(n) ≈ n/ ln n) abbiamo
n
1
2n−1 1
2
2n−1
1
n
n−1
πn = π(2 ) − π(2 ) ≈
=
=
−
−
ln 2 n
n−1
ln 2 n n(n − 1)
!
2n−1 1
1
=
−o
ln 2 n
n
Dunque la probabilià cercata vale
1
1
πn
≈
>
2n−1
(ln 2)n
n
Le approssimazioni usate valgono per n sufficientemente grande.
Teorema 4.2. Sia M(Xn , Yn ) := Xn · Yn , dove Xn e Yn sono variabili aleatorie indipendenti e distribuite uniformemente a valori nell’insieme dei naturali con esattamente n cifre binarie. Assumendo la
Congettura 4.1 M è debolmente one-way.
Dimostrazione. M è calcolabile in tempo polinomiale deterministico. Bisogna poi provare che esiste un polinomio p positivo tale che,
per ogni algoritmo probabilistico polinomiale in tempo A e per ogni
n > n0 , P(A(Xn · Yn ) ↓6∈ {Xn , Yn }) > 1/p(n): nel nostro caso FA è
equivalente a dire che per ogni polinomio f
P A(Pn · Qn ) ↓6∈ {Pn , Qn } > 1 −
1
f (n)
In generale, sappiamo che per ogni evento A e B vale P(A) ≥ P(A∩B),
inoltre, per il lemma 4.1 e per l’indipendenza delle due variabili Xn , Yn
4. APPLICAZIONI IN CRITTOGRAFIA
49
avremo P(Xn , Yn ∈ ℘n > 1/n2 , dunque possiamo scrivere
P A(Xn · Yn ) ↓6∈ {Xn , Yn }
≥
P A(Xn · Yn ) 6∈ {Xn , Yn } ∩ Xn , Yn ∈ ℘n
=
P A(Xn · Yn ) 6∈ {Xn , Yn }) Xn , Yn ∈ ℘n P Xn , Yn ∈ ℘n
>
1
1
1−
f (n) n2
Come detto, questo è vero per ogni polinomio f ; prendendo, ad esempio, f (n) = n, e notando che 1 − 1/n > 1/n per n > n0 ≥ 2, si ottiene
che esiste il polinomio p = n3 per cui è verificato
1
P (A(Xn · Yn ) 6= Xn ) > 3
n
4.2. Crittografia a chiave pubblica, RSA. Diamo una descrizione schematica di uno dei più popolari crittosistemi a chiave pubblica,
proposto da Rivest Shamir ed Adleman nel 1978 in [26], la cui sicurezza
dipende anche dalla assunzione sulla difficoltà di risolvere il problema
della fattorizzazione di interi.
m
Schema RSA per B −→ A
A
(1) Sceglie due primi p, q e
calcola n ← p · q e ϕ(n)
(2) Sceglie e ∈ (Z/ϕ(n)Z)∗ \ {1}
(3) Calcola d t.c. ed ≡ 1 (mod ϕ(n))
B
(4)
invia (n,e)
(8) m ← cd (mod n)
−→
(5) m ∈ Z/nZ
←−
(6) c ← me (mod n)
(7)
invia c
Per provare la correttezza di RSA è sufficiente dimostrare la seguente
proposizione.
Proposizione 4.3 (RSA). Sia n = p · q prodotto di due primi
distinti, siano e, d ∈ Z/ϕ(n)Z tali che e 6= 1 e ed ≡ 1 (mod ϕ(n)), sia
m ∈ Z/nZ. Allora med ≡ m (mod n)
Dimostrazione. Se p | m allora med ≡ 0 ≡ m (mod p), altrimenti, quando p ∤ m, esiste un intero k tale che
med = mϕ(n)·k · m ≡ m
(mod p)
, dove abbiamo usato il teorema di Eulero-Fermat. Dunque, in ogni caso, med ≡ m (mod p). Similmente si dimostra che med ≡ m (mod q).
Dato che i primi p e q sono distinti deve essere med ≡ m (mod n). CAPITOLO 3
Logaritmo Discreto
Il problema del logaritmo discreto formalizzato nel Capitolo 1 come
DLP consiste nel calcolare un analogo per i gruppi ciclici dei logaritmi
ordinari sui numeri reali o complessi. Tale questione, oltre ad essere
interessante da un punto di vista puramente matematico, si rivela fondamentale per stabilire la sicurezza di alcune primitive crittografiche:
se esistesse una procedura efficiente per calcolare i logaritmi discreti sui
gruppi ciclici, allora il problema di Diffie-Hellman, su cui si basa, ad
esempio, il crittosistema di ElGamal, risulterebbe anch’esso trattabile. Le origini storiche di questo problema si possono far coincidere con
gli studi di Gauss nelle Disquisitiones Arithmeticae del 1801, il quale
sembrava preferire il termine “indice” a “logaritmo”. In questo capitolo studiamo il limite inferiore generico di Shoup, il metodo Baby Step
Giant Step di Shanks e l’Index Calculus, un algoritmo non generico
con complessità in tempo sub-esponenziale.
1. Il limite inferiore generico di Shoup
Nel
√ 1997 Victor Shoup è riuscito a dimostrare un limite inferiore
di Ω( n) per la complessità in tempo del logaritmo discreto. Per fare questo, però, ha considerato una particolare classe di algoritmi, gli
algoritmi generici. In altre parole questo limite inferiore non riguarda
qualsiasi tipo di algoritmo o metodo di calcolo, ma riguarda una precisa
formulazione del concetto di algoritmo che risulta essere particolarmente restrittiva. Il risultato è comunque interessante e importante perchè
dimostra che gli algoritmi che funzionano su qualsiasi gruppo ciclico,
come il metodo Baby Step Giant Step di Shanks, sono ottimali. In altre
parole, per trovare algoritmi più efficienti è necessario porre restrizioni
sul gruppo su cui si vuole lavorare e sfruttare la particolare struttura
di tale gruppo, come succede, ad esempio, nell’ Index Calculus.
Formalizziamo il concetto di algoritmo generico:
Definizione 1.1 (Algoritmo Generico di Shoup). Sia Cn il gruppo
ciclico di ordine n, ricordiamo che possiamo vederlo come il gruppo
additivo degli interi modulo n: infatti Cn ∼
= Z/nZ. Sia S un insieme
di stringhe binarie, vale a dire S ⊂ {0, 1}∗, di cardinalità almeno n.
Un algoritmo generico A su Z/nZ è un algoritmo probabilistico con le
seguenti proprietà
51
52
3. LOGARITMO DISCRETO
• A accetta in ingresso una lista detta “lista di codifica” del tipo
(σ(x1 ), . . . , σ(xk )) dove k ∈ N, xi ∈ Z/nZ per ogni i, e σ :
Z/nZ → S è una funzione iniettiva detta “codifica”. Durante
il processo di computazione la lista di codifica può evolversi,
nel modo specificato da questo secondo punto.
• L’unico modo che A ha a disposizione per eseguire operazioni
di gruppo, cioè sommare e calcolare l’inverso, sugli elementi
xi è consultare un oracolo O: O prende in ingresso una tripla
(i, j, ±), dove ± è il segno dell’operazione, e aggiunge σ(xi ±
xj ) in coda alla lista di codifica. La lista di codifica non può
evolvere in alcun altro modo, in altre parole A può solo leggere
la lista di codifica, ed O può solo aggiungere elementi in coda.
Proponiamo un esempio: immaginiamo che A prenda in ingresso gli
elementi codificati σ(1), σ(x) ∈ S per 1, x ∈ Z/nZ, denotiamo questo
fatto con A(σ; 1, x), la notazione non tragga in inganno: cosı̀ A non
conosce 1, x, ma esclusivamente σ(1), σ(x); la lista di codifica al passo
0 è dunque (σ(1), σ(x)). Al passo 1, A può passare in ingresso ad O,
ad esempio, la tripla (1, 2, −), e dunque al passo 2 la lista di codifica a
cui A ha accesso “in lettura” diventerà (σ(1), σ(x), σ(1 − x)). A questo
punto A può passare, ad esempio, la tripla (1, 3, +) ad O, dove l’indice
3 è quello relativo al nuovo elemento σ(1 − x) nella lista di codifica, e
cosı̀ via.
Il risultato di Shoup che vogliamo studiare è il seguente.
Teorema 1.1. Sia n ∈ N e sia p il suo divisore primo più grande.
Sia A un algoritmo generico per il calcolo del logaritmo discreto nel
√
gruppo ciclico Cn ; allora A richiede Ω( p) operazioni-gruppo 1.
La formulazione del Teorema 1.1 è in un certo senso informale,
perchè non abbiamo chiarito cosa voglia dire, con il formalismo degli
algoritmi generici, risolvere il problema del logaritmo discreto. Sappiamo che una istanza di DLP per il gruppo ciclico Cn consiste in una
coppia (g, x) dove g è un generatore del gruppo e il nostro obiettivo
è trovare t tale che g t = x. Ma considerando Cn ∼
= Z/nZ possiamo
prendere 1 ∈ Z/nZ come generatore. Allora, date in ingresso le codifiche σ(1), σ(x), A deve calcolare e restituire l’intero x. Questa è
la formulazione del problema. Dato che per definizione A non sfrutta
alcuna conoscenza sulla codifica σ(·), e quindi tutte le codifiche σ(·)
sono equivalenti, nel senso che il numero di passi dell’algoritmo A non
dipende dalla particolare σ(·), è sufficiente mostrare che esiste almeno
√
una σ per cui vale il limite inferiore di Ω( p). Per fare questo, basta
dimostrare che il limite inferiore vale per σ scelta in maniera casuale
uniforme. Questo è quello che dimostriamo nel corollario del seguente:
1Nel
nostro scenario identifichiamo una operazione-gruppo con una chiamata
all’oracolo O.
1. IL LIMITE INFERIORE GENERICO DI SHOUP
53
Teorema 1.2 (Shoup, [28]). Sia n ∈ N e sia p il suo divisore primo
più grande. Sia S ⊂ {0, 1}∗ un insieme con almeno n elementi. Sia
A un algoritmo generico su Z/nZ e S che compia al più m operazioni
di gruppo. Se x ∈ Z/nZ e una funzione di codifica σ : Z/nZ → S
iniettiva sono scelti in maniera casuale, allora
P A(σ; 1, x) ↓= x = O(m2 /p)
dove la probabilità si intende estesa su σ, x e i passi probabilistici di A.
La tecnica di dimostrazione che Shoup usa per provare questo ed
altri risultati basati sugli algoritmi generici consiste in due passi fondamentali:
(1) Trovare un evento E nello spazio di probabilità tale che contenga propriamente l’evento “A termina correttamente”, che
in questo caso coincide con l’evento “A(σ; 1, x) ↓= x”.
(2) Trovare un limite superiore per P(E) in funzione del numero di operazioni-gruppo m, ovvero qualcosa del tipo P(E) =
O(f (m)) per f : N → N.
In altre parole vogliamo trovare una “barriera” che A deve necessariamente superare per restituire valori corretti con probabilità non tendente a zero quando n cresce, e poi stimare superiormente la probabilità
che questa “barriera” venga superata. Esponiamo ora la dimostrazione
di Shoup. Nell’articolo [28] viene data solo una bozza, e vengono illustrati solo i passi critici. Qui ci preoccupiamo di formalizzare in modo
soddisfacente l’argomento.
Premettiamo un
Lemma 1.3. Sia p un primo e sia t ≥ 1 un intero. Sia F (X1 , . . . , Xk ) ∈
Z/pt Z[X1 , . . . , Xk ] un polinomio non nullo di grado δF = d. Siano
x1 , . . . , xk ∈ Z/pt Z scelti in maniera casuale uniforme, allora
P F (x1 , . . . , xk ) ≡ 0 (mod pt ) ≤ d/p
Dimostrazione. Affermiamo che non perdiamo generalità se consideriamo t = 1: infatti se t > 1 consideriamo la più grande potenza
pk , 0 ≤ k ≤ t − 1, che occorre tra i coefficienti di F , e dividiamo per
pk ambo i membri di F ≡ 0 (mod pt ); riducendo modulo p otteniamo
una congruenza del tipo G ≡ 0 (mod p) per G ∈ Z/pZ[X1 , . . . , Xk ]
non nullo, dunque con t = 1.
Sia allora t = 1, ragioniamo per induzione su k. Se k = 1 abbiamo un
polinomio in una variabile a coefficienti nel campo Z/pZ, dunque abbiamo al più d radici distinte e la probabilità di indovinare una radice
è d/p. Assumiamo vera la tesi per k − 1. Il polinomio F ∈ Z/pZ può
essere visto come polinomio nella sola indeterminata X1 a coefficienti
54
3. LOGARITMO DISCRETO
′
in Z/pZ[X2 , . . . , Xk ], sia C(X2 , . . . , Xk ) il coefficiente di X1d se il polinomio F ∈ Z/pZ[X2 , . . . , Xk ][X1 ] ha grado d′ , per ipotesi di induzione
la probabilità di indovinare una radice di C è al più (d−d′ )/p dunque C
ha al più pk−2 (d − d′ ) radici. Per limitare il numero di radici di F condizioniamo: se y := (x2 , . . . , xk ) è una radice di C, F (X1 , y) ha al più p
radici in Z/pZ perchè è possibile che sia nullo per ogni valore di x1 , in
tal caso F (X1 , . . . , Xk ) ha al più p · pk−2 (d − d′ ) = pk−1 (d − d′ ) radici,
altrimenti, se y non è radice di C, F (X1 , y) ha al più d′ radici perchè è
un polinomio in una variabile di grado d′ , e in tal caso F (X1 , . . . , Xk )
deve avere meno di pk−1 d′ radici. Dunque in totale F (X1 , . . . , Xk ) ha
al più pk−1 d radici, ma allora la probabilità di indovinare una radice è
k−1
al più p pk d = d/p.
Dimostrazione. (Teorema 1.2). Sia n = pt · s con mcd(p, s) =
1, allora sappiamo che Z/nZ ∼
= Z/pt Z + Z/sZ tramite un isomorfismo che chiamiamo Ψ. Costruiamo una sequenza F1 , F2 , . . . , Fm+2 ∈
Z/pt Z[X] di polinomi nel seguente modo: poniamo F1 := 1, F2 := X.
Assumendo che la k-esima operazione-gruppo, per 1 ≤ k ≤ m, sia
(i, j, ±), dove i, j < k + 2, poniamo
Fk+2 := Fi ± Fj ∈ Z/pt Z[X]
Informalmente osserviamo che tale sequenza tiene conto delle immagini
(in Z/pt Z) dei risultati delle m operazioni-gruppo.
Ψ
Assumiamo che A(σ, x) ↓= y ∈ Z/nZ, e sia y ′ tale che y
(y ′, y ′′ ) ∈
Z/pt Z + Z/sZ. Ricordiamo che l’input di A è (σ(1), σ(x)), con σ, x
scelti in modo casuale uniforme. Siano σ1 := σ(1), σ2 := σ(x) e sia
σk+2 per 1 ≤ k ≤ m il risultato della k-esima operazione gruppo. Sia
E l’evento
E := h σi = σj per qualche Fi 6= Fj
oppure indoviniamo y ′ scegliendo in maniera
casuale uniforme in Z/pt Z i
Ora verifichiamo che E sia effettivamente una “barriera”.
Fatto 14. Se A restituisce un risultato corretto, vale a dire se
y = x, allora si verifica l’evento E.
Dimostrazione. Se y = x, e x′ è l’immagine di x in Z/pt Z rispetto a Ψ, necessariamente y ′ = x′ . Vi sono due casi: A indovina x′
scegliendo in maniera casuale uniforme in Z/pt Z, oppure A determina
x′ sfruttando in un qualche modo il suo input (σ(1), σ(x)). Nel primo
caso, l’evento E è banalmente verificato. Nel secondo caso, assumiamo per assurdo che E non si verifichi, ovvero che σi 6= σj per ogni
1 ≤ i 6= j ≤ m + 2 tali che Fi 6= Fj . Allora, dato che σ è scelta in maniera casuale uniforme, A viene a conoscenza solo di una sequenza di
stringhe distinte con distribuzione casuale uniforme rispetto alla componente Z/pt Z, dunque non può conoscere alcuna relazione tra elementi
1. IL LIMITE INFERIORE GENERICO DI SHOUP
55
del gruppo, in particolare non può conoscere alcuna relazione lineare
tra le immagini in Z/pt Z degli elementi 1 e x, perciò l’unico modo che
ha per determinare y ′ = x′ è indovinare scegliendo in maniera casuale
uniforme in Z/pt Z, ma cosı̀ non sfrutta il suo input, assurdo.
Fatto 15. P(E) = O(m2 /p)
Dimostrazione. Siano i, j tali che σi = σj con Fi 6= Fj e poniamo
F := Fi − Fj . Siano xi , xj tali che σi = σ(xi ), σj = σ(xj ); allora
xi = xj perchè σ è iniettiva. Dunque, se x′i , x′j sono le immagini in
Z/pt Z rispetto a Ψ, necessariamente x′i = x′j . Allora dato che Fi (x) ≡
x′i mod pt , Fj (x) ≡ x′j (mod pt ), abbiamo anche F (x) ≡ 0 (mod pt ).
Dato che F 6= 0 e δF ≤ 1 per il Lemma P(F (x) ≡ 0 (mod pt )) ≤
1/p. Inoltre anche la probabilità di indovinare y ′ scegliendo in maniera
casuale uniforme è minore di 1/p. Abbiamo m operazioni-gruppo, e
dunque meno di m2 indici i, j tali che Fi 6= Fj , dunque la tesi.
Dunque P A(σ; 1, x) ↓= x < P(E) = O(m2 /p), il che completa la
dimostrazione del Teorema 1.2.
Corollario 1.4. Se esiste una costante c1 > 0 tale che P(A(σ; 1, x) ↓=
√
x) > c1 allora il numero di operazioni-gruppo è m = Ω( p).
Dimostrazione. Per il teorema 1.2 esiste una costante c2 > 0 tale
che
dunque m >
q
c1 < P(A(σ; 1, x) ↓= x) < c2
c1
p,
c2
√
ovvero m = Ω( p).
m2
p
La tecnica di Shoup permette di ottenere limiti inferiori anche per
problemi diversi dal logaritmo discreto. Con un argomento quasi identico al precedente è possibile, ad esempio, ottenere lo stesso limite
inferiore per il problema di Diffie-Hellman.
Teorema 1.5 (Shoup). Sia n ∈ N e sia p il suo divisore primo
più grande. sia S ⊂ {0, 1}∗ un insieme con almeno n elementi. Sia A
un algoritmo generico su Z/nZ e S che compia almeno m operazionigruppo. Se x, y ∈ Z/nZ e una codifica σ : Z/nZ → S iniettiva vengono
scelti in maniera casuale, allora
P A(σ; 1, x, y) ↓= σ(xy) = O(m2 /p)
Dimostrazione. Si dimostra allo stesso modo del Teorema 1.2,
ma definendo la successione di polinomi come F1 := 1, F2 := X, F3 =
Y, . . . , Fk := Fi ± Fj , . . . ∈ Z/pt Z[X, Y ], se n = pt · s con mcd(p, s) = 1,
e l’evento barriera E come
E := h σi = σj per qualche Fi 6= Fj
oppure Fi ≡ XY (mod pt ) per qualche i
oppure indoviniamo σ(xy) scegliendo in maniera casuale in S i
56
3. LOGARITMO DISCRETO
Il modello generico viene discusso informalmente anche in Koblitz
[18], dove gli autori ne criticano l’uso per dimostrazioni-riduzioni di
sicurezza in stile “provable-security”. Sempre in [18], gli autori fanno
notare che non è difficile cadere in ragionamenti fallaci quando si ha a
che fare con argomenti simili a quelli di Shoup, suggerendo quindi di
fare particolare attenzione ogniqualvolta si voglia estendere la tecnica
di Shoup ad altri problemi.
2. Un algoritmo generico: Baby-Step Giant-Step di Shanks
2.1. Il metodo Baby-step Giant-step di Shanks. Sia dato Cn
il gruppo ciclico di ordine n, un generatore g, e un elemento t ∈ Cn . Il
nostro obiettivo è trovare l’unico intero l ∈ [0, n − 1] tale che g l =√t. Il
metodo di Shanks è molto semplice: se scriviamo l in base b := ⌈ n ⌉,
necessariamente deve essere l = l0 + l1 · b per qualche 0 ≤ l0 , l1 ≤
b − 1, ma allora possiamo scrivere t = g l = g l0 g l1 ·b , equivalentemente
(g −1)l1 ·b · t = g l0 . Di conseguenza per trovare l0 , l1 , e dunque l, non dobbiamo fare altro che calcolare elementi del tipo g 0 , g 1, g 2 , g 3, . . . , g b−1 ed
elementi del tipo (g −b )0 · t, (g −b)1 · t, (g −b)2 · t, . . . , (g −b)b−1 · t e cercare
una “collisione” tra i due tipi. L’algoritmo di Shanks si formalizza nel
seguente modo, assumiamo che non si conosca direttamente n ma una
sua stima superiore n ≤ B.
Baby-Step Giant-Step
input: (B, g, t), dove g è un generatore del gruppo ciclico Cn , B ≥ n
e t ∈ Cn è un elemento del gruppo.
task: Determinare
un naturale l ∈ [0, B − 1] tale che t = g l .
√
1.
b ← ⌈ B⌉ e h ← (g −1)b .
2.
A ← {g i | 0 ≤ i ≤ b − 1},
B ← {thj | 0 ≤ j ≤ b − 1}.
Nota: A e B sono solitamente implementate usando delle tavole hash.
3.
Trovare x ∈ A ∩ B, diciamo per i, j tali che g i = x = thj .
4.
Restituire i + jb.
√
Il tempo di calcolo di tale metodo risulta essere O( B), dunque è un
algoritmo generico ottimale.
3. Un metodo non generico: l’Index Calculus
L’index Calculus è un metodo non generico in quanto sfrutta la
struttra del particolare gruppo su cui lavora. Si consideri infatti il
gruppo moltiplicativo del campo finito, F∗p per p primo, allora è possibile trattare l’equazione g l = t come una congruenza fra interi g l ≡ t
(mod p). Ora fissiamo un intero positivo B, il cui valore effettivo sarà
4. APPLICAZIONI IN CRITTOGRAFIA
57
chiarito in seguito, e assumiamo di conoscere relazioni del tipo
g r ≡ pr11 · pr22 · · · prkk
(mod p)
per p1 , . . . , pk primi minori o uguali di B, per g una radice primitiva
modulo p e per r scelto in maniera casuale uniforme. Allora abbiamo
anche relazioni del tipo
r ≡ r1 · logg p1 + . . . + rk · logg pk
(mod p − 1)
e dall’algebra lineare sappiamo come determinare tutti i logg pi , a patto di avere k relazioni linearmente indipendenti del genere. A questo
punto l’Index Calculus consiste nel sfruttare tali informazioni per calcolare logg t. Infatti se scegliamo ripetutamente R in maniera casualeuniforme è sufficiente trovare una la relazione-”collisione” del tipo
R · t ≡ pα1 1 · · · pαk k
(mod p)
per qualche α1 , . . . , αk , per poi ottenere
logg t ≡ −R + α1 · logg p1 + αk · logg pk
Segue lo pseudo-codice dell’Index Calculus.
Index Calculus di Pollard su F∗p
(mod p − 1)
input: (p, g, t), dove p è un primo, g una radice primitiva
modulo p, e t ∈ F∗p
taks: Calcolare logg t
√
1.
Porre B ← Lp [1/2, 1/ 2] e trovare i primi p1 , . . . , pπ(B)
nell’intervallo [1, B] con il crivello di Eratostene.
2.
Scegliere in maniera casuale uniforme un intero r ∈ [1, p − 2] e
controllare che g r mod p sia B-liscio.
Ripetere il passo 2 fino a che non si trovano B residui B-lisci.
3.
Con un algoritmo di algebra lineare calcolare logg p1 , . . . , logg pπ(B) .
4.
Scegliere in maniera casuale uniforme interi R ∈ [1, p − 2] fino a che
g R t mod p non è B-liscio.
5.
Calcolare logg t usando le relazioni trovate al passo 2 e
i logaritmi trovati al passo 3.
Per quanto riguarda la complessità in tempo dell’Index Calculus, evidentemente si ha a che fare con un problema simile a quello affrontato
nell’analisi del crivello quadratico, vale a dire stimare il numero medio
di volte che è necessario ripetere il passo 2 affinchè si trovi un sottoinsieme di relazioni linearmente indipendenti. In effetti nell’analisi di
Pomerance [23] vengono usate le medesime considerazioni, e si ottengono risultati sub-esponenziali del tutto simili.
√ In particolare si stima
che un valore ottimo di B sia B = Ln [1/2, 1/ 2].
4. Applicazioni in Crittografia
4.1. ElGamal e lo scambio di chiavi Diffie-Hellman. Diamo
una descrizione schematica del critto-sistema di ElGamal.
58
3. LOGARITMO DISCRETO
m
Schema ElGamal per B −→ A
A
B
(1) Sceglie un primo p e
una radice primitiva g modulo p.
(2) Sceglie uniformemente un intero
1 ≤ a ≤ p − 2 e calcola g a mod p
−a
(8) Calcola γ
mod p =
γ p−1−a mod p
(9) Decifra m ← γ −a · δ mod p
(3)
invia (p,g,g a )
−→
(7)
invia c
←−
(4) m ∈ Z/pZ
(5) Sceglie uniformemente
un intero 1 ≤ k ≤ p − 2
(6) Calcola γ ← g k mod p,
δ ← m · (g a )k mod p, c ← (γ, δ)
Segue lo scambio di chiavi di Diffie-Hellman.
Scambio chiave K di Diffie-Hellman
A
B
(1) Sceglie un primo p e
una radice primitiva g modulo p.
(2) Sceglie uniformemente un intero
1 ≤ a ≤ p − 2 e calcola g a mod p
(3)
invia (p,g,g a )
−→
(4) Sceglie uniformemente
un intero 1 ≤ b ≤ p − 2 e
calcola g b mod p
(5)
invia g b
b a
(6A) Chiave K ← (g )
mod p
←−
(6B) Chiave K ← (g a )b (mod p)
CAPITOLO 4
Riduzioni tra problemi
In questo capitolo esponiamo le relazioni di riducibilità ad oggi note
tra il problema della fattorizzazione, del logaritmo discreto, il problema
di Diffie-Hellman e alcune loro varianti. Non daremo una lista esaustiva
delle riduzioni note tra tutti i problemi in teoria dei numeri elementare,
come invece si trova in [32], ma ci concentreremo sulle dimostrazioni
di alcune riduzioni che riteniamo basilari e con conseguenze dirette per
la sicurezza dei sistemi crittografici trattati, cioè RSA ed ElGamal. Lo
schema delle riduzioni è riportato di seguito.
Riduzione relativa
alla classe di compl. X
X
Riduzione banale
GDLP
Auto-Riduzione
probabilistica
n-DLP
ZPP
FACTORING
P
GDHP
ZPP
BLUM-GDHP
EULERPHI
BLUM-FACTORING
DHP
RSAP
DDH
1. Auto-riducibilità probabilistica
Informalmente, un problema o funzione si dicono auto-riducibili se
ogni istanza o punto può essere calcolato usando un oracolo per un sottoinsieme di istanze o punti dello stesso problema o funzione. Se ogni
istanza del problema può essere calcolata con probabilità non trascurabile riducendosi ad una istanza generata in modo casuale-uniforme,
allora si parla di auto-riducibilità probabilistica. Questa proprietà , introdotta da Blum e Micali in [7], ha un ruolo fondamentale nella scelta
delle primitive crittografiche perchè, parlando rozzamente, garantisce
59
60
4. RIDUZIONI TRA PROBLEMI
che se un problema è intrattabile nel caso peggiore, allora resta intrattabile anche in media. In questa sezione formalizziamo l’auto-riducibilità
probabilistica e dimostriamo che i problemi RSAP, GDLP, DHP e
DDH godono di tale proprietà.
Definizione 1.1. Sia P : I → S un problema con insieme di istanze I e insieme di soluzioni S. Sia X una variabile aleatoria uniforme
a valori in I. Se, assumendo che esistano η > 0 e un oracolo polinomiale probabilistico A tale che P A(X) ↓= P (X) = η, è garantita
l’esistenza di un algoritmo polinomiale probabilistico
B relativo ad A
tale che, per ogni i ∈ I, P B(i) ↓= P (i) = η, allora diciamo che P è
probabilisticamente auto-riducibile.
In quanto segue assumiamo che i messaggi in chiaro m delle istanze
di RSAP del tipo (n, me , e) non abbiano fattori in comune con il semiprimo n. Per n sufficientemente grande questa restrizione riduce lo
spazio dei messaggi non cifrati in modo trascurabile perchè se n = pq
ϕ(n) = (p − 1)(q − 1) ≈ n.
Teorema 1.1. Il problema RSAP è probabilisticamente auto-riducibile.
Dimostrazione. Definiamo l’algoritmo B-RSAP come segue:
Algoritmo B-RSAP
input: i := (n, c, e), dove c := (me mod n) ∈ (Z/nZ)∗
è il messaggio cifrato
task: Calcolare m mod n
1.
Scegliere in modo casuale uniforme r ∈ (Z/nZ)∗
2.
ir ← (n, r e c mod n, e)
3.
a ← A(ir ) ↓
4.
ma ← ar −1 mod n
5.
Restituire ma
Dato che A è polinomiale in tempo, lo è anche B. Dobbiamo dimostrare
che P(B(i) ↓= m mod n) = η. Assumiamo per un istante che al passo
2 r e c mod n segua una distribuzione uniforme, allora per l’ipotesi su
A a ≡ rm (mod n) con probabilità η, dunque con la stessa probabilità vale ma := ar −1 ≡ m (mod n). Ora è sufficiente provare che se
r segue una distribuzione uniforme allora la segue anche r e c mod n.
Ma questo segue dal fatto che la mappa σe : (Z/nZ)∗ → (Z/nZ)∗ :
x 7→ xe mod n, per e ∈ (Z/ϕ(n)Z)∗ è biettiva perchè ha come inversa
σe−1 mod n , e anche ·x : (Z/nZ)∗ → (Z/nZ)∗ : r 7→ r · x mod n, per
x ∈ (Z/nZ)∗ , è biettiva perchè ha come inversa ·x−1 mod n .
Teorema 1.2. Il problema GDLP è probabilisticamente auto-riducibile.
Dimostrazione. Definiamo l’algoritmo B-GDLP come segue
Algoritmo B-GDLP
2. RELAZIONI DI RIDUCIBILITÀ TRA PROBLEMI
input:
task:
1.
2.
3.
4.
61
(n, g, g a) dove n e g sono l’ordine e un generatore del gruppo Cn
Calcolare a
Scegliere in maniera casuale uniforme un naturale 0 ≤ r ≤ n
b ← g a g r = g a+r
c ← A((n, g, b)) ↓
Restituire c − r
Affermiamo che, al passo 2, g a+r segue una distribuzione casuale uniforme, infatti la mappa +x : [0, n] ∩ N → [0, n] ∩ N : r 7→ r + x per
x ∈ [0, n] ∩ N è biettiva, dato che ha come inversa +n−x , ed r segue
una distribuzione casuale uniforme. Inoltre per ipotesi su A al passo
3 c = a + r con probabilità η dunque con la medesima probabilità
l’algoritmo restituisce a.
Teorema 1.3. Il problema DHP è probabilisticamente auto-riducibile.
Dimostrazione. Definiamo l’algoritmo B-DHP come segue
Algoritmo B-DHP
intput: (n, g, g a, g b) dove n, g sono l’ordine e un generatore del gruppo
task:
Calcolare g ab
1.
Scegliere 0 ≤ α, β ≤ n in maniera casuale-uniforme
2.
x ← A(n, g, g a · g α, g b · g β ) ↓
3.
Restituire x · (g a )(n−1)β · (g b )(n−1)α · g (n−1)αβ
La mappa σα : [0, n] ∩ N → [0, n] ∩ N : α 7→ a + α per a ∈ [0, n] ∩ N è
biettiva perchè ha come inversa σn−α , dunque se α, β seguono una distribuzione uniforme, la seguono anche g a ·g α , g b ·g β . Dunque al passo 2
con probabilità η si ha x = g (a+α)(b+β) , perciò con la stessa probabilità
al passo 3 si restituisce g ab .
Teorema 1.4. Il problema DDH è probabilisticamente auto-riducibile.
Dimostrazione. Definiamo l’algoritmo B-DDH come segue
Algoritmo B-DDH
input: n, (g a , g b, g c ) dove n, g sono l’ordine e un generatore del gruppo
task: Decidere se ab ≡ c (mod n)
1.
Scegliere 0 ≤ α, β ≤ n in maniera casuale uniforme 2.
Restituire A n, (g a · g α , g b · g β , g c · g αβ · (g a )β · (g b )α ) ↓
Con un argomento del tutto simile ai precedenti si vede che al passo 2
l’istanza passata in input ad A è distribuita in modo casuale-uniforme.
Dunque con probabilità η si restituisce una risposta affermativa al problema di decisione se e solo se (a + α)(b + β) ≡ c + aβ + bα + αβ
(mod n) ⇐⇒ ab ≡ c (mod n).
2. Relazioni di riducibilità tra problemi
2.1. Calcolare ϕ(n). Ci proponiamo di studiare il seguente problema: dato un naturale n calcolare ϕ(n). Un metodo naı̈ve è quello di
62
4. RIDUZIONI TRA PROBLEMI
controllare se mcd(a, n) = 1 per ogni 1 < a < n. Se supponiamo di usare l’algoritmo di Euclide tale procedura richiede dunque O(n3 ) passi.
Notiamo che anche con algoritmi piú efficienti come Stehl-Zimmermann
o Schnhage per il calcolo del massimo comun divisore possiamo abbassare il numero di passi fino a O(n lg(n)M(n)) dove M esprime la
complessità della moltiplicazione tra interi. Dunque tale metodo ha
complessità esponenziale.
Il seguente fatto, ben noto, suggerisce di studiare ϕ(n) in relazione al
problema della fattorizzazione.
Proposizione 2.1. Per ogni n ∈ N vale
Y
1
ϕ(n) = n
1−
p
p|n
Q
Dimostrazione. ϕ è moltiplicativa, dunque se p pα è la fattoQ
rizzazione canonica di n, allora ϕ(n) = p ϕ(pα ). Notiamo ora che i
soli naturali x ≤ p tali che mcd(pα , x) > 1 sono i pα−1 multipli di p,
x = p, 2p, 3p, . . . , pα−1 p. Dunque ϕ(pα ) = pα − pα−1 = pα (1 − 1/p), ma
questo implica la tesi.
Dato che ω(n) ≤ lg2 n, supponendo di conoscere già la fattorizzazione canonica di n, possiamo usare il teorema precedente per calcolare ϕ(n) in tempo O(lg(n)M(n)), dunque polinomiale nel numero
di bit necessari per rappresentare n. Allora abbiamo mostrato che
EULERPHI ≤PT FACTORING. A questo punto è naturale chiedersi se la fattorizzazione di interi sia effettivamente un compito più
difficile del calcolo di ϕ(n). Ebbene, i due problemi risultano deterministicamente equivalenti, se assumiamo vera GRH, e risultano probabilisticamente equivalenti in modo incondizionato.
Prima di trattare il caso generale consideriamo n = pq per p, q primi.
Come già visto i semiprimi sono alla base del metodo RSA, dunque
questa restrizione è comunque interessante.
Fatto 16. Se n = pq è un semiprimo allora
FACTORING ≤PT EULERPHI
Dimostrazione. Sono a noi noti
n = pq
n = pq
⇒
n − ϕ(n) + 1 = p + q
ϕ(n) = pq − p − q + 1
dunque è sufficiente calcolare le radici del polinomio quadratico (x −
p)(x − q) = x2 − (p + q)x + pq, e tale operazione richiede tempo
polinomiale nel numero di bit p, q.
Per quanto riguarda il caso generale, dimostreremo l’equivalenza
probabilistica. Vogliamo però proporre anche alcuni cenni alla riduzione di Miller condizionata a GRH, in quanto la riduzione probabilistica
2. RELAZIONI DI RIDUCIBILITÀ TRA PROBLEMI
63
incondizionata nasce come una sua variazione. Non dimostreremo la
correttezza della riduzione perchè ogni dettaglio di tale prova compare
esplicito nell’articolo originale [19].
Teorema 2.2 (Miller [19]). Assumendo GRH,
FACTORING ≤PT EULERPHI
Dimostrazione. (Bozza, dettagli in [19]) La riduzione di Miller
è la seguente,
Algoritmo di Miller
input: Un naturale composto dispari n.
task: Trovare un fattore non banale d,
ovvero un 1 < d < n tale che d | n.
1.
Se n è potenza perfetta di un primo p, restiture p.
2.
Per ogni a = 2, 3, 4, . . . , c · ln2 n
3.
Se a|n, restituire a.
k
4.
Sia dk ← mcd (aϕ(n)/2 mod n) − 1, n , se dk 6= 1
per qualche a ≤ k ≤ K, dove K è tale che 2K ||ϕ(n),
allora restituire dk .
La parte cruciale delle considerazioni di Miller consiste nel provare che
il passo 2 è legittimo, vale a dire che è sufficiente tentare un numero
O(ln2 n) di basi a. In effetti non è ad oggi nota una dimostrazione di
tale asserto che non sfrutti GRH. In particolare, Miller sfrutta le seguenti considerazioni di Ankeny sul più piccolo nonresiduo q-esimo per
determinare implicitamente la costante c del passo 2,
Teorema 2.3. (Ankeny) Siano p, q dei primi tali che q | p − 1.
Assumendo GRH, il più piccolo a tale che a è un nonresiduo quadratico
q-esimo modulo p è a = O(p2).
Teorema 2.4. (Ankeney) Siano p, q dei primi tali che p 6= q. Asa
sumendo GRH, il più piccolo a tale che ( pq
) 6= 1, dove si intende il
2
simbolo di Jacobi, vale a = O(ln (pq)).
Cosı̀ c viene fatta coincidere con c := max{c1 , c2 } dove c1 è la
costante implicita nell’O-grande del teorema 2.3, e c2 quella del teorema
2.4.
Usando l’adattamento probabilistico di Rabin, noto come algoritmo di Miller-Rabin, è possibile provare che la fattorizzazione di interi
e il calcolo ϕ(n) sono probabilisticamente equivalenti, in modo incondizionato rispetto a GRH. La dimostrazione che proponiamo è una
riorganizzazione di quella di Eric Bach [4]. Mostriamo come la riduzione di Eric Bach, con qualche leggera variazione ed espansione, riduca
la fattorizzazione sia al logaritmo discreto modulo un composto, sia al
calcolo della ϕ di Eulero.
64
4. RIDUZIONI TRA PROBLEMI
Teorema 2.5. Chiamiamo EXPO il seguente problema: dato un
naturale n e un elemento a ∈ (Z/nZ)∗ trovare un qualsiasi e 6= 0 tale
che ae ≡ 1 (mod n). Allora sono vere le seguenti:
(i) FACTORING ≤ZPP
EXPO
T
(ii) EXPO ≤PT EULERPHI
(iii) EXPO ≤PT n-DLP
Dimostrazione. Dimostriamo (i). Consideriamo il seguente algoritmo di riduzione
T-riduzione per FACTORINGEXPO
input:
un naturale composto dispari n
task:
trovare un fattore non banale di n
oracolo: un algoritmo E per EXPO
1.
Se n è potenza perfetta di un primo p, restituire p
2.
Scegliere a ∈ (Z/nZ)∗ in maniera casuale-uniforme
3.
e ← E(a, n) ↓, cosı̀ ae ≡ 1 (mod n)
4.
Sia t tale che e = 2t d per qualche dispari d
5.
Cercare 0 ≤ k < t tale che soddisfi
k
k+1
a2 d 6≡ ±1 (mod n) e a2 d ≡ 1 (mod n),
se k non esiste, tornare al passo 2, altrimenti andare al 6
k
6.
Restituire mcd(a2 d ± 1, n)
Vogliamo dimostrare che l’algoritmo termina con probabilità arbitrariamente alta e che al passo 6 viene sempre restituito un fattore non
banale di n. Se, fissando a, esistesse un k al passo 5, allora la riduzione
k
risulterebbe corretta: infatti a2 d ± 1 sarebbe una radice quadrata non
banale dell’unità, e dunque il massimo comun divisore al passo 6 non
sarebbe banale, cioè diverso da 1, n. Dunque è sufficiente mostrare che
con probabilità a crescita esponenziale si trova un k tale da soddisfare
il passo 5.
Q
Q ei
ei
Sappiamo che #(Z/nZ)∗ = ϕ(n) =
i ϕ(pi ) se n =
i pi è la
fattorizzazione canonica di n. Sia
e
ω(n)
L := mcm(ϕ(pe11 ), . . . , ϕ(pω(n)
))
allora, dal teorema di Eulero-Fermat, per ogni a ∈ (Z/nZ)∗ aL ≡ 1
(mod pei i ) dunque
aL ≡ 1 (mod n)
Inoltre L è pari dunque possiamo considerare
S := {a ∈ (Z/nZ)∗ | aL/2 ≡ ±1
(mod n)}
tale insieme è chiuso rispetto al prodotto e quindi S ≤ (Z/nZ)∗ , dunque
per il teorema di Lagrange #S | ϕ(n). Mostriamo che vale il seguente
2. RELAZIONI DI RIDUCIBILITÀ TRA PROBLEMI
65
Fatto 17. S è un sottogruppo proprio, vale a dire S 6= (Z/nZ)∗ ,
da cui segue immediatamente che #S ≤ ϕ(n)/2
Dimostrazione. La strategia che adottiamo è esibire
Q un elemento
a 6∈ S. Sappiamo che vale l’isomorfismo (Z/nZ)∗ ∼
= i (Z/pei i Z)∗ , e
che (Z/pei i Z)∗ è ciclico perchè p 6= 2. Dunque esistono g1 , . . . , gω(n) geeω(n)
neratori rispettivamente di (Z/pe11 Z)∗ , . . . , (Z/pω(n)
Z)∗ . Consideriamo
ora l tale che 2l ||L, deve esistere un primo px | n tale che 2l ||ϕ(pexx )
perchè L è il minimo comune multiplo di tutti i ϕ(pei i ). Prendiamo
dunque
2
2
2
a := (g12, . . . , gx−1
, gx , gx+1
, . . . , gω(n)
)
Allora
aL/2 = (1, . . . , 1, gxL/2, 1, . . . , 1)
L/2
Dunque o(gx ) = ϕ(pexx ) ∤ L/2 dunque gx
(mod n).
6≡ 1 (mod n), allora a 6≡ ±1
Dunque al passo 2, la probabilità di scegliere a ∈ S è minore o
uguale a 1/2. Dunque al crescere delle iterazioni i del passo 2, la
probabilità di scegliere a ∈ S sarà minore o uguale a 2−i . Dunque
con probabilità arbitrariamente grande l’algoritmo trova al passo 2 un
a 6∈ S. Resta da mostrare solo che
Fatto 18. per tale a 6∈ S esiste un k che soddisfa il passo 5.
Dimostrazione. Assumiamo per assurdo che tale k non esista.
Notiamo che aL/2 6≡ 1 mod n implica che se L = qL o(a) allora qL deve
essere dispari e o(a) deve essere pari. Sappiamo dal passo 3 che ae ≡ 1
(mod n), prendiamo t tale che 2t ||e e consideriamo la sequenza
t
t−1 d
ae = a2 d , a2
t−i d
, . . . , a2
, . . . , ad
t−i−1
d
dove i è il più piccolo intero in [1, t] tale che a2
6≡ 1 (mod n). Tale
d
i esiste, perchè altrimenti si avrebbe a ≡ 1 (mod n) da cui o(a) | d,
ma questo non potrebbe essere vero dato che d sarebbe dispari e o(a)
pari. Per ipotesi di assurdo deve essere
t−i−1 d
a2
≡ −1 (mod n)
(∗)
Se 2t−i d = qi o(a) allora qi è dispari per come si è scelto i. Osserviamo
e
e
che per ogni pj j ||n ao(a)/2 ≡ ±1 (mod pj j ), perchè radice quadrata
dell’unità modulo la potenza di un primo dispari, ma allora, per ogni
e
e
pj j ao(a)/2 ≡ −1 (mod pj j ) perchè qi è dispari e vale la (*). Pertanto
ao(a)/2 ≡ −1 (mod n). Dunque
aL/2 ≡ (ao(a)/2 )qL ≡ −1
(mod n)
perchè qL è dispari, ma tale congruenza è assurda perchè a 6∈ S. Questo
conclude (i)
66
4. RIDUZIONI TRA PROBLEMI
La (ii) è ovvia perchè aϕ(n) ≡ 1 (mod n), dimostriamo dunque (iii).
Consideriamo il seguente algoritmo di riduzione
T-riduzione per EXPOn-DLP
input:
(a, n) dove a ∈ (Z/nZ)∗
output: un naturale e tale che ae ≡ 1 (mod n)
oracolo: un algoritmo DL per n-DLP
1.
Per ogni primo p = 2, 3, 5, . . .
2.
d ← DL(ap , a) ↓
3.
Se d 6= ∄ restituire pd − 1, altrimenti tornare
al passo 1 e provare il prossimo primo
Osserviamo che vale il seguente
Fatto 19. Sia pi l’i-esimo primo. Esiste i ≤ ⌈log2 n⌉ tale che
pi ∤ ϕ(n).
Dimostrazione. Se cosı̀ non fosse, p1 := 2, p2 := 3, . . . , p⌈log2 n⌉ |
ϕ(n), allora ϕ(n) ≥ p1 p2 · · · p⌈log2 n⌉ > 2⌈log2 n⌉ ≥ n. Assurdo.
Dal teorema dei numeri primi segue che pi ∼ i ln i dunque in tempo
O(poly(ln n)) troviamo al passo 1 un primo p tale che p ∤ ϕ(n), allora esiste una soluzione d di pd ≡ 1 (mod ϕ(n)). Dunque (ap )d ≡ a
(mod n), ovvero al passo 3 d 6= ∄, e cosı̀ apd−1 ≡ 1 (mod n).
Il teorema implica immediatamente che
P
FACTORING ≤ZP
EULERPHI, n-DLP
T
2.2. Fattorizzazione e problema di Diffie-Hellman generalizzato. In questo paragrafo studiamo la riduzione che Biham, Boneh
e Reingold hanno presentato in [6], vale a dire il Teorema 2.6. Rispetto
all’articolo orginale cerchiamo di dare una esposizione più accessibile
e di non tralasciare nulla. In particolare abbiamo dimostrato il Fatto
20, il Fatto 21 e il Fatto 22, che invece sono dati per buoni in [6]. La
riduzione riguarda i numeri naturali del seguente tipo:
Definizione 2.1. Un intero di Blum è un semi-primo n = p · q tale
che i primi distinti p e q sono entrambi congrui a tre modulo quattro,
in formule p, q ≡ 3 (mod 4).
Quello che segue è l’enunciato del teorema che vogliamo trattare.
Teorema 2.6 ([6]). Sia A una macchina di Turing probabilistica
con oracolo tale che A abbia tempo di calcolo t = t(n) e tale che ǫ-risolva
il problema GDHPk , dove ǫ = ǫ(n) e t = t(n). Allora esiste una
macchina di Turing probabilistica A′ che ǫ′ -fattorizza in tempo t′ (n) =
poly(n, k(n)) · t(n), per ǫ′ (n) = ǫ(n)/2 − O(k(n) · 2−n ).
Chiariamo cosa voglia dire “ǫ-risolvere GDHPk ” ed “ǫ-fattorizzare”:
2. RELAZIONI DI RIDUCIBILITÀ TRA PROBLEMI
67
Definizione 2.2 (ǫ-fattorizzazione). Sia N = P · Q un intero di
Blum, dove P, Q sono variabili aleatorie a valori nell’insieme dei numeri primi congrui a tre modulo quattro aventi n cifre binarie. Sia
A una TM probabilistica e sia ǫ = ǫ(n) una funzione a valori reali.
Diciamo che A ǫ-fattorizza se esistono infiniti n ∈ N tali che
P A(N) ↓∈ {P, Q} > ǫ(n)
Definizione 2.3 (ǫ-risolvere GDHPk ). Sia N = P · Q un intero
di Blum, dove P, Q sono variabili aleatorie a valori nell’insieme dei
numeri primi congrui a tre modulo quattro aventi n cifre binarie. Sia
g ∈ (Z/NZ)∗ un residuo quadratico modulo N e sia k = k(n) : N → N
una funzione tale che k(n) ≥ 2. Sia ~a = (a1 , . . . , ak ) una sequenza di
k ≥ 2 elementi in {1, 2, . . . , N}. Definiamo una funzione
hN,g,~a : {0, 1}k → Z/NZ
tale che per ogni x := x1 . . . xk valga
hN,g,~a (x) := g
Q
i : xi =1
ai
mod N
hrN,g,~a
e denotiamo con
la restrizione di hN,g,~a al dominio {0, 1}k \ {1k }.
r
Sia AhN,g,~a una TM probabilistica con oracolo per hrN,g,~a e sia ǫ = ǫ(n)
una funzione a valori reali. Diciamo che A ǫ-risolve GDHPk se per
infiniti n si ha
r
P AhN,g,~a (N, g) ↓= hN,g,~a (1k ) > ǫ(n)
Prima di procedere con la dimostrazione del Teorema 2.6 ci preoccupiamo di verificare alcuni fatti che vengono usati ma non dimostrati
in [6].
Fatto 20. Sia n = pq un intero di Blum, e sia Q := {g ∈ (Z/nZ)∗ |
∃x ∈ (Z/nZ)∗ tale che x2 ≡ g (mod n)} l’insieme dei residui quadratici modulo n in (Z/nZ)∗ . Ogni g ∈ Q ha una e solo una radice quadrata
modulo n in Q.
Dimostrazione. Si tratta di chiedersi chi siano effettivamente le
radici quadrate di g in (Z/nZ)∗ . Quello che sappiamo è che g ha
esattamente due radici quadrate modulo ciascun primo p e q, infatti
se g ≡ a2 ≡ c2 (mod p) allora c ≡ ±a (mod p), siano dunque ±a
mod p le radici quadrate modulo p e siano ±b mod q le radici quadrate
modulo q. Allora, se g ≡ r 2 (mod n), r è soluzione di uno dei quattro
sistemi del tipo
x ≡ ±a (mod p)
x ≡ ±b (mod q)
Viceversa, per il Teorema Cinese dei Resti ognuno dei quattro sistemi
ha una e una sola soluzione x mod n, e questa è tale che x2 ≡ (±a)2 ≡
g (mod p) e x2 ≡ (±b)2 ≡ g (mod q) dunque x2 ≡ g (mod n) dunque
x è una radice quadrata di g modulo n. Questo vuol dire che le radici
quadrate di g modulo n sono tutte e sole le soluzioni dei quattro sistemi,
68
4. RIDUZIONI TRA PROBLEMI
−1
p
e dunque sono esattamente quattro. Notiamo ora che
= −1
quando p ≡ 3 (mod 4), dunque vale esclusivamente ap = 1 oppure
b
−b
−a
=
1,
e
vale
esclusivamente
=
1
oppure
= 1. Ma
p
p
p
allora esattamente una radice quadrata r di g modulo n è un residuo
quadratico modulo entrambi p, q, vale a dire esistono α, β tali che α2 ≡
r (mod p) e β 2 ≡ r (mod q). Sia r ′ l’unica soluzione del sistema
x ≡ α (mod p)
x ≡ β (mod q)
allora r ′2 ≡ α2 ≡ r (mod p) e r ′2 ≡ β 2 ≡ r (mod q), dunque r ′2 ≡ r
(mod n), il che dimostra che r è un residuo quadratico anche modulo
n.
Ricordiamo che un semi-primo n = pq si dice un intero di Blum se
p, q sono entrambi congrui a tre modulo quattro. Abbiamo il seguente
Fatto 21. Sia n un intero di Blum, e sia g ∈ (Z/nZ)∗ un residuo
quadratico modulo n. Allora l’ordine di g modulo n è dispari.
Dimostrazione. Per il fatto precedente esistono residui quadratici r ′ , r ′′ tali che g = r ′2 = r ′′4 , dunque
on (g) = on (r ′′4 ) =
on (r ′′ )
mcd(4, on (r ′′ ))
d’altra parte on (r ′′ ) | ϕ(n) ≡ 4 (mod 8) perchè n è un intero di Blum
e dunque on (g) deve essere dispari.
Esponiamo ora la dimostrazione di [6]. La strategia alla base di
questo risultato è la seguente: sappiamo che se vale u2 ≡ v 2 (mod N)
per qualche u 6≡ ±v (mod N), allora siamo in grado di fattorizzare
N calcolando mcd(u − v, N). Ci chiediamo se scelto v ∈ (Z/nZ)∗ in
maniera casuale uniforme sia possibile calcolare tale u, in altre parole
se sia possibile calcolare una radice quadrata di v 2 modulo N diversa da
±v. Ebbene, in modo piuttosto ingegnoso gli autori di [6] dimostrano
che questo è possibile riducendosi a GDHPk .
Dimostrazione. (del Teorema 2.6) Definiamo l’algoritmo A′ come segue
Algoritmo A′
2. RELAZIONI DI RIDUCIBILITÀ TRA PROBLEMI
input:
task:
oracolo:
1.
2.
nota.
3.
4.
69
Un intero N = P · Q di Blum con 2n cifre binarie
Trovare P oppure Q
r
AhN,g,~a per GDHPk
Scegliere v ∈ (Z/NZ)∗ in modo casuale-uniforme e calcolare
k
k = k(n) e g := v 2 (mod N).
Scegliere gli elementi r1 , . . . , rk ∈ [1, n] ∩ N in modo casuale
uniforme.
Introduciamo la notazione ai := ri + 2−1 (mod ℓ) dove
ℓ := on (g), e ~a := (a1 , . . . , ak ). Inoltre denoteremo sempre
2−1 mod ℓ con 2−1 . Chiariamo inoltre che ~a, ℓ non sono
noti ad A′ .
Chiamare A con input (N, g) e rispondere ad ogni query
q ∈ {0, 1}k \ {1k } di A con hrN,g,~a (q), che, come dimostreremo,
è possibile calcolare anche senza calcolare esplicitamente ~a.
Assumendo che A restituisca hN,g,~a (1k ), calcolare
−k
u := g 2 (mod N); se u 6≡ ±v (mod N) restituire,
mcd(u − v, N) altrimenti restituire un messaggio di errore.
Al passo 1 notiamo che per il Fatto 21 on (g) =: ℓ è dispari. Dunque
esiste 2−1 mod ℓ e vale 2−1 = (ℓ + 1)/2. Assumiamo per un istante di poter eseguire il passo 3, e assumiamo che al passo 4 u2 ≡ v 2
(mod N). Sotto queste ipotesi, che dimostreremo essere vere, si ha
mcd(u − v, N) ∈ {P, Q} quando u 6≡ ±v (mod N), ovvero la correttezza dell’algoritmo. I passi 1 e 2 possono essere eseguiti in tempo
poly(n, k(n)), dunque restano da provare le seguenti affermazioni
(1) Al passo 4, u2 ≡ v 2 (mod N)
(2) Al passo 3, per ogni query q, hrN,g,~a (q) può essere calcolata in
tempo poly(n, k(n)).
−k
mod N in tempo
(3) Data hN,g,~a (1k ), è possibile calcolare g 2
poly(n, k(n)).
(4) A′ ǫ′ -fattorizza N per ǫ′ = ǫ′ (n) := ǫ(n)/2 − O(k(n) · 2−n ).
Vediamo come [6] dimostrano (1),(2) e (3).
Sappiamo che 2−1 ≡ (ℓ + 1)/2 (mod ℓ), dunque 2−i ≡ ((ℓ + 1)/2)i
−i
(mod ℓ). Dunque per ogni i g 2 è un residuo quadratico modulo N,
−(k−1)
perchè g lo è. Vogliamo dimostrare che u2 ≡ g 2
≡ v 2 (mod N).
k−(k−1)
Notiamo che si può scrivere v 2 = v 2
, con questo in mente dimostriamo il seguente fatto più forte
−i
Fatto 22. Quando 0 < i < k, g 2
k−i
≡ v2
−1
(mod N).
k−1
Dimostrazione. Per i = 1, entrambi g 2 e v 2 sono radici quadrate di g modulo N, ed entrambe sono residui quadratici, dunque
per il Fatto 20, devono essere uguali. Assumiamo, per ipotesi di in−i+1
k−i+1
duzione, che l’asserto sia vero per i − 1, vale a dire g 2
≡ v2
70
4. RIDUZIONI TRA PROBLEMI
−i
k−i
(mod N), ma allora, similmente al caso base, g 2 e v 2 sono entrambe radici quadrate dello stesso residuo modulo N, ed entrambi sono
residui quadratici modulo N, dunque, per il Fatto 20, devono essere
uguali.
Dunque abbiamo provato (1). Mostriamo che questo implica anche
(2), infatti per ogni q = q1 q2 . . . qk 6= 1k abbiamo
hrN,g,~a (q) ≡ g
Q
i:qi =1
ai
≡g
−1 )
i:qi =1 (ri +2
Q
≡g
Pk−1
j=0
aj 2−j
Q
≡v
Pk−1
j=0
aj 2k−j
(mod N)
dove gli aj sono i coefficienti del polinomio i:qi =1 (ri + x) ∈ Z[x]
di grado k − 1. Tali coefficienti possono essere calcolati in tempo
poly(n, k(n)), e questo dimostra (2).
Similmente, con i bj calcolabili in tempo poly(n, k(n)),
hN,g,~a (1k ) ≡ g
Qk
j=1
−k
g2
ai
≡g
Qk
−1 )
j=1 (ri +2
−k
≡ g2 g
Pk−1
j=0
⇓
Pk−1 k−j −1
≡ hN,g,~a (1k ) v j=0 bj 2
bj 2−j
−k
≡ g2 v
Pk−1
j=0
bj 2k−j
(mod N)
e dunque la (3) è provata.
Resta solo da analizzare la probabilità di successo di A′ , ovvero dimostrare la (4). La probabilità in questione vale
E
P A′ (N) ↓∈ {P, Q}
= P
z
z
}|1
{
u 6≡ ±v (mod N) e
E
hrN,g,~a
A
}|2
{ (N, g) ↓= hN,g,~a (1k )
= P(E1 | E2 ) · P(E2 )
r
Per trovare P(E1 | E2 ) bisogna notare che AhN,g,~a (N, g) ↓ è distribuito dipendentemente da v 2 e non da v, vale a dire che non può portare differenze di distribuzione tra le radici quadrate modulo
N di
Pk−1
bj 2k−j
2
j=0
v , P
analogamente u è distribuito dipendentemente da v
=
k
bj−1 2k−j
2
2
j=1
(v )
, e dunque da v perchè i bj dipendono solo da q e
dagli ri , che sono stati scelti uniformemente. Dunque u è distribuita uniformemente tra le radici quadrate di v 2 , dunque deve essere
P(E1 | E2 ) = 1/2 perchè le radici quadrate modulo N di un elemento
in (Z/NZ)∗ sono quattro, come visto nella dimostrazione del Fatto 20.
Non resta che mostrare che per infiniti valori di n
P(E2 ) > ǫ(n) − O(k(n) · 2−n )
Bisogna notare per prima cosa che il Fatto 20 implica che la mappa
Q → Q : x 7→ x2 , dove per Q intendiamo sempre l’insieme dei residui
quadratici di (Z/NZ)∗ , è iniettiva, e dunque anche biettiva. Dunque
se v è scelto in maniera uniforme anche g := 2k mod N deve essere
distribuito in maniera uniforme. Abbiamo poi che
(mod N)
2. RELAZIONI DI RIDUCIBILITÀ TRA PROBLEMI
71
Fatto 23. Siano r, a′ distribuiti in maniera uniforme in [1, N] ∩ N,
e sia a := r + 2−1 mod ℓ. Allora a e a′ hanno distanza statistica
O(2−n ).
Dimostrazione. Dato che ℓ | (Q − 1)(P − 1) la distribuzione
di a condizionata all’evento r ∈ [1, (Q − 1)(P − 1)] ∩ N è la stessa
della distribuzione di a′ mod ℓ condizionata all’evento a′ ∈ [1, (Q −
1)(P − 1)] ∩ N. Questi due eventi hanno entrambi probabilità pari
a (Q − 1)(P − 1)/N = 1 − O(2−n ). Dunque al crescere di n le due
distribuzioni si avvicinano con velocità esponenziale.
Con il fatto 23 in mente, è sufficiente prendere a′ := (a′1 , . . . , a′k ) in
r
maniera casuale-uniforme per poter concludere che P(AhN,g,~a (N, g) =
hN,g,~a (1k )) > ǫ(n) − O(k(n) · 2−n ); infatti hN,g,~a e hN,g,~a′ , se considerate
come variabili aleatorie, avranno distanza statistica pari a O(k(n) ·
2−n ).
CAPITOLO 5
Alcune considerazioni sperimentali
In questo capitolo proponiamo alcune implementazioni ed eseguiamo dei test su una macchina con sistema operativo MacOsX, processore
PPC G4 con 1.67Ghz e memoria ram di 512MB DDR2 SDRAM.
1. Un generatore di numeri di Carmichael con esattamente
tre fattori primi
Abbiamo già discusso i numeri di Carmichael nel Capitolo 1. In uno
degli esercizi in [17], Koblitz chiede di dimostrare che per ogni primo
r esistono solo un numero finito di numeri di Carmichael del tipo rpq.
Qui dimostriamo qualcosa di più preciso, ovvero un limite superiore per
tali numeri di Carmichael. Come conseguenza ricaviamo un algoritmo
per la generazione di tutti e soli questi numeri e ne diamo una semplice
implementazione con il linguaggio PARI/GP. Questo linguaggio è nato
come libreria C per facilitare le computazioni riguardanti la Teoria dei
Numeri e si è evoluto in seguito in un vero e proprio linguaggio di scripting. Secondo necessità, ogni script può comunque essere trasformato
in un programma C con un applicativo di nome gp2c.
Proposizione 1.1. Per ogni primo r esiste solo un numero finito
di numeri di Carmichael n con esattamente tre fattori primi, ovvero
del tipo n = rpq. In particolare, per ogni primo r, se rqp con r < q < p
è un numero di Carmichael, allora q < 2r(r − 1) ed esiste k < r tale
che p = (qr − 1)/k + 1.
Dimostrazione. Sfruttiamo il criterio di Korselt: n è di Carmichael se e solo se è libero da quadrati e vale l’implicazione p|n →
(p − 1)|(n − 1). Sia r un primo qualsiasi. Se n = rqp è di Carmichael allora per Korselt abbiamo necessariamente il seguente sistema
con p, q, r distinti

 pqr ≡ 1 (mod p − 1) (1)
pqr ≡ 1 (mod q − 1) (2)

pqr ≡ 1 (mod r − 1) (3)
La (1) si può scrivere (p − 1 + 1)qr ≡ 1 (mod p − 1). Allora qr ≡
1 (mod p − 1) e quindi p − 1|qr − 1 dunque esiste uno e un solo k
tale che qr − 1 = (p − 1)k. Possiamo supporre che sia r < q < p,
r−1
dunque k = rq−1
= r(q−1)
+ p−1
< r. D’altra parte la (2) implica,
p−1
p−1
similmente a prima, pr − 1 ≡ 0 (mod q − 1), dunque (kp)r − k ≡ 0
73
74
5. ALCUNE CONSIDERAZIONI SPERIMENTALI
(mod q − 1). Ma allora, dato che vale qr − 1 = (p − 1)k, possiamo
sostituire kp e ottenere (qr − 1 + k)r − k ≡ 0 (mod q − 1). Allora
(r + k − 1)r − k ≡ ((q − 1 + 1)r + k − 1)r − k ≡ 0 (mod q − 1) vale a
dire che (q − 1)|(r + k − 1)r − k = (r + k)(r − 1) < 2r(r − 1), dove la
disuguaglianza segue dal fatto k < r discusso sopra. Ma allora abbiamo
un limite superiore per q, vale a dire q < 2r(r − 1) + 1 , che dipende
solo da r fissato. Vuol dire che esistono al più un numero finito di q
che soddisfano il sistema iniziale. Inoltre, per ogni q, p che soddisfano
le condizioni, deve essere necessariamente p = qr−1
+ 1. Vale a dire che
k
per ogni coppia di primi r e q tali che q < 2r(r − 1) + 1, esiste al più
un numero finito di p = p(k), k < r che eventualmente rendono rpq un
numero di Carmichael, e cosı̀ la tesi segue.
Generatore di numeri di Carmichael del tipo rqp
input: Un naturale M come limite superiore per r.
task: Generare tutti e soli i numeri di Carmichael del tipo
rqp per r ≤ M, r < q < p.
1.
Per ogni primo r = 3, 5, . . . minore o uguale ad M,
2.
Per ogni primo q t.c. r < q < 2r(r − 1),
3.
Per ogni divisore k di qr − 1
4.
p ← (qr − 1)/k + 1
5.
Se p è un primo e p > q, controllare se rqp è
un numero di Carmichael con il criterio di Korselt.
Corollario 1.2. Sia r un primo e poniamo C3 (r) := #{n = rqp |
n è un Carmichael con esattamente tre fattori primi}. Allora C3 (r) =
O(r 3/ ln r). Inoltre per ogni primo r l’algoritmo esegue il passo 5 su
O(r 3/ ln r) numeri del tipo n = rpq.
Dimostrazione. Per r fissato sappiamo che necessariamente r <
q < 2r(r − 1) e p = qr−1
+ 1 per qualche k < r. Chiamiamo dunque #q
k
il numero di primi compresi tra r e 2r(r − 1) (esclusi), e #p il numero
di primi del tipo qr−1
+ 1 per k < r. Certamente
k
C3 (r) ≤ #q · #p
Abbiamo
#q = π(2r(r − 1)) − π(r)
e
#p < r
ed è noto che esistono costanti A, a > 0 tali che per ogni x ≥ 2 vale
a lnxx < π(x) < A lnxx [27]. Dunque
3 2(r − 1)
r
1
2
C3 (r) < r A ·
=O
−a·
ln(2r(r − 1))
ln r
ln r
Teorema 1.3. Per un singolo primo r del ciclo al passo 1 i passi
2-5 eseguono O(P (r)·r 3 ln r) operazioni, dove P (r) è il numero di passi
1. UN GENERATORE DI NUMERI DI CARMICHAEL CON ESATTAMENTE TRE FATTORI PRIMI
75
necessari a decidere la primalità. Inoltre, assumendo P (r) = O(ln5 r),
il tempo di calcolo dell’algoritmo è O(M 4 · ln5 M).
Dimostrazione. Un test di Korset richiede solo un numero costante di moltiplicazioni e di divisioni, dunque tempo O(ln2 r). Dunque il passo 5 richiede tempo O(P (r) · ln2 r), e sappiamo che per un
singolo r del passo 1 il passo 5 viene eseguito O(r 3/ ln r) volte, perciò
abbiamo un tempo pari a O(P (r) · r 3 ln r). Dunque, usando l’assunzione P (r) = O(ln5 r), il tempo di calcolo dell’algoritmo è limitato
superiormente dalla seguente somma estesa ai primi r ≤ M:
X
r 3 ln6 r
r≤M
Sfruttando le considerazioni di Bach-Shallit [5] per stimare le somme
Rx
P
estese ai primi p ≤ x, cioè p≤n f (p) ≈ 2 fln(t)t dt quando f (x) è derivabile con continuità in un sottointervallo aperto di [2, ∞[, possiamo
affermare che
Z M
X
6
3
r ln r ≈
r 3 ln5 r dr = O(M 4 ln5 M)
r≤M
2
Segue il codice in PARI/GP che consente di cercare i numeri di
Carmichael, sfruttando il test di Korselt.
carm(r) =
{ print("cerco con r=", r);
cr = 0;
supr = 2*r*(r-1);
forprime(q=r+1, supr,
num = q*r-1;
fordiv(num, k,
p=num/k+1;
if(isprime(p) && p>q, korselt(r,q,p))
)
);
print("cr = ",cr);
cr
}
korselt(r,q,p)=
{ n=r*q*p;
if( ((n-1)%(r-1)==0)&&((n-1)%(q-1)==0)&&((n-1)%(p-1)==0),
cr++; print(n))
}
\\ carmsearch(int) costruisce tutti i numeri Carmichael rqp per r<=M
76
5. ALCUNE CONSIDERAZIONI SPERIMENTALI
carmsearch(M) =
{ maxcr=0; \\ contatore per la massima quantita’
\\di numeri di Carmichael, con r fissato
forprime(r=3, M,
ret=carm(r); \\costruiamo i Carmichael rqp
if(ret > maxcr, maxcr=ret) \\ aggiorniamo il contatore
);
print("maxcr: ", maxcr)
}
Completiamo il tempo di calcolo asintotico dell’algoritmo con un benchmark relativo all’implementazione in PARI/GP. I tempi sono stati
ottenuti usando la primitiva gettime() di PARI/GP, versione 2.3.4.
sec
20
15
10
5
r
100
200
300
400
500
Figura 1. Tempo di calcolo in secondi richiesto per generare tutti i numeri di Carmichael rpq, con il primo r
in ascissa
2. ALCUNI TEST PER IL LOGARITMO DISCRETO
77
C3(r)
20
15
10
5
r
100
200
300
400
500
Figura 2. Alcuni dati per C3 (r)
2. Alcuni test per il Logaritmo Discreto
Diamo una implementazione in PARI/GP dell’algoritmo Baby Step
Giant Step di Shanks ed eseguiamo un test per il tempo di calcolo. Segue il codice in cui sono definite anche una primitiva modexp(a,b,n)
per il calcolo di ab mod n con il metodo ben noto dei quadrati ripetuti,
una primitiva per il calcolo degli inversi moltiplicativi modulo n e una
ricerca binaria iterativa.
/* metodo dei quadrati ripetuti
per a^b (mod n), per b >= 0
modexp(a, b, n) =
{ local(m, bin, Ma);
m = Mod(1, n);
Ma = Mod(a, n);
bin = binary(b);
for (i = 1, length(bin),
m = m*m;
if (bin[i] == 1,
m = m*Ma;
);
);
return(m);
}
*/
/*calcola l’inverso moltiplicativo di g mod p*/
inverso(g, p)= { return(lift(Mod(bezout(g,p)[1], p))) }
78
5. ALCUNE CONSIDERAZIONI SPERIMENTALI
/* cerca v sul secondo componente del multi-vettore A
e restituisce il primo componente
*/
ricercabin(A, v) =
{ local(mid, l, h);
l = 1;
h = length(A);
while(l <= h,
mid = floor((l+h)/2);
if(A[mid][2] == v, return(A[mid][1])); \\ altrimenti...
if(v < A[mid][2], h=mid-1, l=mid+1);
);
return(-1); \\ v non trovato
}
/* BabyStep-GiantStep di Shanks sui gruppi (Z/pZ)^* per p primo */
babygiant(p, g, t) =
{ local(b, h, A, pow);
if(t%p == 0, return); \\ per t=0 non esiste soluzione
b=ceil(sqrt(p-1)); \\ l’ordine del gruppo e’ p-1
h=lift(modexp(inverso(g,p), b, p));
A=vector(b,x,0); \\ A conterra’ coppie [i, g^i]
pow = 1; \\ pow := g^0 mod p
for(i=0, b-1, \\ riempiamo A
A[i+1] = [i, pow];
pow = (pow*(g%p))%p; \\pow := pow*g mod p
);
A = vecsort(A, 2); \\ ordiniamo A in base al secondo componente,
\\ vale a dire g^i mod p
pow = t%p;
\\pow := th^0 mod p
for(j = 0, b-1, \\ cerchiamo una collisione con una ricerca binaria
i = ricercabin(A, pow);
if(i != -1, return((i+j*b)%p) );
pow = (pow*h)%p; \\ pow := (pow*h)%p
);
}
Nota. Questa implementazione è esemplificativa e non ha lo scopo
di essere una versione ottimizzata. In particolare per la lista A non
viene usata una tabella hash, ma semplicemente un vettore di
√ interi e
una ricerca binaria. Ne consegue che il tempo di calcolo e’ O( n log n),
2. ALCUNI TEST PER IL LOGARITMO DISCRETO
79
√
invece di O( n).
300
msec
250
200
150
100
50
p
100000 200000 300000 400000 500000 600000
Figura 3. Tempo di calcolo in msec della nostra implementazione per il metodo Baby Step Giant Step di
Shanks. Il test è stato ottenuto su istanze t generate in modo pseudo-casuale con la primitiva random() di
PARI/GP e per p via via crescente.
80
5. ALCUNE CONSIDERAZIONI SPERIMENTALI
3. Alcuni test per la Fattorizzazione di Interi
Eseguiamo un test per il tempo di calcolo del Crivello Quadratico
implementato nella primitiva factorint() di PARI/GP. Il test è stato
ottenuto generando interi composti in maniera pseudo-casuale con un
numero di bit via via crescente: fissato il numero di bit b, la primitiva
interocasuale(b) genera un vettore z di dimensione b contenente in ogni
posizione un bit pseudocasuale (primitiva random(2) di PARI/GP), e
poi trasforma z in un intero usando la primitiva vec2int(). Il test
richiede anche il parametro “punti” che specifica quanti interi casuali
devono essere generati per ogni b fissato.
/* converte un vettore binario in un intero*/
vec2int(v) =
{ local(ret); ret=0;
for(i=1, length(v),
ret += v[length(v)+1-i]*2^(i-1) ;
);
return(ret);
}
/*genera un intero pseudo-casuale di b bit*/
interocasuale(b) =
{
local(z, zint);
z = vector(i, x, random(2)); z[1] = 1;
zint = vec2int(z);
return(zint);
}
factortest(a,b, punti) =
{ local(zint);
default(timer, 0);
for(i=a, b,
for(j=1, punti,
zint=interocasuale(i);
while(isprime(zint), zint=interocasuale(i));
gettime();
\\
factorint(zint); \\ Testiamo il Crivello Quadratico
\\implementato in PARI/GP
write("factortest.txt", i, " ", gettime());
);
);
}
3. ALCUNI TEST PER LA FATTORIZZAZIONE DI INTERI
81
msec
800
600
400
200
bit
80
100
120
140
160
180
200
Figura 4. Tempo di calcolo in msec. del Crivello Quadratico per la fattorizzazione di interi implementato in
factorint(), una primitiva nativa di PARI/GP.
Bibliografia
1. L. M. Adleman, C. Pomerance, and R. S. Rumely, On distinguishing prime
numbers from composite numbers, Ann. Math. 117 (1983), 173–206.
2. Leonard M. Adleman and Ming-Deh Huang, Primality testing and two dimensional abelian varieties over finite fields, Lecture Notes in Mathematics, vol.
1512, Springer-Verlag, 1992.
3. M. Agrawal, N. Kayal, and N. Saxena, PRIMES is in P, Annals of Mathematics.
Second Series 160 (2004), no. 2, 781–793.
4. E. Bach, Discrete logarithms and factoring, Tech. Report UCB/CSD 84/186,
University of California, Computer Science Division (EECS), University of
California, Berkely, California, June 1984.
5. E. Bach and J. Shallit, Algorithmic number theory; volume I: Efficient
algorithms, The MIT Press, 1996.
6. E. Biham, D. Boneh, and O. Reingold, Breaking generalized Diffie–Hellman
modulo a composite is no easier than factoring, Information Processing Letters
70 (1999), no. 2, 83–87.
7. M. Blum and S. Micali, How to generate cryptographically strong sequences of
pseudo-random bits, SIAM Journal on Computing 13 (1984), no. 4, 850–864.
8. Bornemann, PRIMES is in P: A breakthrough for “everyman”, NOTICES:
Notices of the American Mathematical Society 50 (2003).
9. J. Brillhart, Canad. J. Math. (1981), no. 33, 1055–1059.
10. E. R. Canfield, P. Erd¨os, and C. Pomerance, On a problem of oppenheim
concerning ‘factorisatio numerorum’, J. Number Theory 17 (1983), 1–28.
11. G.M. Piacentini Cattaneo, Algebra, un approccio algoritmico, Decibel
Zanichelli, 1196.
12. Henri Cohen, A course in computational algebraic number theory, Graduate
Texts in Mathematics, vol. 138, Springer-Verlag, 1993.
13. Jean-Marc Couveignes, Computing a square root for the number field sieve, The
development of the number field sieve (A. K. Lenstra and H. W. Lenstra, Jr.,
eds.), Lecture Notes in Mathematics, no. 1554, Springer-Verlag, 1993, pp. 95–
102.
14. R. Crandall and C. Pomerance, Prime numbers. A computational perspective,
2nd ed., Springer-Verlag, 2005.
15. Oded Goldreich, Foundations of cryptography. volume I: Basic tools.,
Cambridge University Press, Cambridge, England, 2001.
16. G. H. Hardy and E. M. Wright, An introduction to the theory of numbers, fifth
ed., Oxford University Press, 1979.
17. N. Koblitz, A course in number theory and cryptography, second ed., Graduate
texts in mathematics, vol. 114, Springer-Verlag, pub-SV:adr, 1994.
, Another look at generic groups, Advances in Mathematics of
18.
Communications 1 (2007), no. 1.
19. Gary L. Miller, Riemann’s hypothesis and tests for primality, Journal of
Computer and System Sciences 13 (1976), no. 3, 300–317.
83
84
BIBLIOGRAFIA
20. M. Nair, On Chebyshev-type inequalities for primes, American Mathematical
Monthly 89 (1982), no. 2, 126–129.
21. Phong Nguyen, A montgomery-like square root for the number field sieve, Proceedings of the 3rd International Symposium on Algorithmic Number Theory,
ANTS’98 (Portland, Oregon, June 21-25, 1998) (J. P. Buhler, ed.), LNCS, vol.
1423, Springer-Verlag, Berlin-Heidelberg-New York-Barcelona-Budapest-Hong
Kong-London-Milan-Paris-Singapore-Tokyo, 1998, pp. 151–168.
22. I. Niven and H. S. Zuckerman, An introduction to the theory of numbers, Wiley,
1972.
23. C. Pomerance, Fast, rigorous factorization and discrete logarithm algorithms,
Discrete Algorithms and Complexity (D. S. Johnson, T. Nishizeki, A. Nozaki,
and H. S. Wilf, eds.), Academic Press, Orlando, FL, 1987, pp. 119–143.
24. Pratt, Every prime has a succinct certificate, SICOMP: SIAM Journal on
Computing 4 (1975).
25. Rabin, Probabilistic algorithm for testing primality, JNT: Journal of Number
Theory 12 (1980).
26. Rivest, Shamir, and Adleman, A method for obtaining digital signatures and
public-key cryptosystems, CACM: Communications of the ACM 21 (1978).
27. J. Sandor, D. S. Mitrinovic, and B. Crstici, Handbook of number theory, vol. 1,
Springer, 1995.
28. V. Shoup, Lower bounds for discrete logarithms and related problems, Proc.
International Advances in Cryptology Conference – EUROCRYPT ’97, 1997,
pp. 256–266.
29. Solovay and Strassen, A fast monte-carlo test for primality, SICOMP: SIAM
Journal on Computing 6 (1977).
30. J. Teitelbaum, Euclid’s algorithm and the Lanczos method over finite fields,
Mathematics of Computation 67 (1998), no. 224, 1665–1678.
31. D. Wiedemann, Solving sparse linear equations over finite fields, IEEE
Transactions on Information Theory IT-32 (1986), 54–62.
32. H. Woll, Reductions among number theoretic problems, Inf. Comput. 72 (1987),
no. 3, 167–179.