A Miller-Rabin teszt egy valószínűségi polinomiális primalitásteszt . A Miller-Rabin teszt, valamint a Fermat teszt és a Solovay-Strassen teszt hatékonyan meghatározhatja, hogy egy adott szám összetett -e . Nem használható azonban annak szigorú bizonyítására , hogy egy szám prím . A Miller-Rabin tesztet azonban gyakran használják a kriptográfiában nagy véletlenszerű prímszámok generálására .
A Miller-Rabin algoritmus a Gary Miller által 1976 -ban kifejlesztett Miller-algoritmus módosítása . Miller algoritmusa determinisztikus , de helyessége a nem bizonyított kiterjesztett Riemann-hipotézisen alapul [1] . Michael Rabin 1980 -ban módosította [2] . A Miller-Rabin algoritmus nem függ a hipotézis érvényességétől, hanem valószínűségi.
Mivel sok titkosítási algoritmus kriptográfiai erőssége titkos kulcsokon alapul, amelyek létrehozásához prímszámok szükségesek (például így működik az RSA -rejtjel ), az ilyen kulcsok létrehozásakor fontos, hogy gyorsan ellenőrizni lehessen a nagy számokat elsődlegessége. A valószínűségi primalitási tesztek, mint például a Miller-Rabin teszt és a Solovay-Strassen teszt a determinisztikus tesztekhez képest nagyobb hatékonyságot és könnyebb kifejezést mutatnak [3] . A Miller-Rabin algoritmus lehetővé teszi, hogy rövid időn belül ellenőrzést hajtson végre, és ugyanakkor meglehetősen kicsi a valószínűsége annak, hogy a szám valóban összetett. [négy]
A Fermat és Nightingale-Strassen tesztekhez hasonlóan a Miller-Rabin teszt is a prímszámokra érvényes egyenlőségsorozat ellenőrzésére támaszkodik. Ha legalább egy ilyen egyenlőség meghiúsul, az bizonyítja, hogy a szám összetett [5] .
A Miller-Rabin teszthez a következő állítást használjuk:
Legyen egy prímszám és , ahol páratlan. Ekkor az alábbi feltételek közül legalább egy teljesül:
|
A végső mezőben (prím esetén) nincs egység négyzetgyöke, kivéve az 1 , -1 számokat |
Legyen:
Akkor:
Euklidész lemmája szerint :
Fermat kis tétele szerint :
Kivonjuk a szám négyzetgyökét . A fent bizonyított lemma szerint minden lépésnél 1 -es vagy -1 modulo számot kapunk . Ha valamelyik lépésnél -1 -et kapunk , akkor az egyenlőségek közül a második teljesül. Ellenkező esetben az utolsó lépésben (mert ), azaz az első egyenlőség teljesül.
Ha ez az állítás (1. vagy 2. feltétel) bizonyos számokra és (nem feltétlenül prímre) teljesül , akkor a számot Miller prímtanújának , magát a számot pedig valószínűségi prímnek nevezzük . (Véletlenszerűen 25% esély van arra, hogy egy összetett számot összetévesztünk prímszámmal, de ez csökkenthető, ha másokat keres .)
Abban az esetben, ha a bizonyított állítás ellentmondása teljesül, vagyis ha van olyan szám , amely:
és
akkor a szám nem prímszám. Ebben az esetben a számot annak tanújának nevezzük, hogy a szám összetett.
Páratlan összetett számok esetén Rabin tétele szerint nincs több tanúja az egyszerűségnek, hol van az Euler-függvény , így annak a valószínűsége, hogy egy véletlenszerűen kiválasztott szám az egyszerűség tanúja lesz, kisebb, mint 1/4 [2] [6] .
A teszt célja, hogy ellenőrizze a véletlenszerűen kiválasztott számokat , vajon tanúi-e a szám elsődlegességének . Ha bizonyíték van arra, hogy a szám összetett, akkor a szám valóban összetett. Ha a számokat ellenőriztük , és mindegyik prímnek bizonyult, akkor a szám prímnek minősül. Egy ilyen algoritmus esetén kisebb lesz annak a valószínűsége, hogy egy prímszámra összetett számot veszünk [7] .
Nagy számok ellenőrzéséhez véletlenszerű számokat szokás választani , mivel az 1, 2, ..., n − 1 számok között nem ismert az elsődlegesség és az összetett szám tanúinak megoszlása. Arnolt [8] konkrétan egy 397 bites összetett számot ad meg, amelyre minden 307-nél kisebb szám az egyszerűség bizonyítéka.
Tegyük fel, hogy meg akarjuk határozni, hogy n = 221 prím-e. Írjuk fel n − 1 = 220 -at 2 2 55-nek, tehát s = 2 és d = 55. Tetszőlegesen kiválasztunk egy olyan a számot , amelyre 0 < a < n , mondjuk a = 174. Folytassa a számításokkal:
Mivel 220 ≡ −1 mod n , 221 vagy prím, vagy 174 hamis tanúja, hogy 221 prím. Vegyünk egy másik tetszőleges a -t , ezúttal a = 137-et választva:
Mivel a 137 annak tanúja, hogy a 221 összetett, a 174 valójában az egyszerűség hamis tanúja volt. Vegyük észre, hogy az algoritmus nem mond semmit a 221 tényezőiről (amelyek 13 és 17). Bizonyos esetekben azonban további számítások segítenek a számtényezők meghatározásában. [9]
A Miller-Rabin algoritmust az r körök számával paraméterezzük . Javasoljuk, hogy r nagyságrendű legyen , ahol n a vizsgálandó szám.
Adott n esetén van egy s egész és egy páratlan t egész szám , hogy . Egy a véletlenszámot választunk , 1 < a < n . Ha a nem mutatja az n szám elsődlegességét, akkor az "n összetett" választ kapjuk , és az algoritmus véget ér. Ellenkező esetben a rendszer egy új véletlenszámot a kiválaszt , és az ellenőrzési eljárás megismétlődik. Miután r bizonyítékot találtunk az egyszerűségre, az "n valószínűleg prím" választ adjuk , és az algoritmus befejeződik [5] .
Az algoritmus a következőképpen írható pszeudokódban :
Bemenet : n > 2, egy páratlan természetes szám, amelyet az elsődlegesség szempontjából ellenőrizni kell; k a körök száma. Kimenet : összetett , azt jelenti, hogy n egy összetett szám; valószínűleg prím azt jelenti, hogy n nagy valószínűséggel prím. Az n − 1 ábrázolása 2 s · t -ként , ahol t páratlan, megtehető úgy, hogy n - 1- et elosztjuk 2-vel. A hurok : ismételje meg k - szer: Válasszon egy véletlenszerű egész számot a [2, n − 2] x ← a t mod n intervallumban, a modulo hatványozási algoritmussal kiszámítva, ha x = 1 vagy x = n − 1, majd menjen az A hurok következő iterációjához . : ismételje meg az s − 1-szer x ← x 2 mod n ha x = 1, majd adja vissza az vegyületet , ha x = n − 1, majd lépjen az A ciklus következő iterációjához .Rabin tételéből következik, hogy ha k véletlenszerűen kiválasztott szám tanúja lenne az n szám prímságának , akkor annak a valószínűsége, hogy n összetett, nem haladja meg a -t .
Ezenkívül n nagy értékei esetén annak a valószínűsége, hogy egy összetett szám valószínűleg prímként deklaráljon, lényegesen kisebb, mint 4 − k . Damgard, Landrock és Pomerands [10] kiszámított néhány pontos hibahatárt, és egy módszert javasolt k értékének kiválasztására a kívánt hibahatár eléréséhez. Ilyen korlátok használhatók például valószínű prímszámok generálására. Mindazonáltal nem használhatók ismeretlen eredetű prímszámok tesztelésére, mivel a kriptográfiai rendszerekben a cracker megpróbálhat helyettesíteni egy pszeudoprímet, amikor prímszámra van szükség. Ilyen esetekben csak a 4 − k hibára hagyatkozhatunk .
Feltételezve, hogy a szorzási idő logaritmikus, gyors modulo szorzást használva az algoritmus bonyolultsága , ahol a körök száma. Így az algoritmus futási ideje polinomiális.
Az FFT használatával azonban lehetséges az algoritmus futási idejét -ra csökkenteni . Ebben az esetben, ha vesszük , ahol n az ellenőrizendő szám, akkor az algoritmus összetettsége egyenlő -val . [tizenegy]
Ha az a szám az n összetett páratlan szám egyszerűségének tanúja Miller szerint, akkor az n számot viszont erősen pszeudo -prímnek mondjuk az a bázisban . Ha egy n szám erősen pszeudoprím az a bázisban , akkor Fermat pszeudoprím az a bázisban és Euler-Jacobi pszeudoprím az a bázisban is . [3]
Például az erősen pszeudoprímek a 2. bázisban alkotják a következő sorozatot:
2047, 3277, 4033, 4681, 8321, 15841, 29341, 42799, 49141, 52633, 65281, 74665, … ( OEIS sorozat A001262 )a 3. bázisban pedig a következő sorrend:
121, 703, 1891, 3281, 8401, 8911, 10585, 12403, 16531, 18721, 19345, 23521, 31621, … ( OEIS sorozat A020229 ) ![]() |
---|
Számelméleti algoritmusok | |
---|---|
Egyszerűség tesztek | |
Prímszámok keresése | |
Faktorizáció | |
Diszkrét logaritmus | |
GCD keresése | |
Modulo aritmetika | |
Számok szorzása és osztása | |
A négyzetgyök kiszámítása |