Test de simplitate

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 21 mai 2020; verificarea necesită 1 editare .

Întrebarea de a determina dacă un număr natural este prim este cunoscută ca problema primalității.

Un test de primalitate (sau test de primalitate) este un algoritm care, luând ca intrare un număr , permite fie să nu confirme ipoteza despre compoziția numărului, fie să afirme cu acuratețe simplitatea acestuia. În al doilea caz, se numește adevăratul test de primalitate. Astfel, testul de primalitate este doar o ipoteză conform căreia, dacă algoritmul nu confirmă ipoteza că numărul este compus , atunci acest număr poate fi prim cu o anumită probabilitate . Această definiție implică mai puțină încredere în conformitatea rezultatului testului cu adevărata stare de fapt decât un test de primalitate adevărată, care dă un rezultat verificat matematic.

Introducere

Problemele de matematică discretă sunt printre cele mai complexe din punct de vedere matematic . Una dintre ele este problema factorizării , care constă în găsirea factorizării unui număr în factori primi. Pentru a o rezolva, trebuie să găsiți numere prime, ceea ce duce la problema simplității. Problema testului de primalitate aparține clasei de complexitate P , adică timpul de rulare al algoritmilor de rezolvare a acesteia depinde polinomial de mărimea datelor de intrare, ceea ce a fost dovedit în 2002 . Există o afirmație similară, dar nedovedită, pentru problema factorizării .

Unele aplicații ale matematicii care utilizează factorizarea necesită o serie de numere prime foarte mari alese la întâmplare. Algoritmul pentru obținerea lor, bazat pe postulatul lui Bertrand :

Algoritm:

  1. Intrare : număr natural
  2. Soluție (căutați un număr prim aleatoriu P)
    1. Funcția de a genera un număr natural arbitrar pe un segment
    2. Dacă este compus, atunci
      1. Dacă atunci
    3. Returnează „  - prim aleatoriu”

Timpul pentru rezolvarea problemei prin acest algoritm nu este definit, dar există o mare probabilitate ca acesta să fie întotdeauna polinomial, atâta timp cât există suficiente numere prime și sunt distribuite mai mult sau mai puțin uniform . Pentru numere aleatoare simple, aceste condiții sunt îndeplinite.

Se știe ( teorema lui Euclid ) că mulțimea primelor este infinită. Teorema lui Dirichlet ( 1837 ) spune că dacă mcd , atunci există infinit de numere prime congruente cu modulo . Cu alte cuvinte, numerele prime sunt distribuite uniform în clase de reziduuri conform funcției Euler [1] pentru orice valoare a lui . Cu toate acestea, dacă numerele prime sunt distribuite uniform, dar sunt foarte puține, căutarea poate să nu fie posibilă în practică. Pentru a rezolva această a doua problemă, folosim Teorema numerelor prime ( 1896 ), conform căreia numărul de numere prime dintr-un interval crește cu . Acest număr tinde la infinit destul de repede, din care putem concluziona că și pentru valori mari există o probabilitate destul de mare ( ) de a găsi un număr prim la întâmplare. Din aceasta putem concluziona că algoritmul descris mai sus poate da răspunsul în timp polinomial dacă există un algoritm polinomial care ne permite să verificăm simplitatea unui număr arbitrar de mare , ceea ce duce la problema primalității.

Informații istorice

Prima mențiune a numerelor prime este cunoscută de la Euclid ( secolul al III-lea î.Hr. ). În același timp, primul algoritm pentru găsirea numerelor prime a fost inventat de Eratosthenes ( secolul II î.Hr. ) și este acum cunoscut sub numele de sita lui Eratosthenes . Esența sa constă în excluderea secvențială din lista numerelor întregi de la multiplii altor numere prime găsite deja de „sită” [2] . Mult mai târziu, matematicianul arab Ibn al-Banna a propus enumerarea numerelor întregi nu până la , ci până la , ceea ce a făcut posibilă reducerea numărului de operații. Dezavantajul acestei metode este că, în loc să verifice un număr dat pentru simplitate, oferă o enumerare secvențială [3] a tuturor numerelor întregi până la , și, prin urmare, este ineficientă și necesită o putere de calcul semnificativă .

La începutul secolului al XIII-lea, Leonardo din Pisa , cunoscut sub numele de Fibonacci, a propus o secvență de numere (numită după el), una dintre proprietățile căreia este că --lea număr Fibonacci poate fi doar prim pentru numerele prime , cu excepția lui . Această proprietate poate fi utilizată atunci când se testează numerele Fibonacci pentru primalitate. El, de asemenea, independent de ibn al-Banna, a propus o metodă de verificare a simplității numerelor prin enumerare. Acest algoritm este adevărat (sau improbabil) deoarece răspunsul este întotdeauna obținut, dar extrem de ineficient.

Primul care a folosit relațiile dintre numere pentru a defini primalitatea a fost Pietro Antonio Cataldi în lucrarea sa despre numerele perfecte. Numerele perfecte sunt acelea care sunt egale cu suma propriilor divizori. Primele șapte numere perfecte sunt 6, 28, 496, 8128, 33550336, 8589869056 și 137438691328. Cataldi a stabilit că dacă un număr  este prim și numărul  este de asemenea prim, atunci numărul  este perfect.

În secolul al XVII-lea, matematicianul francez Marin Mersenne s-a angajat în studiul numerelor de forma [4] , numit mai târziu numere Mersenne în cinstea sa . Mersenne a descoperit că dintre primele 257 de numere Mersenne, doar 11 sunt prime (pentru n = 2, 3, 5, 7, 13, 17, 19, 31, 67, 127 și 257). Făcând acest lucru, a făcut mai multe greșeli ( nu este prim la p = 67 sau 257 și este la p = 61, 89 și 107). Căutarea numerelor prime printre numerele Mersenne este destul de simplă datorită testului Luc-Lehmer , care vă permite să găsiți o soluție relativ rapid. De aceea, numerele Mersenne sunt cele mai mari dintre numerele prime cunoscute în prezent. În corespondența dintre Mersenne și Fermat s-au exprimat mai multe idei cu privire la numerele prime [4] .

Deci, Fermat a descoperit că, dacă un întreg nu este divizibil cu un număr prim , atunci numărul este întotdeauna divizibil cu ( Mica Teoremă a lui Fermat ). Teorema a fost generalizată mai târziu de Euler . Mai multe teste de primalitate se bazează pe Teorema Mică a lui Fermat. Fermat a sugerat, de asemenea, că numerele de formă pentru toate numerele naturale sunt prime . Acesta este într-adevăr cazul pentru . Un contraexemplu la această afirmație a fost găsit de Euler— . Pentru a testa numerele Fermat pentru primalitate, există un test Pepin eficient . Până în prezent, nu au fost găsite numere prime Fermat noi.

Printre alți oameni de știință, Euler, Legendre , Gauss s-au ocupat de simplitatea numerelor . Rezultate semnificative în rezolvarea problemei primalității au fost obținute de matematicianul francez Édouard Lucas în lucrarea sa despre numerele Fermat și Mersenne. Este criteriul pentru simplitatea numerelor Mersenne date de el, care este acum cunoscut sub numele de testul Lucas-Lehmer.

În 2002, a fost dezvoltat un test de primalitate polinomială deterministă, testul Agrawal-Kayal-Saxena . Apariția sa a fost prezisă de existența certificatelor de primalitate polinomială și, în consecință, de faptul că problema verificării primarității unui număr a aparținut claselor NP și co-NP în același timp.

Teste de primalitate adevărată

Algoritmii existenți pentru testarea unui număr pentru primalitate pot fi împărțiți în două categorii: teste de primalitate adevărată și teste de primalitate probabilistică. Testele adevărate ca rezultat al calculelor scot întotdeauna la iveală faptul simplității sau compoziției unui număr, un test probabilistic oferă un răspuns despre compoziția unui număr sau necompunerea acestuia cu o oarecare probabilitate [2] [4] . Pentru a spune simplu, algoritmul probabilistic spune că numărul cel mai probabil nu este compus, dar în cele din urmă se poate dovedi fie prim, fie compus. Numerele care satisfac testul de primalitate probabilistică, dar sunt compuse, se numesc pseudoprime [1] . Un exemplu de astfel de numere sunt numerele Carmichael [3] . De asemenea, puteți numi numerele Euler-Jacobi pentru testul Solovay-Strassen și pseudoprimele Lucas.

Un exemplu de teste de primalitate adevărată este testul Luc-Lehmer pentru numerele Mersenne . Dezavantajul evident al acestui test este că se aplică doar unui număr de anumite tipuri de numere. Alte exemple includ cele bazate pe Mica Teoremă a lui Fermat :

Precum și:

Teste de primalitate probabilistică

Această categorie include:

Teste de simplitate în criptografie

În prezent, numerele prime sunt utilizate pe scară largă în domeniul securității informațiilor. În primul rând, acest lucru se datorează invenției metodei de criptare a cheii publice, care este utilizată în criptarea informațiilor și în algoritmii de semnătură digitală electronică . În prezent, conform standardelor, dimensiunea numerelor prime utilizate la formarea unei semnături digitale folosind curbe eliptice este, în conformitate cu GOST R 34.10-2012, de cel puțin 254 de biți. Pentru numere atât de mari, problema determinării primei unui număr este extrem de dificilă. Metodele simple, cum ar fi metoda de enumerare, sunt nepotrivite pentru utilizare datorită faptului că necesită o cantitate extrem de mare de resurse de calcul și o cantitate mare de timp [6] .

De asemenea, determinarea primei unui număr este necesară atunci când spargerea informațiilor criptate sau semnate folosind algoritmul RSA . Pentru a deschide un astfel de mesaj, este necesar să puteți descompune un număr în doi factori primi, ceea ce este o sarcină netrivială pentru numerele mari.

Pe de altă parte, atunci când se generează chei pentru criptosisteme cu cheie publică , scheme de semnătură electronică etc., sunt folosite numere prime mari pseudoaleatoare. De exemplu, atunci când utilizați protocolul Diffie-Hellman, este necesar să aveți un număr prim care să specifice câmpul final . Prin urmare, utilizarea unui test de primalitate eficient face posibilă creșterea fiabilității algoritmilor pentru generarea unor astfel de chei.

Vezi și

Note

  1. 1 2 Kormen T., Leiser C. Algoritmi. Construcție și analiză. - M. : MTSNMO, 2002. - S. 765-772.
  2. 1 2 Vasilenko O. N. Algoritmi de teorie numerică în criptografie. - M. : MTSNMO, 2003. - 328 p.
  3. 1 2 Crandall R., Pomerance C. Prime Numbers: A Computational Perspective. — Springer, 2005.
  4. 1 2 3 Donald Knuth . Arta programarii, volumul 2. Algoritmi derivati. - M .: „Williams” , 2007.
  5. Nesterenko Yu. V. Introducere în criptografie. - Petru, 2001. - 288 p.
  6. B. Schneier. Criptografia aplicată. - S. 296-300.

Literatură