Aritmetica modulare, numeri primi e crittografia
Transcript
Aritmetica modulare, numeri primi e crittografia
Aritmetica modulare, numeri primi e crittografia Alberto Canonaco Università di Pavia 14 Giugno 2016 Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Numeri primi Definizione Un intero n > 1 è un numero primo se non esistono due interi a, b > 1 tali che n = ab. Sono dunque numeri primi: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, . . . Teorema fondamentale dell’aritmetica Ogni intero n > 1 si può scrivere, in modo unico a meno dell’ordine, come prodotto di numeri primi. Esempio 140 = 2 · 7 · 5 · 2 = 5 · 2 · 2 · 7 = · · · Di solito si scrive 140 = 22 · 5 · 7. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Alcune proprietà dei numeri primi Teorema I numeri primi sono infiniti. Si sa molto di più sulla distribuzione dei numeri primi. In particolare, il cosiddetto teorema dei numeri primi afferma che i numeri primi fino a n sono (in un senso che si può rendere n matematicamente rigoroso) “circa” log(n) . Esempio I numeri primi fino a un miliardo sono 50847534, mentre 1000000000 = 48254942, 43 log(1000000000) D’altra parte non si conoscono risultati generali che permettano di determinare facilmente se un dato numero è primo. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Il problema della fattorizzazione Dato un intero n > 1 come posso stabilire se n è primo? Nel caso che non lo sia, come posso trovare la sua fattorizzazione? È facile fornire un algoritmo che risolve entrambi i problemi: 1. d = 2 2. se d > √ n, allora n è primo (fine!) 3. se d - n (d non divide n), sostituisco d + 1 a d e torno al punto 2 4. se d | n (d divide n), allora n non è primo, d è un suo fattore primo e riapplico l’algoritmo con dn (< n) al posto di n Osservazione Nel caso peggiore (cioè quando n è primo), l’algoritmo richiede √ circa n passi. Il suo tempo è quindi esponenziale come funzione del numero di cifre di n (che è circa log(n)). Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Efficienza degli algoritmi Esistono algoritmi molto più veloci (e complicati...). I In particolare si può sempre fattorizzare n in tempo subesponenziale, ma non polinomiale (almeno allo stato attuale delle conoscenze). I È invece possibile stabilire in tempo polinomiale se n è primo o no: anche se questo è stato dimostrato rigorosamente solo nel 2002 da Agrawal, Kayal e Saxena, erano già noti degli algoritmi che in pratica funzionano in tempo polinomiale. I Inoltre esistono dei test di primalità probabilistici molto semplici e ancora più veloci, che sono sicuri se indicano che n non è primo e altrimenti permettono di concludere solo che n è molto probabilmente primo. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Conseguenze In pratica un computer può trovare velocemente (in pochi minuti) dei numeri primi anche di parecchie centinaia di cifre, mentre in generale impiegherebbe un tempo enormemente maggiore per fattorizzare un numero della stessa grandezza. Il caso che richiede più tempo è quello in cui n = pq con p e q numeri primi circa della stessa grandezza (ma non troppo vicini e scelti con alcune altre accortezze). Alberto Canonaco Aritmetica modulare, numeri primi e crittografia RSA-768 Un normale pc impiegherebbe almeno mille anni per fattorizzare 1230186684530117755130494958384962720772853569595334792197 3224521517264005072636575187452021997864693899564749427740 6384592519255732630345373154826850791702612214291346167042 9214311602221240479274737794080665351419597459856902143413 Alberto Canonaco Aritmetica modulare, numeri primi e crittografia RSA-768 Un normale pc impiegherebbe almeno mille anni per fattorizzare 1230186684530117755130494958384962720772853569595334792197 3224521517264005072636575187452021997864693899564749427740 6384592519255732630345373154826850791702612214291346167042 9214311602221240479274737794080665351419597459856902143413 = 3347807169895689878604416984821269081770479498371376856891 2431388982883793878002287614711652531743087737814467999489 × 3674604366679959042824463379962795263227915816434308764267 6032283815739666511279233373417143396810270092798736308917 Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Crittografia Scopo della crittografia è di trasformare un messaggio rendendolo incomprensibile a chiunque, tranne a chi è autorizzato a leggerlo. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Crittografia Scopo della crittografia è di trasformare un messaggio rendendolo incomprensibile a chiunque, tranne a chi è autorizzato a leggerlo. Ci sono essenzialmente due tipi di crittografia: I la crittografia simmetrica, in cui un’unica chiave (nota solo a mittente e destinatario) permette di crittare e decrittare il messaggio; Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Crittografia Scopo della crittografia è di trasformare un messaggio rendendolo incomprensibile a chiunque, tranne a chi è autorizzato a leggerlo. Ci sono essenzialmente due tipi di crittografia: I la crittografia simmetrica, in cui un’unica chiave (nota solo a mittente e destinatario) permette di crittare e decrittare il messaggio; I la crittografia asimmetrica, in cui si usa una chiave pubblica (nota a tutti) per crittare il messaggio e una chiave privata (nota solo al destinatario) per decrittarlo. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Crittografia Scopo della crittografia è di trasformare un messaggio rendendolo incomprensibile a chiunque, tranne a chi è autorizzato a leggerlo. Ci sono essenzialmente due tipi di crittografia: I la crittografia simmetrica, in cui un’unica chiave (nota solo a mittente e destinatario) permette di crittare e decrittare il messaggio; I la crittografia asimmetrica, in cui si usa una chiave pubblica (nota a tutti) per crittare il messaggio e una chiave privata (nota solo al destinatario) per decrittarlo. Uno dei primi sistemi di crittografia asimmetrica fu inventato nel 1977 da Rivest, Shamir e Adleman, basandosi proprio sulla facilità di trovare due numeri primi grandi e sulla difficoltà di fattorizzarne il prodotto. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Divisione con resto Teorema Dati due interi a e n con n > 0, esistono unici due altri interi q e r (detti quoziente e resto della divisione di a per n) tali che I a = qn + r I 0≤r <n Il resto della divisione di a per n si chiama a modulo n e si indica a mod n Chiaramente a mod n = 0 se e solo se n | a. Esempio Se n = 10 e a ≥ 0, q si ottiene da a cancellando l’ultima cifra, mentre r è proprio l’ultima cifra di a (scritto come al solito in base 10). Quindi, per esempio, 216 = 21 × 10 + 6 e 216 mod 10 = 6. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Algoritmo RSA Preliminarmente il destinatario I sceglie (opportunamente) due numeri primi p e q Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Algoritmo RSA Preliminarmente il destinatario I sceglie (opportunamente) due numeri primi p e q I calcola n := pq Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Algoritmo RSA Preliminarmente il destinatario I sceglie (opportunamente) due numeri primi p e q I calcola n := pq I calcola m := mcm(p − 1, q − 1) Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Algoritmo RSA Preliminarmente il destinatario I sceglie (opportunamente) due numeri primi p e q I calcola n := pq I calcola m := mcm(p − 1, q − 1) I sceglie un intero 1 < c < m tale che mcd(c, m) = 1 Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Algoritmo RSA Preliminarmente il destinatario I sceglie (opportunamente) due numeri primi p e q I calcola n := pq I calcola m := mcm(p − 1, q − 1) I sceglie un intero 1 < c < m tale che mcd(c, m) = 1 I trova un intero 0 ≤ d < m tale che (cd) mod m = 1 Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Algoritmo RSA Preliminarmente il destinatario I sceglie (opportunamente) due numeri primi p e q I calcola n := pq I calcola m := mcm(p − 1, q − 1) I sceglie un intero 1 < c < m tale che mcd(c, m) = 1 I trova un intero 0 ≤ d < m tale che (cd) mod m = 1 I divulga n e c (la chiave pubblica), mentre tiene segreti p, q, m e d (la chiave privata) Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Algoritmo RSA Preliminarmente il destinatario I sceglie (opportunamente) due numeri primi p e q I calcola n := pq I calcola m := mcm(p − 1, q − 1) I sceglie un intero 1 < c < m tale che mcd(c, m) = 1 I trova un intero 0 ≤ d < m tale che (cd) mod m = 1 I divulga n e c (la chiave pubblica), mentre tiene segreti p, q, m e d (la chiave privata) Per mandare un intero 0 ≤ a < n (ogni messaggio si può trasformare in questa forma, eventualmente spezzandolo) il mittente I calcola b := ac mod n e manda b Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Algoritmo RSA Preliminarmente il destinatario I sceglie (opportunamente) due numeri primi p e q I calcola n := pq I calcola m := mcm(p − 1, q − 1) I sceglie un intero 1 < c < m tale che mcd(c, m) = 1 I trova un intero 0 ≤ d < m tale che (cd) mod m = 1 I divulga n e c (la chiave pubblica), mentre tiene segreti p, q, m e d (la chiave privata) Per mandare un intero 0 ≤ a < n (ogni messaggio si può trasformare in questa forma, eventualmente spezzandolo) il mittente I calcola b := ac mod n e manda b Infine il destinatario I calcola b d mod n (= a) Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Sicurezza dell’algoritmo RSA La sicurezza dell’algoritmo dipende da alcune assunzioni su cui non ci sono certezze, ma che sembrano molto plausibili grazie ai numerosi esperti che hanno studiato (e continuano a studiare) la questione. In particolare non deve essere possibile risolvere velocemente nessuno dei seguenti problemi: I fattorizzare n I trovare d conoscendo solo n e c I trovare a conoscendo solo n, c e b D’altra parte è noto che vanno prese alcune precauzioni tecniche tra cui evitare che a assuma valori particolari per i quali l’ultimo problema si risolve facilmente. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Aritmetica modulare Dati degli interi a, a0 e n con n > 0, si vede subito che a mod n = a0 mod n ⇐⇒ n | (a0 − a) Proposizione Se a mod n = a0 mod n e b mod n = b 0 mod n, allora (a + b) mod n = (a0 + b 0 ) mod n (ab) mod n = (a0 b 0 ) mod n Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Aritmetica modulare Dati degli interi a, a0 e n con n > 0, si vede subito che a mod n = a0 mod n ⇐⇒ n | (a0 − a) Proposizione Se a mod n = a0 mod n e b mod n = b 0 mod n, allora (a + b) mod n = (a0 + b 0 ) mod n (ab) mod n = (a0 b 0 ) mod n Dimostrazione. Se a0 − a = cn e b 0 − b = dn, si trova (a0 + b 0 ) − (a + b) = (c + d)n a0 b 0 − ab = (cdn + bc + ad)n Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Esponenziale modulare Per calcolare ak mod n (con k > 0) non è necessario calcolare ak . Se k > 1, posso scrivere k = k1 + k2 on 0 < k1 , k2 < k. Essendo ak = ak1 +k2 = ak1 ak2 , se so calcolare ai := aki mod n, allora ak mod n = (a1 a2 ) mod n. Scegliendo k1 = k − 1 e k2 = 1 se k è dispari e k1 = k2 = k2 se k è pari, se ne deduce induttivamente che posso calcolare ak mod n con circa log(k) moltiplicazioni modulari, dunque in tempo polinomiale se k < n. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Massimo comun divisore e minimo comune multiplo Definizione Dati due interi a, b > 0 si definiscono mcd(a, b) := max{k : k | a, k | b} mcm(a, b) := min{k > 0 : a | k, b | k} Osservazione I Se sono note le fattorizzazioni di a e di b, si calcolano facilmente mcd(a, b) e mcm(a, b). Inoltre mcm(a, b) = I ab mcd(a, b) Si definisce allo stesso modo mcd(a, 0) e risulta mcd(a, 0) = a (perché k | 0 per ogni k). Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Algoritmo di Euclide Se a ≥ b > 0, per calcolare mcd(a, b) pongo r1 := a, Alberto Canonaco r2 := b. Aritmetica modulare, numeri primi e crittografia Algoritmo di Euclide Se a ≥ b > 0, per calcolare mcd(a, b) pongo r1 := a, r2 := b. Poi definisco r3 := r1 mod r2 Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Algoritmo di Euclide Se a ≥ b > 0, per calcolare mcd(a, b) pongo r1 := a, r2 := b. Poi definisco r3 := r1 mod r2 e induttivamente, se ri > 0, ri+1 := ri−1 mod ri Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Algoritmo di Euclide Se a ≥ b > 0, per calcolare mcd(a, b) pongo r1 := a, r2 := b. Poi definisco r3 := r1 mod r2 e induttivamente, se ri > 0, ri+1 := ri−1 mod ri Dato che ri+1 < ri , esiste j tale che rj 6= 0 Alberto Canonaco e rj+1 = 0 Aritmetica modulare, numeri primi e crittografia Algoritmo di Euclide Se a ≥ b > 0, per calcolare mcd(a, b) pongo r1 := a, r2 := b. Poi definisco r3 := r1 mod r2 e induttivamente, se ri > 0, ri+1 := ri−1 mod ri Dato che ri+1 < ri , esiste j tale che rj 6= 0 e rj+1 = 0 Allora mcd(a, b) = rj . Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Dimostrazione Dato 2 ≤ i ≤ j, per definizione esiste un intero qi tale che ri−1 = qi ri + ri+1 . Allora mcd(ri−1 , ri ) = mcd(qi ri + ri+1 , ri ) = mcd(ri+1 , ri ) (perché k | ri+1 e k | ri se e solo se k | (qi ri + ri+1 ) e k | ri ). Dunque mcd(a, b) = mcd(r1 , r2 ) = mcd(r2 , r3 ) = · · · = mcd(rj , rj+1 ) = mcd(rj , 0) = rj Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Ulteriori proprietà I Poiché ri+1 < ri < ri−1 , deve essere qi > 0, e quindi ri−1 = qi ri + ri+1 ≥ ri + ri+1 > 2ri+1 Ne segue che l’algoritmo di Euclide richiede circa log(a) passi, e dunque un tempo polinomiale se a < n. I Inoltre, partendo da rj e sostituendo ricorsivamente ri+1 con ri−1 − qi ri , si possono trovare (sempre in tempo polinomiale) due interi x e y tali che ax + by = mcd(a, b). Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Esempio a = r1 = 91, b = r2 = 35 91 = 2 · 35 + 21 (q2 = 2, r3 = 21) 35 = 21 + 14 21 = 14 + 7 (q3 = 1, r4 = 14) (q4 = 1, r5 = 7) 14 = 2 · 7 + 0 (q5 = 2, r6 = 0) Dunque j = 5 e mcd(91, 35) = r5 = 7. Inoltre 7 = 21 − 14 = 21 − (35 − 21) = 2 · 21 − 35 = 2 · (91 − 2 · 35) − 35 = 2 · 91 − 5 · 35 Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Efficienza dell’algoritmo RSA Osserviamo che tutti i calcoli richiesti dall’algoritmo possono essere svolti velocemente (in particolare, in tempo polinomiale): I Già detto che si possono trovare i primi p e q (e ovviamente calcolare n := pq). Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Efficienza dell’algoritmo RSA Osserviamo che tutti i calcoli richiesti dall’algoritmo possono essere svolti velocemente (in particolare, in tempo polinomiale): I Già detto che si possono trovare i primi p e q (e ovviamente calcolare n := pq). I Con l’algoritmo di Euclide si calcola m := mcm(p − 1, q − 1) = (p − 1)(q − 1) mcd(p − 1, q − 1) e si trova 1 < c < m tale che mcd(c, m) = 1. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Efficienza dell’algoritmo RSA Osserviamo che tutti i calcoli richiesti dall’algoritmo possono essere svolti velocemente (in particolare, in tempo polinomiale): I Già detto che si possono trovare i primi p e q (e ovviamente calcolare n := pq). I Con l’algoritmo di Euclide si calcola m := mcm(p − 1, q − 1) = (p − 1)(q − 1) mcd(p − 1, q − 1) e si trova 1 < c < m tale che mcd(c, m) = 1. I Inoltre si trovano due interi x e y tali che cx + my = 1. Dunque (cx) mod m = 1 e allora d := x mod m verifica 0 ≤ d < m e (cd) mod m = 1. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Efficienza dell’algoritmo RSA Osserviamo che tutti i calcoli richiesti dall’algoritmo possono essere svolti velocemente (in particolare, in tempo polinomiale): I Già detto che si possono trovare i primi p e q (e ovviamente calcolare n := pq). I Con l’algoritmo di Euclide si calcola m := mcm(p − 1, q − 1) = (p − 1)(q − 1) mcd(p − 1, q − 1) e si trova 1 < c < m tale che mcd(c, m) = 1. I Inoltre si trovano due interi x e y tali che cx + my = 1. Dunque (cx) mod m = 1 e allora d := x mod m verifica 0 ≤ d < m e (cd) mod m = 1. I Con l’esponenziale modulare si calcolano b := ac mod n e b d mod n. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Caratterizzazione dei numeri primi Proposizione Sia p un numero primo e siano a e b due interi tali che p | (ab). Allora p | a o p | b. Dimostrazione. Se p | b, OK. Altrimenti mcd(b, p) = 1, e dunque esistono x e y tali che bx + py = 1. Essendo ab = pk per qualche k, si trova a = a(bx + py ) = abx + apy = pkx + pay = p(kx + ay ), il che dimostra che p | a. Osservazione Con questo si dimostra il teorema fondamentale dell’aritmetica. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Teorema cinese del resto Siano n1 e n2 due interi positivi tali che mcd(n1 , n2 ) = 1. Dati 0 ≤ a1 < n1 e 0 ≤ a2 < n2 , esiste unico 0 ≤ a < n1 n2 tale che ( a mod n1 = a1 a mod n2 = a2 Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Teorema cinese del resto Siano n1 e n2 due interi positivi tali che mcd(n1 , n2 ) = 1. Dati 0 ≤ a1 < n1 e 0 ≤ a2 < n2 , esiste unico 0 ≤ a < n1 n2 tale che ( a mod n1 = a1 a mod n2 = a2 Dimostrazione. Dato che sia a che (a1 , a2 ) possono assumere n1 n2 valori, basta dimostrare l’unicità della soluzione. Se a e a0 sono due soluzioni del sistema, allora n1 | (a0 − a) e n2 | (a0 − a). Questo implica che mcm(n1 , n2 ) = n1 n2 = n1 n2 | (a0 − a), mcd(n1 , n2 ) e quindi a0 = a perché 0 ≤ a, a0 < n1 n2 . Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Piccolo teorema di Fermat Sia p un numero primo e a un intero tale che a mod p 6= 0. Allora ap−1 mod p = 1 Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Piccolo teorema di Fermat Sia p un numero primo e a un intero tale che a mod p 6= 0. Allora ap−1 mod p = 1 Osservazione Questo teorema fornisce un criterio molto veloce per vedere se un intero n > 1 non è primo: scelto 0 < a < n, se an−1 mod n 6= 1, sicuramente n non è primo. Se invece an−1 mod n = 1, non si può concludere che n è primo, ma una semplice variante di questo criterio (ripetuto per un numero abbastanza grande di valori di a) permette di sapere che n è molto probabilmente primo. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Dimostrazione Per i = 0, 1, . . . , p − 1 sia ai := (ai) mod p. Se ai = aj , allora p | (ai − aj) = a(i − j) Per ipotesi p - a, dunque p | (i − j). Dato che 0 ≤ i, j < p, questo implica i = j. Visto che a0 = 0, ne segue che {a1 , . . . , ap−1 } = {1, . . . , p − 1} Posto r := 1 · · · (p − 1), si ha ap−1 r = a(2a) · · · ((p − 1)a), e quindi (ap−1 r ) mod p = (a1 · · · ap−1 ) mod p = r mod p Pertanto p | (ap−1 r − r ) = r (ap−1 − 1), e, tenendo conto che p - r (perché p - i per 0 < i < p), si ottiene p | (ap−1 − 1), da cui si deduce subito ap−1 mod p = 1. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Correttezza dell’algoritmo RSA p e q primi distinti, n := pq, m := mcm(p − 1, q − 1), c, d > 0 tali che (cd) mod m = 1. Devo dimostrare che dato 0 ≤ a < n e posto b := ac mod n, vale b d mod n = a. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Correttezza dell’algoritmo RSA p e q primi distinti, n := pq, m := mcm(p − 1, q − 1), c, d > 0 tali che (cd) mod m = 1. Devo dimostrare che dato 0 ≤ a < n e posto b := ac mod n, vale b d mod n = a. Essendo b d mod n = (ac )d mod n = acd mod n, devo quindi dimostrare acd mod n = a, che per il teorema cinese equivale a ( acd mod p = a mod p acd mod q = a mod q Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Correttezza dell’algoritmo RSA p e q primi distinti, n := pq, m := mcm(p − 1, q − 1), c, d > 0 tali che (cd) mod m = 1. Devo dimostrare che dato 0 ≤ a < n e posto b := ac mod n, vale b d mod n = a. Essendo b d mod n = (ac )d mod n = acd mod n, devo quindi dimostrare acd mod n = a, che per il teorema cinese equivale a ( acd mod p = a mod p acd mod q = a mod q Per simmetria basta dimostrare la prima uguaglianza. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Correttezza dell’algoritmo RSA p e q primi distinti, n := pq, m := mcm(p − 1, q − 1), c, d > 0 tali che (cd) mod m = 1. Devo dimostrare che dato 0 ≤ a < n e posto b := ac mod n, vale b d mod n = a. Essendo b d mod n = (ac )d mod n = acd mod n, devo quindi dimostrare acd mod n = a, che per il teorema cinese equivale a ( acd mod p = a mod p acd mod q = a mod q Per simmetria basta dimostrare la prima uguaglianza. Se a mod p = 0, anche acd mod p = 0. Alberto Canonaco Aritmetica modulare, numeri primi e crittografia Correttezza dell’algoritmo RSA p e q primi distinti, n := pq, m := mcm(p − 1, q − 1), c, d > 0 tali che (cd) mod m = 1. Devo dimostrare che dato 0 ≤ a < n e posto b := ac mod n, vale b d mod n = a. Essendo b d mod n = (ac )d mod n = acd mod n, devo quindi dimostrare acd mod n = a, che per il teorema cinese equivale a ( acd mod p = a mod p acd mod q = a mod q Per simmetria basta dimostrare la prima uguaglianza. Se a mod p = 0, anche acd mod p = 0. Se a mod p 6= 0, osservo che cd = 1 + (p − 1)k per qualche k (perché (cd) mod m = 1 e (p − 1) | m), e quindi acd = a(ap−1 )k . Usando il piccolo teorema di Fermat concludo che acd mod p = (a(ap−1 )k ) mod p = (a · 1k ) mod p = a mod p Alberto Canonaco Aritmetica modulare, numeri primi e crittografia