Pollards rho-algoritm

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

Algoritmens historia

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

Beskrivning av algoritmen

Originalversion

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 .

Modern version

Låt vara ett sammansatt positivt heltal som du vill faktorisera. Algoritmen ser ut så här [11] :

  1. Ett litet antal väljs slumpmässigt [12] och en sekvens konstrueras , som definierar varje nästa som .
  2. Samtidigt, vid varje i -te steg , beräknas det för vissa , så att t.ex.
  3. Om , då slutar beräkningen, och talet som hittades i föregående steg är en divisor av . Om det inte är ett primtal fortsätter sökproceduren för divisor, med ett tal .

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 .

Algoritmförbättringar

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

Ett exempel på faktorisering av ett tal

Det här exemplet visar tydligt faktoriseringens ρ-algoritm (version av algoritmen, med Floyds förbättring ), för talet N = 8051:

Tabell: faktorisering av talet 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:

Tabell: faktorisering av talet 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)
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] .

Skäl för Pollards ρ-algoritm

Algoritmen bygger på den välkända födelsedagsparadoxen .

Födelsedagsparadoxen, kortfattat:
Låt . För ett slumpmässigt urval av element vart och ett mindre än , där sannolikheten för att två element är likadana .

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

Algoritmens komplexitet

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

Implementeringsfunktioner

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

Algoritmparallellisering

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 minnessystem

Den 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 minne

Den tidigare metoden kan uppenbarligen användas på system med delat minne, men det är mycket rimligare att använda en enda generator [21] .

Anteckningar

  1. 1 2 Pollard, 1974 , sid. 521–528.
  2. Christensen, 2009 , 3.3.3.0.
  3. Chatterjee, 2008 , 5.2.2.
  4. Floyd, 1967 , sid. 636–644.
  5. Brent, 1980 , En förbättrad Monte Carlo-faktoriseringsalgoritm, sid. 176.
  6. 1 2 3 Pollard, 1975 , A Monte Carlo method for factorization, sid. 176.
  7. Koshy, 2007 , Elementär nummerteori med tillämpningar.
  8. ^ Childs, 2009 , en konkret introduktion till högre algebra.
  9. 1 2 Brent, 1999 , Några parallella algoritmer för heltalsfaktorisering..
  10. 1 2 3 Pollard, 1975 , En Monte Carlo-metod för faktorisering.
  11. 1 2 3 4 5 6 Ishmukhametov, 2011 , sid. 64.
  12. 1 2 Mollin, 2006 , sid. 215-216.
  13. Zolotykh N. Yu. Föreläsningar om datoralgebra. Föreläsning 11. Pollards ρ-metod. Arkiverad 30 oktober 2014 på Wayback Machine
  14. Brent, 1980 , En förbättrad Monte Carlo-faktoriseringsalgoritm, sid. 176-184.
  15. Reisel, 2012 , Utvalda områden i kryptografi. Primtal och datormetoder för faktorisering. 2:a upplagan..
  16. Cormen, 2001 , Introduktion till algoritmer. Avsnitt 31.9. Heltalsfaktorisering. Pollards rho heuristik..
  17. Ishmukhametov, 2011 , sid. 63.
  18. Kosyakov, 2014 , sid. 12.
  19. Kuhn, 2001 , Random Walks Revisited: Förlängningar av Pollards Rho-algoritm för att beräkna flera diskreta logaritmer, s. 212-229.
  20. Crandall, 1999 , Parallellisering av Polldar-rho-faktorisering.
  21. Kosyakov, 2014 , sid. 19.

Litteratur