Algoritmul Berlekamp-Rabin (de asemenea metoda lui Berlekamp ) este o metodă probabilistică pentru găsirea rădăcinilor polinoamelor într- un câmp cu complexitate polinomială . Metoda a fost descrisă de matematicianul american Alvin Berlekamp în 1970 [1] ca o derivație a algoritmului de factorizare pentru polinoame peste câmpuri finite și a fost ulterior (în 1979) modificată de Michael Rabin pentru cazul câmpurilor finite arbitrare [2] . Versiunea originală a algoritmului propus de Berlekamp în 1967 [3] nu era polinomială [4] . Versiunea algoritmului publicată în 1970 pe baza rezultatelor lui Zassenhaus a lucrat cu valori mari ale , în care metoda titlului a fost folosită ca ajutor [1] . La momentul publicării, metoda era comună în mediul profesional, dar rar întâlnită în literatură [4] .
Metoda a fost propusă de Alvin Berlekamp în lucrarea sa despre factorizarea polinoamelor pe câmpuri finite [1] . În ea, factorizarea unui polinom în factori ireductibili dintr-un câmp se reduce la găsirea rădăcinilor altor polinoame peste un câmp . În același timp, în lucrarea originală nu a existat nicio dovadă a corectitudinii algoritmului [2] . Algoritmul a fost finalizat și generalizat în cazul câmpurilor finite arbitrare de Michael Rabin [2] . În 1986, René Peralta a descris un algoritm similar [5] care rezolvă problema găsirii rădăcinii pătrate într-un câmp [6] , iar în 2000 metoda lui Peralta a fost generalizată pentru a rezolva ecuațiile cubice [7] .
În algoritmul lui Berlekamp , un polinom este mai întâi reprezentat ca un produs , unde este produsul polinoamelor de grad . Apoi factorizarea fiecărui astfel de polinom de grad se reduce la găsirea rădăcinilor noului polinom de grad . Articolul de introducere a algoritmului de factorizare a propus trei metode de găsire a rădăcinilor unui polinom într- un câmp Galois . Primele două reduc găsirea rădăcinilor într-un câmp la găsirea rădăcinilor într-un câmp . A treia metodă, care face obiectul acestui articol, rezolvă problema găsirii rădăcinilor în câmpul , care, împreună cu celelalte două, rezolvă problema factorizării [1] .
Versiunea algoritmului de factorizare propusă de Berlekamp în prima sa lucrare din 1967 [3] a rulat în , unde este numărul de factori ireductibili ai polinomului. Astfel, algoritmul a fost non-polinom și a fost nepractic atunci când numărul prim era suficient de mare. În 1969, această problemă a fost rezolvată de Hans Zassenhaus , care a arătat cum se reduce blocajul algoritmului la problema găsirii rădăcinilor unui polinom [4] . În 1970, articolul lui Berlekamp a fost republicat, ținând cont de soluțiile lui Zassenhaus [1] .
În 1980, Michael Rabin a efectuat o analiză riguroasă a algoritmului, l-a generalizat pentru a lucra cu câmpuri finite de forma , și a demonstrat că probabilitatea de eroare a unei iterații a algoritmului nu depășește [2] , iar în 1981 Michael Ben- Sau a consolidat această estimare la , unde — numărul de rădăcini diferite ale polinomului [8] . Întrebarea existenței unui algoritm determinist polinom pentru găsirea rădăcinilor unui polinom peste un câmp finit rămâne deschisă - principalii algoritmi de factorizare polinomială , algoritmul Berlekamp și algoritmul Cantor-Zassenhaus sunt probabilistice. În 1981, Paul Camion a arătat [9] că un astfel de algoritm există pentru orice număr dat , dar acest rezultat este pur teoretic și întrebarea posibilității de a construi mulțimile descrise de el în practică rămâne deschisă [10] .
În prima ediție a celui de-al doilea volum din „The Art of Programming ” despre algoritmi numerici, Donald Knuth scrie că proceduri similare de factorizare erau cunoscute până în 1960, dar au fost rareori găsite în domeniul public [4] . Unul dintre primele exemple publicate de utilizare a metodei poate fi găsit în lucrarea lui Golomb , Welsh și Hales din 1959 privind factorizarea trinoamelor peste , unde a fost luat în considerare un caz special [11] .
Fie un număr prim impar. Se consideră un polinom peste câmpul resturilor modulo . Este necesar să găsiți toate numerele astfel încât pentru toate posibilele [2] [12] .
Lasă . Găsirea tuturor rădăcinilor unui astfel de polinom este echivalentă cu împărțirea lui în factori liniari. Pentru a găsi o astfel de partiție, este suficient să învățați cum să împărțiți polinomul în oricare doi factori și apoi să rulați recursiv în ei. Pentru a face acest lucru, introducem un polinom , unde este un număr aleator din . Dacă un astfel de polinom poate fi reprezentat ca un produs , atunci în ceea ce privește polinomul original aceasta înseamnă că , ceea ce dă o factorizare a polinomului original [1] [12] .
Conform criteriului Euler, pentru orice monom este îndeplinită exact una dintre următoarele proprietăți [1] :
Astfel, dacă nu este divizibil cu , ceea ce poate fi verificat separat, atunci este egal cu produsul celor mai mari divizori comuni și [12] .
Cele de mai sus conduce la următorul algoritm [1] :
Dacă este, de asemenea, împărțit la un polinom care nu are rădăcini în , atunci când se calculează cu și , se va obține o partiție a polinomului fără pătrat în factori netriviali, astfel încât algoritmul vă permite să găsiți toate rădăcinile oricărui polinoame peste , și nu doar cele care sunt rupte într-un produs de monomii [12] .
Să fie necesar să se rezolve o comparație ale cărei soluții sunt elementele și respectiv. Găsirea lor este echivalentă cu factorizarea unui polinom peste un câmp . În acest caz particular, problema este simplificată, deoarece pentru soluție este suficient să calculați numai . Pentru polinomul rezultat, exact una dintre afirmații va fi adevărată:
În al treilea caz, monomul rezultat trebuie să fie egal cu sau , sau . Acest lucru permite ca soluția să fie scrisă ca [1] .
ExempluSă rezolvăm comparația . Pentru a face acest lucru, trebuie să factorizați . Să luăm în considerare valorile posibile :
Verificarea arată că și este validă .
Algoritmul găsește o partiție în factori non-triviali în toate cazurile, cu excepția celor în care toate numerele sunt reziduuri sau nereziduuri în același timp. Conform teoriei ciclotomiei [1] , probabilitatea unui astfel de eveniment pentru cazul în care ei înșiși sunt ambele reziduuri sau nereziduuri în același timp (adică atunci când nu este potrivit pentru procedura noastră) poate fi estimată ca [8] , unde este numărul de numere diferite dintre [1] . Astfel, probabilitatea de eroare a algoritmului nu depășește .
Din teoria câmpurilor finite se știe că, dacă gradul unui polinom ireductibil este , atunci un astfel de polinom este un divizor și nu este un divizor pentru .
Astfel, luând în considerare secvențial polinoamele unde și pentru , putem împărți polinomul în factori de forma , unde este produsul tuturor polinoamelor ireductibile de grad care împart polinomul . Cunoscând gradul de , putem determina numărul de astfel de polinoame egal cu . Lasă . Dacă luăm în considerare polinomul , unde , atunci ordinea unui astfel de polinom în câmp trebuie să împartă numărul . Dacă nu este divizibil cu , atunci polinomul este divizibil cu , dar nu cu .
Pe baza acestui fapt, Zassenhaus a sugerat să se caute divizori ai unui polinom sub forma , unde este un divizor suficient de mare , de exemplu, . Într-un caz particular , exact metoda Berlekamp este obținută așa cum este descris mai sus [4] .
Pas cu pas, timpul de rulare a unei iterații a algoritmului poate fi estimat după cum urmează, presupunând că gradul polinomului este :
Astfel, o iterație a algoritmului poate fi efectuată pentru operații aritmetice cu elemente , iar găsirea tuturor rădăcinilor polinomului necesită o medie [8] . În cazul particular al extragerii rădăcinii pătrate, valoarea este două, deci timpul de rulare este estimat ca o iterație a algoritmului [12] .
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 |