Pollards rho-algoritme

Ro-algoritme ( -algorithm ) er en algoritme foreslået af John Pollard i 1975 til factoring (faktoring) af heltal. Denne algoritme er baseret på Floyds algoritme til at finde cykluslængde i en sekvens og nogle konsekvenser af fødselsdagsparadokset . Algoritmen er mest effektiv ved faktorisering af sammensatte tal med tilstrækkeligt små faktorer i udvidelsen. Algoritmens kompleksitet er estimeret til [1] .

Pollards ρ-algoritme bygger en talrække , hvis elementer danner en cyklus, startende fra et eller andet tal n , hvilket kan illustreres ved opstillingen af ​​tal i form af det græske bogstav ρ , som var navnet på familien af ​​algoritmer [2 ] [3] .

Algoritmens historie

I slutningen af ​​60'erne af det XX århundrede kom Robert Floyd med en ret effektiv metode til at løse cyklusfindingsproblemet , også kendt som "skildpadde og hare"-algoritmen [4] . John Pollard , Donald Knuth og andre matematikere har analyseret den gennemsnitlige case-adfærd for denne algoritme. Adskillige ændringer og forbedringer af algoritmen er blevet foreslået [5] .

I 1975 publicerede Pollard en artikel [6] , hvori han, baseret på Floyds cyklusdetektionsalgoritme, skitserede ideen om en talfaktoriseringsalgoritme, der kører i tid proportionalt med [6] [1] . Forfatteren af ​​algoritmen kaldte den Monte Carlo-faktoriseringsmetoden, hvilket afspejler den tilsyneladende tilfældighed af de tal, der blev genereret under beregningen. Men senere fik metoden stadig sit moderne navn - Pollards ρ-algoritme [7] .

I 1981 brugte Richard Brent og John Pollard en algoritme til at finde de mindste divisorer af Fermat-tal ved [8] . Algoritmens hastighed afhænger kun stærkt af værdien af ​​den mindste divisor af det oprindelige tal, men ikke af selve tallet. Så det tager meget længere tid at finde den mindste divisor af det syvende Fermat-tal - , end at finde divisoren for det tolvte Fermat-tal (fordi dens divisor 114689 er meget mindre, selvom tallet i sig selv består af mere end 1200 decimalcifre).

Som en del af Cunningham-projektet hjalp Pollards algoritme med at finde en divisor på 19 cifre . Store divisorer kunne også findes, men opdagelsen af ​​den elliptiske kurvefaktoriseringsmetode gjorde Pollards algoritme ukonkurrencedygtig [9] .

Beskrivelse af algoritmen

Original version

Vi betragter en sekvens af heltal , sådan at og , hvor  er det tal, der skal faktoriseres . Den originale algoritme ser sådan ud [10] [6] :

1. Der beregnes tripler af tal , hvor . Desuden opnås hver sådan tripel fra den foregående. 2. Hver gang et tal er et multiplum af et tal (f.eks. ), skal du beregne den største fælles divisor ved en kendt metode. 3. Hvis , så findes en delvis dekomponering af tallet , og . Den fundne divisor kan være sammensat, så den skal også faktoriseres. Hvis tallet er sammensat, så fortsætter vi algoritmen med modulo . 4. Beregninger gentages én gang. Hvis tallet samtidig ikke var fuldstændig faktoriseret, for eksempel, vælges et andet begyndelsestal .

Moderne version

Lad være et sammensat positivt heltal, som du vil faktorisere. Algoritmen ser sådan ud [11] :

  1. Et lille tal er tilfældigt udvalgt [12] og en sekvens er konstrueret , der definerer hver næste som .
  2. Samtidig beregnes det ved hvert i -te trin for nogle , sådan at f.eks .
  3. Hvis , så slutter beregningen, og tallet fundet i det foregående trin er en divisor af . Hvis det ikke er et primtal, fortsætter divisorsøgningsproceduren, idet der tages som et tal .

I praksis er funktionen valgt ikke for svær at beregne (men samtidig ikke et lineært polynomium), forudsat at den ikke skal generere en en-til-en mapping. Normalt er funktioner [12] eller [13] valgt som . Men funktionerne og passer ikke [10] .

Hvis man ved, at et tals divisor er gyldig for nogle , så giver det mening at bruge [10] .

En væsentlig ulempe ved algoritmen i denne implementering er behovet for at gemme et stort antal tidligere værdier .

Algoritmeforbedringer

Den originale version af algoritmen har en række ulemper. I øjeblikket er der flere tilgange til at forbedre den originale algoritme.

Lad . Så, hvis , så derfor, hvis et par giver en løsning, så vil ethvert par give en løsning .

Derfor er det ikke nødvendigt at kontrollere alle par , men vi kan begrænse os til par af formen , hvor , og løber gennem sættet af på hinanden følgende værdier 1, 2, 3, ..., og tager værdier fra intervallet . For eksempel, , og [11] .

Denne idé blev foreslået af Richard Brent i 1980 [14] og reducerer antallet af udførte operationer med cirka 25 % [15] .

En anden variation af Pollards ρ-algoritme blev udviklet af Floyd . Ifølge Floyd opdateres værdien ved hvert trin i henhold til formlen , så værdierne , , vil blive opnået på trin , og GCD på dette trin beregnes for og [11] .

Et eksempel på faktorisering af et tal

Dette eksempel demonstrerer klart faktoriseringens ρ-algoritme (version af algoritmen, med Floyds forbedring ), for tallet N = 8051:

Tabel: Faktorisering af tallet 8051
n = 8051, F ( x ) = ( x 2 + 1) mod n , x 0 = y 0 = 2
jeg x i = F ( x i -1 ) y i = F ( F ( y i -1 )) GCD(| x i − y i |, 8051)
en 5 26 en
2 26 7474 en
3 677 871 97

Ved at bruge andre varianter af polynomiet kan man også få en divisor på 83:

Tabel: Faktorisering af tallet 8051
n = 8051, F ( x ) = ( x 2 + 3) mod n , x 0 = y 0 = 2
jeg x i = F ( x i -1 ) y i = F ( F ( y i -1 )) GCD(| x i − y i |, 8051)
en 7 52 en
2 52 1442 en
3 2707 778 en
fire 1442 3932 83

Således er d 1 \u003d 97, d 2 \u003d 83 ikke-trivielle divisorer af tallet 8051.

Efter at have fundet tallets divisor, foreslås det i ρ-algoritmen at fortsætte beregningerne og lede efter tallets divisorer, hvis det ikke er primtal. I dette simple eksempel var dette trin ikke påkrævet [11] .

Begrundelse for Pollards ρ-algoritme

Algoritmen er baseret på det velkendte fødselsdagsparadoks .

Fødselsdagsparadokset, kort fortalt:
Lad . For en tilfældig stikprøve af elementer, der hver er mindre end , hvor sandsynligheden for, at to elementer er ens .

Det skal bemærkes, at sandsynligheden i fødselsdagsparadokset nås kl .

Lad sekvensen bestå af forskelle , kontrolleret under algoritmen. En ny sekvens bestemmes , hvor ,  er den mindste af divisorerne af tallet .

Alle medlemmer af sekvensen er mindre end . Hvis vi betragter det som en tilfældig sekvens af heltal mindre end , så, ifølge fødselsdagsparadokset, vil sandsynligheden for, at to identiske vil falde blandt dets medlemmer, overstige når , så skal den være mindst .

Hvis altså , det vil sige for et eller andet heltal . Hvis , som holder med høj sandsynlighed, så vil den ønskede divisor af tallet blive fundet som . Da , så med en sandsynlighed der overstiger , vil divisoren blive fundet i iterationer [11] .

Algoritmens kompleksitet

For at estimere kompleksiteten af ​​algoritmen betragtes sekvensen konstrueret i løbet af beregninger som tilfældig (selvfølgelig kan man ikke tale om nogen strenghed i dette tilfælde). For fuldstændigt at faktorisere et antal længdebits er det nok at finde alle dens divisorer, der ikke overstiger , hvilket maksimalt kræver rækkefølgen af ​​aritmetiske operationer eller bitoperationer.

Derfor estimeres kompleksiteten af ​​algoritmen til [16] . Dette estimat tager dog ikke højde for overhead ved beregning af den største fælles divisor . Den opnåede kompleksitet af algoritmen er, selvom den ikke er nøjagtig, i god overensstemmelse med praksis.

Følgende udsagn er sandt: lad være  et sammensat tal . Så er der en konstant sådan, at for ethvert positivt tal, overstiger sandsynligheden for hændelsen, at Pollards ρ-algoritme ikke finder en ikke-trivial divisor i tid , ikke . Dette udsagn følger af fødselsdagsparadokset [17] .

Implementeringsfunktioner

Mængden af ​​hukommelse, der bruges af algoritmen, kan reduceres betydeligt.

int Rho-Pollard ( int N) { int x = tilfældig (1, N-2); int y = 1; int i = 0; int trin = 2; mens (N.O.D.(N, abs (x - y)) == 1) { if (i == fase){ y=x; trin = trin*2; } x = (x*x + 1) (mod N); i = i + 1; } retur N.O.D (N, abs (xy)); }

I denne version kræver beregningen kun at lagre tre variable , , og , hvilket adskiller algoritmen i en sådan implementering fra andre talfaktoriseringsmetoder [11] .

Algoritme parallelisering

Pollards algoritme tillader parallelisering ved hjælp af både delte hukommelsessystemer og distribuerede hukommelsessystemer ( message passing ), men det andet tilfælde er det mest interessante fra et praktisk synspunkt [18] .

Distribueret hukommelsessystem

Den eksisterende metode til parallelisering ligger i det faktum, at hver computerknude udfører den samme sekventielle algoritme , men det oprindelige tal og/eller polynomium tages forskelligt. For at forenkle parallelisering foreslås det at modtage dem fra en tilfældig talgenerator. En sådan parallel implementering giver dog ikke en lineær speedup [19] .

Lad os antage, at der er identiske kunstnere. Hvis vi bruger forskellige sekvenser (det vil sige forskellige polynomier ), så vil sandsynligheden for, at de første tal i disse sekvenser vil være forskellige modulo være omtrent lig med . Den maksimale acceleration kan således estimeres til [9] .

Richard Crandall foreslog, at acceleration er opnåelig , men denne erklæring er endnu ikke blevet bekræftet [20] .

Delt hukommelsessystem

Den tidligere metode kan naturligvis bruges på systemer med delt hukommelse, men det er meget mere rimeligt at bruge en enkelt generator [21] .

Noter

  1. 1 2 Pollard, 1974 , s. 521-528.
  2. Christensen, 2009 , 3.3.3.0.
  3. Chatterjee, 2008 , 5.2.2.
  4. Floyd, 1967 , s. 636-644.
  5. Brent, 1980 , En forbedret Monte Carlo-faktoriseringsalgoritme, s. 176.
  6. 1 2 3 Pollard, 1975 , A Monte Carlo metode til faktorisering, s. 176.
  7. Koshy, 2007 , Elementær talteori med applikationer.
  8. Childs, 2009 , En konkret introduktion til højere algebra.
  9. 1 2 Brent, 1999 , Nogle parallelle algoritmer til heltalsfaktorisering..
  10. 1 2 3 Pollard, 1975 , En Monte Carlo-metode til faktorisering.
  11. 1 2 3 4 5 6 Ishmukhametov, 2011 , s. 64.
  12. 1 2 Mollin, 2006 , s. 215-216.
  13. Zolotykh N. Yu. Forelæsninger om computeralgebra. Foredrag 11. Pollards ρ-metode. Arkiveret 30. oktober 2014 på Wayback Machine
  14. Brent, 1980 , En forbedret Monte Carlo-faktoriseringsalgoritme, s. 176-184.
  15. Reisel, 2012 , Udvalgte områder i kryptografi. Primtal og computermetoder til faktorisering. 2. udg..
  16. Cormen, 2001 , Introduktion til algoritmer. Afsnit 31.9. Heltalsfaktorisering. Pollards rho heuristik..
  17. Ishmukhametov, 2011 , s. 63.
  18. Kosyakov, 2014 , s. 12.
  19. Kuhn, 2001 , Random Walks Revisited: Extensions of Pollard's Rho Algorithm for Computing Multiple Discrete Logarithms, s. 212-229.
  20. Crandall, 1999 , Parallelization of Polldar-rho factorization.
  21. Kosyakov, 2014 , s. 19.

Litteratur