Miller-Rabinin testi on todennäköisyyspohjainen polynomiprimaaliteettitesti . Miller-Rabin-testi sekä Fermat -testi ja Solovay-Strassen-testi voivat tehokkaasti määrittää, onko tietty luku yhdistetty . Sitä ei kuitenkaan voida käyttää tiukasti todistamaan , että luku on alkuluku . Miller-Rabin-testiä käytetään kuitenkin usein kryptografiassa suurten satunnaisalkulukujen luomiseen .
Miller-Rabin-algoritmi on muunnos Gary Millerin vuonna 1976 kehittämään Millerin algoritmiin . Millerin algoritmi on deterministinen , mutta sen oikeellisuus perustuu todentamattomaan laajennettuun Riemannin hypoteesiin [1] . Michael Rabin muokkasi sitä vuonna 1980 [2] . Miller-Rabin-algoritmi ei riipu hypoteesin pätevyydestä, vaan on todennäköisyys.
Koska monien salausalgoritmien kryptografinen vahvuus perustuu salaisiin avaimiin, joiden luomiseen tarvitaan alkulukuja (esimerkiksi näin RSA -salaus toimii ), tällaisia avaimia luotaessa on tärkeää pystyä nopeasti tarkistamaan suuria lukuja. ensisijaisuus. Todennäköisyyspohjaiset primaliteettitestit, kuten Miller-Rabin-testi ja Solovay-Strassen-testi , osoittavat tehokkaampaa käyttöä ja ilmaisun helppoutta deterministisiin testeihin verrattuna [3] . Miller-Rabin-algoritmin avulla voit suorittaa tarkistuksen lyhyessä ajassa ja antaa samalla melko pienen todennäköisyyden, että luku on todella yhdistetty. [neljä]
Kuten Fermat- ja Nightingale-Strassen- testit, Miller-Rabin-testi perustuu alkulukujen pätevien yhtälöiden tarkistamiseen. Jos ainakin yksi tällainen yhtälö epäonnistuu, se osoittaa, että luku on yhdistetty [5] .
Miller-Rabin-testissä käytetään seuraavaa lausetta:
Antaa olla alkuluku ja , Missä on pariton. Sitten vähintään yksi seuraavista ehdoista täyttyy:
|
Viimeisessä kentässä (alkuluvulle ) ei ole yksikön neliöjuuria lukuun ottamatta numeroita 1 , -1 |
Päästää:
Sitten:
Eukleideen lemman mukaan :
Fermatin pienen lauseen mukaan :
Poimimme luvun neliöjuuret . Yllä todistetun lemman mukaan jokaisessa vaiheessa saamme luvun 1 tai -1 modulo . Jos jossain vaiheessa saamme -1 , niin toinen yhtälöistä täyttyy. Muuten viimeisessä vaiheessa (koska ), eli ensimmäinen yhtäläisyys täyttyy.
Jos tämä lause (ehto 1 tai 2) täyttyy joillekin luvuille ja (ei välttämättä alkuluku), niin lukua kutsutaan Millerin alkuluvuksi ja itse lukua kutsutaan todennäköiseksi alkuluvuksi . (Satunnaisesti on 25 %:n mahdollisuus sekoittaa yhdistelmäluku alkuluvuksi, mutta tätä voidaan pienentää tarkistamalla muita lukuja .)
Siinä tapauksessa , että todistetun väitteen ristiriitaisuus täyttyy, eli jos on luku , joka:
ja
silloin luku ei ole alkuluku. Tässä tapauksessa numeroa kutsutaan todistajaksi, että numero on yhdistetty.
Parittomille yhdistelmäluvuille Rabinin lauseen mukaan ei ole enää yksinkertaisuuden todistajia, missä on Euler-funktio , joten todennäköisyys, että satunnaisesti valittu luku on yksinkertaisuuden todistaja, on pienempi kuin 1/4 [2] [6] .
Testin ideana on tarkistaa satunnaisesti valitut luvut , ovatko ne todistajia luvun ensimäisyydestä . Jos on näyttöä siitä, että luku on yhdistelmä, luku on todellakin yhdistelmä. Jos luvut tarkistettiin ja ne kaikki osoittautuivat alkuluvuiksi, lukua pidetään alkulukuna. Tällaisella algoritmilla todennäköisyys ottaa yhdistelmäluku alkuluvulle on pienempi [7] .
Suurten lukujen tarkistamiseksi on tapana valita satunnaisia lukuja, koska primaalisuuden todistajien ja yhdistelmäluvun todistajien jakautumista lukujen 1, 2, ..., n − 1 kesken ei tiedetä etukäteen. Erityisesti Arnolt [8] antaa 397-bittisen yhdistelmäluvun, jolle kaikki alle 307:n luvut ovat todisteita yksinkertaisuudesta.
Oletetaan, että haluamme määrittää, onko n = 221 alkuluku. Kirjoitetaan n − 1 = 220 arvoksi 2 2 55, joten s = 2 ja d = 55. Valitsemme mielivaltaisesti luvun a siten, että 0 < a < n , oletetaan a = 174. Jatketaan laskutoimituksia:
Koska 220 ≡ −1 mod n , 221 on joko alkuluku tai 174 on väärä todistus siitä, että 221 on alkuluku. Otetaan toinen mielivaltainen a , tällä kertaa valitsemalla a = 137:
Koska 137 on todiste siitä, että 221 on yhdistetty, luku 174 oli itse asiassa väärä todistus yksinkertaisuudesta. Huomaa, että algoritmi ei kerro meille mitään 221:n tekijöistä (jotka ovat 13 ja 17). Joissakin tapauksissa lisälaskelmat auttavat kuitenkin saamaan luvun tekijät. [9]
Miller-Rabin-algoritmi parametroidaan kierrosten lukumäärällä r . On suositeltavaa ottaa r suuruusluokkaa , jossa n on testattava luku.
Tietylle n :lle on olemassa kokonaisluku s ja pariton kokonaisluku t siten, että . Valitaan satunnaisluku a , 1 < a < n . Jos a ei todista luvun n alkuvoimaa, annetaan vastaus "n on yhdistetty" ja algoritmi päättyy. Muussa tapauksessa valitaan uusi satunnaisluku a ja varmennusmenettely toistetaan. Kun on löydetty r todisteita yksinkertaisuudesta, annetaan vastaus "n on luultavasti alkuluku" ja algoritmi päättyy [5] .
Algoritmi voidaan kirjoittaa pseudokoodilla seuraavasti:
Syöte : n > 2, pariton luonnollinen luku, joka testataan primaalisuuden suhteen; k on kierrosten lukumäärä. Tulos : komposiitti tarkoittaa, että n on yhdistelmäluku; luultavasti alkuluku tarkoittaa, että n on erittäin todennäköisesti alkuluku. Arvon n − 1 esittäminen muodossa 2 s · t , jossa t on pariton, voidaan tehdä jakamalla n - 1 peräkkäin kahdella. Silmukka A: toista k kertaa: Valitse satunnainen kokonaisluku a väliltä [2, n − 2] x ← a t mod n , joka lasketaan eksponentiointialgoritmilla modulo , jos x = 1 tai x = n − 1, ja siirry sitten silmukan A silmukan B seuraavaan iteraatioon : toista s − 1 kertaa x ← x 2 mod n jos x = 1, sitten palauttaa yhdisteen , jos x = n − 1, sitten siirry silmukan seuraavaan iteraatioon A palauttaa yhdisteen palauttaa luultavasti alkuluvunRabinin lauseesta seuraa, että jos k satunnaisesti valittua lukua todistaisivat luvun n alkuvoimaa , niin todennäköisyys, että n on yhdistetty, ei ylitä .
Myös suurilla n :n arvoilla todennäköisyys julistaa yhdistelmäluku todennäköisesti alkuluvuksi on olennaisesti pienempi kuin 4 − k . Damgard, Landrock ja Pomerands [10] laskivat tarkkoja virherajoja ja ehdottivat menetelmää k:n arvon valitsemiseksi halutun virherajan saamiseksi. Tällaisia rajoja voidaan käyttää esimerkiksi todennäköisten alkulukujen muodostamiseen. Niitä ei kuitenkaan tule käyttää tuntemattoman alkuperän alkulukujen testaamiseen, koska salausjärjestelmissä krakkausyksikkö voi yrittää korvata pseudoalkuluvun, kun alkulukua vaaditaan. Tällaisissa tapauksissa voidaan luottaa vain virheeseen 4 − k .
Olettaen, että kertolaskuaika on logaritminen, käyttämällä nopeaa modulo kertolaskua , algoritmin monimutkaisuus on , missä on kierrosten lukumäärä. Siten algoritmin ajoaika on polynomi.
FFT : tä käyttämällä on kuitenkin mahdollista lyhentää algoritmin ajoaikaa . Tässä tapauksessa, jos otamme , jossa n on tarkistettava luku, niin algoritmin monimutkaisuus on yhtä suuri kuin . [yksitoista]
Jos luku a todistaa Millerin mukaan yhdistelmäparittoman luvun n yksinkertaisuuden , niin luvun n puolestaan sanotaan olevan vahvasti pseudo -alkuluku kannassa a . Jos luku n on vahvasti pseudoalkuluku kannassa a , niin se on myös Fermatin pseudoalkuluku emäksessä a ja Euler-Jacobin pseudoalkuluku emäksessä a . [3]
Esimerkiksi vahvasti pseudoalkuluvut emäksessä 2 muodostavat sekvenssin:
2047, 3277, 4033, 4681, 8321, 15841, 29341, 42799, 49141, 52633, 65281, 74665, … ( OEIS - sekvenssi A001262 )ja kannassa 3 järjestys:
121, 703, 1891, 3281, 8401, 8911, 10585, 12403, 16531, 18721, 19345, 23521, 31621, … ( OEIS - sekvenssi A020229 )Sanakirjat ja tietosanakirjat |
---|
Lukuteoreettiset algoritmit | |
---|---|
Yksinkertaisuustestit | |
Alkulukujen löytäminen | |
Faktorisointi | |
Diskreetti logaritmi | |
GCD:n löytäminen |
|
Modulo-aritmetiikka | |
Lukujen kerto- ja jakolasku | |
Neliöjuuren laskeminen |