Algoritmus Pollards rho - Pollards rho algorithm - Wikipedia
Pollardův rho algoritmus je algoritmus pro celočíselná faktorizace. To bylo vynalezeno John Pollard v roce 1975.[1] Využívá jen malé množství prostoru a jeho očekávaná doba chodu je úměrná druhé odmocnině velikosti nejmenšího hlavní faktor z složené číslo je faktorizovaný.
Základní myšlenky
Předpokládejme, že musíme rozložit číslo , kde je netriviální faktor. Polynomiální modulo , volala (např., ), se používá ke generování a pseudonáhodná posloupnost: Je vybrána počáteční hodnota, řekněme 2, a sekvence pokračuje jako , , Sekvence souvisí s jinou sekvencí . Od té doby není předem známa, nelze tuto sekvenci v algoritmu explicitně vypočítat. Přesto v tom spočívá základní myšlenka algoritmu.
Protože počet možných hodnot pro tyto sekvence je konečný, oba sekvence, což je mod , a posloupnost se nakonec bude opakovat, i když tu druhou neznáme. Předpokládejme, že se sekvence chovají jako náhodná čísla. V důsledku narozeninový paradox, počet Před opakováním se očekává, že bude , kde je počet možných hodnot. Takže sekvence bude pravděpodobně opakovat mnohem dříve než sekvence . Jakmile má sekvence opakovanou hodnotu, bude sekvence cyklovat, protože každá hodnota závisí pouze na té před ní. Tato struktura případného cyklování vede ke vzniku názvu „Algoritmus Rho“, vzhledem k podobnosti tvaru řeckého znaku ρ, když hodnoty , , atd. jsou reprezentovány jako uzly v a řízený graf.

To zjistí Floydův algoritmus pro vyhledávání cyklů: dva uzly a (tj., a ) jsou drženi. V každém kroku se jeden přesune do dalšího uzlu v sekvenci a druhý se posune vpřed o dva uzly. Poté se zkontroluje, zda . Pokud to není 1, znamená to, že v opakování je opakování sekvence (tj. . To funguje, protože pokud je stejné jako , rozdíl mezi a je nutně násobkem . I když se to vždy stane nakonec, výsledkem Největší společný dělitel (GCD) je dělitelem jiné než 1. To může být sám, protože tyto dvě sekvence se mohou opakovat současně. V tomto (neobvyklém) případě algoritmus selže a lze jej opakovat s jiným parametrem.
Algoritmus
Algoritmus bere jako své vstupy n, celé číslo, které má být zohledněno; a , polynom v X vypočítané modulo n. V původním algoritmu , ale v dnešní době je běžnější používat . Výstup je buď netriviální faktor nnebo selhání. Provádí následující kroky:[2]
x ← 2 y ← 2 d ← 1 zatímco d = 1: x ← g (x) y ← g (g (y)) d ← gcd (| x - y |, n) -li d = n: selhání návratu jiný: vrátit se d
Tady X a y odpovídá a v části o základní myšlence. Všimněte si, že tento algoritmus nemusí najít netriviální faktor, i když n je složený. V takovém případě lze metodu vyzkoušet znovu pomocí jiné počáteční hodnoty než 2 nebo jiné .
Příklad faktorizace
Nechat a .
i | X | y | GCD (|X − y|, 8051) |
---|---|---|---|
1 | 5 | 26 | 1 |
2 | 26 | 7474 | 1 |
3 | 677 | 871 | 97 |
4 | 7474 | 1481 | 1 |
97 je netriviální faktor 8051. Počáteční hodnoty jiné než X = y = 2 může dát kofaktor (83) místo 97. Jedna další iterace je uvedena výše, aby bylo jasné, že y se pohybuje dvakrát rychleji než X. Všimněte si, že i po opakování se GCD může vrátit na 1.
Varianty
V roce 1980 Richard Brent zveřejnil rychlejší variantu algoritmu rho. Použil stejné základní myšlenky jako Pollard, ale jinou metodu detekce cyklu a nahradil ji Floydův algoritmus pro vyhledávání cyklů se souvisejícími Brentova metoda hledání cyklu.[3]
Další vylepšení provedli Pollard a Brent. Pozorovali, že pokud , pak také pro jakékoli kladné celé číslo . Zejména místo výpočtů na každém kroku to stačí definovat jako produkt 100 po sobě jdoucích termíny modulo a poté spočítat jeden . Hlavní zrychlení má za následek 100 gcd kroky jsou nahrazeny 99 multiplikacemi modulo a jeden gcd. Občas to může způsobit selhání algoritmu zavedením opakovaného faktoru, například když je čtverec. Potom však stačí vrátit se k předchozímu gcd termín, kde a odtud použijte běžný algoritmus ρ.
aplikace
Algoritmus je velmi rychlý pro čísla s malými faktory, ale pomalejší v případech, kdy jsou všechny faktory velké. Nejpozoruhodnějším úspěchem algoritmu ρ byla faktorizace Číslo Fermata F8 = 1238926361552897 * 93461639715357977769163558199606896584051237541638188580280321 [4]. Algoritmus ρ byl dobrou volbou F8 protože hlavní faktor p = 1238926361552897 je mnohem menší než druhý faktor. Faktorizace trvala 2 hodiny na a UNIVAC 1100/42.[4]
Příklad n = 10403 = 101 · 103
Zde představíme další variantu, kde se počítá pouze jedna sekvence, a gcd se počítá uvnitř smyčky, která detekuje cyklus.
Ukázka kódu C.
Následující ukázka kódu najde faktor 101 10403 s počáteční hodnotou X = 2.
#zahrnout <stdio.h>#zahrnout <stdlib.h>int gcd(int A, int b) { int zbytek; zatímco (b != 0) { zbytek = A % b; A = b; b = zbytek; } vrátit se A;}int hlavní (int argc, char *argv[]) { int číslo = 10403, smyčka = 1, počet; int x_fixed = 2, X = 2, velikost = 2, faktor; dělat { printf("---- smyčka% 4i ---- n", smyčka); počet = velikost; dělat { X = (X * X + 1) % číslo; faktor = gcd(břišní svaly(X - x_fixed), číslo); printf("count =% 4i x =% 6i faktor =% i n", velikost - počet + 1, X, faktor); } zatímco (--počet && (faktor == 1)); velikost *= 2; x_fixed = X; smyčka = smyčka + 1; } zatímco (faktor == 1); printf("faktor je% i n", faktor); vrátit se faktor == číslo ? EXIT_FAILURE : EXIT_SUCCESS;}
Výše uvedený kód bude zobrazovat průběh algoritmu i mezilehlé hodnoty. Konečný výstupní řádek bude „faktor je 101“. Kód bude fungovat pouze pro malé testovací hodnoty, protože k přetečení dojde v celočíselných datových typech během čtverce x.
Ukázka kódu Pythonu
z itertools import početz matematika import gcdčíslo, X = 10403, 2pro cyklus v počet(1): y = X pro i v rozsah(2 ** cyklus): X = (X * X + 1) % číslo faktor = gcd(X - y, číslo) -li faktor > 1: tisk(„faktor je“, faktor) výstup()
Výsledky
V následující tabulce obsahuje třetí a čtvrtý sloupec tajné informace, které osoba, která se pokouší vytvořit faktor, nezná pq = 10403. Jsou zahrnuty, aby ukázaly, jak algoritmus funguje. Pokud začneme s X = 2 a podle algoritmu dostaneme následující čísla:
krok | ||||
---|---|---|---|---|
2 | 2 | 2 | 2 | 0 |
5 | 2 | 5 | 2 | 1 |
26 | 2 | 26 | 2 | 2 |
677 | 26 | 71 | 26 | 3 |
598 | 26 | 93 | 26 | 4 |
3903 | 26 | 65 | 26 | 5 |
3418 | 26 | 85 | 26 | 6 |
156 | 3418 | 55 | 85 | 7 |
3531 | 3418 | 97 | 85 | 8 |
5168 | 3418 | 17 | 85 | 9 |
3724 | 3418 | 88 | 85 | 10 |
978 | 3418 | 69 | 85 | 11 |
9812 | 3418 | 15 | 85 | 12 |
5983 | 3418 | 24 | 85 | 13 |
9970 | 3418 | 72 | 85 | 14 |
236 | 9970 | 34 | 72 | 15 |
3682 | 9970 | 46 | 72 | 16 |
2016 | 9970 | 97 | 72 | 17 |
7087 | 9970 | 17 | 72 | 18 |
10289 | 9970 | 88 | 72 | 19 |
2594 | 9970 | 69 | 72 | 20 |
8499 | 9970 | 15 | 72 | 21 |
4973 | 9970 | 24 | 72 | 22 |
2799 | 9970 | 72 | 72 | 23 |
První opakovací modulo 101 je 97, ke kterému dochází v kroku 17. Opakování je detekováno až v kroku 23, kdy . To způsobuje být a je nalezen faktor.
Složitost
Pokud je pseudonáhodné číslo vyskytující se v algoritmu Pollard ρ byly skutečné náhodné číslo, z toho by vyplývalo, že úspěchu by bylo dosaženo polovinu času, Paradox k narozeninám v iterace. Předpokládá se, že stejná analýza platí také pro skutečný algoritmus rho, ale toto je heuristické tvrzení a důsledná analýza algoritmu zůstává otevřená.[5]
Viz také
Reference
- ^ Pollard, J. M. (1975). "Metoda Monte Carlo pro faktorizaci". BIT Numerická matematika. 15 (3): 331–334. doi:10.1007 / bf01933667.
- ^ Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L. & Stein, Clifford (2009). "Oddíl 31.9: Faktorizace celého čísla". Úvod do algoritmů (třetí vydání). Cambridge, MA: MIT Press. 975–980. ISBN 978-0-262-03384-8. (tato část pojednává pouze o Pollardově rho algoritmu).
- ^ Brent, Richard P. (1980). „Vylepšený algoritmus faktorizace Monte Carlo“. BIT. 20: 176–184. doi:10.1007 / BF01933190.
- ^ A b Brent, R.P .; Pollard, J. M. (1981). "Factorization of the Eighth Fermat Number". Matematika výpočtu. 36 (154): 627–630. doi:10.2307/2007666.
- ^ Galbraith, Steven D. (2012). „14.2.5 Směrem k důkladné analýze Pollarda rho“. Matematika kryptografie veřejného klíče. Cambridge University Press. str. 272–273. ISBN 9781107013926..
Další čtení
- Katz, Jonathan; Lindell, Yehuda (2007). „Kapitola 8“. Úvod do moderní kryptografie. CRC Press.
- Samuel S. Wagstaff, Jr. (2013). Radost z faktoringu. Providence, RI: American Mathematical Society. str. 135–138. ISBN 978-1-4704-1048-3.