Testul Miller-Rabin este un test de primalitate polinomială probabilistică . Testul Miller-Rabin, împreună cu testul Fermat și testul Solovay-Strassen , pot determina în mod eficient dacă un anumit număr este compus . Cu toate acestea, nu poate fi folosit pentru a demonstra riguros că un număr este prim . Cu toate acestea, testul Miller-Rabin este adesea folosit în criptografie pentru a genera numere prime aleatorii mari .
Algoritmul Miller-Rabin este o modificare a algoritmului Miller dezvoltat de Gary Miller în 1976 . Algoritmul lui Miller este determinist , dar corectitudinea lui se bazează pe ipoteza Riemann extinsă nedovedită [1] . Michael Rabin l-a modificat în 1980 [2] . Algoritmul Miller-Rabin nu depinde de validitatea ipotezei, ci este probabilist.
Deoarece puterea criptografică a multor algoritmi de criptare se bazează pe chei secrete, care necesită numere prime pentru a fi create (de exemplu, așa funcționează cifrul RSA ), atunci când creați astfel de chei, este important să puteți verifica rapid numerele mari pentru primalitate. Testele de primalitate probabilistică, cum ar fi testul Miller-Rabin și testul Solovay-Strassen , arată o eficiență mai mare de utilizare și ușurință de exprimare în comparație cu testele deterministe [3] . Algoritmul Miller-Rabin vă permite să efectuați o verificare într-un timp scurt și, în același timp, să oferiți o probabilitate destul de mică ca numărul să fie de fapt compus. [patru]
La fel ca testele Fermat și Nightingale-Strassen , testul Miller-Rabin se bazează pe verificarea unei serii de egalități care sunt valabile pentru numerele prime. Dacă cel puțin o astfel de egalitate eșuează, se demonstrează că numărul este compus [5] .
Pentru testul Miller-Rabin, se utilizează următoarea afirmație:
Fie un număr prim și , unde este impar. Atunci pentru oricare dintre cel puțin una dintre următoarele condiții este îndeplinită:
|
În câmpul final (pentru prim ) nu există rădăcini pătrate ale unității, cu excepția numerelor 1 , -1 |
Lăsa:
Apoi:
După lema lui Euclid :
După mica teoremă a lui Fermat :
Vom extrage rădăcinile pătrate ale numărului . Conform lemei demonstrate mai sus, la fiecare pas vom obține numărul 1 sau -1 modulo . Dacă la un pas obținem -1 , atunci a doua dintre egalități este îndeplinită. În caz contrar, la ultimul pas (pentru că ), adică prima egalitate va fi îndeplinită.
Dacă această afirmație (condiția 1 sau 2) este îndeplinită pentru unele numere și (nu neapărat prime), atunci numărul se numește martorul prim al lui Miller , iar numărul însuși se numește prim probabil . (La întâmplare , există o șansă de 25% de a confunda un număr compus cu un prim, dar acest lucru poate fi redus prin verificarea altor .)
În cazul în care este satisfăcută contrapoziția afirmației dovedite, adică dacă există un număr astfel încât:
și
atunci numărul nu este prim. În acest caz, numărul este numit un martor că numărul este compus.
Pentru numerele compuse impare , conform teoremei lui Rabin , nu mai există martori ai simplității, unde este funcția Euler , deci probabilitatea ca un număr ales aleatoriu să fie martor al simplității este mai mică de 1/4 [2] [6] .
Ideea testului este de a verifica numerele selectate aleatoriu , dacă acestea sunt martori ai primului numărului . Dacă există dovezi că numărul este compus, atunci numărul este într-adevăr compus. Dacă numerele au fost verificate și toate s-au dovedit a fi prime, atunci numărul este considerat prim. Pentru un astfel de algoritm, probabilitatea de a lua un număr compus pentru un număr prim va fi mai mică [7] .
Pentru a verifica numerele mari, se obișnuiește să se aleagă numere aleatoare, deoarece distribuția martorilor de primalitate și a martorilor unui număr compus între numerele 1, 2, ..., n − 1 nu este cunoscută dinainte. În special, Arnolt [8] oferă un număr compus de 397 de biți, pentru care toate numerele mai mici de 307 sunt dovezi ale simplității.
Să presupunem că vrem să determinăm dacă n = 221 este prim. Să scriem n − 1 = 220 ca 2 2 55, deci s = 2 și d = 55. Alegem în mod arbitrar un număr a astfel încât 0 < a < n , să spunem a = 174. Să trecem la calcule:
Deoarece 220 ≡ −1 mod n , 221 este fie prim, fie 174 este un martor fals că 221 este prim. Luați un alt a arbitrar , de data aceasta alegând a = 137:
Deoarece 137 este un martor că 221 este compus, numărul 174 a fost de fapt un martor fals al simplității. Rețineți că algoritmul nu ne spune nimic despre factorii lui 221 (care sunt 13 și 17). Cu toate acestea, în unele cazuri, calculele suplimentare ajută la obținerea factorilor numărului. [9]
Algoritmul Miller-Rabin este parametrizat de numărul de runde r . Se recomandă să luăm r de ordinul mărimii , unde n este numărul de verificat.
Pentru un n dat , există un număr întreg s și un număr întreg impar t astfel încât . Se alege un număr aleatoriu a , 1 < a < n . Dacă a nu este martor la primă a numărului n , atunci răspunsul „n este compus” este dat , iar algoritmul se termină. În caz contrar, se selectează un nou număr aleator a și se repetă procedura de verificare. După găsirea r dovezi de simplitate, se dă răspunsul „n este probabil prim” , iar algoritmul se termină [5] .
Algoritmul poate fi scris în pseudocod după cum urmează:
Intrare : n > 2, un număr natural impar de testat pentru primalitate; k este numărul de runde. Ieșire : compus , înseamnă că n este un număr compus; probabil prim înseamnă că n este foarte probabil să fie prim. Reprezentarea n − 1 ca 2 s · t , unde t este impar, se poate face împărțind succesiv n - 1 la 2. bucla A: repetați de k ori: Alegeți un număr întreg aleatoriu a în intervalul [2, n − 2] x ← a t mod n , calculat folosind algoritmul de exponențiere modulo dacă x = 1 sau x = n − 1, apoi treceți la următoarea iterație a buclei A buclei B : repetă s − 1 ori x ← x 2 mod n dacă x = 1, apoi returnează compusul dacă x = n − 1, apoi mergi la următoarea iterație a buclei A returnează compusul returnează probabil primDin teorema lui Rabin rezultă că, dacă k numere alese aleatoriu au fost martori ale primului numărului n , atunci probabilitatea ca n să fie compus nu depășește .
De asemenea, pentru valori mari ale lui n , probabilitatea de a declara un număr compus probabil prim este substanțial mai mică decât 4 - k . Damgard, Landrock și Pomerands [10] au calculat niște limite precise de eroare și au propus o metodă de alegere a valorii lui k pentru a obține limita de eroare dorită. Astfel de limite pot fi utilizate, de exemplu, pentru a genera numere prime probabile. Cu toate acestea, ele nu ar trebui utilizate pentru a testa numerele prime de origine necunoscută, deoarece în sistemele criptografice un cracker poate încerca să înlocuiască un pseudoprim atunci când este necesar un prim. În astfel de cazuri, se poate baza doar pe eroarea 4 − k .
Presupunând că timpul de înmulțire este logaritmic, utilizând înmulțirea rapidă modulo , complexitatea algoritmului este , unde este numărul de runde. Astfel, timpul de rulare al algoritmului este polinom.
Cu toate acestea, folosind FFT , este posibil să se reducă timpul de rulare al algoritmului la . În acest caz, dacă luăm , unde n este numărul de verificat, atunci complexitatea algoritmului este egală cu . [unsprezece]
Dacă numărul a este un martor al simplității numărului impar compus n conform lui Miller, atunci numărul n , la rândul său, se spune că este puternic pseudo -prim în baza a . Dacă un număr n este puternic pseudoprim în baza a , atunci este și pseudoprim Fermat în baza a și Euler-Jacobi pseudoprim în baza a . [3]
De exemplu, pseudoprimele puternice în baza 2 formează secvența:
2047, 3277, 4033, 4681, 8321, 15841, 29341, 42799, 49141, 52633, 65281, 74665, … ( secvența OEIS A001262 )iar în baza 3, secvența:
121, 703, 1891, 3281, 8401, 8911, 10585, 12403, 16531, 18721, 19345, 23521, 31621, … ( secvența OEIS A020229 ) ![]() |
---|
Algoritmi teoretici numerelor | |
---|---|
Teste de simplitate | |
Găsirea numerelor prime | |
Factorizarea | |
Logaritm discret | |
Găsirea GCD | |
Modul de aritmetică | |
Înmulțirea și împărțirea numerelor | |
Calcularea rădăcinii pătrate |