Pollardin rho-algoritmi

Ro-algoritmi ( -algoritmi ) on John Pollardin vuonna 1975 ehdottama algoritmi kokonaislukujen faktorointiin . Tämä algoritmi perustuu Floydin algoritmiin syklin pituuden ja syntymäpäiväparadoksin seuraamusten löytämiseksi sekvenssistä . Algoritmi on tehokkain, kun otetaan huomioon yhdistelmäluvut riittävän pienillä kertoimilla laajennuksessa. Algoritmin monimutkaisuus on arvioitu [1] .

Pollardin ρ-algoritmi rakentaa numerosarjan , jonka alkiot muodostavat syklin, joka alkaa jostain luvusta n , jota voidaan havainnollistaa numeroiden järjestyksellä kreikkalaisen kirjaimen ρ muodossa , joka oli algoritmiperheen nimi [2 ] [3] .

Algoritmin historia

1960-luvun lopulla Robert Floyd keksi melko tehokkaan menetelmän syklin etsintäongelman ratkaisemiseksi , joka tunnetaan myös nimellä "kilpikonna ja jänis" -algoritmi [4] . John Pollard , Donald Knuth ja muut matemaatikot ovat analysoineet tämän algoritmin keskimääräistä tapauskäyttäytymistä. Algoritmiin on ehdotettu useita muutoksia ja parannuksia [5] .

Vuonna 1975 Pollard julkaisi artikkelin [6] , jossa hän Floydin syklintunnistusalgoritmiin perustuen hahmotteli ajatuksen lukutekijöiden jakamisalgoritmista, joka kulkee ajassa suhteessa [6] [1] . Algoritmin kirjoittaja kutsui sitä Monte Carlon tekijöiden muodostusmenetelmäksi, mikä heijastaa laskennan aikana syntyneiden lukujen näennäistä satunnaisuutta. Myöhemmin menetelmä sai kuitenkin edelleen nykyaikaisen nimensä - Pollardin ρ-algoritmi [7] .

Vuonna 1981 Richard Brent ja John Pollard käyttivät algoritmia löytääkseen Fermat - lukujen pienimmät jakajat [8] . Algoritmin nopeus riippuu voimakkaasti vain alkuperäisen luvun pienimmän jakajan arvosta, mutta ei itse luvusta. Joten seitsemännen Fermat-luvun pienimmän jakajan löytäminen - , vie paljon enemmän aikaa kuin kahdennentoista Fermat-luvun jakajan löytäminen (koska sen jakaja 114689 on paljon pienempi, vaikka itse luku koostuu yli 1200 desimaalinumerosta).

Osana Cunningham-projektia Pollardin algoritmi auttoi löytämään 19 numeron pituisen jakajan . Suuria jakajia voitiin myös löytää, mutta elliptisen käyrän tekijöiden menetelmän löytäminen teki Pollardin algoritmista kilpailukyvyttömän [9] .

Algoritmin kuvaus

Alkuperäinen versio

Tarkastellaan kokonaislukujen sarjaa siten , että ja , missä  on tekijöihin jaettava luku . Alkuperäinen algoritmi näyttää tältä [10] [6] :

1. Lasketaan lukujen kolmiot , missä . Lisäksi jokainen tällainen kolmois saadaan edellisestä. 2. Joka kerta kun luku on luvun kerrannainen (esim. ), laske suurin yhteinen jakaja millä tahansa tunnetulla menetelmällä. 3. Jos , niin luvun osittainen hajoaminen löytyy, ja . Löytynyt jakaja voi olla yhdistelmä, joten se on myös faktoroitava. Jos luku on yhdistelmä, jatkamme algoritmia modulolla . 4. Laskutoimitukset toistetaan kerran. Jos samaan aikaan lukua ei esimerkiksi ole kerrottu kokonaan, valitaan toinen alkuluku .

Moderni versio

Olkoon positiivinen kokonaisluku, jonka haluat kertoa tekijöille. Algoritmi näyttää tältä [11] :

  1. Pieni määrä valitaan satunnaisesti [12] ja muodostetaan sekvenssi , joka määrittelee jokaisen seuraavan muodossa .
  2. Samanaikaisesti jokaisessa i - vaiheessa se lasketaan joillekin , niin että esimerkiksi .
  3. Jos , laskenta päättyy ja edellisessä vaiheessa löydetty luku on luvun jakaja . Jos ei ole alkuluku, jakajahaku jatkuu ottamalla numeroksi .

Käytännössä funktion valinta ei ole liian vaikeasti laskettava (mutta ei samalla lineaarinen polynomi), jos sen ei tulisi tuottaa yksi-yhteen-kuvausta. Yleensä toiminnot [12] tai [13] valitaan muodossa . Toiminnot ja eivät kuitenkaan sovi [10] .

Jos tiedetään, että luvun jakaja pätee joillekin , niin on järkevää käyttää [10] .

Algoritmin merkittävä haittapuoli tässä toteutuksessa on tarve tallentaa suuri määrä aikaisempia arvoja .

Algoritmin parannukset

Algoritmin alkuperäisessä versiossa on useita haittoja. Tällä hetkellä on olemassa useita tapoja parantaa alkuperäistä algoritmia.

Anna . Sitten, jos , niin , siis, jos pari antaa ratkaisun, niin mikä tahansa pari antaa ratkaisun .

Siksi kaikkia pareja ei tarvitse tarkistaa , vaan voimme rajoittua muodon pareihin , joissa ja kulkee peräkkäisten arvojen joukon 1, 2, 3, ... läpi ja ottaa arvot intervalli . Esimerkiksi , , ja [11] .

Tämän idean ehdotti Richard Brent vuonna 1980 [14] , ja se vähentää suoritettujen leikkausten määrää noin 25 % [15] .

Floyd kehitti toisen muunnelman Pollardin ρ-algoritmista . Floydin mukaan arvo päivitetään jokaisessa vaiheessa kaavan mukaan, joten arvot , , saadaan vaiheessa , ja GCD tässä vaiheessa lasketaan ja [11] .

Esimerkki luvun tekijöistä

Tämä esimerkki osoittaa selvästi tekijöiden jakamisen ρ-algoritmin (algoritmin versio, Floydin parannuksella ) numerolle N = 8051:

Taulukko: luvun 8051 kertoimet
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)
yksi 5 26 yksi
2 26 7474 yksi
3 677 871 97

Käyttämällä muita polynomin muunnelmia voidaan myös saada 83:n jakaja:

Taulukko: luvun 8051 kertoimet
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)
yksi 7 52 yksi
2 52 1442 yksi
3 2707 778 yksi
neljä 1442 3932 83

Siten d 1 \u003d 97, d 2 \u003d 83 ovat luvun 8051 ei-triviaaleja jakajia.

Kun luvun jakaja on löydetty, ρ-algoritmissa ehdotetaan jatkavan laskelmia ja etsimällä luvun jakajia, jos se ei ole alkuluku. Tässä yksinkertaisessa esimerkissä tätä vaihetta ei vaadittu [11] .

Pollardin ρ-algoritmin perustelu

Algoritmi perustuu tunnettuun syntymäpäiväparadoksiin .

Syntymäpäiväparadoksi, lyhyesti:
Anna . Satunnaisotokselle elementtejä kukin pienempi kuin , missä todennäköisyys , että kaksi elementtiä ovat samat .

On huomattava, että syntymäpäiväparadoksin todennäköisyys saavutetaan klo .

Olkoon sekvenssi koostuva eroista , jotka tarkistetaan algoritmin aikana. Määritetään uusi jono , jossa ,  on luvun pienin jakaja .

Kaikki sekvenssin jäsenet ovat pienempiä kuin . Jos tarkastellaan sitä satunnaisena kokonaislukujonona, joka on pienempi kuin , niin syntymäpäiväparadoksin mukaan todennäköisyys, että sen jäsenten joukkoon putoaa kaksi identtistä, ylittää milloin , silloin sen on oltava vähintään .

Jos Sitten , Eli joidenkin kokonaislukujen . Jos , joka pätee suurella todennäköisyydellä, luvun haluttu jakaja löytyy muodossa . Koska , silloin todennäköisyydellä, joka ylittää , jakaja löytyy iteraatioista [11] .

Algoritmin monimutkaisuus

Algoritmin monimutkaisuuden arvioimiseksi laskelmien aikana muodostettua sekvenssiä pidetään satunnaisena (tässä tapauksessa ei tietenkään voida puhua mistään kurinalaisuudesta). Pituusbittien osoittamiseksi kokonaan riittää , että etsitään kaikki sen jakajat, jotka eivät ylitä , mikä vaatii maksimissaan aritmeettisten operaatioiden eli bittioperaatioiden järjestyksen .

Siksi algoritmin monimutkaisuus on arvioitu [16] . Tämä arvio ei kuitenkaan ota huomioon suurimman yhteisen jakajan laskemisen yleiskustannuksia . Algoritmin saatu monimutkaisuus, vaikkakaan ei tarkka, on hyvin sopusoinnussa käytännön kanssa.

Seuraava väite on totta: anna olla  yhdistelmäluku . Sitten on sellainen vakio , että mille tahansa positiiviselle luvulle tapahtuman todennäköisyys, että Pollardin ρ-algoritmi ei löydä ei-triviaalista jakajaa ajassa , ei ylitä . Tämä lausunto on seurausta syntymäpäivien paradoksista [17] .

Toteutusominaisuudet

Algoritmin käyttämän muistin määrää voidaan vähentää merkittävästi.

int Rho-Pollard ( int N) { int x = satunnainen (1, N-2); int y = 1; int i = 0; int vaihe = 2; while (N.O.D.(N, abs (x - y)) == 1) { if (i == vaihe){ y = x; vaihe = vaihe*2; } x = (x*x + 1) (mod N); i = i + 1; } paluu N.O.D (N, abs (xy)); }

Tässä versiossa laskenta vaatii vain kolmen muuttujan , , ja tallentamisen , mikä erottaa tällaisen toteutuksen algoritmin muista lukukerroinmenetelmistä [11] .

Algoritmin rinnastus

Pollardin algoritmi mahdollistaa rinnastamisen sekä jaetuilla muistijärjestelmillä että hajautetuilla muistijärjestelmillä ( sanomanvälitys ), mutta toinen tapaus on käytännön näkökulmasta mielenkiintoisin [18] .

Hajautettu muistijärjestelmä

Nykyinen rinnakkaismenetelmä perustuu siihen, että jokainen laskentasolmu suorittaa saman peräkkäisen algoritmin , mutta alkuperäinen luku ja/tai polynomi otetaan eri tavalla. Rinnakkaisemisen yksinkertaistamiseksi ehdotetaan niiden vastaanottamista satunnaislukugeneraattorilta. Tällainen rinnakkaistoteutus ei kuitenkaan tarjoa lineaarista nopeutta [19] .

Oletetaan, että esiintyjät ovat samat. Jos käytämme erilaisia ​​sekvenssejä (eli erilaisia ​​polynomeja ), niin todennäköisyys, että näiden sekvenssien ensimmäiset luvut ovat eri modulo , on suunnilleen yhtä suuri kuin . Näin ollen suurin kiihtyvyys voidaan arvioida [9] .

Richard Crandall ehdotti, että kiihtyvyys on saavutettavissa , mutta tätä väitettä ei ole vielä vahvistettu [20] .

Jaettu muistijärjestelmä

Edellistä menetelmää voidaan luonnollisesti käyttää järjestelmissä, joissa on jaettu muisti, mutta paljon järkevämpää on käyttää yhtä generaattoria [21] .

Muistiinpanot

  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 , Parannettu Monte Carlo -faktorointialgoritmi, s. 176.
  6. 1 2 3 Pollard, 1975 , Monte Carlo -menetelmä faktorointiin, s. 176.
  7. Koshy, 2007 , Elementary Number Theory with Applications.
  8. Childs, 2009 , Konkreettinen johdatus korkeampaan algebraan.
  9. 1 2 Brent, 1999 , Jotkut rinnakkaiset algoritmit kokonaislukujen tekijöihin jakamiseen.
  10. 1 2 3 Pollard, 1975 , Monte Carlo -menetelmä tekijöihin jakamiseen.
  11. 1 2 3 4 5 6 Ishmukhametov, 2011 , s. 64.
  12. 1 2 Mollin, 2006 , s. 215-216.
  13. Zolotykh N. Yu. Luennot tietokonealgebrasta. Luento 11. Pollardin ρ-menetelmä. Arkistoitu 30. lokakuuta 2014 Wayback Machinessa
  14. Brent, 1980 , Parannettu Monte Carlo -faktorointialgoritmi, s. 176-184.
  15. Reisel, 2012 , Valitut alueet kryptografiassa. Alkuluvut ja tietokonemenetelmät faktorointiin. 2. painos..
  16. Cormen, 2001 , Johdatus algoritmeihin. Kohta 31.9. Kokonaislukufaktorointi. Pollardin rho-heuristiikka..
  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 Logathms, s. 212-229.
  20. Crandall, 1999 , Polldar-rho-tekijöiden rinnastaminen.
  21. Kosyakov, 2014 , s. 19.

Kirjallisuus