Ro-algoritmus ( -algorithm ) je algoritmus navržený Johnem Pollardem v roce 1975 pro faktorování (faktorování) celých čísel. Tento algoritmus je založen na Floydově algoritmu pro nalezení délky cyklu v sekvenci a některých důsledcích narozeninového paradoxu . Algoritmus je nejúčinnější při faktorizaci složených čísel s dostatečně malými faktory v expanzi. Složitost algoritmu je odhadnuta jako [1] .
Pollardův ρ-algoritmus buduje číselnou posloupnost , jejíž prvky tvoří cyklus začínající od nějakého čísla n , což lze ilustrovat uspořádáním čísel ve tvaru řeckého písmene ρ , což byl název rodiny algoritmů [2 ] [3] .
Na konci 60. let 20. století přišel Robert Floyd s poměrně účinnou metodou pro řešení problému hledání cyklu , známou také jako algoritmus „želva a zajíc“ [4] . John Pollard , Donald Knuth a další matematici analyzovali chování průměrného případu tohoto algoritmu. Bylo navrženo několik úprav a vylepšení algoritmu [5] .
V roce 1975 Pollard publikoval článek [6] , ve kterém na základě Floydova algoritmu detekce cyklu nastínil myšlenku algoritmu faktorizace čísel, který běží v čase úměrně [6] [1] . Autor algoritmu nazval metodu faktorizace Monte Carlo, odrážející zdánlivou náhodnost čísel generovaných během výpočtu. Později však metoda stále dostala svůj moderní název - Pollardův ρ-algoritmus [7] .
V roce 1981 Richard Brent a John Pollard použili algoritmus k nalezení nejmenších dělitelů Fermatových čísel na [8] . Rychlost algoritmu silně závisí pouze na hodnotě nejmenšího dělitele původního čísla, nikoli však na čísle samotném. Nalezení nejmenšího dělitele sedmého Fermatova čísla - , tedy zabere mnohem více času než nalezení dělitele dvanáctého Fermatova čísla (protože jeho dělitel 114689 je mnohem menší, ačkoli samotné číslo se skládá z více než 1200 desetinných číslic).
V rámci projektu Cunningham pomohl Pollardův algoritmus najít dělitele o délce 19 číslic . Bylo možné také nalézt velké dělitele, ale objev metody faktorizace eliptické křivky učinil Pollardův algoritmus nekonkurenční [9] .
Uvažujeme posloupnost celých čísel , taková, že a , kde je číslo, které má být faktorizováno . Původní algoritmus vypadá takto [10] [6] :
1. Počítají se trojice čísel , kde . Navíc je každá taková trojice získána z předchozí. 2. Pokaždé, když je číslo násobkem čísla (řekněme, ), vypočítejte největšího společného dělitele jakoukoli známou metodou. 3. Jestliže , pak je nalezen částečný rozklad čísla a . Nalezený dělitel může být složený, takže musí být také faktorizován. Pokud je číslo složené, pak pokračujeme v algoritmu s modulo . 4. Výpočty se jednou opakují . Pokud současně nebylo číslo úplně rozloženo, například se zvolí jiné počáteční číslo .Nechť je složené kladné celé číslo, které chcete faktorizovat. Algoritmus vypadá takto [11] :
V praxi se volí funkce nepříliš náročná na výpočet (ale zároveň ne lineární polynom), pokud by neměla generovat zobrazení jedna ku jedné. Obvykle jsou funkce [12] nebo [13] vybrány jako . Funkce a však nesedí [10] .
Pokud je známo, že dělitel čísla platí pro nějaké , pak má smysl použít [10] .
Významnou nevýhodou algoritmu v této implementaci je nutnost ukládat velké množství předchozích hodnot .
Původní verze algoritmu má řadu nevýhod. V současné době existuje několik přístupů ke zlepšení původního algoritmu.
Nechte _ Pak, jestliže , pak , tedy, pokud pár dává řešení, pak jakýkoli pár dá řešení .
Není tedy potřeba kontrolovat všechny páry , ale můžeme se omezit na páry tvaru , kde a prochází množinou po sobě jdoucích hodnot 1, 2, 3, ..., a přebírá hodnoty od interval . Například , , a [11] .
Tuto myšlenku navrhl Richard Brent v roce 1980 [14] a snižuje počet provedených operací přibližně o 25 % [15] .
Další variaci Pollardova ρ-algoritmu vyvinul Floyd . Podle Floyda se hodnota aktualizuje v každém kroku podle vzorce , takže hodnoty , , budou získány v kroku a GCD v tomto kroku se vypočítá pro a [11] .
Tento příklad jasně demonstruje faktorizační ρ-algoritmus (verze algoritmu s Floydovým vylepšením ) pro číslo N = 8051:
n = 8051, F ( x ) = ( x 2 + 1) mod n , x 0 = y 0 = 2 | |||
---|---|---|---|
i | x i = F ( x i -1 ) | y i = F ( F ( y i -1 )) | GCD(| x i − y i |, 8051) |
jeden | 5 | 26 | jeden |
2 | 26 | 7474 | jeden |
3 | 677 | 871 | 97 |
Pomocí jiných variant polynomu lze také získat dělitel 83:
n = 8051, F ( x ) = ( x 2 + 3) mod n , x 0 = y 0 = 2 | |||
---|---|---|---|
i | x i = F ( x i -1 ) | y i = F ( F ( y i -1 )) | GCD(| x i − y i |, 8051) |
jeden | 7 | 52 | jeden |
2 | 52 | 1442 | jeden |
3 | 2707 | 778 | jeden |
čtyři | 1442 | 3932 | 83 |
Tedy d 1 \u003d 97, d 2 \u003d 83 jsou netriviální dělitelé čísla 8051.
Po nalezení dělitele čísla se v ρ-algoritmu navrhuje pokračovat ve výpočtech a hledat dělitele čísla , pokud není prvočíslo. V tomto jednoduchém příkladu nebyl tento krok vyžadován [11] .
Algoritmus je založen na známém narozeninovém paradoxu .
Narozeninový paradox, stručně: |
Je třeba poznamenat, že pravděpodobnost v narozeninovém paradoxu je dosažena při .
Nechte sekvenci sestávat z rozdílů , kontrolovaných během algoritmu. Určí se nová posloupnost , kde , je nejmenší z dělitelů čísla .
Všechny členy posloupnosti jsou menší než . Pokud ji budeme považovat za náhodnou posloupnost celých čísel menších než , pak podle narozeninového paradoxu pravděpodobnost, že mezi její členy padnou dvě stejná, překročí když , pak musí být alespoň .
Pokud , tedy , tedy pro nějaké celé číslo . Jestliže , což s vysokou pravděpodobností platí, pak požadovaný dělitel čísla bude nalezen jako . Protože , pak s pravděpodobností převyšující , bude dělitel nalezen v iteracích [11] .
Pro odhad složitosti algoritmu je posloupnost vytvořená v průběhu výpočtů považována za náhodnou (samozřejmě v tomto případě nelze hovořit o žádné přísnosti). K úplnému faktorizaci počtu bitů délky stačí najít všechny jeho dělitele nepřesahující , což vyžaduje maximálně řád aritmetických operací neboli bitových operací.
Proto je složitost algoritmu odhadnuta jako [16] . Tento odhad však nebere v úvahu režii výpočtu největšího společného dělitele . Získaná složitost algoritmu, i když není přesná, je v dobré shodě s praxí.
Platí následující tvrzení: nechť je složené číslo . Pak existuje konstanta taková, že pro žádné kladné číslo pravděpodobnost události, že Pollardův ρ-algoritmus nenajde netriviálního dělitele v čase , nepřekročí . Toto tvrzení vyplývá z paradoxu narozenin [17] .
Množství paměti používané algoritmem lze výrazně snížit.
int Rho-Pollard ( int N) { int x = náhodné (1, N-2); int y = 1; int i = 0; int stadium = 2; zatímco (N.O.D.(N, abs (x - y)) == 1) { if (i == stadium){ y=x; etapa = etapa*2; } x = (x*x + 1) (mod N); i = i + 1; } návrat N.O.D (N, abs (xy)); }V této verzi výpočet vyžaduje uložení pouze tří proměnných , , a , což odlišuje algoritmus v takové implementaci od jiných metod faktorizace čísel [11] .
Pollardův algoritmus umožňuje paralelizaci jak pomocí systémů se sdílenou pamětí , tak pomocí systémů s distribuovanou pamětí ( předávání zpráv ), ale z praktického hlediska je nejzajímavější druhý případ [18] .
Distribuovaný paměťový systémStávající metoda paralelizace spočívá v tom, že každý výpočetní uzel provádí stejný sekvenční algoritmus , avšak původní číslo a/nebo polynom jsou brány jinak. Pro zjednodušení paralelizace se navrhuje přijímat je z generátoru náhodných čísel. Taková paralelní implementace však neposkytuje lineární zrychlení [19] .
Předpokládejme, že existují identičtí interpreti. Pokud použijeme různé posloupnosti (tedy různé polynomy ), pak pravděpodobnost, že první čísla v těchto posloupnostech budou různá modulo , bude přibližně rovna . Maximální zrychlení lze tedy odhadnout jako [9] .
Richard Crandall navrhl, že zrychlení je dosažitelné , ale toto tvrzení ještě nebylo ověřeno [20] .
Systém sdílené pamětiPředchozí způsob lze samozřejmě použít na systémech se sdílenou pamětí, mnohem rozumnější je však použít jediný generátor [21] .
Čí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 |