Pollardův rho algoritmus

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] .

Historie algoritmu

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] .

Popis algoritmu

Původní verze

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 .

Moderní verze

Nechť je složené kladné celé číslo, které chcete faktorizovat. Algoritmus vypadá takto [11] :

  1. Náhodně se vybere malé číslo [12] a vytvoří se sekvence , která definuje každou další jako .
  2. Současně se v každém i -tém kroku počítá pro nějaké , jako například .
  3. Jestliže , pak výpočet skončí a číslo nalezené v předchozím kroku je dělitelem . Pokud to není prvočíslo, pak postup hledání dělitele pokračuje a vezme se jako číslo .

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 .

Vylepšení algoritmu

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] .

Příklad rozkladu čísla na rozklad

Tento příklad jasně demonstruje faktorizační ρ-algoritmus (verze algoritmu s Floydovým vylepšením ) pro číslo N = 8051:

Tabulka: rozklad čísla 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:

Tabulka: rozklad čísla 8051
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] .

Odůvodnění Pollardova ρ-algoritmu

Algoritmus je založen na známém narozeninovém paradoxu .

Narozeninový paradox, stručně:
Let . Pro náhodný vzorek prvků je každý menší než , kde , pravděpodobnost, že dva prvky jsou stejné .

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] .

Složitost algoritmu

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] .

Funkce implementace

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] .

Paralelizace algoritmu

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ém

Stá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ěti

Př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] .

Poznámky

  1. 1 2 Pollard, 1974 , s. 521–528.
  2. Christensen, 2009 , 3.3.3.0.
  3. Chatterjee, 2008 , 5.2.2.
  4. Floyd, 1967 , str. 636–644.
  5. Brent, 1980 , Vylepšený faktorizační algoritmus Monte Carlo, str. 176.
  6. 1 2 3 Pollard, 1975 , Metoda Monte Carlo pro faktorizaci, s. 176.
  7. Koshy, 2007 , Elementární teorie čísel s aplikacemi.
  8. Childs, 2009 , Konkrétní úvod do vyšší algebry.
  9. 1 2 Brent, 1999 , Některé paralelní algoritmy pro faktorizaci celých čísel.
  10. 1 2 3 Pollard, 1975 , Monte Carlo metoda pro faktorizaci.
  11. 1 2 3 4 5 6 Ishmukhametov, 2011 , str. 64.
  12. 1 2 Mollin, 2006 , str. 215-216.
  13. Zolotykh N. Yu.Přednášky o počítačové algebře. Přednáška 11. Pollardova ρ-metoda. Archivováno 30. října 2014 na Wayback Machine
  14. Brent, 1980 , Vylepšený faktorizační algoritmus Monte Carlo, str. 176-184.
  15. Reisel, 2012 , Vybrané oblasti kryptografie. Prvočísla a počítačové metody faktorizace. 2. vyd..
  16. Cormen, 2001 , Úvod do algoritmů. Část 31.9. Faktorizace celých čísel. Pollardova rho heuristika..
  17. Ishmukhametov, 2011 , str. 63.
  18. Kosyakov, 2014 , s. 12.
  19. Kuhn, 2001 , Random Walks Revisited: Extensions of Pollard's Rho Algorithm for Computing Multiple Discrete Logarithms, str. 212-229.
  20. Crandall, 1999 , Paralelizace Polldar-rho faktorizace.
  21. Kosyakov, 2014 , s. 19.

Literatura