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] .
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] .
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 .Lad være et sammensat positivt heltal, som du vil faktorisere. Algoritmen ser sådan ud [11] :
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 .
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] .
Dette eksempel demonstrerer klart faktoriseringens ρ-algoritme (version af algoritmen, med Floyds forbedring ), for tallet N = 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:
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] .
Algoritmen er baseret på det velkendte fødselsdagsparadoks .
Fødselsdagsparadokset, kort fortalt: |
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] .
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] .
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] .
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 hukommelsessystemDen 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 hukommelsessystemDen tidligere metode kan naturligvis bruges på systemer med delt hukommelse, men det er meget mere rimeligt at bruge en enkelt generator [21] .
Talteoretiske algoritmer | |
---|---|
Enkelthedstest | |
At finde primtal | |
Faktorisering |
|
Diskret logaritme | |
Finder GCD | |
Modulo aritmetik | |
Multiplikation og division af tal | |
Beregning af kvadratroden |