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.