Numeri e Crittografia 8847003318, 9788847003316

Il libro tratta di metodi di crittografia e sistemi, con particolare enfasi alla teoria dei numeri. Il libro è rivolto a

99 65 17MB

Italian Pages 188 [183] Year 2006

Report DMCA / Copyright

DOWNLOAD PDF FILE

Table of contents :
Title Page
Copyright Page
Indice
Introduzione
1 Dalla Crittografia ai Numeri
1.1 Giulio Cesare e Sherlock Holmes
1.2 L'ABC della Crittografia
1.3 Esistono Criptosistemi Perfetti?
1.4 Crittografia a Chiave Pubblica
1.5 Problemi del millennio
1.6 Teoria dei Numeri e Crittografia
Riferimenti bibliografici
2 Primi e Composti
2.1 Divisori, restie quozienti
2.2 Una parentesi computazionale
2.3 Il Teorema Fondamentale dell' Aritmetica
2.4 Il Teorema dei Numeri Primi
2.5 Riconoscere i Primi?
2.6 Generare i Primi
2.7 Numeri e Misteri
Riferimenti bibliografici
3 Potenze, Radici e Logaritmi
3.1 Introduzione
3.2 L'Aritmetica dell'Orologio
3.3 Radici Quadrate e Resti Cinesi
3.4 Potenze
3.5 Il Piccolo Teorema di Fermat
3.6 La funzione c/J e il Teorema di Eulero
3.7 Campi finiti
3.8 Logaritmi discreti
3.9 I simboli di Legendre e di Jacobi
3.10 La Legge di Reciprocità Quadratica di Gauss
3.11 Ancora Radici Quadrate
3.12 Curve Ellittiche, per finire
Riferimenti bibliografici
4 Il Problema della Primalità
4.1 Dagli antichi Greci ad AKS
4.2 Gli Pseudoprimi di Carmichael
4.3 Variazioni sul Piccolo Teorema di Fermat
4.4 Primi e N P
4.5 L'Algoritmo di Solovay-Strassen
4.6 L'Algoritmo di Miller-Rabin
4.7 AKS: l'Algoritmo di Agrawal-Kayal-Saxena
4.8 Variazioni su AK S
Riferimenti bibliografici
5 Il Problema della Fattorizzazione
5.1 Introduzione
5.2 Il Metodo p-l
5.3 Il Metodo p
5.4 Fattorizzazione alla Fermat
5.5 Fattorizzazione e Curve Ellittiche
5.6 Riflessioni finali
Riferimenti bibliografici
6 Ancora Crittografia
6.1 Crittografia a Chiave Pubblica
6.2 Il Logaritmo Discreto e il Criptosistema diDiffie-Hellman
6.3 Doppi Lucchetti
6.4 Il Problema dello Zaino
6.5 Il Criptosistema RSA
6.6 Attacchi aRSA
6.7 Crittografia e Curve Ellittiche
6.8 Firme digitali
6.9 Protocolli a Conoscenza Zero
6.10 Testa o Croce telefonico
6.11 Poker al telefono
Riferimenti bibliografici
Riferimenti bibliografici
Indice analitico
Recommend Papers

Numeri e Crittografia
 8847003318, 9788847003316

  • 0 0 0
  • Like this paper and download? You can publish your own PDF file online for free in a few minutes! Sign Up
File loading please wait...
Citation preview

Numeri e Crittografia

s. Leonesi, C. Toffalori

Numeri e Crittografia

~ Springer

S. LEONESI

Dipartimento di Matematica e Informatica Facoltà di Scienze e Tecnologie Università di Camerino, Camerino C. TOFFALORI

Dipartimento di Matematica e Informatica Facoltà di Scienze e Tecnologie Università di Camerino, Camerino

Springer-Verlag fa parte di Springer Science+ Business Media springer.it © Springer-Verlag Italia, Milano 2006

ISBN lO 88-470-0331-8 ISBN 13 978-88-470-0331-6

Quest'opera è protetta dalla legge sul diritto d'autore. Tutti i diritti, in particolare quelli relativi alla traduzione, alla ristampa, all'uso di figure e tabelle, alla citazione orale, alla trasmissione radiofonica o televisiva, alla riproduzione su microfIlm o in database, alla diversa riproduzione in qualsiasi altra forma (stampa o elettronica) rimangono riservati anche nel caso di utilizzo parziale. Una riproduzione di quest'opera, oppure di parte di questa, è anche nel caso specifico solo ammessa nei limiti stabiliti dalla legge sul diritto d'autore, ed è soggetta all'autorizzazione dell'Editore. La violazione delle norme comporta sanzioni previste dalla legge. I:utilizzo di denominazioni generiche, nomi commerciali, marchi registrati, ecc., in quest'opera, anche in assenza di particolare indicazione, non consente di considerare tali denominazioni o marchi liberamente utilizzabili da chiunque ai sensi della legge sul marchio. Riprodotto da copia camera-ready fornita dagli Autori Progetto grafico della copertina: Simona Colombo, Milano Stampato in Italia: Signum, Bollate (Mi)

Indice

Introduzione ................................................... VII 1

Dalla Crittografia ai Numeri.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 Giulio Cesare e Sherlock Holmes. . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 L'ABC della Crittografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 1.3 Esistono Criptosistemi Perfetti? . . . . . . . . . . . . . . . . . . . . . . . . . .. 1.4 Crittografia a Chiave Pubblica. . . . . . . . . . . . . . . . . . . . . . . . . . .. 1.5 Problemi del millennio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 1.6 Teoria dei Numeri e Crittografia. . . . . . . . . . . . . . . . . . . . . . . . . ..

1 1 4 10 17 19 24

2

Primi e Composti. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 2.1 Divisori, resti e quozienti. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 2.2 Una parentesi computazionale. . . . . . . . . . . . . . . . . . . . . . . . . . . .. 2.3 Il Teorema Fondamentale dell'Aritmetica ................... 2.4 Il Teorema dei Numeri Primi .............................. 2.5 Riconoscere i Primi? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 2.6 Generare i Primi ........................................ 2.7 Numeri e Misteri ........................................

27 27 31 33 37 41 42 47

3

Potenze, Radici e Logaritmi ............................... 3.1 Introduzione............................................ 3.2 L'Aritmetica dell'Orologio ................................ 3.3 Radici Quadrate e Resti Cinesi. . . . . . . . . . . . . . . . . . . . . . . . . . .. 3.4 Potenze................................................ 3.5 Il Piccolo Teorema di Fermat ............................. 3.6 La funzione cjJ e il Teorema di Eulero. . . . . . . . . . . . . . . . . . . . . .. 3.7 Campi finiti ............................................ 3.8 Logaritmi discreti ....................................... 3.9 I simboli di Legendre e di Jacobi .......................... 3.10 La Legge di Reciprocità Quadratica di Gauss ............... 3.11 Ancora Radici Quadrate ..................................

51 51 51 53 57 59 60 64 68 68 76 81

VI

Indice

3.12 Curve Ellittiche, per finire. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 82 4

Il Problema della Primalità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 91 4.1 Dagli antichi Greci ad AKS .............................. 91 4.2 Gli Pseudoprimi di Carmichael . . . . . . . . . . . . . . . . . . . . . . . . . . .. 94 4.3 Variazioni sul Piccolo Teorema di Fermat. . . . . . . . . . . . . . . . . .. 98 4.4 Primi e N P ............................................ 101 4.5 L'Algoritmo di Solovay-Strassen ........................... 102 4.6 L'Algoritmo di Miller-Rabin .............................. 107 4.7 AKS: l'Algoritmo di Agrawal-Kayal-Saxena ................ 114 4.8 Variazioni su AKS ...................................... 122

5

Il Problema della Fattorizzazione .......................... 127 5.1 Introduzione ............................................ 127 5.2 Il Metodo p-l ......................................... 128 5.3 Il Metodo p ............................................. 129 5.4 Fattorizzazione alla Fermat ............................... 132 5.5 Fattorizzazione e Curve Ellittiche .......................... 137 5.6 Riflessioni finali ......................................... 140

6

Ancora Crittografia ........................................ 143 6.1 Crittografia a Chiave Pubblica ............................ 143 6.2 Il Logaritmo Discreto e il Criptosistema di Diffie-Hellman .... 144 6.3 Doppi Lucchetti ......................................... 147 6.4 Il Problema dello Zaino .................................. 148 6.5 Il Criptosistema RSA .................................... 151 6.6 Attacchi aRSA . ........................................ 155 6.7 Crittografia e Curve Ellittiche ............................. 157 6.8 Firme digitali ........................................... 159 6.9 Protocolli a Conoscenza Zero ............................. 161 6.10 Testa o Croce telefonico .................................. 162 6.11 Poker al telefono ........................................ 165

Riferimenti bibliografici ........................................ 171 Indice analitico ................................................ 175

Introd uzione

L'Aritmetica, o Teoria dei Numeri, è una delle discipline più antiche della Matematica. I numeri che tratta sono quelli che si chiamano naturali 0, 1, 2, ... e che adoperiamo sin da bambini per contare. Apparentemente semplici e innocui, nascondono tuttavia alcuni dei misteri più difficili e appassionanti dell'intera Matematica. La Crittografia si interessa invece di nascondere a occhi indiscreti il contenuto di comunicazioni riservate. Corrisponde a esigenze largamente diffuse nella nostra società; infatti la possibilità di usare strumenti telematici per acquisti, o per transazioni di denaro, o addirittura per esprimere il voto elettorale, richiede protocolli capaci di garantire la segretezza dei dati trasmessi e la privacy personale. La Teoria dei Numeri può soccorrere la Crittografia in queste sue esigenze; proprio grazie ai misteri che ancora la avvolgono, riesce a fornire idee e strategie per la architettura di protocolli di sicurezza. Il libro che presentiamo dà resoconto di questo collegamento. Introduce dapprima la Crittografia moderna, i suoi obiettivi, le sue priorità, le sue necessità. Passa poi a esporre argomenti di Teoria dei Numeri, con particolare riferimento ai due problemi di riconoscere i numeri primi, e di decomporre un naturale nei suoi fattori primi; per ognuna delle due questioni fornisce un vasto panorama degli algoritmi che la trattano e cercano di risolverla nel modo più efficiente possibile. In particolare presenta la recentissima procedura AK S per riconoscere i numeri primi. Il libro torna poi alla Crittografia e mostra come idee e metodi di Teoria dei Numeri si applichino alla costruzione di procedure affidabili per la trasmissione sicura delle informazioni riservate. Gli argomenti trattati corrispondono dunque in modo naturale a un corso del terzo anno di una Laurea Triennale in Matematica, o del successivo biennio della Laurea Specialistica. Può interessare e coinvolgere anche studenti di Informatica. Del resto, il libro deriva direttamente da esperienze didattiche svolte per vari anni nell'Università di Camerino. Alcuni colleghi di altre sedi

VIII

Introduzione

hanno avuto la bontà di apprezzare le note che da queste esperienze furono tratte qualche tempo fa e che forniscono la base del libro stesso. Speriamo che anche i nostri lettori possano gradire allo stesso modo questo nostro lavoro.

1

Dalla Crittografia ai Numeri

1.1 Giulio Cesare e Sherlock Holmes Tra i casi che il dottor Watson riferisce nella serie di racconti The Return oE Sherlock Holmes, c'è quello intitolato The Adventure oE the Dancing Men. In esso Sherlock Holmes viene in possesso di un foglio di carta riempito da strani geroglifici rappresentanti figurine di pupazzi variamente orientate (i ballerini del titolo) e deve capirne il significato. Non gli è difficile immaginare che i disegni nascondano un messaggio cifrato; ma questa congettura non lo avvicina molto alla soluzione, perché il vero problema è comprendere quale è il testo criptato e dunque, preliminarmente, in quale modo è stato criptato. Comunque Sherlock Holmes ragiona così: c'è un pupazzo che compare più frequentemente sul foglio; se assumiamo che il testo nasconda un messaggio in lingua inglese, si può azzardare l'ipotesi che questo pupazzo rappresenti la lettera più comune in inglese, cioè la E. Procedendo su questa strada, si può associare alle figurine del disegno, ordinate secondo la loro frequenza, la successione delle lettere dell'alfabeto inglese, ordinate secondo il loro uso nella lingua comune, dunque, dopo la E, la T, la A, la 0, e così via. Holmes ammette che questa corrispondenza non può essere così sicura e ben fondata da escludere errori, ma affidandosi al suo intuito e all'intelligenza guidata dall'esperienza, riesce finalmente a svelare il messaggio nascosto. Chi è appassionato di gialli e misteri e, incuriosito da questo intreccio, è interessato a conoscerne tutto lo sviluppo può leggere questa avventura e gli altri godibili casi del nostro eroe nella raccolta citata. A noi il resoconto del dottor Watson interessa perché introduce bene i due argomenti che vogliamo trattare: l'arte di cifrare i messaggi - la crittografia -, e quella di svelare i messaggi nascosti - la crittoanalisi -. In realtà il racconto di Sherlock Holmes non ha molto di originale. In effetti l'esigenza di nascondere ad occhi indiscreti per motivi di guerra, o di spionaggio, o di amore messaggi dal contenuto delicato si può ritenere vecchia come il mondo; e tra i trucchi più semplici di cifratura (e decifratura) c'e quello di tradurre le lettere dell'alfabeto in uso con altri simboli (come i pupazzi

2

1 Dalla Crittografia ai Numeri

ballerini di Sherlock Holmes), oppure di permutarle tra di loro secondo una chiave prestabilita. Questi procedimenti erano ben noti sin dall'antichità: li utilizzava anche Giulio Cesare, che, nel corso delle sue numerose campagne di guerra, dovendo corrispondere con i suoi luogotenenti e volendo evitare che i suoi ordini venissero intercettati e soprattutto capiti dai suoi nemici, talora li criptava traducendoli semplicemente in greco, talora provvedeva a permutarne le lettere secondo uno schema fisso prestabilito. Ad esempio, il testo poteva essere cifrato spostando ogni lettera dell'alfabeto dei Romani di 3 passi in avanti (A in D, B in E, ... ) e le ultime tre nelle prime tre, in ordine (X in A, T in B, Z in C): così il saluto AVE diventava, tra le 24 lettere dell'alfabeto della lingua latina, DZH (ricordiamo infatti che le lettere usate dai latini erano A, B, C, D, E, F, G, H, I, K, L, M, N,O, P, Q, R, S, T, U, V, X, Y, Z); il testo originale veniva poi decifrato col semplice procedimento inverso di tornare indietro di 3 lettere; ovviamente la chiave 3 doveva essere concordata in anticipo e resa nota sia a chi cifrava che a chi decifrava. In realtà Cesare e i suoi luogotenenti, che non conoscevano le cifre 1, 2, 3, ... , usavano al loro posto una sorta di anello con 2 circonferenze concentriche, che elencava nella fascia esterna tutte le lettere dell'alfabeto e le accompagnava internamente con le loro sostituzioni. Anche la strategia usata da Holmes per recuperare il messaggio nascosto dai suoi pupazzi non era affatto originale. Ad esempio, era conosciuta e usata dagli Arabi, ed in particolare da Ishaq-al-Kindi, sin dal nono secolo dopo Cristo; grazie alla tecnica prima descritta nel caso di Holmes, permetteva in genere una decifrazione relativamente facile dei messaggi criptati attraverso una permutazione delle lettere; veniva (e viene) chiamata analisi di frequenza: un nome che ben ne sintetizza l'idea di base, secondo cui i simboli più frequenti nel messaggio corrispondono alle lettere più comuni nella lingua usata. Del resto, già assai prima di Holmes, la crittografia e, conseguentemente, la crittoanalisi avevano ottenuto rilevanti progressi e raffinamenti. Ad esempio, nel Rinascimento Leon Battista Alberti e, poco dopo, il francese Vigenère avevano proposto l'idea di cifrare le lettere di un dato messaggio non più con l'uso costante di un'unica permutazione, ma piuttosto utilizzando permutazioni diverse, dipendenti dal posto della lettera da cifrare. Ad esempio si poteva concordare di traslare la prima lettera di 3 posti, la seconda di 2, la terza di 4, secondo uno schema prestabilito e noto a mittente e destinatario, e dunque cifrare l"'AVE" di Cesare nell'alfabeto latino come DYI. Con gli anni, però, più sofisticate tecniche di analisi di frequenza permisero di infrangere anche questi sistemi crittografici. Ma ancora nella seconda guerra mondiale, l'esercito tedesco adoperava una macchina Enigma che, per dirla in termini molto banali, cifrava le informazioni segrete secondo un ripetuto uso dell'idea di Alberti e Vigenère, rinnovandone frequentissimamente la chiave. Questo sistema veniva usato, ad esempio, per trasmettere ai sottomarini tedeschi dell'Atlantico le coordinate dei convogli nemici in navigazione e gli ordini di combattimento, ad esempio il comando di affondarne uno. I crittoanalisti inglesi che cercavano di violare questo codice e di carpire il significato dei messaggi si trovavano dun-

1.1 Giulio Cesare e Sherlock Holmes

3

que di fronte alla difficoltà non solo di ricavame la chiave (in effetti, tecniche raffinate di analisi di frequenza già permettevano questo obiettivo prima della guerra), ma anche e soprattutto di farlo in tempi rapidi, prima che la chiave stessa perdesse la sua validità e comunque in tempo per salvare il convoglio in navigazione. I loro sforzi, coordinati da un grande matematico del Novecento, Alan Thring, riuscirono alla fine nell'impresa, ed il loro successo contribuì all'esito del conflitto, almeno alla battaglia navale nell' Atlantico. Recenti libri e pellicole cinematografiche descrivono in modo romanzato questi accadimenti. Ma al di là del contributo di Turing e del suo impegno in tempi di guerra, ci si potrebbe ragionevolmente chiedere a questo punto: che cosa c'entra la Matematica in tutto questo? Quale legame può mai stringerla alla Crittografia? Una prima superficiale relazione si può avvertire nel modo stesso di scrivere i messaggi. In effetti, se le lettere di un alfabeto possono essere cifrate con simboli arbitrari, ed anche con pupazzi (del resto, gli stessi geroglifici sono simboli di alfabeto), perché non rappresentarle addirittura come numeri naturali? A diventerebbe 0, B diventerebbe 1, e così via, fino a Z che, se accettiamo l'alfabeto della lingua scientifica oggi imperante, e cioè l'inglese, corrisponderebbe a 25; se poi vogliamo qualche ulteriore numero per cifrare i simboli di punteggiatura (punti, virgole, pause, etc.) possiamo accomodarci, ed usare tutti i numeri che vogliamo, tanto il serbatoio dei numeri naturali è infinito: così uno spazio vuoto può avere codifica 26, una virgola 27, e via dicendo. Se però ci limitiamo alle 26 lettere abbiamo il seguente vocabolario di traduzione:

00 01 02 03 04 05 06 07 08 09 lO 11 12 A B C D E F G H I J K L M 13 14 15 16 17 18 19 20 21 22 23 24 25 NOPQRSTUVWXYZ Tabella 1.1. Vocabolario di traduzione

In particolare l' AV E di Cesare è rappresentato rispetto all'alfabeto inglese dalla tema 0, 21, 4 e la cifratura che se ne ottiene aggiungendo 3 ad ogni lettera produce 3,24,7, cioè DYH (non più DZH come nell'alfabeto latino perché adesso dopo V dobbiamo considerare anche W). Inoltre questa addizione per 3 è da intendersi modulo 26; infatti le ultime tre lettere dell'alfabeto inglese X, Y, Z sono codificate rispettivamente da A, B, C, e quindi i numeri corrispondenti 23,24,25 diventano 0, 1, 2, che coincidono con le somme 23+3, 24 + 3, 25 + 3 proprio modulo 26. Così la Matematica può risultare utile non solo per rappresentare i caratteri di scrittura, ma anche per snellire e sveltire le operazioni di cifratura e decifratura, che, almeno nel caso di Cesare, corrispondono alle operazioni di addizione e sottrazione modulo 26, o comunque

4

1 Dalla Crittografia ai Numeri

modulo il numero di lettere dell'alfabeto. Se poi conveniamo che criptare un messaggio significa permutarne le lettere, allora la Matematica può fornirci ulteriore soccorso, visto che le permutazioni sono un suo tipico argomento, spesso indigesto ai non esperti che vi si accostano per studiarlo. Ad esempio, la Matematica ci dice subito quante sono le possibili maniere di permutare (e dunque quanti sono i possibili modi di criptare) le 26 lettere dell'alfabeto (se vogliamo limitarci a 26 simboli e dimenticare la punteggiatura): sono 26!, e cioè il prodotto di tutti i numeri naturali da 1 fino a 26. Tuttavia queste relazioni tra Crittografia e Matematica sembrano più superficiali che sostanziali. Ma, in realtà, si può instaurare un rapporto più serio. Nei prossimi paragrafi cerchiamo di spiegare perché. Esercizi 1.1.1 Negli esercizi che seguono si faccia riferimento all'alfabeto inglese e alla tabella 1.1 di conversione delle sue lettere in numeri interi. Si assuma anche che lo spazio vuoto corrisponda al numero 27 (cioè venga dopo la lettera Z).

1. Si codifichi il messaggio "siamo a corto di viveri" spostando indietro di 7 passi ciascuna lettera. 2. Si decodifichi il messaggio "ZMZEDPEDQEXIQEXMGE" sapendo che è stato ottenuto traslando di 4 lettere in avanti il messaggio originale.

1.2 L'ABC della Crittografia Per apprezzare meglio i contributi della Matematica alla Crittografia, conviene che fissiamo anticipatamente il nostro contesto, prescindendo dai casi particolari di Cesare e Holmes. Assumiamo allora un modello in cui il personaggio A (Alice) cerca di scrivere al personaggio B (Bernardo) un messaggio riservato e teme che C (il "cattivo") possa intercettarlo e leggerlo. A si preoccuperà allora di CIFRARE o CRIPTARE il messaggio in qualche maniera, secondo un'opportuna chiave di codifica, e di far conoscere in anticipo a B come DECIFRARE o DECRIPTARE il messaggio criptato trasmettendogli l'opportuna chiave di decodifica. A questo punto a C non basterà più intercettare il messaggio di A; dovrà anche sforzarsi di capire come VIOLARE il sistema di cifratura ideato da A. Quel che deriva da questa situazione è una coppia di problemi opposti: •

quello della CRITTOGRAFIA, che si preoccupa con A e con B di escogitare sistemi per cifrare e decifrare messaggi riservati (chiamati di conseguenza criptosistemi);

1.2 L'ABC della Crittografia



5

quello della CRITTOANALISI, che cerca, insieme a C, di infrangere questi criptosistemi.

Come già detto nel precedente paragrafo, possiamo convenire che tutti i messaggi, tanto quelli originali quanto quelli cifrati, siano scritti con un alfabeto composto dai numeri O, 1, 2, ... , 24, 25 (ed eventualmente 26, 27, 28, 29, ... se vogliamo anche utilizzare simboli di punteggiatura come lo spazio vuoto, la virgola, il punto, il punto interrogativo e così via). Se ci limitiamo a 26 simboli, allora ognuna delle 26! permutazioni su questi 26 oggetti diviene la base di un possibile criptosistema. Ad esempio, nel caso di Cesare descritto nello scorso paragrafo, la codifica è data dalla funzione i che ad ogni numero x tra O e 25 associa l'intero i(x) == x

+ 3 (mod26),

O:S i(x)

< 26

e dunque ha chiave 3, mentre la decodifica si ottiene tramite la funzione "inversa" l' che ad ogni x associa

i' (x) == X - 3 (mod26),

O:S i'(X)

< 26

con chiave -3. Il sistema si infrange se riusciamo a conoscere la chiave di codifica 3 o equivalentemente quella di decodifica -3: è facile infatti ricavare l'una delle due chiavi dall'altra. Procedendo in modo più generale ed astratto, supponiamo che N sia il numero dei simboli del nostro alfabeto (con N = 26, 27, ... ), così che le permutazioni possibili sono N!. Ci muoviamo poi nel contesto delle classi di resti modulo N, cioè quello dell' "aritmetica dell'orologio" di Gauss, riferita ovviamente all'intero N. Fissiamo due naturali a e b minori di N, e supponiamo poi che a e N siano primi tra loro e dunque che a sia invertibile modulo N (assumiamo qui un minimo di dimestichezza con i punti essenziali della Teoria elementare dei Numeri, che comunque saranno ricordati in maggior dettaglio nei capitoli 2 e 3). A questo punto 1. cifriamo ogni simbolo x tramite la funzione

i(x) == ax + b (modN),

i

che gli associa l'intero

O:S i(x)

< N;

si noti che, siccome a è inverti bile modulo N, i si può invertire; 2. decifriamo proprio tramite la funzione "inversa" l' di i, quella che ad ogni simbolo x associa l'intero 1'(x) tale che f'(x) == a'x

+ b' (modN),

O:S i(x)

O. Se il criptosistema ammette più messaggi che chiavi, possiamo trovare mb E M tale che mb "I- dk(co) per ogni k E K e quindi PrkEK(CO = ek(mb)) = O. Ma questo contraddice l'ipotesi di perfezione perché si ottiene PrkEK(CO = ek(mO)) "IPrkEK(CO = ek(mb)). Segue che ci devono essere almeno tante chiavi quanti messaggi. D

La conclusione del paragrafo è dunque scoraggiante: infatti, siccome i cifrari di Vernam sono praticamente inutilizzabili, ma sono gli unici sostanzialmente perfetti, dobbiamo ammettere che non esistono criptosistemi perfetti che si possano realmente adoperare nella vita comune.

1.4 Crittografia a Chiave Pubblica

17

1.4 Crittografia a Chiave Pubblica Negli anni più recenti, l'avvento dei moderni calcolatori e le crescenti capacità computazionali che ne derivano hanno aperto anche alla Crittografia nuove prospettive e nuovi campi di interesse. Ricordiamo infatti due ovvie caratteristiche della Crittografia Classica (quella di Giulio Cesare, Vigenère e Vernam, per intenderci): 1. c'è una chiave di cifratura, che i corrispondenti devono preventivamente scambiarsi (come il numero 3 nell'esempio di Cesare); 2. sapere come si cifra (traslando di 3 lettere, nell'esempio) equivale a sapere come si decifra (traslando di 3 lettere nel senso opposto).

Ma queste proprietà si rivelano altrettanto ostacoli e difetti rispetto alle nuove esigenze della Crittografia Moderna. Quali sono infatti i nuovi obiettivi cui la nuova Crittografia deve far fronte? Vediamo un esempio. Tra le nuove possibilità che Internet consente, c'è quella di operare acquisti direttamente in rete, pagando con la semplice trasmissione delle coordinate della propria carta di credito. Naturalmente questo genere di transazioni richiede una ovvia riservatezza, che nasconda il numero della carta ad occhi indiscreti. Come si possono cifrare queste informazioni? Certamente non con i codici classici. 1. Utilizzare una sola chiave, e comunque trasmetterla ai tanti utenti interessati, sarebbe enormemente pericoloso: un pirata capace di intercettare i messaggi potrebbe anche anticipatamente riuscire a carpire la chiave, e a quel punto non dovrebbe far più nessuno sforzo di crittoanalisi per infrangere le informazioni riservate.

Una maniera per ovviare a questa difficoltà è quella di escogitare sistemi crittografici che escludano qualunque trasmissione di chiave. Ogni utente A sceglie una coppia di chiavi: una pubblica, che ogni interlocutore può ed anzi deve sapere per cifrare la propria corrispondenza verso A; una privata, che soltanto A deve conoscere (e gelosamente custodire) e che gli serve per decifrare i messaggi che gli arrivano. Ma la chiave pubblica per cifrare i messaggi ad A diventerebbe in questo modo nota anche a persone indiscrete e a pirati. Dunque un tale sistema dovrebbe avere la seguente proprietà, del tutto opposta a quanto avviene nella crittografia classica. 2. Decifrare deve essere enormemente più difficile di cifrare, almeno per chi non conosce la chiave privata di A: le due operazioni di criptare e decriptare non devono essere computazionalmente equivalenti.

È ragionevole aspettarsi di costruire sistemi crittografici con queste caratteristiche? Il seguente esempio suggerisce di sì. Il metodo del doppio lucchetto. Supponiamo che B voglia trasmettere un messaggio ad A senza dovergli preventivamente spedire alcuna chiave: B ripone il messaggio in uno scrigno che chiude con un suo lucchetto ed invia ad A.

18

1 Dalla Crittografia ai Numeri

A, ricevuto lo scrigno, lo chiude con un suo secondo lucchetto e lo rispedisce a B. B a questo punto apre il proprio lucchetto: lo scrigno resta chiuso dallucchetto di A, e viene rimandato ad A. A, ricevuto nuovamente lo scrigno, apre l'ultimo lucchetto rimasto - il suo - e può finalmente leggere il messaggio. Si noti che la trasmissione è avvenuta senza alcuno scambio preventivo di chiave, anzi A e B hanno usato i loro privatissimi lucchetti per aprire e chiudere lo scrigno. Il racconto mostra a livello intuitivo come sia possibile, in linea di principio, escogitare sistemi crittografici di cifratura e decifratura che evitino lo scambio preventivo di chiavi, e dunque superino la proprietà 1 della crittografia classica: i due interlocutori A e B operano con le loro chiavi, personalissime e privatissime, e tra loro indipendenti, visto che la facoltà di A di aprire o chiudere il suo lucchetto non interferisce con l'analoga libertà di B. Ma certamente non possiamo immaginare di usare nella nostra vita comune, per la nostra pur delicata corrispondenza, un simile macchinoso procedimento di scrigni e lucchetti. Ci chiediamo allora se possiamo realmente costruire sistemi efficienti e sicuri che possano garantire le esigenze sopra sottolineate. Ebbene, la Matematica sa fornire idee e strumenti per realizzare nella pratica di tutti i giorni il metodo del doppio lucchetto. Ma prima di introdurli ricapitoliamo ancora una volta quali sono le necessità della Crittografia moderna, quella che viene adesso usualmente chiamata Crittografia a chiave pubblica: 1. non deve essere richiesto alcuno scambio di chiave; 2. decifrare deve essere un'operazione enormemente più difficile che cifrare, a meno che non si disponga di ulteriori specifiche informazioni. Un'idea per soddisfare queste esigenze potrebbe essere quella di usare funzioni a senso unico: funzioni di cifratura che (i) siano facilmente computabili (in modo che chiunque possa velocemente criptare un messaggio per un dato utente A), (ii) siano invertibili (in modo da permettere la decifratura), (iii) ma abbiano un'inversa il cui calcolo è proibitivo in assenza di ulteriori informazioni (che costituiscono la chiave privata di A, quella che solo A deve conoscere e senza la quale nessun pirata potrà infrangere in tempi rapidi un messaggio eventualmente intercettato). Una funzione a senso unico potrebbe essere la base ragionevole di un efficiente sistema di crittografia a chiave pubblica. A priori, però, niente assicura che simili funzioni esistano. E, comunque, la nozione stessa di funzione a senso unico non ha niente di matematicamente rigoroso: infatti la difficoltà di calcolare l'inversa potrebbe essere soltanto transitoria e passeggera, legata allo stato attuale delle conoscenze scientifiche; una funzione che oggi si rivelasse a senso unico domani potrebbe non esserlo più, perché niente vieta che nel frattempo qualche genio - un novello Sherlock Holmes? - riesca ad ideare un procedimento effettivo e rapido capace di computarla.

1.5 Problemi del millennio

19

D'altra parte ci sono due significativi settori della Matematica e dell'Informatica Teorica che possono fornire numerosi spunti e fonti di ispirazione per la costruzione di funzioni a senso unico e, conseguentemente, di criptosistemi a chiave pubblica. Descriviamo brevemente nel prossimo paragrafo certe strategie suggerite dall'Informatica.

1.5 Problemi del millennio C'è una famosa questione di Informatica Teorica, che viene in genere chiamata p = N P, e che sostanzialmente chiede quanto segue. Anche uno studente di Matematica alle prime armi, impegnato a risolvere un problema di aritmetica oppure un'equazione, constata che verificare la soluzione, una volta che è stata trovata, può essere noioso, ma certamente è rapido e sicuro, mentre cercare la soluzione è talora stimolante, ma spesso lento ed incerto. P = N P domanda, più generalmente, se tutti i problemi che ammettono un procedimento rapido di verifica delle soluzioni hanno anche un algoritmo veloce di soluzione: parliamo qui di problemi non solo matematici, ma anche eventualmente di Chimica, Biologia, e così via, purché riconducibili ad un modello matematico. Ovviamente una piena comprensione della questione richiede che si chiarisca preliminarmente che cosa è un "problema" e che successivamente si definisca con precisione 1) quali problemi hanno un algoritmo di soluzione, e quali no, 2) in quali casi l'algoritmo si può ritenere rapido, e in quali no. Rispondiamo qui in modo non rigoroso, rimandando ai testi specifici di Teoria della Computabilità e della Complessità citati a fine capitolo per una trattazione più dettagliata. Anzitutto osserviamo che un problema matematico, o comunque riconducibile a un modello matematico, si deve esprimere nel linguaggio matematico, che si compone di simboli specifici come le cifre decimali 0, 1, 2, ... , 8, 9 oppure le lettere x, y, z, ... ; con esse si possono costruire numeri, o polinomi, o altri oggetti ancora. Diciamo allora che quei simboli matematici necessari a esprimere il contesto di un particolare problema formano l'alfabeto di quel problema. Possiamo facilmente convenire di trattare soltanto alfabeti finiti. Adesso notiamo che un "problema" consiste spesso nel riconoscere, tra tutte le sequenze finite di simboli (o parole) del suo alfabeto, quelle che soddisfano una prefissata condizione. Ad esempio, c'è un famoso problema di aritmetica che chiede di stabilire se un dato numero naturale N 2: 2 è primo; il problema domanda quindi di identificare tra tutti i numeri naturali N 2: 2 - espressi come sequenze di cifre 0, 1, 2, ... , 9 - quelli che sono primi, e attende la risposta sì se N è primo, no altrimenti: accetta conseguentemente 2, 3, 5, 7, 11, ... , perché primi, esclude al contrario 4, 6 e così via. Quindi in questo caso, e in molti altri, è dato un input formato da una parola dell'alfabeto e ci

20

1 Dalla Crittografia ai Numeri

attendiamo un output del tipo sì o no a seconda che l'input soddisfi o no la condizione richiesta dal problema. Altre volte il problema consiste nel calcolare, per ogni parola dell'alfabeto, la sua immagine in una qualche funzione. Ad esempio, per ogni naturale N 2': 2 possiamo chiederci di decomporre N nei suoi fattori primi, dedurre quindi 2 2 da 4, 2 . 3 da 6, 2 da 2 e via dicendo. Stavolta l'input è ancora una parola dell'alfabeto, ma l'output non si riduce a un sì o no, ma si estende a parola, o a coppie o terne di parole - nel caso specifico, nella sequenza dei fattori primi di N-. Nel seguito, considereremo prevalentemente problemi di queste forme o, ancora più frequentemente, del primo tipo sopra descritto (con le due risposte alternative sì e no). Intenderemo dunque principalmente un "problema" da un punto di vista astratto, come un insieme S di parole su un alfabeto finito A (allo stesso modo in cui i numeri naturali, e in particolare i primi, si possono intendere come parole sull'alfabeto {a, 1,2, ... , 9}). La questione da risolvere è, per ogni parola w su A, se w è in S o no (così come, nel caso dei primi, per ogni naturale N 2': 2, si vuole decidere se N è primo o no). Possiamo adesso distinguere quali problemi hanno soluzione e quali no. In base a quanto abbiamo fin qui stabilito un procedimento di soluzione tratta parole sull'alfabeto (finito) del problema e tende a scegliere quelle che soddisfano determinate condizioni, oppure a calcolare la loro immagine in determinate funzioni. Per certi problemi questo procedimento si trova facilmente, per altri si raggiunge con qualche maggior difficoltà, per altri ancora resta incerto e misterioso: anzi, in questi ultimi casi si può addirittura dubitare che un algoritmo di soluzione si possa realmente scoprire. Il procedimento, quando c'è, dipende poi ovviamente dal problema, e cioè dalla domanda a cui deve rispondere: un algoritmo che riconosce i numeri primi non va bene per risolvere le equazioni di terzo grado, e viceversa. Come possiamo allora sviluppare un trattamento astratto uniforme di queste situazioni così disparate? Come possiamo dare una definizione teorica generale di algoritmo? Ebbene, nel 1936, Alan Turing ideò una sorta di calcolatore astratto ante litteram, in realtà più assomigliante ad una vecchia macchina da scrivere che ad un moderno computer: la macchina di Turing. Egli propose di assumere questi meccanismi teorici come termine di paragone di ogni computazione, e dunque di convenire che è calcolabile esattamente ciò che una macchina di Turing sa calcolare. Sostanzialmente si afferma, a livello di slogan: Tesi di Turing. Un problema ha un "algoritmo" che lo risolve se e solo se c'è una Macchina di Turing che è capace di farlo.

"Tesi" sta qui per proposta, ipotesi di lavoro. Ci sono fondati argomenti che sostengono ancor oggi questo punto di vista, espresso da Turing una settantina di anni fa. a) Ad esempio, non si conoscono ancora esempi di problemi che hanno una loro specifica procedura di soluzione e che non si possono gestire con nessuna

1.5 Problemi del millennio

21

macchina di Thring. b) Di più, nell'epoca di Thring e negli anni successivi ci sono state svariate altre proposte su come definire in generale sia il concetto di algoritmo che la classe dei problemi che hanno algoritmo di soluzione. Ma questi approcci, talora assai distanti per spirito e ispirazione da quello di Turing, si sono poi dimostrati ad esso equivalenti. Questa coincidenza concentrica di idee originariamente così distanti può essere intesa come loro comune sostegno. Così, se accettiamo la Tesi di Thring, disponiamo di una precisa identificazione dei problemi che hanno procedimento di soluzione. Risulta allora addirittura possibile provare in modo rigoroso che taluni problemi non si possono risolvere perché non c'è macchina di Turing capace di farlo. Si potrebbe tuttavia ancora obiettare che dai tempi di Thring i modelli pratici di calcolatori, ed anche la relativa teoria astratta, si sono grandemente sviluppati: oggi, al posto delle macchine di Turing, si possono considerare computer sofisticati e addirittura prevedere, secondo certi recenti progressi della Fisica, calcolatori quantistici di eccezionale velocità (ne accenneremo nel seguito). Thttavia questi sviluppi non mettono in crisi il modello di Thring: infatti si prova che quello che un moderno calcolatore, o una macchina quantistica, sa computare, anche un'opportuna macchina di Thring riesce a calcolarlo, semmai più lentamente. Arriviamo così al vero nocciolo della questione. Infatti la semplice esistenza di un procedimento che fornisce le risposte di un problema non è talora sufficiente a garantire un trattamento pieno, adeguato e soddisfacente del problema stesso. Sovente occorre che le risposte arrivino in tempo breve, senza indugi: una soluzione che tarda ore, o anni, o millenni ad arrivare è tanto inutile quanto una soluzione che non c'è. Del resto lo stesso Turing aveva sperimentato queste esigenze di rapidità nell'urgenza di infrangere il codice Enigma. Sotto questo punto di vista, non ci basta più sapere che cosa è un algoritmo, e quali problemi hanno un algoritmo che li risolva. Vogliamo invece caratterizzare la nozione di algoritmo rapido e stabilire quali problemi hanno un procedimento rapido di risposta e quali no. C'è in Informatica Teorica una proposta formulata da Edmonds a metà degli anni sessanta, ribadita da Cook e Karp agli inizi degli anni settanta (e in realtà già anticipata da Von Neumann, Rabin e Cobham alcuni anni prima di Edmonds) che afferma:

Tesi di Edrnonds-Cook-Karp. Un algoritmo è efficiente (= rapido) se e solo se lavora in tempo al più polinomiale rispetto alla lunghezza dell'input. (La lunghezza di un input è il numero dei simboli che lo compongono.) Dunque, secondo una visione ormai accettata anche nella vita comune, si bolla come lento e inefficiente qualunque procedimento che richieda un tempo esponenziale rispetto alla lunghezza dell'input (maggiore o uguale di 21 se l indica, appunto, questa lunghezza); al contrario si accetta come rapido ed effettivo un algoritmo che impieghi un numero di passi al più polinomiale rispetto a l (scelta che meriterà qualche commento nelle prossime righe).

22

1 Dalla Crittografia ai Numeri

Per dirla in termini più precisi, si comincia col considerare, per ogni algoritmo, la funzione f che ad ogni intero positivo l associa la massima durata delle computazioni dell'algoritmo che partono da input composti da :::; l simboli e giungono all'output in un numero finito di passi. Si noti che le parole di lunghezza:::; l sono soltanto una quantità finita perché l'alfabeto che le genera contiene solo un numero finito di simboli. Conseguentemente, anche le computazioni dell'algoritmo che le riguardano sono solo una collezione finita, ed ha senso cercarne la massima durata. Si vede allora facilmente che si può assumere che la funzione f di cui sopra sia definita, se non proprio su ogni l, almeno per l abbastanza grande, e che sia inoltre crescente e non limitata (a sottolineare che input più lunghi richiedono computazioni sempre più complicate). Si dà poi della funzione f una stima asintotica, che non si faccia condizionare dai suoi valori parziali ma ne studi il comportamento quando l tende a +00. È utile in questo ambito la relazione O definita nel modo che segue: per f e 9 funzioni come sopra, si pone

f

= O(g)

se e solo se 9 supera asintoticamente f a meno di un fattore costante positivo c: per la precisione, se e solo se esistono un reale positivo c ed un naturale lo tali che, per ogni l 2: lo, f(l) :::; c· g(l). Allora si vede facilmente che ogni funzione polinomiale l I-t lk, con k intero positivo, soddisfa dove ll-t 21 è la funzione esponenziale (in base 2), ma viceversa non vale

per nessun k. Di più, per k, k' interi positivi, si ha

lk = o(lk') se e solo se k :::; k'. La Tesi di Edmonds-Cook-Karp afferma, per usare termini ufficiali, che un algoritmo opera in tempi rapidi se e solo se la corrispondente funzione f è O(lk) per qualche intero positivo k. In particolare esclude che un algoritmo che impiega un numero esponenziale 21 di passi rispetto alla lunghezza l dell'input sia rapido: conclusione che pare facilmente condivisibile, come già osservato. Ma per altri versi, la tesi di Edmonds-Cook-Karp è discutibile: ad esempio, quanto possiamo ritenere efficiente un algoritmo che impiega un tempo lk se l'esponente k è 222 "'? Comunque la proposta è, allo stato attuale delle cose, prevalentemente accettata se non altro perché non se ne vedono di migliori, dunque per pigrizia più che per convinzione. La classe dei problemi che hanno un algoritmo di soluzione che lavora in tempo polinomiale viene denotata P (P per polinomiale, appunto). Si chiama invece N P la classe dei problemi che ammettono un algoritmo rapido (e cioè, ancora, polinomiale) di verifica delle soluzioni, nel senso che adesso spieghiamo.

1.5 Problemi del millennio

23

Ammettiamo per semplicità che il nostro problema preveda una risposta del tipo sì o no, come nel caso dei numeri primi. Allora diciamo che il problema sta in N P esattamente quando, per ogni input w, w ha risposta sì se e solo se si può trovare una qualche testimonianza y che sa confermarlo in tempi rapidi ed è breve da scriversi. Ad esempio, il problema di riconoscere i numeri composti (attenzione: i composti, non i primi) si dimostra appartenere a N P osservando quanto segue. Anzitutto si ricorda che un naturale N 2: 2 è composto se e solo se ammette un divisore d diverso da 1 e da N; a questo punto si coinvolge d come testimone, notando che d è breve da scriversi, perché non più lungo di N, ed è capace di ribadire rapidamente che N è composto: basta dividere N per d e vedere che il resto è O. Si noti però che il procedimento appena descritto non serve a riconoscere altrettanto rapidamente anche i primi; infatti, per N primo, nessun d -::f- 1, N divide N e c'è bisogno di sperimentare questo fallimento per ogni possibile testimone d prima di concludere che N è, appunto, primo. In effetti, per un problema in N P, gli input w a esito negativo no si riconoscono solo dopo che tutti i testimoni y intervengono a loro sfavore. Dunque non basta un'unica opportuna certificazione per dirimere il problema, occorre invece la consultazione sistematica di ogni testimone possibile, il che può allungare enormemente i tempi di lavoro. Il confronto tra le due classi P e N P è dunque, come già detto, una comparazione tra i tempi di dimostrazione e di verifica della soluzione dei problemi matematici o riconducibili a modelli matematici. Chiaramente

PCNP perché ogni algoritmo (rapido) di soluzione costituisce implicitamente anche una verifica. Ci si chiede allora se vale: Problema. P = N P. In altre parole ci si domanda se i tempi di soluzione siano o no significativamente più lunghi di quelli di verifica, ovvero ancora se esistano problemi privi di un algoritmo rapido di dimostrazione ma dotati di un algoritmo veloce di verifica. Il problema P = N P è uno tra i più dibattuti e profondi della Matematica Applicata (e dell'Informatica Teorica), e sembra ben lungi dal trovare una risposta, anche se ci sono forti argomenti che sembrano avvalorare la congettura negativa P -::f- N P. Comunque, proprio per la sua difficoltà e per il suo interesse, è stato inserito nella lista dei 7 "Problemi del Millennio", ovvero di quelle che sono sembrate le sette questioni più rilevanti per la Matematica del duemila. Ci sono poi vari problemi S, spesso di natura combinatoria, e ancor più spesso di facile presentazione, che si trovano nella seguente condizione: a) S ammette un algoritmo rapido di verifica, e dunque sta in N P, b) ogni problema S'in NP si può ricondurre a S in tempo polinomiale (nel senso che c'è una procedura che traduce in tempo polinomiale le istanze

24

1 Dalla Crittografia ai Numeri

s' di S'in corrispondenti istanze s di S in modo tale che s' ha risposta positiva in S' se e solo se s la ha in S). Così dimostrare che S E P implica che tutto NP è in P, e dunque P = NP; viceversa, è ovvio che, se S f/. P, allora P -::f- N P. Questi problemi S sono allora chiamati N P-completi, a sottolineare la loro caratteristica di test campione circa la congettura P = NP. Chiaramente, se si prova P = NP, allora la nozione di N P-completezza perde di significato. Ma, siccome si congettura proprio il contrario e cioè P -::f- N P, la N P-completezza assume piena rilevanza: concludere P -::f- N P si riduce, infatti, ad escludere qualunque algoritmo rapido di soluzione per un qualsiasi problema NP-completo. Se P -::f- NP, si dimostra poi che c'è spazio in N P - P anche per problemi che non sono NP-completi: si chiamano NP-intermedi. Ne vedremo tra poco un possibile esempio assai significativo. Tornando alla crittografia, la disparità di tempo tra gli algoritmi di verifica e quelli di soluzione di un problema N P-completo o N P-intermedio può fornire, in linea di principio, ottimi spunti per la costruzione di funzioni F a senso unico: si tratta di legare in modo opportuno la computazione di F (e dunque la codifica del criptosistema) alla procedura (rapida) di verifica, e la computazione dell'inversa di F (quindi la decodifica) alla difficoltà di ottenere algoritmi veloci di soluzione. Nel Capitolo 6, presenteremo in dettaglio un esempio famoso (e sfortunato) di cripto sistema a chiave pubblica basato su questi argomenti: si tratta del Criptosistema di Merkle-Hellman, che si fonda su un classico problema N P-completo, noto come Problema dello Zaino. Il collegamento tra il problema P = N P e l'esistenza di funzioni a senso unico ha comunque un fondamento teorico ben stabilito. Si prova infatti che ci sono funzioni a senso unico se e solo se P eguaglia un'opportuna sottoclasse U P di N P, definita - più o meno - come segue. Un problema S è in U P se e solo se c'è un algoritmo di verifica delle sue soluzioni che richiede esattamente un testimone per ogni istanza positiva. Così si ha P ç U P ç N P, ma non è chiaro se P = U P né se l'uguaglianza P = U P implica P = N P. La condizione di unicità che U P richiede va sostanzialmente a tradurre la proprietà di invertibilità che una funzione a senso unico F possiede, il fatto cioè che ogni sua immagine proviene da un unico elemento del dominio.

1.6 Teoria dei Numeri e Crittografia C'è però un'altra copiosa fonte di ispirazione per le funzioni a senso unico; per stupefacente che possa sembrare, essa è la Teoria dei Numeri naturali, quegli apparentemente innocui numeri 0, 1, 2, ... con cui siamo abituati a contare fin da bambini. Infatti, a dispetto della loro presunta semplicità, i naturali racchiudono alcuni dei misteri più profondi ed affascinanti della Matematica, e gli enigmi che ne derivano si rilevano una buona fonte per la crittografia moderna. Anche il cripto sistema oggi più comune, quello chiamato RSA, nasce

1.6 Teoria dei Numeri e Crittografia

25

in questo ambito. Infatti RSA si basa sostanzialmente sulla differenza che attualmente si rileva tra i tempi di soluzione di due famosi problemi sui naturali, già ricordati nel precedente paragrafo: a) riconoscere i numeri primi, b) decomporre un numero composto nei suoi fattori primi. Infatti di a) si sa che appartiene a P ed invece di b) si congettura che sia N Pintermedio: comunque sta in N P e non è nota alcuna procedura classica che lo sappia risolvere in tempo rapido. Comunque, prima di introdurre RSA ed altri analoghi protocolli crittografici, varrà la pena di prendere maggiore confidenza con primi e composti. Questo sarà l'argomento del prossimo capitolo.

Esercizi 1.6.1 1. Si faccia riferimento all'alfabeto inglese e alla tabella 1.1 di traduzione di lettere in numeri interi, e si assuma che lo spazio vuoto corrisponda al 27. Si cifri il messaggio "appuntamento alle otto" tramite la funzione f che ad ogni numero intero x (quindi ad ogni lettera) associa l'intero 4x + 3 (mod27). 2. Si decifri il messaggio "7 2 18 31 9" sapendo che è stato criptato, numero per numero, usando la funzione f(x) = lOx + 5 (mod33). 3. Si cifri il messaggio composto dai quattro digrafi "(12,28)

(21,3)

(6,14)

(30,26)"

attraverso la funzione di codifica

f

(x) y

= (

6x

+ 4y + 1 ) (mod31). -x + 5y +-2

Si trovi poi la funzione di decodifica l' di f. La si applichi al messaggio cifrato e si verifichi che tramite essa si riottengono i digrafi originali. 4. Blaise de Vigenère scrive alla sua amica inglese per darle appuntamento "Ci vediamo a mezzanotte al castello". Per non insospettire il marito dell'amica, Vigenère cripta il messaggio col suo cifrario, usando la parola chiave Blaise: quale è il messaggio cifrato? (Ammettiamo che Vigenère adoperi l'alfabeto della lingua inglese, con un ulteriore simbolo per lo spazio vuoto). 5. James Bond ha scoperto che il segreto di Goldfinger è 1001101010111, e vuole informare Londra. Per sicurezza, usa il cifrario di Vernam. ma Goldfinger intercetta il messaggio cifrato, e legge 0101010110110: che parola chiave ha usato 007?

26

1 Dalla Crittografia ai Numeri

Riferimenti bibliografici [68] propone una storia della crittografia accattivante e facilmente accessibile, [27] la espone in modo più rigoroso; ad esempio vi si possono trovare maggiori dettagli sul cifrario di Vernam. Anche la Teoria di Shannon è esposta sinteticamente in [27]. Molti ottimi testi introducono la teoria della computabilità e della complessità computazionale, discutendo in dettaglio il problema p = NP: citiamo [13], [30], [43], [51], [69]. Si veda anche [71]. Una presentazione dei problemi del millennio e dunque in particolare di P = N P è in

[20].

2

Primi e Composti

2.1 Divisori, resti e quozienti Come già anticipato, consideriamo in questo capitolo l'insieme N dei naturali O, 1, 2, ... , talora eventualmente allargato all'insieme Z di tutti gli interi O, ±1, ±2, .... Assumiamo una minima dimestichezza con questi insiemi numerici e con le usuali operazioni +, . e relazioni :S che li riguardano, quale si può dedurre dai testi menzionati nei riferimenti bibliografici a fine capitolo. In particolare, supponiamo noti il principio di induzione, il principio di induzione completa e il principio del minimo. Trattiamo comunque in dettaglio alcuni argomenti specifici che ci riguarderanno nel seguito del libro. Ci interessano in particolare l'operazione di divisione, non sempre possibile né tra i naturali né tra gli interi, e la conseguente relazione binaria di divisibilità ''l'': per a, b naturali, si dice che b divide a, o anche che a è divisibile per b (o multiplo di b), e si scrive b I a quando esiste qualche naturale q per cui a = b· q. Analoga definizione si dà per gli interi. Si verifica facilmente che ogni naturale è divisibile per 1 e per se stesso e divide O (esercizio). Viceversa, l'unico naturale divisibile per O è lo stesso O. La relazione di divisibilità è una relazione di ordine parziale e non totale tra i naturali; tra gli interi, invece, anche la proprietà antisimmetrica va persa (ad esempio 2 I -2 e -2 I 2, ma 2 :I -2). Il controllo di queste proprietà è un esercizio relativamente semplice. Come detto, anche escludendo il caso eccezionale b = O, la divisibilità non sempre è assicurata per coppie di naturali (ad esempio 2 divide 4, ma non 3), ed il miglior risultato che possiamo citare a questo riguardo è quello ben noto che segue. Teorema 2.1.1 (del quoziente e del resto) Siano a e b naturali, b:l O. Allora esistono due naturali q e r unici tali che a = b . q + r e r < b.

Con le opportune modifiche il teorema si estende anche agli interi (dove occorre chiedere O :S r < Ibl invece che r < b); q si dice il quoziente, e r il resto della divisione di a per b. Si ha che b divide a esattamente quando il resto r

28

2 Primi e Composti

della loro divisione è O. Ricordiamo adesso la definizione di massimo comune divisore e minimo comune multiplo (tra i naturali). Definizione 2.1.2 Siano a e b due naturali non entrambi nulli. Un naturale d si dice massimo comune divisore di a e b se: (i) d divide tanto a quanto b, (ii) ogni altro divisore comune di a e b è

:S

d.

Si noti che esiste almeno un divisore comune di a e b, ed è 1. Inoltre, per a f::- 0, i divisori di a devono essere tutti :S a, ed altrettanto vale per b quando b f::- o. Ne segue che, se almeno uno dei due elementi a, b è diverso da 0, l'insieme dei loro divisori comuni è, oltre che non vuoto, anche finito, e quindi ha massimo. In conclusione, il massimo comune divisore di a e b esiste, ed è ovviamente unico. Possiamo allora denotarlo con uno specifico simbolo, ad esempio (a, b). Ci chiediamo adesso come calcolarlo nella pratica: la definizione non pare infatti utile in questa prospettiva. In certi casi, la computazione del massimo comune divisore è comunque facile e diretta. Esempio 2.1.3 Se b I a (in particolare se a = O), il massimo comune divisore di a e b non può che essere b (che è il massimo tra i suoi divisori, e dunque anche tra quelli comuni con a). Allo stesso modo si procede se a I b.

In tutti gli altri casi, dunque anche per a, b f::- 0, la seguente osservazione può risultare utile. Osservazione 2.1.4 Siano a e b due naturali, a, b f::- 0, a 2: b. Dividiamo a per b ottenendo quoziente qo e resto ro:

a = b . qo

+ ro,

ro

< b.

Allora (a, b) = (b, ro). Infatti i divisori comuni di a e b dividono anche ro = a - bqo e, viceversa, i divisori comuni di b e ro dividono anche a = bqo + ro. Così il massimo tra i primi coincide con il massimo tra i secondi. L'utilità della precedente osservazione nella ricerca del massimo comune divisore tra a e b è facilmente comprensibile: siccome ro < b :S a, dovrebbe risultare più semplice, almeno in linea di principio, computare (b, ro) invece che (a, b). In effetti un algoritmo rapido di calcolo del massimo comune divisore può essere organizzato su questo fondamento, nel modo che segue. Algoritmo euclideo delle divisioni successive. Supponiamo che a e b siano, come detto, due naturali non nulli e che a 2: b. Dividiamo a per b ottenendo a = bqo

+ ro,

ro

< b.

2.1 Divisori, resti e quozienti

29

Se ro = 0, allora b divide a e il massimo comune divisore cercato è, appunto, b. Altrimenti possiamo dividere b per ro e calcolare i relativi quoziente e resto

Di nuovo, se rl = 0, allora possiamo dedurre ro I be ro = (b, ro). Ma (a, b) = (b, ro), dunque (a, b) = ro. Altrimenti proseguiamo dividendo stavolta ro per rl. Il procedimento ha comunque termine dopo un numero finito s di passi: infatti il principio del minimo esclude l'esistenza di una successione strettamente decrescente infinita di naturali

Al passo s, si avrà dunque

e, conseguentemente, (a, b)

=

(b, ro)

=

(ro, rd

= ... =

(rs -2, rs-d

= rs-l·

In altre parole, l'ultimo resto non nullo determinato dal procedimento è anche il massimo comune divisore di a e b. Il metodo appena descritto si chiama algoritmo euclideo perché era già noto agli antichi Greci e, in particolare, ad Euclide. A dispetto della sua età, è usato ancor oggi per la sua semplicità e per la sua ragionevole rapidità (secondo i criteri della tesi di Edmonds-Cook-Karp riferita nel primo capitolo). Naturalmente, per apprezzare pienamente questo suo ultimo merito, dobbiamo prima chiarire in che forma intendiamo scrivere i numeri naturali e conseguentemente valutare la loro lunghezza come possibili input; dobbiamo poi precisare in che modo conveniamo di misurare i tempi delle computazioni che li riguardano. Di tutto questo parleremo brevemente nel prossimo paragrafo. Per il momento ci limitiamo a dire che l'algoritmo delle divisioni successive lavora in un tempo al più quadratico (e cioè limitato da un polinomio di grado 2) rispetto alla lunghezza degli input e quindi è ragionevolmente rapido rispetto ai moderni parametri di efficienza.

Esercizio 2.1.5 Si determini attraverso l'algoritmo euclideo delle divisioni successive il massimo comun divisore di • •

343 e 1421; 1650 e 8712.

Tornando al massimo comune divisore, sarà opportuno ricordare:

Teorema 2.1.6 (Identità di Bézout) Siano a e b due naturali non entrambi nulli. Allora ci sono due interi x e y tali che (a, b) = ax

+ by.

30

2 Primi e Composti

È da notare che uno tra x e y può anche essere negativo. Va poi sottolineato che valori opportuni di x e y si possono trovare esplicitamente e velocemente usando ancora l'algoritmo delle divisioni successive, ed anzi impiegando tempo al più quadratico rispetto alla lunghezza di a e b. Infatti, se a = O, allora (a, b) = b = a . O + b . 1, cioè possiamo scegliere x = O e y = 1. Il caso b = O si tratta in ruolo analogo. Se poi a, b # O, allora possiamo fare riferimento, appunto, all'algoritmo euclideo e al numero s dei suoi passi. Lavoriamo infatti per induzione su s. Se s = O, si ha di nuovo (a, b) = b = a· O + b· 1. Sia allora s > o. Per induzione, esistono due interi Xl e yl tali che il massimo comune divisore (b, ro) (che richiede all'algoritmo euclideo s - 1 passi) si esprime come b· Xl + ro . yl; inoltre Xl e yl possono essere trovati esplicitamente. Ma sappiamo che (b, ro) coincide proprio con (a, b); sfruttando allora ro = a - bqo, si deduce (a, b) = bX'

+ (a -

bqO)Y' = ayl

+ b(X' -

qoyl),

dunque in particolare x = yl e y = Xl - qoyl. È facile poi controllare che il calcolo di x e y a partire da a e b richiede sostanzialmente gli stessi tempi dell'algoritmo euclideo e quindi è al più quadratico rispetto alla lunghezza di a e b. L'identità di Bézout ha varie interessanti conseguenze. Ad esempio implica: Corollario 2.1.7 Siano a, b, c naturali non nulli tali che a I bc. Se (a, b) allora a I c. Invece non è vero in generale che, se a I bc, allora a esempio, 4 I 2 . 6 = 12, ma 4 non divide né 2 né 6. Dimostrazione. Sia q un naturale tale che aq ax + by per opportuni interi x e y. Così c

dove cx

= bc.

I b oppure

Ricordiamo 1

a

I c.

= 1, Ad

= (a, b) =

= c . 1 = c . (ax + by) = cax + cby = cax + qay = a . (cx + by)

+ by è ovviamente naturale.

Segue a I c.

D

A proposito, ricordiamo che due naturali non nulli a e b che hanno massimo comune divisore 1 si dicono primi tra loro. Parliamo adesso del minimo comune multiplo di due naturali. Definizione 2.1.8 Siano a, b due naturali non nulli. Un naturale m si dice minimo comune multiplo di a e b se m # O e

(i) m è multiplo tanto di a quanto di b, (ii) ogni altro multiplo comune n

# O di a

e b è 2: m.

Il motivo per cui O è stavolta brutalmente escluso dalla trattazione è facile da capire: in effetti O è, ovviamente, il minimo multiplo di ogni naturale e comunque l'unico multiplo di se stesso. Supponiamo dunque a e b diversi da O:

2.2 Una parentesi computazionale

31

c'è almeno un multiplo comune a· b di a e b e, di conseguenza, per il principio del minimo, c'è un minimo comune multiplo (# O) di a e b, ovviamente unico. Possiamo convenire di rappresentarlo [a, b]. Quanto a calcolarlo esplicitamente, il successivo paragrafo 2.3 ci mostrerà che, per ogni scelta di a e b non nulli, a . b = (a, b) . [a, b], il che riduce la computazione di [a, b] a quella già considerata di (a, b): l'uso dell'algoritmo euclideo, seguito da una moltiplicazione e una divisione determina a·b

[a, b] = (a, b) .

2.2 Una parentesi computazionale Come anticipato poche righe fa dedichiamo questo paragrafo a descrivere a) come si rappresentano i numeri naturali e quindi come si misura la loro lunghezza, b) come si valutano i tempi delle computazioni sui numeri naturali. Potremo così apprezzare pienamente l'efficienza degli algoritmi sui naturali, come quello, già trattato, per la ricerca del massimo comune divisore, confrontando, appunto, tempi di computazione e lunghezza dei numeri coinvolti come input. Cominciamo proprio parlando della lunghezza. Sappiamo tutti che un numero naturale viene comunemente scritto in base lO, elencando a partire da destra la cifra delle unità, quella delle decine, quella delle centinaia, quella delle migliaia, e COSI via. Un numero tra 1 e lO (escluso) richiede una sola cifra, una tra lO e 100 = 10 2 (escluso) necessita di due cifre, una tra 100 e 1000 = 103 (escluso) di 3, e via di seguito. Dunque la lunghezza di un numero intero positivo N fa diretto riferimento al suo logaritmo in base lO o meglio alla sua parte intera, che infatti vale • • •

O per numeri fino a lO escluso, 1 per numeri da lO fino a 10 2 escluso, 2 per numeri da 10 2 a 103 escluso

e così via. Il valore preciso della lunghezza di N in base lO è, infatti

lloglONJ

+1

(dove l ...J denota la parte intera). Naturalmente, il riferimento alla base lO nOn è l'unico possibile, ed è ammesso ricorrere ad altre basi, per esempio 2, e rappresentare così i naturali solo COn le cifre O e 1, di modo che 0,1,2,3,4,5,6,7,8,9,10,11,12, ...

32

2 Primi e Composti

diventano rispettivamente 0,1,10,11,100,101,110,111,1000,1001,1010,1011,1100, ... La lunghezza aumenta, ma la regola che la calcola rimane la stessa: infatti la lunghezza di un naturale N in base 2 eguaglia llog2 N J + 1 e dunque è ancora collegata a lOg2 N. Ricordiamo poi la relazione che intercorre tra i logaritmi di N in base 10 e 2: loglO N = loglO 2 ·log2 N. Quindi anche le lunghezze pur diverse di N nelle basi 10, 2 crescono "quasi proporzionalmente" mediante la costante loglO 2. Analoghe considerazioni si possono ripetere a proposito di altre basi 3, 4, 5, e cosi via. Notiamo anche che N = 1Olo91QN = 2lo92N è esponenziale rispetto alla sua lunghezza. Di conseguenza un algoritmo che richiede costo N (o approssimabile a N) su N è da ritenersi poco efficiente: constatazione che sarà bene ricordare in futuro. In genere, la base cui si fa più facilmente riferimento è 2. Le cifre O, 1 che vi ricorrono si chiamano bit. Ad esempio 1001 (cioè il numero in base 2 che corrisponde a 9 in base 10) si compone di 4 bit. Abbiamo così trattato il tema della lunghezza degli input. Adesso dobbiamo considerare il tempo di lavoro di una computazione sui naturali. Possiamo facilmente convenire di identificarlo col numero complessivo di passi da essa svolto prima di concludersi. Ma dobbiamo anche chiarire che cosa intendiamo per passo di computazione nel nostro ambito, quando si trattano naturali N in notazione binaria e si svolgono le varie operazioni di somma, prodotto e cosi via. In genere si conviene che ogni singola operazione sui bit degli input N coinvolti corrisponde ad un passo di computazione. Per esempio si assume che l'addizione 1001 11110

+ =

100111

(ovvero 9+30=39 in base 10) richiede 5 passi per svolgere i calcoli sulle varie colonne. In questa ottica, si può notare che sommare due numeri di k bits richiede al più k passi, ed è dunque al più lineare nella lunghezza k, mentre la moltiplicazione degli stessi numeri si può svolgere in k 2 passi e quindi richiede

2.3 Il Teorema Fondamentale dell'Aritmetica

33

tempo al più quadratico in k. Lo stesso vale per il calcolo del quoziente e del resto, e cioè per la divisione. Illustriamo allora la situazione riferendo ci come esempio al calcolo del massimo comun divisore tramite l'algoritmo di Euclide delle divisioni successive. Vogliamo mostrare che secondo i parametri appena introdotti, questo procedimento richiede tempo al più polinomiale (anzi quadratico) rispetto alla lunghezza dell'input, come già anticipato nel paragrafo precedente. Esempio 2.2.1 Consideriamo dunque due naturali a, b. Possiamo supporre a > b > O per semplicità. I due primi passi dell'algoritmo di Euclide corrispondono alle divisioni

a = b . qo

+ ro

con ro

< b,

qo

~

1,

Ne deduciamo

Così due successive applicazioni dell'algoritmo determinano un resto rl < ~a. Non è difficile osservare che, allo stesso modo, rl > 2r3, dunque a > 2rl > 22r3; in generale, dopo t iter azioni si deduce

a>

2t . r2t-l

(dove r2t-l è il resto ottenuto al passo 2t - 1). Sia s il passo finale dell'algoritmo, quello che produce rs = O e dunque dichiara rs-l = (a, b). Supponiamo per semplicità che s sia pari, dunque s = 2T per T numero naturale, e deduciamo

a>

2T r2T-l.

Siccome r2T-l = rs-l > O, 2~ ~ 1, cioè a ~ 2T e T :S lOg2 a, da cui s :S 2log 2 a. Dunque le varie divisioni successive da svolgere sono 0(lOg2 a). Inoltre i calcoli sui bit dei vari numeri coinvolti in ciascuna divisione si svolgono certamente in tempo O(log~ a) perché riguardano interi al più lunghi quanto a, e anzi possono ridursi a 0(log2 a) con qualche opportuno accorgimento. In conclusione il numero di passi dell'algoritmo euclideo è O(log~ a), quindi al più polinomiale (e anzi quadratico) nella lunghezza dell'input a, e conseguentemente anche in quella di b, visto che b :S a.

2.3 Il Teorema Fondamentale dell' Aritmetica Ricordiamo che un numero naturale N si dice primo se N ~ 2 e gli unici divisori di N sono 1 e N (quelli che N non può evitare). Dunque la sequenza dei numeri primi è

34

2 Primi e Composti

2, 3, 5, 7, 11, 13, 17, 19, 23, 29, ... Può essere utile notare che 2 è l'unico primo pari, anche se l'osservazione non è sorprendente, visto che "pari" significa "divisibile per 2" ed è ovvio che qualunque multiplo di 2 maggiore di 2 ammette un divisore diverso da 1 e da se stesso (2, appunto) e quindi non può essere primo; allo stesso modo si potrebbe sottolineare che 3 è l'unico primo multiplo di 3, 5 l'unico primo multiplo di 5, e così via. Comunque sarà bene ricordare che tutti i primi, eccettuato 2, sono dispari e dunque, in certo qual modo, 2 ha una sua specificità tra i primi: per citare un gioco di parole di Zassenhaus, "2 is the oddest prime", e cioè "2 è il più dispari dei primi" (anche se riesce difficile cogliere in italiano la sfumatura che si ha in inglese nell'aggettivo odd, che può significare tanto dispari quanto eccentrico, bizzarro). Chiamiamo poi un naturale N 2 2 composto quando N non è primo, e cioè quando esistono due naturali a e b minori di N (e quindi maggiori di 1) tali che N = a· b. Il motivo dell'aggettivo composto è ovvio: del resto qualunque numero naturale > 1 (anche non primo) si decompone in modo sostanzialmente unico nel prodotto di fattori primi. Il risultato è tanto importante quanto famoso, e ha un nome altisonante: Teorema 2.3.1 (Teorema Fondamentale dell' Aritmetica) Qualunque naturale N > 1 si decompone in uno e un solo modo (a meno dell'ordine dei fattori) come prodotto di numeri primi. Prima di iniziarne la dimostrazione, sarà bene premettere una considerazione che si collega a quanto osservato nel paragrafo 1, quando si è sottolineato che, se un naturale N è divisore di un prodotto a· b, non è detto che sia divisore di uno dei fattori a e b. Questa conclusione è comunque vera quando N è primo, come adesso proviamo. Lemma 2.3.2 Siano p un primo, a e b due naturali tali che p I a . b. Allora p I a oppure p I b. Dimostrazione. (a, p) è un divisore di p e dunque vale 1 o p perché p è primo. Nel secondo caso, p divide a. Altrimenti possiamo applicare il Corollario 2.1.7 sopra citato e dedurre che p divide b. D Passiamo adesso alla dimostrazione del Teorema Fondamentale dell' Aritmetica. Esistenza della decomposizione. Procediamo per induzione completa su N 2 2. Se N è primo, in particolare se N = 2, la tesi è ovvia. Supponiamo allora N composto (in particolare N > 2). Allora N = a· b per opportuni fattori a e b entrambi minori di N e 2 2. Per l'ipotesi di induzione, tanto a quanto b si scrivono come prodotto di numeri primi. Ma allora altrettanto vale per N.

2.3 Il Teorema Fondamentale dell'Aritmetica

35

Unicità della decomposizione. È da provare che, se N = Po . . ... Pn = qo ..... qm per n e m naturali, Po, ... , Pn, qo, ... , qm primi, allora n = m

e, salvo permutare gli indici, Pi = qi per ogni i :S n. Procediamo nuovamente per induzione completa su N. Se N è primo, la tesi è immediata: deve essere n = m = O, Po = qo = N. Adesso assumiamo N composto. Notiamo che Po divide N = qo ..... qm' Per il Lemma 2.3.2, deve esistere un qualche j :S m tale che Po I qj; salvo riordinare gli indici, possiamo supporre j = O, cioè Po I qo· Anzi, siccome qo è primo e Po > 1, deve essere Po = qo. Consideriamo adesso N - = Pl ..... Pn = ql ..... qm' Po

Siccome N è composto, Po N > 2; inoltre N < N. Possiamo allora applicare Po l'ipotesi di induzione e dedurre n = m e, salvo un riordinamento degli indici, Pl

= ql,

... , Pn

= qn'

D

Vale la pena di sottolineare che il Teorema Fondamentale dell'Aritmetica ed in particolare l'unicità della decomposizione in fattori non ulteriormente riducibili (validi in N e, salvo opportuni aggiustamenti, anche in Z) non si preservano in strutture apparentemente vicine sia ai naturali che agli interi. Questo ribadisce che il teorema è proprietà sostanziale e non banale dei naturali e degli interi. Eccone infatti due controesempi.

Esempi 2.3.3 1. (Hilbert) Consideriamo l'insieme 4N + 1 dei naturali della forma 4n con n E N 1, 5, 9, 13, 17, 21, 25, 29, 33, ...

+1

Esso è chiuso rispetto alla moltiplicazione: per n e m naturali,

(4n

+ 1) . (4m + 1) =

4(4mn + m

+ n) + 1.

Tuttavia è facile controllare che, nel nostro insieme, 693 = 4 . 173 + 1 ha due possibili decomposizioni in fattori irriducibili 693 = 9·77 = 21 . 33. 2. Consideriamo adesso i numeri reali della forma ao + al V15 con ao e al interi. È facile controllare che essi formano un sottoanello del campo reale, usualmente denotato Z[v'i5]. In questo anello 10 ha due possibili decomposizioni 10

= 2·5 =

in fattori irriducibili 2, 5, 5 ±

(5

+ v''i5) . (5 - v'i'5)

V15.

36

2 Primi e Composti

Ritorniamo ai naturali. Il Teorema Fondamentale dell'Aritmetica ci dice che ogni naturale N ~ 2 si scrive in modo unico come N --Poko ..... Pnkn

con Po < ... divisore di N,




2 e, come tale, ammette almeno un divisore primo p. Ma P non può essere né Po, ... , né Pr, altrimenti divide il prodotto Po ..... Pr e dunque anche la differenza N - Po ..... Pr, cioè 1 (il che è assurdo). D In realtà vi sono molte possibili dimostrazioni dell'infinità dei primi: ad esempio il libro di P. Ribenboim The new book oE prime number records ne raccoglie una decina, e ne cita anche altre. Noi ci limitiamo a presentare una seconda prova del teorema, dovuta ad Eulero e dunque successiva ad Euclide di molti secoli: gli strumenti tecnici che vi sono coinvolti sono certamente meno semplici di quelli di Euclide, ma mostrano come metodi di Analisi Matematica possano intervenire fruttuosamente nella ricerca sui primi. Dimostrazione di Eulero. Ricordiamo che ogni primo P è maggiore di 1 e converge dunque soddisfa O < ~ < 1. Dunque la serie geometrica L%:o alla somma l~l. Se q è un altro primo, si deduce allo stesso modo

;k

p

L 00

h=O

1 qh

1

= 1- l· q

Notiamo che le due serie appena considerate sono a termini positivi, dunque il loro prodotto secondo Cauchy è definito ed ha somma

Si noti poi che il prodotto al primo membro è la somma Lm ~ dove m varia tra i naturali non nulli che hanno fattori primi tra P e q. Siano ora per assurdo Po < ... < Pr tutti i primi. Si avrà

38

2 Primi e Composti 1

1

IILIi=II 1_ PJ 00

j"5.r k=O

j"5.r

l

P;

dove il prodotto al primo membro eguaglia Em ~ quando m varia tra i naturali non nulli con fattori primi tra Po, ... , Pr e dunque, in definitiva, tra tutti i naturali non nulli. Ma la serie Em>o ~ diverge, e dunque non può avere una somma finita TIj 2, a un intero primo con N. Se a è un quadrato modulo N, allora a ha almeno due radici quadrate distinte modulo N (suggerimento: sia a == b2 (modN), allora vale anche a == (_b)2 (modN) e si controlla facilmente b =t -b(modN)).

Assumiamo comunque N composto dispari> 2. Ci è utile strumento il Teorema del Resto Cinese: ricordiamone allora velocemente enunciato e dimostrazione. Teorema 3.3.5 Siano No, ... , Nn interi> 1 a due a due primi tra loro. Allora, per ogni scelta di interi bo, ... , bn , esiste un intero x tale che

x == bj (modNj )

per ogni j :::; n

e questa soluzione è unica modulo N se N denota il prodotto ITj::;n N j . Dimostrazione. Per ogni j :::; n poniamo qj = f:,.. Allora (qj, N j ) dunque per la identità di Bézout esistono due interi Sj, tj per cui

e conseguentemente bj = qjsjbj

1, e

+ Njtjbj .

Quindi qjsjbj == bj (mod N j ) per ogni j :::; n. Sia ora x che, fissato j :::; n, N j divide ogni qi per i -::f. j. Così

=

L:i(N), esiste un unico j = 1, ... , 4>(N) per cui bi == ab j (mod N). Moltiplicando al variare di i (e quindi di j) otteniamo (N)

(N)

II bi == II (ab i=l

(N) j )

j=l

==

a(N)

II b

j

(modN).

j=l

Ricordando che i bi sono primi con N, si moltiplica per il prodotto dei loro inversi modulo N e si ottiene, come richiesto, a(N)

== 1 (modN). D

Si noti che, come già il Piccolo Teorema di Fermat nel caso di N primo, così anche il teorema di Eulero permette il calcolo dell'inverso modulo un N arbitrario di interi a primi con N e dunque invertibili modulo N. Tale inverso eguaglia infatti la classe modulo N di a(N)-l. Ma il suo calcolo per questa via è consigliabile solo se disponiamo di procedimenti che computino velocemente la 4>, oltre alle potenze e alle divisioni, ed è da rilevare che non conosciamo ancora algoritmi rapidi per la 4>. Dunque il riferimento alla procedura basata sull'algoritmo euclideo della divisioni successive rimane preferibile.

64

3 Potenze, Radici e Logaritmi

3.7 Campi finiti Prima di proseguire, abbiamo bisogno di richiamare qualche fatto sui campi finiti, quale si può desumere da un corso elementare di Algebra. Tra i campi finiti ci sono, come abbiamo visto poche pagine fa, i campi Zp al variare di p tra i primi. Ma adesso vogliamo ricordare come si descrivono tutti i campi finiti e sottolineare alcune delle loro proprietà. Ecco intanto il teorema che li classifica. Teorema 3.7.1 Per q intero positivo, c'è un campo finito F con q elementi se e solo se q è la potenza di un primo. Inoltre due campi finiti con lo stesso numero di elementi sono tra loro isomorfi. Dunque, per ogni q potenza di primo, esiste a meno di isomorfismi un unico campo di q elementi, che possiamo conseguentemente denotare F q. Ad esempio, per q primo, F q coincide (a meno di isomorfismi) con Zq. Accenniamo adesso brevemente alla dimostrazione del teorema. Maggiori dettagli possono trovarsi, come già detto, nei manuali di Algebra. Dimostrazione. (Cenni) Sia F un campo finito, e sia q il numero dei suoi elementi; OF e lF denotino poi rispettivamente l'elemento nullo e l'elemento unità di F. La prima considerazione da fare riguarda la caratteristica di F car F, che non può essere O (altrimenti F ammette come sotto campo il campo razionale ed è dunque infinito), e quindi è un primo p. In altre parole, il sotto campo minimo di F è proprio Zp (a meno di isomorfismi). F è, allora, uno spazio vettoriale su Zp, finito e dunque di dimensione finita m (con m intero positivo). Ne consegue che il numero q degli elementi di F coincide con la potenza pm di p q =pm.

Infatti ogni elemento di F si scrive in modo unico come combinazione lineare a coefficienti in Zp degli m elementi di una base di F su Zp, il che stabilisce appunto in pm la cardinalità complessiva di F. Consideriamo adesso il gruppo moltiplicativo F* degli elementi f::- OF di F. Ovviamente, F* ha cardinalità q-L Quindi, per la teoria elementare dei gruppi, e segnatamente per il teorema di Lagrange, ogni elemento a E F* soddisfa da cui si deduce uguaglianza che è soddisfatta anche da OF: quindi a q = a per ogni a E F (tra l'altro, si può osservare che, nel caso F = Zp, riscopriamo per questa via il Piccolo Teorema di Fermat). Consideriamo allora il polinomio x q - x E Zp[x]: ha grado q ed i q elementi distinti di F sono sue radici. Dunque F è proprio costituito dalle radici di x q - x, e x q - x si decompone in fattori lineari in F[x]

3.7 Campi finiti xq

-

x =

II (x -

65

a);

aEF

come si usa dire in termini ufficiali, F è il campo di riducibilità completa di x q - x (il minimo ampliamento di Zp in cui il polinomio x q - x si decompone in fattori di primo grado). Viceversa, consideriamo un primo p, un intero positivo m e la potenza q = pm di p; ci domandiamo se esiste un campo F con q elementi. Per cercare di costruirlo, partiamo dal campo Zp con p elementi e dal polino mio x q - x. È un fatto relativamente elementare di Algebra che, a meno di isomorfismi (identici su Zp), esiste uno ed un solo campo che amplia Zp, decompone x q - x in fattori lineari ed è minimo rispetto a queste condizioni (il campo di riducibilità completa di x q - x su Zp, appunto): indichiamolo con K (e denotiamo con OK e lK i suoi elementi nullo e unitario). Notiamo che x q - x ha derivata qx q - l - lK = -lK perché stiamo lavorando in caratteristica p (e dunque q vale O). Conseguentemente x q - x non ha radici multiple (perché le eventuali radici multiple dovrebbero annullare anche la derivata - l K ). Ne consegue che le radici di x q - x in K sono tutte semplici, e dunque sono complessivamente q. Consideriamo a questo punto F = {a E K : aq = a}.

F è un sotto campo di K

perché include OK =

0'k e l K = 1'k ed è chiuso per

±, . e inverso: ricordando che lavoriamo in caratteristica p, si ha infatti, per

a, b in F,

(a-l)q = (aq)-l = a-l. Inoltre F ha esattamente q elementi (le q radici distinte di x q - x, come già osservato). Dunque F è il campo cercato (di più F coincide proprio con K). In conclusione: •

si trova un campo con q elementi se e solo se q è la potenza pm di un primo p;



un campo con q = pm elementi amplia Zp ed è il campo di riducibilità del polinomio x q - x su Zp: come tale, è unico a meno di isomorfismi. D

Esempi 3.7.2 1. Per q = p primo, già sappiamo dal Piccolo Teorema di Fermat che tutti gli elementi di Zp soddisfano il polinomio x P - x in Zp. 2. Il campo F9 con 9 = 32 elementi estende Z3 con tutte e sole le radici di x 9 - x. D'altra parte F9 si può ottenere ampliando direttamente Z3 con una radice v del polinomio irriducibile X2 - x-l E Z3[X]. Infatti l'ampliamento Z3(V) include tutti e soli gli elementi della forma ao + alv

66

3 Potenze, Radici e Logaritmi

COn ao, al E Z3, e ognuno di essi ha un'unica rappresentazione di questo tipo. Si raggiungono così 9 elementi distinti, e si esauriscono i 9 posti a disposizione in F9. Addizione e moltiplicazione di F9 = Z3(V) si descrivono facilmente facendo riferimento a questa rappresentazione. Infatti la somma si calcola componente per componente,

e il prodotto si ottiene sostanzialmente ricordando che v 2 = v + 1: dunque v4

= (v + 1)2 = v 2 + 2v + 1 = 3v + 2 = 2,

v8

= 22 = 1,

v9

= v,

e così via. Si conferma poi che ogni elemento di Z3(V) annulla il polinomio x 9 - x. Infatti, per ogni scelta di ao, al in Z3, ricordando che stiamo lavorando modulo 3 e che per il Piccolo Teorema di Fermat = ai per i = 0, 1, si controlla facilmente

ar

( ao

+ al v ) 9

= ao + al v = ao 9

9 9

+ al v.

Vogliamo adesso mettere in evidenza una proprietà del gruppo moltiplicativo F* di un campo finito F che ci sarà spesso utile nel seguito: il fatto che tutti i suoi elementi si possano ottenere come potenze di unO opportuno di loro. Verifichiamolo anzitutto COn qualche esempio particolare. Esempi 3.7.3 1. Consideriamo F 19 = Z19. I diciotto elementi nOn nulli di F 19 coincidonO COn le potenze di 2. Infatti 2 è primo COn 19 e dal Piccolo Teorema di Fermat segue anzitutto 218 == 1 (mod 19) e dunque che il periodo moltiplicativo di 2 modulo 19 divide 18. D'altra parte

26 == 7 t'- 1 (mod 19),

29 == -1

t'- 1 (mod 19)

e quindi il periodo di 2 non può essere un divisore proprio di 18, e quindi deve coincidere con 18: in altre parole, ci sono 18 potenze distinte di 2 modulo 19, ed esse esauriscono i 18 elementi non nulli di F 19 . 2. Consideriamo adesso il campo F9 appena studiato negli Esempi 3.7.2. Si vede facilmente che v genera tutti gli elementi nOn nulli di F 9 come sue potenze. Infatti abbiamo già osservato

dunque v ha periodo 8 nel gruppo moltiplicativo di

F9.

Adesso enunciamo con precisione e dimostriamo la proprietà appena confermata dagli esempi. Teorema 3.7.4 Un sottogruppo finito G del gruppo moltiplicativo F* di un campo F è sempre ciclico. In particolare, se F è finito, allora F* è ciclico.

3.7 Campi finiti

67

Dimostrazione. Sia N il numero degli elementi di G. Allora ogni elemento di G ha periodo che divide N. Per ogni divisore d di N, sia 'lj;(d) il numero degli elementi di G di periodo esattamente d. Segue che

L'lj;(d) = N, dlN eguaglianza che richiama la proprietà della cjJ di Eulero affermata dal Teorema 3.6.5, e cioè LcjJ(d) = N. dlN Confrontiamo allora 'lj;(d) e cjJ(d) per ogni d. Sia 'lj;(d) > O e sia 9 un elemento di G di periodo d. Consideriamo le potenze distinte 1 = gO, g, ... , gd-l di g: tutte soddisfano in F il polinomio x d - 1. D'altra parte nel campo F un polinomio di grado d, come x d - 1, non può avere più di d radici. Quindi le d potenze distinte di 9 esauriscono tutte le possibili radici in F di x d - 1, cioè tutti gli elementi di F che hanno periodo divisibile per d. In particolare, gli elementi di F* di periodo d sono tra queste potenze, e per la precisione vanno a coincidere con quelle della forma gk per (k, d) = 1 (come il lettore può controllare per esercizio). In conclusione gli elementi di periodo d in F* sono tanti quanti i numeri compresi tra 1 e d e primi con d, cioè cjJ(d). Tutti questi elementi, in quanto potenze di g, sono in G e quindi esauriscono gli elementi di periodo d di G: ne segue

'lj;(d) = cjJ(d). Ricapitolando si ha

L'lj;(d) = N = L cjJ(d) , dlN dlN 'lj;(d) = cjJ(d), per ogni d I N con 'lj;(d)

-I- O;

ma questo chiaramente implica

'lj;(d)

-I- O per ogni d I N.

Così G ha elementi di periodo d per ogni d. In particolare 'lj;(N) > O e G ha elementi di periodo N, capaci cioè di generarlo: quindi G è ciclico. D Un risultato analogo al precedente, ugualmente utile nel seguito, è Teorema 3.7.5 Per ogni primo p, il gruppo moltiplicativo degli elementi invertibili di Zp2 è ciclico.

Lasciamo la dimostrazione al lettore per esercizio, richiamando ancora la sua attenzione sul fatto che l'anello Zp2 delle classi di resti modulo p2 non è un campo, meno che mai coincide con F p2 (suggerimento: per p = 2, la tesi è ovvia perché il gruppo moltiplicativo degli elementi invertibili di Z4 ha ordine

68

3 Potenze, Radici e Logaritmi

2. Per p> 2, si consideri un intero 9 che genera 1',,; modulo p; si controlli che + 1) . 9 genera modulo p2 il gruppo moltiplicativo degli elementi invertibili di Z p 2).

9 oppure (p

Esercizio. Si provi che il gruppo moltiplicativo degli elementi invertibili di 1',,8 = 1',,23 non è ciclico (suggerimento: gli elementi del gruppo sono 1,3,5,7 e 12 == 32 == 52 == 72 == 1 (mod8)).

3.8 Logaritmi discreti Sia F un campo finito (di cardinalità q). Si è detto che, per un'opportuna scelta di 9 E F*, gli elementi di F* vanno a coincidere con le potenze di g: per ogni a E F*, esiste x E 1'" tale che a = gX; e si può anzi assumere O :S x < q -1, x è infatti definito a meno di congruenze modulo il periodo di g, e cioè modulo la cardinalità di F*. Si dice in questo caso che x è il logaritmo discreto di a in base g. Infatti la situazione richiama quella degli usuali logaritmi dei numeri reali positivi (rispetto a qualche base reale positiva 9 :I 1): anche nel nostro ambito x è l'esponente da assegnare a 9 per ottenere a. L'aggettivo "discreto" sta a sottolineare solo il contesto diverso in cui stiamo adesso lavorando, quello degli interi o comunque dei campi finiti. Esempi 3.8.1 1. Sia F = Z19. Sappiamo già dall'Esempio 1 in 3.7.3 che 9 = 2 genera F*. Sia poi a = 7. Allora il logaritmo discreto di a = 7 in base 2 è 6, infatti 2 6 == 7(modI9). 2. Sia ora F = F g il campo introdotto nell'Esempio 2 di 3.7.2 come ampliamento di 1',,3 tramite una radice v del polinomio irriducibile X2 - x - I E Z3[X]. Sappiamo già che v genera F*. Inoltre il logaritmo discreto di -1 in base v è 4, infatti v 4 = 2 = -1 in F.

Fissati F e g, si pone in generale il problema di calcolare, per ogni a E F*, il logaritmo discreto di a in base g. Procedere per tentativi, calcolare cioè gX per ogni x finchè non si trova a, è procedimento elementare che può richiedere tempi proibitivi quando q è "grande". D'altra parte bisogna prendere atto che non si conoscono attualmente metodi ragionevolmente rapidi di calcolo del logaritmo discreto. Avremo modo di riparlarne.

3.9 I simboli di Legendre e di Jacobi Torniamo al problema di identificare i quadrati e estrarne le radici. Nei campi infiniti più familiari, quello razionale ij, o quello reale OC, o quello complesso

3.9 I simboli di Legendre e di Jacobi

69

C, la situazione che si registra è assai disomogenea. In tutti i casi O è un quadrato (solo di se stesso). Ma per valori a :I O ciascuno dei tre campi ha sua specifiche proprietà: • • •

in C ogni a :I O è un quadrato e ammette esattamente due radici, in ffi. la cosa accade se e solo se a > O, in ij, finalmente, la situazione è assai più ingarbugliata.

Vediamo allora che cosa succede modulo un primo p, e cioè nel campo finito Zp. Il caso p = 2 si tratta facilmente: ambedue le classi O2 e b sono quadrati (di se stesse). Dunque supponiamo p dispari. Op è ancora un quadrato (di se stesso e solo di se stesso). Escludiamo dunque Op, e quindi tutti gli interi a == O(modp), dalle nostre indagini e consideriamo valori di a primi con p. Definizione 3.9.1 Un intero a primo con p si dice

• •

un residuo quadratico modulo p se a è un quadrato modulo p, cioè un intero b tale che a == b2 (mod p), un non residuo quadratico modulo p altrimenti.

se

esiste

Notiamo subito che la proprietà di essere residuo o non residuo quadratico modulo p si trasmette da a a tutti gli interi congrui ad a modulo p: dipende quindi dalla classe di congruenza ap e non direttamente da a. Ricordiamo poi che un residuo quadratico ha esattamente due radici quadrate modulo p. Esempi 3.9.2

== 1 (mod3), 22 == 1 (mod3). Segue che 1 è residuo quadratico modulo 3, e 2 non lo è. Quindi i 2 elementi non nulli di 1. 3 si suddividono a metà: uno ha radice quadrata, uno no. 2. Consideriamo adesso p = 5. Si verifica 12 == 42 == 1 (mod 5) e 22 == 32 == 4 (mod5). Così 1 e 4 sono residui quadratici modulo 5, 2 e 3 no. Nuovamente, i 4 elementi non nulli di 1. 5 si dividono a metà: due ammettono una radice quadrata, due no. 3. Sia p = 11. Si verifica nuovamente che, tra le dieci classi di resti modulo 11 diverse da O, ce ne sono 5 che corrispondono a residui quadratici (per la precisione 1, 4, 9,16 == 5 (modll) e 25 == 3(modll)) e 5 che non corrispondono a residui quadratici (2, 6, 7, 8, lO). l. Sia p = 3. Si nota 12

C'è un argomento generale che conferma quanto suggerito dai tre esempi precedenti. Consideriamo infatti il campo F = Zp con p primo. Ricordiamo che il gruppo moltiplicativo F* è ciclico, e scegliamo un intero positivo g tale che la classe gp genera F* modulo p: così g ha periodo moltiplicativo p-l modulo p e gli interi 1, g, ... , gP-2 determinano tutte le classi non nulle di resti modulo p. Notiamo allora che, per ogni j < p-l, gj è residuo quadratico modulo p se e solo se j è pari.

70

3 Potenze, Radici e Logaritmi

Infatti, supponiamo che gj sia residuo quadratico modulo p, allora esiste un naturale i < p - 1 per cui gj == g2i (mod p). Ricordando che 9 ha periodo moltiplicativo p - 1 modulo p, deduciamo j == 2i (mod (p - 1)). Ma 2i è pari, ed anche p - 1 è pari, dunque j deve essere pari. Il contrario è ovvio. Si ha dunque, come preannunciato dagli esempi: Teorema 3.9.3 Sia p un primo dispari. Allora tra le p - 1 classi di resti modulo p di interi primi con p, P;l corrispondono a residui quadratici modulo p e P;l no. Del resto, la proprietà si può provare più direttamente ricordando che: •

ogni intero b (primo o no con p) ha il suo quadrato modulo p,



uno stesso quadrato ammette esattamente due radici quadrate distinte ±b modulo p.

Così le p - 1 classi di congruenza di interi primi con p si ripartiscono modulo p in coppie con ugual quadrato e determinano quadrati. Quindi abbiamo

P;l

a meno di congruenze P;l residui quadratici modulo p, P;l non residui quadratici modulo p. Per ogni intero a, il simbolo di Legendre (~) di a rispetto a p stabilisce a quale dei casi a corrisponde; infatti si pone: •

( ~ ) = O se p divide a;



( ~ ) = 1 se a è primo con p e a è residuo quadratico modulo p;



( ~) = -1 se a è primo con p ma a è un non residuo quadratico modulo

p. Il nostro obiettivo è, allora, quello di calcolare (possibilmente in modo rapido) il simbolo di Legendre (~ ) per ogni intero a. Una prima utile osservazione è la seguente. Osservazione 3.9.4 Se a e al sono congrui modulo p, allora ( ~ ) = ( ~ ). Infatti sappiamo che la proprietà di essere residuo o non residuo quadratico modulo p, e dunque (~), dipendono da ap e non direttamente da a. In particolare, per ogni a, se r denota il resto della divisione di a per p, allora (~) = (~). Quindi, salvo dividere a per p e sostituirlo con il suo resto, possiamo sempre assumere O :::; a < p. Ulteriori proprietà del simbolo di Legendre si deducono dal seguente risultato provato da Eulero. Teorema 3.9.5 (Eulero) Sia p un primo dispari. Allora, per ogni intero a,

(Pa) == a-

p-l

2-

(modp).

3.9 I simboli di Legendre e di Jacobi

71

Dimostrazione. Se p divide a, la tesi è ovvia, infatti (~) = O e a p;-l == O(modp). Supponiamo allora che a sia primo con p. Per il Piccolo Teorema di Fermat (a P;-I)2 == a P - 1 == 1 (modp)

e dunque, visto che p è primo, aP;-1 == ±1 (modp). Ma anche (~) vale ±1 in questo caso, così ci basta provare che, per a primo con p,

(~)

=1

p-l

== 1 (modp).

a-2-

{:}

Fissiamo un intero g che genera Z; modulo p. Sia j

< p-l tale che a

gj (modp). Allora si ha che (~) = 1 se e solo se j è pari, condizione che

equivale a dire che p-l divide j . aP;-1 == 1 (modp) , come richiesto.

P;l,

o anche gj.P;-1

== 1 (modp), cioè D

Il teorema di Eulero stabilisce quindi una proprietà dei numeri primi che ci sarà utile ricordare. Ma quel che più ci preme sottolineare adesso sono le sue conseguenze per il calcolo del simbolo di Legendre. Osservazione 3.9.6 Il simbolo di Legendre preserva il prodotto: per ogni scelta di interi a e b,

(a; b) .

.

(~) (~) Infatti dal Teorema di Eulero deduciamo

(pa) . (b)p == a-2-

p-l

Ma p > 2 e (~), (~) e appunto,

p-l 2. b-

(a;b)

p-l == (a· b)-2==

(a.b) P (modp).

assumono i soli valori O, 1 e -1. Ne segue,

(a; b) .

.

(~) (~)

Conseguentemente, per il calcolo del simbolo di Legendre ( !f; ) di un qualche intero N 2 2, possiamo procedere decomponendo N come prodotto di potenze di fattori primi distinti N = q~;

II j 2 diverso da n,

(:) = (_I)n2"'~2" (:). Esercizio 3.9.11 Il lettore può provarsi a verificare 1, 2, 3 e 4 sulla base delle analoghe proprietà per n, m primi. Le precedenti osservazioni ci permettono di elaborare un procedimento di calcolo rapido del simbolo di Jacobi ( ~ ) e dunque, in particolare, del simbolo di Legendre. La strategia da seguire consiste dei passi di seguito descritti. Ci riferiamo alle proprietà 1, 2, 3 e 4 appena enunciate.



Per la proprietà 1, salvo dividere N per n e sostituire N con il suo resto in questa divisione, possiamo supporre N < n. Sfruttando le proprietà 2 e 3 ci si riduce al caso in cui N è dispari. Infatti si estrae anzitutto la massima potenza di 2 che divide N ottenendo N = 2h m con m dispari; usando la proprietà 2, si scrive (~) = (~) h . (~ ); usando la



3, si calcola poi (~) h (per h dispari, perché per h pari (~) h è forzatamente 1); ci si riporta così a (~) con m dispari. A questo punto, con la Legge di Reciprocità Quadratica (cioè con 4), riduciamo il calcolo di ( ~ ) a quello di ( ;:; ), dove n> m (e dunque si può dividere n per m ricominciando il procedimento con valori più bassi).



Illustriamo l'algoritmo appena descritto con un esempio. Esempio 3.9.12 Ammettiamo di dover calcolare ( 1A213 ). Anzitutto si sostituisce 1123 con il suo resto nella divisione per 151, cioè 66, e si passa a calcolare 66

(1 51)

=

(1~1) . (13531) .

Siccome 151 == -1 (mod8), si ha dalla proprietà 3 che riduce al calcolo di (13531)' D'altra parte

( ~) 151

=

(1;1) = 1, dunque ci si

(151) 33

perché 33 == 1 (mod 4). Passando ai resti delle opportune di visioni si ottiene prima (~~), che eguaglia (i~) sempre perché 33 == 1 (mod4), e successivamente (~~) = Ug) . Ug)· Ma C2g) = -1 perché 19 'l'- ±1 (mod8), e quindi ci si riporta a

- (179) = C:)

perché né 7 né 19 sono == 1 (mod4). Di nuovo passando al resto nella divisione per 7 e procedendo poi come sopra, si conclude

C:)

(~) (~) (~) =-1.

76

3 Potenze, Radici e Logaritmi

Il metodo descritto evita così il ricorso obbligato alla fattorizzazione di N per calcolare ( z;f ). In particolare, estrarre al secondo passo la massima potenza di 2 che divide N è assai più semplice che decomporre N in tutti i suoi fattori primi. Anzi, si può verificare che il procedimento appena illustrato lavora in un numero di passi 0(log2 N), e dunque in tempo polinomiale (= rapido) rispetto alla lunghezza dell'input N.

3.10 La Legge di Reciprocità Quadratica di Gauss Come promesso, proviamo qui i due teoremi fondamentali enunciati nello scorso paragrafo, e cioè: a) se p è un primo dispari,

O) = (_1(2

8-

1

;

b) la Legge di Reciprocità Quadratica di Gauss: se p f::- q sono due primi dispari, (;) = (_1)P;1.Q;1 (~). Il lettore che non è interessato ai loro dettagli può procedere direttamente al paragrafo successivo. Ci servono alcune ulteriori premesse sui campi finiti. In un campo finito F (e più in generale in ogni campo) ci sono sempre 2 radici quadrate dell'unità ±1F, che coincidono se e solo se F estende Z2. Infatti un polinomio di grado 2, come x2 - 1F, ammette al massimo 2 radici in F, e d'altra parte (±1 F )2 = 1F ; in caratteristica 2, poi, X2 - 1F = (x - 1F)2. Allo stesso modo, per ogni r 2 2, le radici r-me di 1F in F, e cioè le radici del polinomio x T - 1F , sono al più r e includono 1F . Inoltre si verifica facilmente che queste radici formano un sottogruppo del gruppo moltiplicativo F*: infatti, per a, b E F*, aT = bT = 1F implica (a· bt = aT . bT = 1F. Il Teorema 3.7.4 ci dice che questo sottogruppo è, come F*, ciclico, c'è dunque un suo elemento opportuno che genera tutti gli altri come sue potenze. Ci interessa comunque sapere per quali valori di r ci sono esattamente r radici r-me dell'unità in F. A questo proposito osserviamo anzitutto che si ha: Proposizione 3.10.1 Sia d = (r, radici r-me dell'unità.

IFI- 1).

Allora F contiene esattamente d

Dimostrazione. Sia q il numero degli elementi di F; ricordiamo che q = pm è una potenza di un primo p. Sia poi 9 un generatore del gruppo ciclico F*. Allora gli elementi di F* sono esattamente le potenze gj di 9 per O :S j < q e 9 ha periodo moltiplicativo q-L Ci chiediamo quali di queste potenze gj sono radici r-me dell'unità: a questo proposito osserviamo che, per j < q, gj

se e solo se

è radice r-ma dell'unità (e cioè

gjT

= 1F

)

3.10 La Legge di Reciprocità Quadratica di Gauss

77

q-l divide jr (in altre parole jr == O(mod (q - 1)). D'altra parte, posto d

= (r, q-l),

jr==O(mod(q-1)) Siccome ~ e

qd 1

se e solo se

.r q-l J d == O (mod -d-).

sono primi tra loro, si deduce che, per O :S j < q,

gj è radice r-ma dell'unità se e solo se j è multiplo di

qd 1 ,

dunque per d valori di j. In conclusione, ci sono d = (r, q-l) radici r-me dell'unità in F. D Corollario 3.10.2 Siano radici r-me dell'unità.

Wl ==

Dimostrazione. Quando d=r.

Wl == 1 (modr),

1 (modr). Allora F contiene esattamente r

cioè quando r divide

Wl-l, si ha D

Esempi 3.10.3

1. Per r = 2, ritroviamo la conferma che un campo che non estende Z2, e quindi ha un numero dispari di elementi, contiene esattamente 2 radici quadrate dell'unità. 2. Sia Wl = pr-l con r primo e (p, r) = 1. Dal Piccolo Teorema di Fermat Wl == 1 (modr). Dal precedente corollario, F ha r radici r-me dell'unità. Supponiamo adesso che F abbia esattamente r radici r-me dell'unità. Chiameremo in questo caso radice primitiva r-ma dell'unità in F un generatore del loro gruppo, cioè una radice r-ma dell'unità che ha periodo proprio r, cioè ancora un elemento 'fJ E F tale che le radici r-me di 1F in F sono esattamente 1 =I 'fJ =I 'fJ2 =I ... =I 'fJr-l. Passiamo finalmente alla prova di a) e b). Dimostrazione di a). Siccome p2 == 1 (mod8), segue dal Corollario 3.10.2 che che il campo F = F p2 contiene esattamente 8 radici ottave dell'unità. Fissiamo allora una radice primitiva ottava 'fJ dell'unità in F: dunque 'fJ4 è una radice quadrata dell'unità ed è diversa da 1 (confondiamo qui per semplicità di notazione gli interi e le loro classi di resti modulo p, che sono elementi di F). Ne segue 'fJ4 = -1 (da cui 'fJ5 = -'fJ, 'fJ6 = _'fJ2, 'fJ7 = _'fJ3). Poniamo n 2 _1

ora, per ogni naturale n, f(n) = O se n è pari, f(n) = (-1)-8- altrimenti (notiamo che nel secondo caso, quando n è dispari, n 2 - 1 = (n - 1) . (n + 1) è certamente divisibile per 8, come già abbiamo avuto modo di osservare a proposito di p nello scorso paragrafo, appena dopo l'enunciato del Teorema 3.9.8). È facile vedere che, ad esempio f(l) = f(7) = 1, f(3) = f(5) = -1. Osserviamo poi che, per ogni intero j,

fU) = f(P) . f(P· j).

(3.1)

78

3 Potenze, Radici e Logaritmi

Questo è chiaro se j è pari e quindi anche p . j è pari. Ammettiamo allora che j sia dispari, così che

=

(

p2_ l )

(-1)-8-

2

2 ;2_1

. (-1)P ·-8 =

(

(-1)P

2)

;2~1

che coincide con (-1 f ~ cioè con f (j) perché p è dispari e (-1)P =-1. Vogliamo provare f(P) = (~). Poniamo in F ·2

1

2

L

'Y =

f(j)TJj

05,j 2 e supponiamo che per ogni intero a primo con N (ad esempio per a = 2) valga

possiamo dedurne che N è primo? Oppure esistono anCora "anomalie" come gli pseudoprimi di Carmichael per il Piccolo Teorema di Fermat? La risposta stavolta cambia. Infatti, se tutti gli a interpellati soddisfano (*), allora N deve essere primo. Vale anzi una condizione anCora più forte, che adesso enunciamo e dimostriamo.

104

4 Il Problema della Primalità

Teorema 4.5.3 Sia N un intero positivo composto dispari. Allora per almeno metà di cjJ(N) interi a primi con N, ed a due a due incongrui modulo N, non vale la congruenza

Dimostrazione. Ci basta provare che esiste almeno un intero a primo con N che non soddisfa (*). Supponiamo infatti che questo sia vero, e prendiamo un intero b primo con N per cui si ha invece

(*)

(Nb) =- b-

N-l 2-

(modN).

ab, che rimane primo con Ne torna a rifiutare

Consideriamo allora il prodotto

(*)

N-l (ab)-2-

(ab) N

t

(modN),

altrimenti a

N; l . b N; l=-( ab( ; l=-( ~) =- (~) (~ ) =- (~) . b N; l (mod N)

e, dividendo per b N ; l che è primo con N, si ottiene N-l 2a-

=-

(

Na ) (modN),

il che è assurdo. In questo modo, se bI, ... , bs sono s interi primi con N, a 2 a 2 incongrui modulo N, tutti capaci di soddisfare (*), possiamo ottenere altrettanti interi ab l , ... , ab s ancora primi con N ed incongrui modulo N per i quali però (*) non vale più. In conclusione, su cjJ(N) interi primi con N ed a 2 a 2 incongrui modulo N, almeno la metà non soddisfa (*). Possiamo allora concentrarci a trovare un intero a primo con N per cui (*) non vale. Ricordiamo che N è composto dispari > 2 e dunque è il prodotto di almeno due primi (non necessariamente distinti). Distinguiamo allora due casi nella nostra ricerca.

1. N non è libero da quadrati, e cioè esiste un primo p tale che p2 I N. 2. N è libero da quadrati, e cioè è il prodotto di primi distinti.

Discutiamo anzitutto il Caso 1. Sia pk la massima potenza di p che divide N: dunque k ~ 2. Siccome (N) = ±1, ci basta trovare un qualche intero ± 1 (mod N). Se un tale a non esiste, ogni a primo con N per cui a N; l ±1 (modN) e dunque, quadrando, intero a primo con N soddisfa aN;1 aN - I 1 (modN), in altre parole tutti gli elementi invertibili di ZN hanno

t

=-

=-

4.5 L'Algoritmo di Solovay-Strassen

105

un periodo (moltiplicativo) che divide N -1. D'altra parte il numero di questi elementi, e dunque l'ordine del gruppo moltiplicativo da essi formato, è

ed è quindi multiplo di p perché k - 1 2: 1. A questo punto possiamo ricorrere ad un risultato non banale della Teoria dei Gruppi Finiti (il Teorema di Sylow) e dedurre che tra questi elementi ce n'è qualcuno di periodo p. Da quanto abbiamo detto in precedenza ricaviamo p I N -1. Ma p I N e dunque cadiamo nella contraddizione p I 1. In conclusione a può essere trovato nel Caso 1. Passiamo allora a considerare il Caso 2. Fissiamo N = ITi 2.

1) Se N è una potenza perfetta, dichiariamo N COMPOSTO. 2) Altrimenti, troviamo il più piccolo r < N tale che il periodo (moltiplicativo) di N modulo r è > log~ N e consideriamo il massimo comune divisore tra a e N per a ~ r. Se (a, N) f::- 1 per qualche a, diciamo nuovamente N COMPOSTO. 3) Altrimenti, per a = 1, ... , l..jr log2 NJ, verifichiamo la nostra congruenza (x + a)N == x N + a (mod N, x T - 1). Se qualche a non la soddisfa, dichiariamo N COMPOSTO. 4) In caso contrario, dichiariamo N PRIMO. Infatti 1) 2), 3) negano rispettivamente le condizioni (i), (ii), (iii) del teorema, mentre 4) corrisponde al loro contemporaneo verificarsi. Valutiamo allora il tempo di lavoro di AK S. Vogliamo confermare che il numero dei passi che il procedimento impiega su un dato input N è asintoticamente limitato da una qualche funzione polinomiale della lunghezza di N e dunque di log2 N: se d è il grado di questo polinomio, si scrive, secondo le convenzioni ufficiali di Analisi e Complessità già ricordate nel Capitolo 1, che il tempo di lavoro dell'algoritmo è O(logg N); si afferma invece che il tempo è (logg N) se è O(logg N) a meno di un fattore polinomiale nel logaritmo del logaritmo di N (il che specifica con maggior precisione il numero dei passi necessari alla computazione, ma lo mantiene ad un livello ancora polinomiale rispetto al parametro decisivo, e cioè il logaritmo di N). Ciò premesso ripercorriamo i singoli momenti del procedimento.

o

1) Il primo passo dell'algoritmo controlla se l'intero dispari N si può o no esprimere come potenza Mh con M, h 2 2. Procedimenti rapidi a questo proposito erano noti ben prima di AK S. Infatti non è difficile ammettere che si

4.7 AKS: l'Algoritmo di Agrawal-Kayal-Saxena

117

può anzitutto supporre h :S log2 N (visto che M 2: 2). Dunque il numero dei possibili valori dell'esponente h è limitato polinomialmente dalla lunghezza di N. In questo ambito dobbiamo individuare h in modo tale che N = l N* J. Ma nulla ci garantisce a priori che, per un dato h, il calcolo di N* e la verifica della sua eventuale interezza si possano svolgere in modo rapido (e questo è in effetti il nocciolo della questione). Esistono comunque strategie vincenti a questo proposito. In particolare, c'è una procedura di Bernstein che lavora in tempi O(log~ N) (ed anche inferiori nelle sue implementazioni più efficaci): l'idea è quella di lavorare tramite approssimazioni che accelerino i calcoli senza pregiudicare la correttezza dei risultati. L'algoritmo lavora infatti in partenza su ogni candidato h COn una precisione di 3+ l(~) bits (come è ragionevole, visto che ciò che stiamo cercando è N* = 2109~ N ); h viene scartato se il risultato approssimato non è abbastanza vicino ad un intero; altrimenti si raddoppia la precisione e si controlla nuovamente. In conclusione, la complessità totale di 1) si può ridurre a O(log~ N). 2) Nel secondo passo si fa riferimento al minimo r < N tale che il periodo di N modulo r supera log~ N. È anzitutto da stabilire che un tale r esista davvero. Se sì, sarà da notare che log~ N < r < N, infatti un periodo moltiplicativo modulo r non può eccedere r; così r ha lunghezza che è almeno logaritmica in N ma può arrivare anche ad essere lineare in N; sarà quindi opportuno precisare l'ambito effettivo di questa lunghezza, e magari ridurlo al minimo possibile. Ma rimandiamo il problema dell'esistenza di r e quello della sua lunghezza a più tardi, e assumiamo di sapere che r c'è davvero. Domandiamoci piuttosto quale è il costo per trovarlo. A tale fine dobbiamo considerare tutti i possibili valori s = 1,2,3, ... per r, controllare in ogni caso se Nk =t= 1 (mod s) per ogni k :S log~ N. Per ogni s, la verifica richiede O(log~ N) moltiplicazioni modulo s (quelle necessarie per calcolare N k modulo s al variare di k), seguite dal controllo della relativa congruenza: se ne deduce che il costo di questa fase per un dato s :S r è O(log~ N . lOg2 r). Ma l'analisi va estesa a tutti gli s :S r, e quindi raggiunge un tempo asintotico O(r log~ N). A questo punto si deve computare il massimo comun divisore di a ed N per ogni a :S r. Ma abbiamo già avuto modo di ricordare come il classico algoritmo euclideo delle divisioni successive permette di svolgere questo calcolo in un tempo rapido e specificamente O(log~ N), per ogni dato a. In conclusione, allora, la complessità totale del passo 2 è O(r log~ N). 3) Adesso dobbiamo verificare l y'r log2 NJ congruenze: in ciascuna di esse il grado si può rendere minore di r e i coefficienti hanno lunghezza O(log2 N). Conseguentemente ogni congruenza può essere controllata in O(r log~ N) passi, il che fissa la complessità totale di questo passo in

O(ry'r log~ N) = O(r! log~ N).

118

4 Il Problema della Primalità

Il tempo di 3) supera ovviamente quello dei passi precedenti, e stabilisce conseguentemente la complessità asintotica totale dell'algoritmo in funzione di N e di r. Resta da stabilire l'esistenza di r, e limitare superiormente in modo ottimale la sua lunghezza rispetto a quella di N. A questo proposito, si è già detto che r > log~ N, il che implica che AKS non può lavorare in tempi inferiori a O(log~ N) (infatti r 3 / 2 > log~ N). Agrawal, Kayal, Saxena usano argomenti non banali per provare r = O(log~ N) il che fissa i tempi di lavoro di AK S in O(log~O,5 N). In realtà risultati ancor più profondi di natura analitica di Fouvry permettono di abbassare questo livello fino a O(log~,5 N) perché implicano la possibilità di trovare r vicino a log~ N. In conclusione possiamo comunque affermare: Teorema 4.7.2 Il problema della primalità è in P.

Infatti l'algoritmo AK S riconosce se un intero N 2: 2 è primo o no in tempo O(log~,5 N). Vedremo nel prossimo paragrafo che, in realtà, recenti ulteriori perfezionamenti dell'idea di AK S raggiungono addirittura il livello minimo O(log~ N) sopra accennato. Ma passiamo ora, come promesso, alla dimostrazione del teorema 4.7.1 e della sua caratterizzazione della primalità. Come al solito, il lettore non interessato ai dettagli può passare direttamente oltre, al paragrafo successivo. Notiamo che, in aggiunta agli articoli originali di Agrawal, Kayal, Saxena, ci sono vari lavori espositivi che presentano la prova del teorema. Seguiamo qui uno dei più recenti, quello scritto da Granville per il Bullettin oE American Mathematical Society. La prova è in ogni caso lunga e articolata, usa tuttavia argomenti relativamente elementari. Ne accenniamo le idee fondamentali, lasciando talora per esercizio certi particolari più facilmente accessibili. Dimostrazione del teorema 4.7.1. È evidente che, se N è primo, allora vale (i), così come (ii) per r < N e, finalmente, anche (iii), che segue dal teorema 4.3.4 e dalle considerazioni iniziali di questo paragrafo. Va quindi provato che, viceversa, un N composto viola, per ogni scelta di r, una delle condizioni (i), (ii), o (iii). Assumiamo per assurdo il contrario, supponiamo cioè che un qualche N composto soddisfi (i), (ii) e (iii) insieme a r. Poniamo per semplicità

l=

l Vr log2 NJ,

m = periodo di N modulo r

(dunque m > log~ N). Sia p un fattore primo di N. Da (i), N non è potenza di p - osservazione che avremo modo di sfruttare più tardi -; da (iii) si ha che, per ogni a :S l, (x

+ a)N == x N + a (mod p,

xT

-

1)

e cioè che x T -1 divide (x + a)N - (x N + a) modulo p tra i polinomi a coefficienti nel campo Zp[x].

4.7 AKS: l'Algoritmo di Agrawal-Kayal-Saxena

119

Da (ii), p > r e quindi (p,r) = 1 e pT-l == 1 (modr). Allora, per il corollario 3.10.2 ci sono r radici r-me di 1 in qualche ampliamento finito di Zp (si veda in particolare l'esempio 2 in 3.10.3). Fissiamo una radice primitiva r-ma v di r su Zp; h(x) E Zp[x] definisca il suo polinomio minimo su Zp (per semplicità indichiamo qui alla stessa maniera un numero intero e la sua immagine in Zp, semmai riservandoci di chiarire caso per caso se ci riferiamo a Z o a Zp; in modo analogo procediamo con i polinomi in Z[x] e con le loro proiezioni modulo p). Ampliamo adesso Zp con v e formiamo F = Zp(v): quindi, se t è il grado di h(x), F è isomorfo a F p'. Come già notato, v T = 1 in F e anzi v ha periodo r in F. Ogni polinomio g(x) E Z[x] definisce un elemento g(v) E F, e due polinomi g(x),g'(x) E Z[x] determinano lo stesso elemento g(v) = g'(v) se e solo se g(x) == g'(x) (modp, h(x)). Ci interessa il caso dei polinomi della forma g(x) = (x + a)k a, ka E N

II a5}

e degli elementi g(v) = ITa: log~ N. Allora Inoltre

l = lv'rlog2NJ > l-/Slog2NJ. Per ogni sottoinsieme non vuoto T di {O, 1, ... , l -/s log2 NJ}, costruiamo il polinomio

gT(X) =

II (x + a), aET

che ha grado < l Vs log2 N J < s e definisce un elemento gT (v) E G perché ogni a E T soddisfa a < l; gT(X) corrisponde quindi alle ipotesi del lemma 4.7.5. I polinomi così ottenuti sono 2lv'sJlog2 N+l _ 1

> 2lv'slog2 NJ > Nlv'sJ. -

-

Per T = T', gT(X) e gTI(X) non possono essere congrui modulo p. Dal lemma 4.7.5 segue che i polinomi gT(X) definiscono elementi distinti in G. Dunque

come previsto. Questo chiude la dimostrazione.

D

4.8 Variazioni su AK S La prima versione dell'algoritmo AKS fu divulgata, come già riferito, nell'estate 2002, e suscitò subito interesse, reazioni, commenti, suggerimenti su possibili miglioramenti e implementazioni. Gli stessi Agrawal, Kayal, e Saxena hanno quindi provveduto negli anni successivi a perfezionare l'idea originaria e a darne nuove formulazioni. Accenniamo in questo paragrafo a due recenti e notevoli sviluppi, che migliorano ulteriormente AK S dal punto di vista pratico, abbassandone i tempi di lavoro. Il primo è dovuto essenzialmente a Bernstein e Berrizbeitia (con contributi di Cheng) e si basa sulle seguenti considerazioni.

4.8 Variazioni su AK S

123

Esercizio 4.8.1 Sia N > 2 un primo. Si ricordi che ZN è un campo e si fissi un polinomio monico a coefficienti interi f(x) di grado d irriducibile modulo N. Si provi che esiste un polinomio g(x) E Z[x] che soddisfa

(a) g(x)N d - l == 1 (modN,f(x)) e, in riferimento ad un qualunque intero d'

> 1 che divide N d

-

1,

Nd_l

(b) per ogni fattore primo q di d', g(x)-q- -1 è invertibile modulo N,f(x). (Suggerimento. Si costruisca l'ampliamento semplice F = ZN(V) di ZN tramite una radice v di f(x) modulo N, si ricordi che Wl = Nd e che il gruppo moltiplicativo F* è ciclico e ha, ovviamente, ordine Nd - 1. Si fissi conseguentemente un polinomio g(x) a coefficienti interi tale che g(v) genera F*. Si osservi che g(v) ha periodo N d - 1 in F*. Si deducano (a) e (b).) Sulla base di queste osservazioni, consideriamo un intero dispari N > 2 e un polinomio monico f (x) a coefficienti interi di grado d. Il procedimento di Bernstein-Berriz beitia prevede di fissare • •

un altro polinomio a coefficienti interi g(x), un intero d' > 1 tale che d'IN d -1 e d' > (2dlogN)2

per cui valgano (a) e (b). Si prova allora: Teorema 4.8.2 (Bernstein-Berrizbeitia) Siano N, f(x), g(x), d, d' come appena descritto, valgano in particolare (a) e (b). Allora N è primo se e solo se

(1) N non è una potenza perfetta, (2) (y _1)N d == yN d -1 (modN,f(x),yd' - g(x)) in Z[x,y].

È chiaro che (1) e (2) sono soddisfatte quando N è primo. (2) segue in particolare ancora dal teorema 4.3.4, che è già alla base di AK S. Così il punto cruciale della dimostrazione è escludere (1) e (2) quando N è composto. Si ottiene comunque una nuova elegante caratterizzazione della primalità, che modifica e perfeziona AK S ed ha anche il pregio di originare un algoritmo probabilistico di primalità di tipo Montecarlo che, ricorrendo ai testimoni g(x), d' per f(x) opportuno • •

lavora in tempo approssimativamente O(logi N), è pienamente affidabile quando risponde N PRIMO, mentre ha probabilità di errore :S ~ quando azzarda N COMPOSTO.

Dunque 200 successive iter azioni con la comune conclusione N COMPOSTO abbassano il margine di imprecisione ben sotto al fatidico livello di 10-50. Si noti la simmetria con i procedimenti di Solovay-Strassen e di Miller-Rabin, che garantiscono sicurezza assoluta quando rispondono N COMPOSTO, e altrimenti probabilità :S ~, t rispettivamente che la risposta N PRIMO sia corretta.

124

4 Il Problema della Primalità

Combinando l'uno o l'altro di tali algoritmi con questa nuova procedura basata sul teorema di Bernstein-Berrizbeitia, si ha certezza quasi definitiva di riconoscere se un dato N è primo o composto in tempo complessivamente rapido, approssimativamente O(logi N). Basta svolgere le due procedure in parallelo: una risposta N COMPOSTO dall'algoritmo di Solovay-Strassen o da quello di Miller-Rabin assicura che N è davvero composto, e una risposta N PRIMO da parte del nuovo algoritmo garantisce che N è davvero primo, I casi eccezionali corrispondono alla situazione particolarmente sfortunata in cui la prima procedura dichiara N PRIMO e la seconda N COMPOSTO. Di recente è stato provato, comunque, anche un procedimento deterministico di probabilità che si ispira ad AK S ma ne abbassa i tempi di lavoro alla soglia di 6(log~ N) (la migliore possibile per AKS, come già osservato). L'algoritmo è dovuto a Lenstra e Pomerance e opera sulla base della seguente osservazione sui primi. Esercizio 4.8.3 Sia N > 2 un primo. Si ricordi che ZN è un campo e si consideri, come prima, un polinomio monico f(x) E Z[x] di grado d irriducibile modulo N. Si dimostri: (a) f(x N ) == O (modN, f(x)), (b) x Nd == x (modN, f(x)),

(c) per ogni fattore primo q di d, x Nd / q

-

x è invertibile modulo N, f(x).

(Suggerimento. Come nell'esercizio precedente, si formi l'ampliamento semplice F = ZN(V) di ZN con una radice v di f(x) modulo N. Si noti Wl = N d . Siccome ogni intero a soddisfa a N == a (modN), si ha f(v N ) = (J(v))N=Oda cui si ottiene (a) -. Si ricordi poi che V Nd = v, e si deduca (b). Quanto a (c), si osservi che, per q divisore primo di d, non può essere v Nd / q = v, altrimenti v sta in un campo con Nd/q elementi, mentre sappiamo che la minima estensione di ZN con v è F e ha ordine Nd).

Lenstra e Pomerance provano allora: Teorema 4.8.4 (Lenstra-Pomerance) Siano N un intero dispari> 2, d un intero tale che log~ N < d < N, f(x) un polinomio monico a coefficienti interi di grado d per cui valgono (a), (b) e (c). Allora N è primo se e solo se (1) N non è potenza perfetta, (2) N non ha fattori primi ~ d, (3) (x + a)N = x N + a (modN, f(x)) per ogni intero positivo a

< Vdlog2 N.

Ovviamente (1), (2), (3) valgono se N è primo, in particolare (3) richiama ancora l'idea base di AKS. Così il punto chiave della dimostrazione è provare che un numero composto N viola una delle tre condizioni. Si noti poi che (1), (2), (3) sono rapide da verificare conoscendo f(x) e d. Quindi per ottenere complessivamente una procedura veloce basta costruire in tempi brevi un opportuno polinomio f(x). Le tecniche usate a questo proposito

4.8 Variazioni su AK S

125

da Lenstra e Pomerance fanno riferimento a idee di Gauss per la costruzione dei poligoni regolari di n lati.

Esercizi 4.8.5 l. Si indichi quali tra i seguenti numeri composti sono pseudoprimi di

2.

3.

4.

5. 6.

Carmichael e quali no: • 2167; • 2465; • 2821; • 3025; • 6601; • 8911. (Suggerimento: si sfruttino i teoremi 4.2.4 e 4.2.6). Si provi che ogni numero di Fermat F(m) = 22 '" + 1 che non è primo è comunque pseudoprimo in base 2. (Suggerimento: è chiaro che 2 è primo con ogni numero di Fermat F(m), è da provare che 2F (m)-1 == 1 (modF(m)), cioè che F(m) divide 22 '" -1, per ogni m. Si osservi che 22 '" -1 = F(2 m )-2 e si ricordi che F(2 m ) - 2 eguaglia il prodotto degli F(i) per i < 2m . Si noti che m < 2m per ogni m). Si mostri in quali casi N è pseudoprimo di Eulero in base a: • N = 3, a = 25; • N = 7, a = 25; • N = 11, a = 8; • N=17,a=9; • N = 19, a = 9. Controllare attraverso i test di Solovay-Strassen e di Miller-Rabin la primalità di 107, 139, 1807, 4693, 5879. Si richiede una probabilità massima di errore dello 0,5%. Si confrontino poi le velocità tra i due metodi (per rispettare la causalità della scelta dell'input a si utilizzi la funzione Random presente in qualunque calcolatrice scientifica). Si mostri che l'algoritmo di Miller-Rabin riconosce N = 13 e N = 561 come primi quando consulta a = 2. E l'algoritmo di Solovay-Strassen? Si ricordi che 561 è composto. Si mostri che l'algoritmo di Miller-Rabin lo dichiara probabilmente primo quando si affida al testimone a = 101. Invece lo stesso algoritmo certifica che 561 è composto se interpella a = 2.

Riferimenti bibliografici Una avvincente introduzione ai numeri primi è in [57]. [19] è un altro ottimo riferimento, ancor più approfondito e dettagliato. Da citare è anche [38]. Il

126

4 Il Problema della Primalità

lavoro di Carmichael relativo agli pseudoprimi è [14]. L'infinità degli pseudoprimi di Carmichael è provata in [4]. Un'altra prova che l'insieme dei primi sta in NP è in [54]. L'algoritmo di Solovay-Strassen fu proposto in [70]. Una trattazione del teorema di Sylow (usato nella dimostrazione del teorema 4.5.3) è in [36], ad esempio. L'idea dell'algoritmo di Miller-Rabin nasce da [49] e si sviluppa in [55]. A proposito di altri algoritmi di primalità citati nel corso del capitolo, rimandiamo a [2] per quello di Adleman-Huang, a [3] per quello di Adleman-Pomerance-Rumely, a [18] per quello di Cohen-Lenstra, e finalmente a [31] per quello di Goldwasser-Kilian. La computazione quantistica è introdotta, ad esempio, in [71]; per l'algoritmo quantistico di Shor si vedano [65], [66]. Arriviamo finalmente ad AKS. L'ultima versione dell'articolo di Agrawal, Kayal e Saxena si trova in [1]. [8] e il più recente [33] sono articoli espositivi che introducono e discutono l'algoritmo. L'articolo di Fouvry, citato nella nostra esposizione di AK S è [28]. I più recenti sviluppi segnalati a fine capitolo si trovano in vari articoli [9], [42] e altri ancora non pubblicati: [33] ne dà ampio resoconto. Un algoritmo per riconoscere le potenze di interi è discusso in [7] e [lO].

5

Il Problema della Fattorizzazione

5.1 Introduzione Nel precedente capitolo abbiamo discusso gli algoritmi di primalità. Adesso affrontiamo quelli che riguardano la fattorizzazione. Abbiamo già osservato come quest'ultimo problema sia da ritenersi più complicato: infatti è possibile stabilire che un numero N è composto senza ottenere alcuna informazione sulla sua decomposizione in fattori primi. Del resto, già nel capitolo 1 abbiamo avuto modo di osservare come talora i numeri di Fermat siano riconosciuti come composti senza che sia ancora noto alcun loro divisore proprio. La stessa paradossale situazione si manifesta tra i numeri di Mersenne, come il lettore può facilmente controllare visitando il sito http://www.mersenne.org. Vedremo in questo capitolo che, allo stato attuale delle conoscenze, i metodi conosciuti per la fattorizzazione sono effettivamente più lenti di quelli di primalità. Questa differenza non è cosa da poco, è anzi il fondamento di alcune procedure crittografiche di largo impiego e alta sicurezza, quali il sistema RSA che tratteremo nel prossimo capitolo. È anche da dire che, ove i calcolatori quantistici fossero applicabili nella pratica, l'algoritmo quantistico di Shor annullerebbe questa differenza tra primalità e fattorizzazione, insieme alle sue conseguenze. Consideriamo comunque un intero dispari N> 2, come nel capitolo precedente. Già conosciamo algoritmi rapidi per verificare se N è composto oppure no. Come già sottolineato, può capitare che in questi procedimenti la risposta N COMPOSTO, pur assicurando l'esistenza di un divisore proprio d di N, non fornisca esplicitamente un tale d e dunque non dia informazioni dirette sulla fattorizzazione di N. Cerchiamo allora algoritmi per il seguente: Problema. Per N composto dispari, determinare un divisore d di N tale che 1 < d < N.

.Jt

U n simile procedimento, applicato, dopo N, a d ed al quoziente e così via, fornisce, in definitiva e almeno in linea di principio, la decomposizione in fattori primi di N. Di più, il numero delle eventuali iter azioni del procedimento

128

5 Il Problema della Fattorizzazione

necessarie per completare la fattorizzazione si può limitare polinomialmente rispetto a [og2 N (come è facile controllare), dunque, se si trova un algoritmo rapido che determina d da N, se ne deduce un metodo veloce anche per decomporre N in fattori primi. Il capitolo sarà allora dedicato a presentare alcuni algoritmi per la risoluzione del problema sopra enunciato ed a discutere, finalmente, l'efficienza di queste procedure. Nel dettaglio, descriveremo due metodi relativamente elementari dovuti a Pollard; poi un altro procedimento basato su un approccio classico e su un'idea già nota a Fermat (conseguentemente denominato "fattorizzazione alla Fermat"); infine, un algoritmo per certi versi rivoluzionario e innovativo di H. Lenstra Jr., che inaugura l'uso delle curve ellittiche nella fattorizzazione. Un breve panorama di altri possibili approcci è fornito nel paragrafo finale.

5.2 Il Metodo p - l Cominciamo con un procedimento molto semplice, dovuto a Pollard. Sia N il nostro numero composto dispari. Ogni fattore primo p di N è, ovviamente, dispari, e quindi il suo predecessore p-l è divisibile per 2. Assumiamo poi che p-l sia prodotto di fattori primi tra loro distinti e "piccoli", ad esempio ~ s dove s è un intero prefissato. Allora p-l divide s! e quindi possiamo dedurre dal Piccolo Teorema di Fermat che, per ogni intero a primo con p (ad esempio per a = 2) vale la congruenza aS !

== 1 (modp),

in altre parole che p divide asl_l. Così p divide anche (as!-l, N), e (as!-l, N) diventa un ragionevole candidato come divisore -::f- 1, N di N. In conclusione il procedimento funziona come segue. Metodo p-l (Pollard) Sia N composto dispari> 2. Si fissano • •

un intero positivo s, un intero a tra 1 e N-l (ad esempio a = 2).

Si calcola anzitutto (a, N). Se (a, N) -::f- 1, allora (a, N) rivela un divisore proprio di N. Altrimenti a e N sono primi tra loro e si calcolano • •

- 1 modulo N, d = (a s ! - 1, N),

aS !

confidando che d costituisca il divisore proprio di N che stiamo cercando. Si noti che s è indipendente da N e dalla sua lunghezza; così almeno in teoria il calcolo di s! non incide sui tempi di lavoro dell'algoritmo; ovviamente, per s piccolo, la computazione non attarda il procedimento neppure nella pratica. Altrettanto può dirsi degli altri calcoli (di a s ! -1 modulo N, o dei due massimi comuni divisori richiesti). Dunque il procedimento si svolge in tempi rapidi. D'altra parte l'algoritmo non fornisce alcuna garanzia di successo, visto che si

5.3 Il Metodo p

129

basa sulla speranza di qualche premessa fortunata a proposito dei fattori primi p di N. In questo senso il metodo p-l può fallire (per una scelta disgraziata di s, o per particolari valori di N). Esempio 5.2.1 Vediamo come il metodo rivela la fattorizzazione di N = 91: ovviamente il procedimento si applica in genere a valori ben più grandi di 91, il caso di 91 serve solo per illustrarlo. Scegliamo s = 3 (così s! = 6), a = 2. Allora 26 - 1 = 63, (63, 91) = 7. Si conferma in questo modo che 7 è divisore di 91, e si conclude facilmente 91 = 7 ·13. Si noti che la scelta s = 5 (e quindi s! = 120), a = 2 non sarebbe altrettanto fortunata, infatti 2120 == 1 (mod91), e quindi (2 120 - 1, 91) non rivela alcun divisore proprio di 91.

5.3 Il Metodo p Il Metodo p, ancora dovuto a Pollard, considera il composto dispari N e ne cerca un divisore proprio d all'interno di sequenze predefinite di interi, ad esempio quelle generate da • •

un intero xo, una funzione polinomiale

f da Z a Z

ponendo

(j E N). L'idea è quella di calcolare il massimo comune divisore (Xj - Xk, N) per ogni scelta di j < k in N sperando di ricavarne un valore f::- 1, N. In tal caso, (Xj - Xk, N) è il divisore proprio d di N che stiamo cercando. Il fondamento del discorso è il seguente: sappiamo che c'è un divisore d f::- 1, N di N, anche se non conosciamo d, e anzi cerchiamo di individuarlo; sappiamo anche che gli elementi Xo, Xl, X2, ... , X j, X j+ 1, . .. (j E N) prima o poi contengono una ripetizione modulo d perché Zd è finito: ci sono stime ragionevoli che fissano questa ripetizione entro O( VN) passi, e anche prima. Si ha allora, per j < k, Xj == Xk (modd), e quindi d divide non solo N, ma anche Xj - Xk. È da prevedere che (Xj - Xk, N) possa allora rivelare proprio d, o comunque un divisore proprio di N. Tra l'altro, si può ricordare che la ricerca di un singolo massimo comune divisore si fa in tempi rapidi rispetto alla lunghezza di N. Si noti poi che, se j < k sono gli indici che determinano la prima ripetizione Xj == Xk (modd), allora si ha Xj+1 = f(xj) == f(Xk) = Xk+1 (modd) e via dicendo, dunque la sequenza Xo, Xl, X2, ... , X j, ... , Xk, ... consiste di •

un ciclo Xj+1

==

Xj,"" Xk+1

Xk-1

che si ripete modulo d (nel senso che

(modd) e così via)

preceduto da •

una "coda"

XO,X1,oo.,Xj-1'

Xj

==

Xk

(modd),

130

5 Il Problema della Fattorizzazione

La figura che ne deriva (un ciclo più una coda) richiama la lettera greca rho p; da qui nasce il nome del metodo. Esempio 5.3.1 Supponiamo ancora di considerare N = 91 e di sapere già che 91 è composto. Scegliamo

Xo = 1, Allora Xl

= 2,

f(x) = x 2 + 1 \::Ix E Z.

= 5, X3 = 26, ... ; 5, 91) = (21,91) =

X2

7. Deduciamo che 7 è si verifica (X3 - X2, N) = (26 divisore di 91; è facile ricavare che 91 = 7· 13 è la decomposizione di 91 in fattori primi. Osservazioni 5.3.2 1. Si noti anzitutto che lavoriamo modulo N, possiamo conseguentemente sostituire ciascun Xj con il suo resto nella divisione per N e supporlo tra 0,1, ... , N-L 2. A questo proposito, è essenziale che la funzione f si preservi per congruenze modulo N, cioè che si abbia f(x) == f(x' ) (modN) ogni volta che x == x' (mod N). È per questo che si sceglie f tra le funzioni polinomiali. 3. Bisogna comunque valutare con attenzione se la strategia appena esposta ha speranza di rapido successo. In effetti dobbiamo prendere atto che, fissato un naturale k e il corrispondente Xk, il procedimento prevede di calcolare (Xj -Xk, N) per ogni naturale j < k; possiamo dunque aspettarci tempi lunghi di computazione (sempre ammesso che si incontri davvero prima o poi una coppia fortunata j < k). 4. Thttavia possiamo osservare che, se jo < ko permettono di determinare un massimo comune divisore d = (Xjo - Xko' N) # 1, N, allora, per ogni scelta di due naturali j e k tali che k - j = ko - jo (cioè k - ko = j - jo), si ha d I (Xj - Xk, N). Infatti, per m = k - ko = j - jo, Xj == fm(xjo) == fm(Xko) == Xk (modd). Naturalmente può capitare che (Xj - Xk, N) > d; ma si verifica che la probabilità di questo rischio è assai limitata, almeno quando N è grande o, meglio, quando è prodotto di primi molto grandi (i casi che maggiormente ci possono interessare nella pratica).

Sulla base di queste osservazioni, possiamo allora organizzare il seguente raffinamento della precedente strategia. Metodo p (Pollard) Per ogni k come sopra, cerchiamo il naturale h tale che 2h :S k < 2h +1 (in altre parole, k ha lunghezza h + 1 in base 2) e consideriamo j = 2h - 1. Calcoliamo d = (Xj - Xk, N). Se d # 1, N, siamo a posto. Altrimenti passiamo a k + 1.

Ricordiamo per chiarezza che: •

k

= 1 ha lunghezza 1 in base 2, dunque corrisponde ad h = 0, j = 0,

5.3 Il Metodo p

• •

131

k = 2, 3 (dunque 2 :S k < 4) hanno lunghezza 2 in base 2, dunque corrispondono ad h = 1, j = 1, k = 4, 5, 6, 7 (dunque 4 :S k < 8) hanno lunghezza 3 in base 2, dunque corrispondono ad h = 2, j = 3

e così via. Il vantaggio del Metodo p è evidente: per ogni intero positivo k, si deve calcolare (Xj - Xk, N) per un solo naturale j < k. Lo svantaggio principale consiste invece nel fatto che può capitare per questa via di saltare proprio qualche coppiajo < ko per cui (Xjo -Xko' N) = d:l 1, N. Supponiamo comunque che (io, k o) sia una tale coppia, e che in particolare 2h :S ko < 2h+1. Consideriamo

j = 2h+1 - 1, Allora 2h+ 1

k= j

:S

k

+ (k o - jo).

< 2h+ 2

e j corrisponde a k nel Metodo p. Dunque la coppia (i, k) è presa in considerazione dal procedimento di Pollard e, per la Osservazione 4 in 5.3.2, d divide anche (Xj - Xk, N) e c'è forte probabilità che (Xj - Xk, N) :I N. Inoltre

k

< 2h+2

= 4· 2h

:S 4ko.

Così, se la coppia (io, k o) è sfuggita, il metodo prende comunque in considerazione una coppia (i, k) che soddisfa k :S 4ko e, con alta probabilità, testimonia ancora (Xj - Xk, N) :IN. Esempio 5.3.3 Per illustrare il procedimento, ritorniamo a N = 91. Scegliamo ancora Xo = 1, f(x) = x 2 + 1 per ogni intero x. Ricordiamo

Xo = 1,

Xl

= 2, X2 = 5, X3 = 26, X4

== 40 (mod91),

Procedendo col metodo p si ha (Xl -

Xo, N) = (1, 91) = 1,

(X2 -

Xl,

(X3 -

Xl,

N) = (3, 91) = 1, N) = (24, 91) = 1,

(X4 - X3, N) = (14, 91) = 7; così, con breve ritardo su k rispetto a 5.3.1, si ottiene comunque 7 I 91. Si può comunque obiettare che il Metodo p, come già quello p - 1, si basa parzialmente sulla speranza di circostanze favorevoli e non garantisce con sicurezza di fornire rapidamente il divisore d :I 1, N richiesto. È quindi ragionevole chiedersi se una selezione appropriata di Xo e f possa favorire la ricerca di d. Ma si vede con l'uso di argomenti probabilistici che la scelta di Xo e f

132

5 Il Problema della Fattorizzazione

può essere completamente arbitraria e neSSun vantaggio è garantito, almeno in linea di principio, da una particolare preferenza su Xo e f. Nella pratica si osserva che f(x) = X2 + 1 per ogni x E Z è una buona funzione di controllo, mentre le funzioni lineari f(x) = ax + b per ogni x E Z (con a e b interi ed a -::f- O) sono da evitare perché incapaci di produrre senza troppi ritardi la ripetizione cercata Xj == Xk (modd).

5.4 Fattorizzazione alla Fermat Un'altra strategia per ottenere un divisore d -::f- 1, N del nostro composto dispari N > 2 si basa sulla seguente osservazione, già nota a Fermat. Proposizione 5.4.1 Sia N un composto dispari. Allora è possibile esprimere

N=a·b come prodotto di due fattori a differenza di quadrati con t, s naturali e t - s

~

b

>1

se e solo se N si rappresenta come

> 1.

Dimostrazione. Chiaramente, se N = t 2 - s2 è la differenza dei quadrati dei due naturali t, s e t - s > 1, allora N si può decomporre nel prodotto N = (t + s) . (t - s) dove t + s ~ t - s > 1. Viceversa, supponiamo N = a· b con a ~ b > 1. Notiamo che a e b devono essere dispari perché N è dispari. Dunque i due naturali a ± b sono pari e dividendoli per 2 otteniamo due nuovi naturali at b e a;-b. Inoltre

dove

a+b

2

>

a-b

2

e

a+b _ a-b

2

2

= b> 1

D

.

In conclusione, fattorizzare N = a·b con a ~ b > 1 equivale a de comporlo nella differenza di quadrati N = t 2 - s2 COn t - s > 1, e le formule che permettono di passare dall'una all'altra di queste rappresentazioni SOnO a = t + s, b = t - s, a+b

a-b

t = -2-' s = -2rispettivamente. Sulla base di questa osservazione possiamo cambiare l'impostazione del nostro problema nel senso che segue.



È dato un composto dispari N.



Cerchiamo due interi positivi t, s tali che N = t 2

-

s2

et- s

> 1.

5.4 Fattorizzazione alla Fermat

133

La ricerca è facilitata quando a e b sono molto vicini tra loro, e dunque è lecito assumere che s = sia molto "piccolo" e t = sia molto vicino a VN. Allora possiamo considerare i valori

at b

a;-b

t

=

LVNJ + 1, LVNJ + 2,

... ,

per ciascuno di essi calcolare t 2 - N e verificare se è il quadrato perfetto di qualche naturale s. In tal caso t 2 - N = S2 implica N = t 2 - S2 = (t+s)· (t-s). Ovviamente non è detto che a e b soddisfino la premessa di essere vicini (e del resto a e b non sono conosciuti da chi sta cercando la fattorizzazione di N). Thttavia, se la precedente strategia non conduce a successo in un numero ragionevolmente breve di passi, possiamo seguire una procedura più elaborata, ma simile: per ogni intero m > 1, considerare gli elementi

t=

Lv'mNJ + 1, Lv'mNJ + 2, ... ,

e per ciascuno di essi calcolare t 2 - mN e verificare se è il quadrato perfetto di qualche naturale s. In tal caso t 2 - mN = s2 implica mN = t 2 - s2 = (t + s) . (t - s) e, per m abbastanza piccolo, si può ritenere che N e t + s abbiano qualche fattore primo comune, in altre parole che (N, t + s) -::f- 1, il che determina un divisore -::f- 1, N di N. Può anche essere che sia invece (N, t - s) a svelare questo divisore. Illustriamo il procedimento con un paio di esempi. Al solito, usiamo valori di N "piccoli" e dunque facili da trattare. Il lettore deve comunque tenere presente che questi procedimenti di fattorizzazione si applicano a numeri N ben più grandi e ricchi di cifre di quelli che per semplicità qui consideriamo. Esempi 5.4.2

1. Sia N = 91. Sappiamo già che 91 = 7 . 13 dove i fattori 7 e 13 sono relativamente vicini tra loro; anzi, applicando le formule sopra descritte, si ricava facilmente che 91 = 10 2 - 32 . Ma fingiamo di non sapere niente di tutto questo, e procediamo considerando LVNJ + 1 = lO. Allora già al primo tentativo troviamo che 10 2 - 91 = 9 = 32 è un quadrato perfetto. Così abbiamo la conferma che 91 = 10 2

-

32 = (lO + 3) . (lO - 3) = 13 . 7.

2. Sia ora N = 203. È facile vedere che N = 7· 29 e quindi N = 18 2 - 11 2 . Facciamo però finta di non saperne niente e consideriamo LVNJ + 1 = 15. Si osserva che • 15 2 - 203 = 22 non è un quadrato perfetto, • 16 2 - 203 = 53 non è un quadrato perfetto, • 172 - 203 = 86 non è un quadrato perfetto, e il fallimento di questi tentativi potrebbe indurre a qualche scoraggiamento (anche se, in realtà, basterebbe aspettare un ulteriore passo per incontrare la rappresentazione corretta). Potremmo allora decidere di cambiare strada, ricorrere a m = 3, considerare mN = 609 e LV3NJ + 1 = 25 e ottenere direttamente al primo tentativo

134

5 Il Problema della Fattorizzazione

• 25 2 - 609 = 16 = 42 , dunque 3·203 = 25 2

-

4 2 = (25 - 4) . (25

+ 4)

= 21 ·29

che rivela, appunto, che 29 divide 203. La procedura che questi esempi lasciano intravedere sembra comunque abbastanza casuale ed estemporanea, troppo legata al buon esito dei tentativi e all'umore di chi li compie. Cerchiamo allora di delinearla in modo più preciso. Ribadiamo allora che •

è dato un numero composto dispari N

e che cerchiamo due interi positivi t e s tali che

• •

t 2 == S2 (mod N) (cioè t 2 - S2 = kN per qualche naturale k), t =t ±s (modN) (cioè N non divide né t - s né t + s).

In questo caso a = (t + s, N) è verosimilmente un divisore non banale di N, mentre b = ~ divide molto probabilmente t-s. Dobbiamo però cercare un qualche algoritmo che ci permetta di ottenere esplicitamente (e, se possibile, rapidamente) t e s • •

con lo stesso quadrato modulo N, ma né uguali né opposti modulo N.

A questo proposito converrà osservare che, come conseguenza del Teorema del Resto Cinese, quando N ha almeno due fattori primi distinti, allora ogni quadrato modulo N ha almeno 4 = 22 radici quadrate distinte modulo N (si ricordi la proposizione 3.3.6). Ecco allora una procedura che cerca di produrre t e s come richiesti. Per apprezzarla, ci serve introdurre preliminarmente la seguente definizione. Definizione 5.4.3 Chiamiamo minimo resto assoluto di un intero a rispetto

ad N l'intero r tale che

r == a (modN),

N

N

2

2

- - < r O.

6.2 Il Logaritmo Discreto e il Criptosistema di Diffie-Hellman

145

Consideriamo invece, per N numero primo molto grande, il gruppo ciclico moltiplicativo Z~ composto dalla potenze distinte 1, g, g2, ... , gN-2 di un opportuno g primo COn N (modulo N), oppure più in generale il gruppo moltiplicativo F*, parimenti ciclico, di un qualunque campo finito F. In questi ambiti la situazione cambia. Infatti, fissato g, • •

esistono, come sappiamo, metodi rapidi di calcolo di gX (modulo N) per ogni intero x, ma, come anticipato nel paragrafo 3.8, nOn SOnO attualmente noti metodi altrettanto ragionevoli per recuperare da una data potenza y di g un esponente naturale x < N-I per cui y coincide con gX (quello che si chiama il logaritmo discreto di y in base g).

Anzi, la questione di trovare algoritmi efficienti per il calcolo del logaritmo discreto è conosciuta come il Problema del logaritmo discreto, e pare molto complessa e delicata: esistono semmai procedimenti quantistici rapidi, ancora dovuti a Shor (il lettore interessato può far riferimento a [66]), ma già abbiamo descritto le complicazioni pratiche di attuazione di tali metodi. Diffie e Hellman sfruttarono nel 1976 la difficoltà di calcolo del logaritmo discreto per costruire il primo cripto sistema a chiave pubblica: in esso la funzione a senso unico è proprio la esponenziazione in base g modulo un opportuno N. Infatti essa è inverti bile e facile da computare, ma ha una funzione inversa (il logaritmo discreto) proibitiva da calcolare, almeno allo stato attuale delle COnOscenze. Vediamo allora una esposizione (molto elementare) di questo cri ptosistema. Criptosistema di Diffie-Hellman

1. A e B concordano anzitutto una potenza q di un primo, il corrispondente campo finito F q e un generatore g del gruppo ciclico F~. Essi fanno parte delle informazioni pubbliche del sistema. 2. A questo punto A si sceglie un intero positivo nA (che si può supporre < q-I) e calcola gnA: • gn A completa la chiave pubblica di A, da diffondere tra tutti gli altri utenti, • nA rappresenta invece la sua chiave privata. 3. Supponiamo adesso che A e B vogliano mettersi in corrispondenza; anche B ha scelto la propria chiave privata nB e divulgato la sua chiave pubblica gnB. Tanto A quanto B possono a questo punto calcolare gnA ·nB = (gnA) nB = (gnB) nA :

B dalla sua chiave segreta nB e dalla chiave pubblica gn A di A; A, invece, dalla sua chiave segreta nA e dalla chiave pubblica gn B di B. Allora A e B possono usare l'elemento gnA·n B come chiave comune per cifrare e decifrare i loro messaggi (vedremo tra poche righe in che modo). La sicurezza del sistema rispetto a possibili incursioni di pirati si basa, come detto, sulla difficoltà del problema del logaritmo discreto. Infatti, ammettiamo

146

6 Ancora Crittografia

che un malintenzionato C intercetti un messaggio cifrato. Per decriptarlo in tempi rapidi, C ha bisogno di COnOscere gn A .ns ; ma le uniche informazioni di cui dispone a questo proposito SOnO le chiavi pubbliche di A e H, dunque gn A e gns. Il problema è dunque quello di

(*)

recuperare gn A ·ns da gn A e gns.

Una semplice strategia per riuscirci è quella di calcolare gli esponenti nA e nE, cioè 2 logaritmi discreti, poi moltiplicarli e assegnare il prodotto nA . nE come esponente a g. Naturalmente si possono seguire altre idee e tentare altri procedimenti. Ma si concorda che, allo stato attuale delle conoscenze, (*) è computazionalmente intrattabile, e comunque non più facile del problema del logaritmo discreto: questa ipotesi di lavoro è comunemente conosciuta come Ipotesi di Diffie-Hellman. Aggiungiamo che il sistema di Diffie-Hellman ha (ovviamente) maggiori garanzie di sicurezza quando il valore scelto per q è molto grande. Per concludere, resta da chiarire come l'elemento gn A ·ns concordato da A e H in F~, più in generale un elemento arbitrario di un campo finito F~, riesca da solo a generare un criptosistema comune tra A e H. Ci sono varie possibili strategie a questo riguardo. Ad esempio possiamo riferirei ai cripto sistemi classici del Capitolo 1, come quelli che maneggiano coppie di digrafi, ciascuno composto da 2 lettere scelte in un alfabeto di N elementi: si ha dunque a che fare COn vettori

(~)

COn x e y interi compresi tra Oe N 2 -1. Sappiamo allora

che una possibile codifica (tradizionale) di

( Xy',)

(~)

tramite la versione cifrata

avviene allora nel modo descritto dalla seguente formula

dove a, b, c, d, e, i sono interi prefissati tra O e N 2 - 1 e ad - be è primo con N 2 (dunque con N). Vediamo adesso come, per N e q opportuni, un elemento di F~ possa determinare a, b, c, d, e, f. Notiamo anzitutto che questi 6 elementi a, b, c, d, e, i SOnO univocamente definiti come coefficienti della decomposizione in base N 2 di un opportuno naturale M < N 12 M

= aN 10 + bN 8 + cN 6 + dN 4 + eN 2 + i,

deve valere poi (ad - be, N) = 1. N 12 difficilmente è potenza di primo (e sicuramente nOn è primo), possiamo comunque fissare una potenza q = pS di un qualche primo p tale che pS 2: N 12 , e pensare M come un elemento dell'anello 7l q • In altre parole a, b, c, d, e, i risultano univocamente determinati da un opportuno elemento M E 7l q • Notiamo che 7l q non è un campo (a menO che q = p e s = 1), in particolare nOn coincide COn F q (escluso il caso

6.3 Doppi Lucchetti

147

appena menzionato q = p e s = 1). Se però fissiamo una base B di F q su Zp (intendendo F q, appunto, come spazio vettoriale sul sottocampo Zp), all'intero M, decomposto in base p secondo le potenze 1, p, ... , ps-l di p con coefficienti tra O e p-I, possiamo far corrispondere l'elemento di F q che ha le stesse coordinate modulo p rispetto alla base B. Questa corrispondenza è biunivoca ed effettiva. Così possiamo determinare a, b, c, d, e, f (ed in definitiva la chiave di codifica del nostro criptosistema) scegliendo un elemento del campo F q e tramite esso, con la corrispondenza ora introdotta, il naturale M < q.

6.3 Doppi Lucchetti Sulla difficoltà di calcolare il logaritmo discreto si basa anche il Criptosistema di Massey-Omura, che fu proposto nel 1983 e riproduce nell'ambito numerico il modello del doppio lucchetto, quello in cui gli utenti A e B cifrano e decifrano l'uno dopo l'altro, adoperando ciascuno una propria chiave privata. Criptosistema di Massey-Omura 1. Si fissa anzitutto un primo (grande) q e si considera il campo Zq. 2. L'utente A sceglie un numero nA con 1 < nA < q-I e nA inverti bile modulo q-I, calcola poi l'inverso n:.:;.l di nA modulo q-I: nA e ni

costituiranno la chiave privata di A. Si noti che, per il Piccolo Teorema di Fermat, ogni intero a soddisfa -1

a nA ·nA

== a (modq)

perché nA . ni == 1 (modq - 1). B si comporta ovviamente allo stesso modo, scegliendo il proprio nE e calcolando n"B 1. 3. La corrispondenza tra B e A avviene come segue. Sia a il messaggio che B vuole inviare ad A. • B spedisce ad A il testo a cifrato con la propria chiave privata, dunque come a na modulo q; • A cifra ulteriormente con la sua chiave privata e ottiene modulo q (ana)n A cioè a na · nA e invia il risultato a B· " , • B inizia a decifrare (a na · nA )ni3 1 == anA (modq) e rispedisce il risultato adA; • A termina di decifrare elevando alla n modulo q e recuperando finalmente a.

i

Così il Criptosistema di Massey-Omura riproduce esattamente il meccanismo del doppio lucchetto: nA e n:.:;.l rappresentano la chiave con cui A chiude e apre lo scrigno, ed altrettanto vale per B. Si noti che le procedure che A esegue (elevare alla nA, o alla ni) sono indipendenti da quelle di B che usa invece gli esponenti nE e n"B 1. In altre parole si ha

148

6 Ancora Crittografia

e altrettanto vale per ogni coppia di esponenti tra nA, ni, na, nEl. C'è quindi una commutatività tra le quattro operazioni di codifica e decodifica di A e H. La sicurezza del procedimento rispetto ai tentativi del pirata C si fonda nuovamente sulla difficoltà di calcolare i logaritmi discreti. Infatti C, quand'anche riesca ad intercettare uno dei vari messaggi, ad esempio a ns , per recuperare il testo originario a ha bisogno di conoscere l'esponente na (per poi ricavarne l'inverso modulo q-I), deve dunque risolvere un problema di logaritmo discreto. Va semmai rilevato che C, ottenuto in qualche modo a ns , può tentare di spacciarsi per A agli occhi di H, rispondergli cioè al posto di A cifrando ulteriormente con la sua chiave privata ne e proseguendo la corrispondenza con H fino a ricavare a. Si pone così in questo caso un problema comune a molti criptosistemi: quello di procedure di firma e autenticazione dei messaggi, che assicurino l'identità del mittente e del destinatario. Avremo modo di parlarne più in là nel corso del capitolo. Trattiamo invece adesso un altro semplice metodo crittografico, ancora basato sui logaritmi discreti. Si tratta del Criptosistema di ElGamal del 1985. Esso opera come segue. Criptosistema di EIGamal 1. Si fissano anzitutto una potenza q di un numero primo e un generatore g

del gruppo moltiplicativo del campo F q. 2. L'utente A sceglie poi come sua chiave privata un intero positivo nA < q-I e divulga come sua chiave pubblica gnA. H procede allo stesso modo. 3. Supponiamo che H intenda spedire ad A il messaggio a. H prende un naturale k e invia ad A la coppia (gk, a . gkn A ). In particolare H riesce a calcolare la coppia gkn A come (gnA)k usando la chiave pubblica gn A di A. 4. A decifra come segue: eleva la prima componente gk della coppia che ha ricevuto alla propria chiave privata nA e ottiene gknA; divide poi la seconda componente a . gkn A per questo valore e ricava finalmente a. Si noti che la scelta di k non ha ruolo decisivo nel procedimento, anzi A non ha alcun bisogno di conoscere k per svolgere i suoi calcoli. La sicurezza del criptosistema si fonda nuovamente sul logaritmo discreto. Infatti un pirata C che pure intercetti gk e conosca gn A deve comunque risolvere problemi di logaritmo discreto per trovare gli esponenti k e nA. Per l'esattezza, C deve recuperare gk nA da gk e gnA. Ma per l'Ipotesi di DiffieHellman la relativa computazione è tanto complicata quanto, appunto, quella dei logaritmi discreti.

6.4 Il Problema dello Zaino Come già anticipato nel Capitolo 1, altri cripto sistemi a chiave pubblica sono ispirati ai così detti problemi N P-completi, e cioè a problemi, spesso di natura combinatoria, e ancor più spesso di facile presentazione, che si trovano

6.4 Il Problema dello Zaino

149

nella seguente condizione: ammettono un algoritmo rapido per la verifica delle soluzioni - dunque stanno in N P -, non si sa se consentono un procedimento rapido per la ricerca delle soluzioni - cioè se stanno in P -, si sa invece che, parlando alla buona, se stessero in P, costringerebbero N P e P a coincidere. Un semplice esempio di problema NP-completo è costituito dal Problema dello Zaino, che si può formulare come segue. Sono dati uno zaino con un volume intero prefissato V, e k oggetti di volume - ancora intero - Va, ... , Vk-l rispettivamente; il problema è stabilire se è possibile scegliere alcuni dei k oggetti in modo che essi riempiano esattamente lo zaino, cioè la somma dei loro volumi eguagli V. Ci sono chiari algoritmi per rispondere, ad esempio procedendo per tentativi, considerando cioè ogni possibile sequenza di oggetti e controllando se occupa completamente o no lo zaino: ma questo metodo, ancora accessibile se k è piccolo e gli oggetti sono pochi, diventa impraticabile quando k diventa enormemente grande. In realtà non si conosce nessun algoritmo polinomiale di soluzione del problema. In compenso, esistono metodi rapidissimi di verifica: infatti, se conosciamo la soluzione, è semplice controllarla, basta sommare i volumi coinvolti e verificare che il risultato è V, riempire in altre parole lo zaino con gli oggetti scelti e realizzare, appunto, che essi lo occupano senza lasciare spazi vuoti e senza farlo scoppiare. Di più, si sa che il problema dello zaino è, appunto, N P-completo: se l'algoritmo rapido di soluzione si trovasse, potremmo dedurne P = NP. Si capisce facilmente che una simile situazione si presta a definire funzioni a senso unico. In effetti, vari criptosistemi a chiave pubblica si fondano sul problema dello zaino. Ne descriviamo il più antico, quello proposto da Merkle e Hellman nel 1978. Anzitutto rienunciamo il problema dello zaino in versione più asciutta e matematica.

Problema dello Zaino. Dati i naturali k, V, Va, ... , Vk-l -::f- O, determinare, se possibile, aa, ... , ak-l E {O, I} tali che V = 2:i 2: j 24 > 15, si comincia col porre a4 = O ed a3 = 1. A questo punto si calcola 24 - 15 = 9 e si nota 7 < 9, deducendone a2 = 1. Da 9 - 7 = 2 < 3 si ottiene al = O e aa = 1, riempiendo finalmente lo zaino. In conclusione, il Problema Supercrescente dello Zaino ha un algoritmo rapido di soluzione, mentre non si conosce nessuna procedura veloce per il Problema generale dello Zaino (ed anzi si paventa che non ci sia). Il Criptosistema di Merkle-Hellman cerca di sfruttare questa situazione nel modo che adesso descriviamo. Anzitutto possiamo convenire di rappresentare le unità di messaggio con sequenze (aa, ... , ak-d di O e 1. La cosa non è difficile, basta scrivere le lettere dell'alfabeto (e cioè gli interi positivi:::; N, dove N vale al solito 26, o 27, o altro ancora) in notazione binaria, e dunque come sequenze ordinate finite di O e 1; possiamo supporre che queste sequenze abbiano comune lunghezza k (eventualmente premettendo qualche O alle sequenze più corte). Ad esempio, se N = 27, possiamo rappresentare ogni simbolo dell'alfabeto come una sequenza ordinata di 5 cifre tra O e 1, da O che si rappresenta 00000 a 26 che è invece 11010. Ciò premesso, si procede come segue. Criptosistema di Merkle-Hellman

1. L'utente A sceglie anzitutto • una sequenza supercrescente (va, ... , vk-d, • un intero m > Ei