Algoritmus Berlekamp-Rabin (také Berlekampova metoda ) je pravděpodobnostní metoda pro nalezení kořenů polynomů na poli s polynomiální složitostí. Metoda byla popsána americkým matematikem Alvinem Berlekampem v roce 1970 [1] jako vedlejší produkt faktorizačního algoritmu pro polynomy nad konečnými tělesy a později (v roce 1979) byla upravena Michaelem Rabinem pro případ libovolných konečných těles [2]. . Původní verze algoritmu navržená Berlekampem v roce 1967 [3] nebyla polynomická [4] . Verze algoritmu publikovaná v roce 1970 na základě výsledků Zassenhaus pracovala s velkými hodnotami , ve které byla jako pomocník použita metoda title [1] . V době publikace byla metoda běžná v odborném prostředí, v literatuře se však nacházela jen zřídka [4] .
Metodu navrhl Alvin Berlekamp ve své práci na faktorizaci polynomů nad konečnými tělesy [1] . V tom je faktorizace polynomu na ireducibilní faktory nad polem redukována na nalezení kořenů některých dalších polynomů nad polem . Přitom v původní práci nebyl žádný důkaz o správnosti algoritmu [2] . Algoritmus dokončil a zobecnil na případ libovolných konečných polí Michael Rabin [2] . V roce 1986 popsal René Peralta podobný algoritmus [5] , který řeší problém hledání druhé odmocniny v poli [6] , a v roce 2000 byla Peraltova metoda zobecněna pro řešení kubických rovnic [7] .
V Berlekampově algoritmu je polynom nejprve reprezentován jako součin , kde je součin polynomů stupně . Potom faktorizace každého takového polynomu stupně je redukována na nalezení kořenů nového polynomu stupně . Článek představující faktorizační algoritmus také navrhl tři metody pro nalezení kořenů polynomu v Galoisově poli . První dva redukují hledání kořenů v poli na hledání kořenů v poli . Třetí metoda, která je předmětem tohoto článku, řeší problém hledání kořenů v poli , který spolu s dalšími dvěma řeší problém faktorizace [1] .
Verze faktorizačního algoritmu navržená Berlekampem ve svém prvním článku v roce 1967 [3] běžela v roce , kde je počet ireducibilních faktorů polynomu. Algoritmus byl tedy nepolynomiální a byl nepraktický, když bylo prvočíslo dostatečně velké. V roce 1969 tento problém vyřešil Hans Zassenhaus , který ukázal, jak redukovat úzké hrdlo algoritmu na problém hledání kořenů nějakého polynomu [4] . V roce 1970 byl znovu publikován Berlekampův článek s přihlédnutím k řešením Zassenhause [1] .
V roce 1980 provedl Michael Rabin rigorózní analýzu algoritmu, zobecnil jej pro práci s konečnými poli tvaru a dokázal, že pravděpodobnost chyby jedné iterace algoritmu nepřesahuje [2] a v roce 1981 Michael Ben- Nebo posílil tento odhad na , kde — počet různých kořenů polynomu [8] . Otázka existence polynomiálního deterministického algoritmu pro hledání kořenů polynomu nad konečným polem zůstává otevřená - hlavní algoritmy rozkladu polynomů, Berlekampův algoritmus a Cantor-Zassenhausův algoritmus jsou pravděpodobnostní. V roce 1981 Paul Camion ukázal [9] , že takový algoritmus existuje pro jakékoli dané číslo , ale tento výsledek je čistě teoretický a otázka možnosti sestrojení jím popisovaných množin v praxi zůstává otevřená [10] .
V prvním vydání druhého svazku „ Umění programování “ o numerických algoritmech Donald Knuth píše, že podobné faktorizační postupy byly známy již v roce 1960, ale jen zřídka se nacházely ve veřejné doméně [4] . Jeden z prvních publikovaných příkladů použití metody lze nalézt v práci Golomba , Welshe a Halese z roku 1959 o faktorizaci trinomů nad , kde byl zvažován zvláštní případ [11] .
Nechť je liché prvočíslo. Uvažujme polynom nad polem zbytků modulo . Je potřeba najít všechna čísla taková, aby pro všechny možné [2] [12] .
Nechte _ Nalezení všech kořenů takového polynomu je ekvivalentní jeho rozdělení na lineární faktory. K nalezení takového rozdělení se stačí naučit, jak rozdělit polynom na libovolné dva faktory, a pak na ně rekurzivně spustit. K tomu zavedeme polynom , kde je náhodné číslo z . Pokud lze takový polynom reprezentovat jako součin , pak v podmínkách původního polynomu to znamená, že , což dává rozklad původního polynomu [1] [12] .
Podle Eulerova kritéria je pro jakýkoli monomiál splněna právě jedna z následujících vlastností [1] :
Pokud tedy není dělitelné , což lze zkontrolovat samostatně, pak se rovná součinu největších společných dělitelů a [12] .
Výše uvedené vede k následujícímu algoritmu [1] :
Pokud je také rozdělen nějakým polynomem , který nemá kořeny v , pak při výpočtu s a získáme rozdělení polynomu bez čtverců na netriviální faktory, takže algoritmus vám umožní najít všechny kořeny libovolného polynomy přes , a nejen ty, které jsou rozděleny do součinu monočlenů [12] .
Nechť je třeba řešit srovnání, jehož řešením jsou prvky a resp. Jejich nalezení je ekvivalentní rozkladu polynomu nad polem . V tomto konkrétním případě je úloha zjednodušena, protože pro řešení stačí vypočítat pouze . Pro výsledný polynom bude pravdivý právě jeden z výroků:
Ve třetím případě musí být výsledný monomiál roven nebo , nebo . To umožňuje zapsat řešení jako [1] .
PříkladPojďme vyřešit srovnání . Chcete-li to provést, musíte faktorizovat . Zvažme možné hodnoty :
Ověření to ukazuje a je platné .
Algoritmus najde rozdělení na netriviální faktory ve všech případech, kromě těch, ve kterých jsou všechna čísla současně zbytky nebo nezbytky. Podle teorie cyklotomie [1] , lze pravděpodobnost takové události pro případ, kdy samy jsou zároveň zbytky i nezbytky (tedy kdy se to pro náš postup nehodí), odhadnout jako [8] , kde je počet různých čísel mezi [1] . Pravděpodobnost chyby algoritmu tedy nepřesahuje .
Z teorie konečných těles je známo , že je-li stupeň ireducibilního polynomu , pak takový polynom je dělitel a není dělitelem pro .
Postupně tedy zvažujeme polynomy kde a pro , můžeme rozdělit polynom na faktory tvaru , kde je součin všech ireducibilních polynomů stupně , které dělí polynom . Když známe stupeň , můžeme určit počet takových polynomů rovný . Nechte _ Pokud vezmeme v úvahu polynom , kde , pak pořadí takového polynomu v oboru musí dělit číslo . Pokud není dělitelný , pak je polynom dělitelný , ale ne .
Na základě toho Zassenhaus navrhl hledat dělitele polynomu ve tvaru , kde je nějaký dostatečně velký dělitel , například . V konkrétním případě se přesně získá Berlekampova metoda, jak je popsáno výše [4] .
Krok za krokem lze dobu trvání jedné iterace algoritmu odhadnout následovně, za předpokladu, že stupeň polynomu je :
Pro aritmetické operace s prvky lze tedy provést jednu iteraci algoritmu a nalezení všech kořenů polynomu vyžaduje průměr [8] . V konkrétním případě extrahování druhé odmocniny je hodnota dvě, takže doba běhu se odhaduje jako jedna iterace algoritmu [12] .
Číselné teoretické algoritmy | |
---|---|
Testy jednoduchosti | |
Hledání prvočísel | |
Faktorizace | |
Diskrétní logaritmus | |
Hledání GCD | |
Modulová aritmetika | |
Násobení a dělení čísel | |
Výpočet druhé odmocniny |