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] .
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] .
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 .Olkoon positiivinen kokonaisluku, jonka haluat kertoa tekijöille. Algoritmi näyttää tältä [11] :
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 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] .
Tämä esimerkki osoittaa selvästi tekijöiden jakamisen ρ-algoritmin (algoritmin versio, Floydin parannuksella ) numerolle 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) |
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:
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] .
Algoritmi perustuu tunnettuun syntymäpäiväparadoksiin .
Syntymäpäiväparadoksi, lyhyesti: |
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 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] .
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] .
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] .
Lukuteoreettiset algoritmit | |
---|---|
Yksinkertaisuustestit | |
Alkulukujen löytäminen | |
Faktorisointi | |
Diskreetti logaritmi | |
GCD:n löytäminen |
|
Modulo-aritmetiikka | |
Lukujen kerto- ja jakolasku | |
Neliöjuuren laskeminen |