Ro-algoritm ( -algorithm ) är en algoritm som föreslagits av John Pollard 1975 för att faktorisera ( faktorera) heltal. Denna algoritm är baserad på Floyds algoritm för att hitta cykellängden i en sekvens och några konsekvenser av födelsedagsparadoxen . Algoritmen är mest effektiv vid faktorisering av sammansatta tal med tillräckligt små faktorer i expansionen. Algoritmens komplexitet uppskattas till [1] .
Pollards ρ-algoritm bygger en talföljd , vars element bildar en cykel, utgående från något tal n , vilket kan illustreras genom arrangemanget av siffror i form av den grekiska bokstaven ρ , som var namnet på familjen av algoritmer [2] ] [3] .
I slutet av 60-talet av 1900-talet kom Robert Floyd med en ganska effektiv metod för att lösa problemet med att hitta cykeln , även känd som "sköldpadda och hare"-algoritmen [4] . John Pollard , Donald Knuth och andra matematiker har analyserat det genomsnittliga fallbeteendet för denna algoritm. Flera modifieringar och förbättringar av algoritmen har föreslagits [5] .
1975 publicerade Pollard en artikel [6] där han, baserat på Floyds cykeldetekteringsalgoritm, skisserade idén om en talfaktoriseringsalgoritm som går i tid proportionell mot [6] [1] . Författaren till algoritmen kallade den Monte Carlo-faktoriseringsmetoden, vilket återspeglar den uppenbara slumpmässigheten hos siffrorna som genererades under beräkningen. Men senare fick metoden fortfarande sitt moderna namn - Pollards ρ-algoritm [7] .
1981 använde Richard Brent och John Pollard en algoritm för att hitta de minsta divisorerna av Fermat-tal vid [8] . Algoritmens hastighet beror starkt endast på värdet av den minsta divisorn av det ursprungliga talet, men inte på själva talet. Så att hitta den minsta divisorn för det sjunde Fermat-talet - , tar mycket mer tid än att hitta divisorn för det tolfte Fermat-talet (eftersom dess divisor 114689 är mycket mindre, även om talet i sig består av mer än 1200 decimalsiffror).
Som en del av Cunningham-projektet hjälpte Pollards algoritm att hitta en divisor på 19 siffror . Stora divisorer kunde också hittas, men upptäckten av metoden för faktorisering av elliptiska kurvor gjorde Pollards algoritm okonkurrenskraftig [9] .
Vi betraktar en sekvens av heltal , så att och , där är talet som ska faktoriseras . Den ursprungliga algoritmen ser ut så här [10] [6] :
1. Tripplar av siffror beräknas , var . Dessutom erhålls varje sådan trippel från den föregående. 2. Varje gång ett tal är en multipel av ett tal (säg, ), beräkna den största gemensamma divisorn med någon känd metod. 3. Om , då en partiell nedbrytning av antalet hittas, och . Den hittade divisorn kan vara sammansatt, så den måste också faktoriseras. Om talet är sammansatt fortsätter vi algoritmen med modulo . 4. Beräkningarna upprepas en gång. Om numret samtidigt inte var helt faktoriserat, till exempel, väljs ett annat initialtal .Låt vara ett sammansatt positivt heltal som du vill faktorisera. Algoritmen ser ut så här [11] :
I praktiken väljs funktionen inte för svårt att beräkna (men samtidigt inte ett linjärt polynom), förutsatt att den inte ska generera en en-till-en-mappning. Vanligtvis väljs funktionerna [12] eller [13] som . Men funktionerna och inte passar [10] .
Om det är känt att divisorn för ett tal är giltig för vissa , då är det vettigt att använda [10] .
En betydande nackdel med algoritmen i denna implementering är behovet av att lagra ett stort antal tidigare värden .
Den ursprungliga versionen av algoritmen har ett antal nackdelar. För närvarande finns det flera metoder för att förbättra den ursprungliga algoritmen.
Låt . Sedan, om , då , därför, om ett par ger en lösning, då kommer vilket par som helst att ge en lösning .
Därför finns det inget behov av att kontrollera alla par , men vi kan begränsa oss till par av formen , där , och går igenom uppsättningen av på varandra följande värden 1, 2, 3, ..., och tar värden från intervallet . Till exempel, , och [11] .
Denna idé föreslogs av Richard Brent 1980 [ 14] och minskar antalet utförda operationer med cirka 25 % [15] .
En annan variant av Pollards ρ-algoritm utvecklades av Floyd . Enligt Floyd uppdateras värdet vid varje steg enligt formeln , så värdena , , kommer att erhållas vid steget , och GCD i detta steg beräknas för och [11] .
Det här exemplet visar tydligt faktoriseringens ρ-algoritm (version av algoritmen, med Floyds förbättring ), för talet 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) |
ett | 5 | 26 | ett |
2 | 26 | 7474 | ett |
3 | 677 | 871 | 97 |
Genom att använda andra varianter av polynomet kan man också få en divisor på 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) |
ett | 7 | 52 | ett |
2 | 52 | 1442 | ett |
3 | 2707 | 778 | ett |
fyra | 1442 | 3932 | 83 |
Således är d 1 \u003d 97, d 2 \u003d 83 icke-triviala divisorer av numret 8051.
Efter att ha hittat talets divisor, föreslås i ρ-algoritmen att fortsätta beräkningarna och leta efter talets divisorer om det inte är primtal. I detta enkla exempel krävdes inte detta steg [11] .
Algoritmen bygger på den välkända födelsedagsparadoxen .
Födelsedagsparadoxen, kortfattat: |
Det bör noteras att sannolikheten i födelsedagsparadoxen uppnås vid .
Låt sekvensen bestå av skillnader , kontrollerade under algoritmen. En ny sekvens bestäms , där , är den minsta av talets divisorer .
Alla medlemmar i sekvensen är mindre än . Om vi betraktar det som en slumpmässig sekvens av heltal mindre än , då, enligt födelsedagsparadoxen, kommer sannolikheten att två identiska kommer att falla bland dess medlemmar att överstiga när , då måste den vara minst .
Om , alltså , det vill säga för något heltal . Om , vilket håller med hög sannolikhet, kommer den önskade divisorn för talet att hittas som . Eftersom , då med en sannolikhet som överstiger , kommer divisorn att hittas i iterationer [11] .
För att uppskatta algoritmens komplexitet anses sekvensen som konstruerats under beräkningarna som slumpmässig (naturligtvis kan man inte tala om någon rigor i detta fall). För att helt faktorisera ett antal längdbitar räcker det att hitta alla dess divisorer som inte överstiger , vilket kräver maximalt ordningen för aritmetiska operationer, eller bitoperationer.
Därför uppskattas komplexiteten hos algoritmen till [16] . Denna uppskattning tar dock inte hänsyn till omkostnaderna för att beräkna den största gemensamma divisorn . Den erhållna komplexiteten hos algoritmen, även om den inte är exakt, överensstämmer väl med praxis.
Följande påstående är sant: låt vara ett sammansatt tal . Sedan finns det en konstant sådan att, för varje positivt tal, sannolikheten för händelsen att Pollards ρ-algoritm inte hittar en icke-trivial divisor i tiden inte överstiger . Detta uttalande följer av paradoxen med födelsedagar [17] .
Mängden minne som används av algoritmen kan reduceras avsevärt.
int Rho-Pollard ( int N) { int x = slumpmässigt (1, N-2); int y = 1; int i = 0; int steg = 2; medan (N.O.D.(N, abs (x - y)) == 1) { if (i == stadium){ y=x; steg = steg*2; } x = (x*x + 1) (mod N); i = i + 1; } retur N.O.D (N, abs (xy)); }I denna version kräver beräkningen att endast tre variabler lagras , och , vilket skiljer algoritmen i en sådan implementering från andra talfaktoriseringsmetoder [11] .
Pollards algoritm tillåter parallellisering med användning av både delade minnessystem och distribuerade minnessystem ( meddelandeöverföring ), men det andra fallet är det mest intressanta ur praktisk synvinkel [18] .
Distribuerat minnessystemDen befintliga metoden för parallellisering ligger i det faktum att varje beräkningsnod exekverar samma sekventiella algoritm , men det ursprungliga numret och/eller polynomet tas på olika sätt. För att förenkla parallellisering föreslås att man tar emot dem från en slumptalsgenerator. En sådan parallell implementering ger dock ingen linjär hastighet [19] .
Låt oss anta att det finns identiska artister. Om vi använder olika sekvenser (det vill säga olika polynom ), så kommer sannolikheten att de första talen i dessa sekvenser kommer att vara olika modulo att vara ungefär lika med . Således kan den maximala accelerationen uppskattas till [9] .
Richard Crandall föreslog att acceleration är möjlig , men detta påstående har ännu inte verifierats [20] .
System för delat minneDen tidigare metoden kan uppenbarligen användas på system med delat minne, men det är mycket rimligare att använda en enda generator [21] .
Talteoretiska algoritmer | |
---|---|
Enkelhetstest | |
Hitta primtal | |
Faktorisering | |
Diskret logaritm | |
Hitta GCD | |
Modulo aritmetik | |
Multiplikation och division av tal | |
Beräkna kvadratroten |