Primalitás teszt - Primality test
Az elsődlegességi teszt egy algoritmus annak meghatározására, hogy egy bemeneti szám prím . A matematika egyéb területei között kriptográfiaként használják . Az egész szám faktorizációval ellentétben a primalitási tesztek általában nem adnak prímtényezőket , csak azt, hogy a bemeneti szám prím vagy sem. Faktorizációja Úgy gondolják, hogy a számítási nehéz feladat, mivel Prímtesztelés viszonylag könnyű (a futási idő van polinomiális a bemenet mérete). Néhány primitív teszt azt bizonyítja, hogy egy szám prímszám, míg mások, mint Miller – Rabin, azt bizonyítják, hogy egy szám összetett . Ezért az utóbbit pontosabban összetettségi tesztnek lehet nevezni az elsődlegességi tesztek helyett.
Egyszerű módszerek
A legegyszerűbb prímteszt van tárgyalás osztály : adott egy input szám, n , ellenőrzi, hogy egyenletesen osztható bármely prímszám 2 és √ n (azaz, hogy a szétválás nem hagy maradék ). Ha igen, akkor n jelentése kompozit . Ellenkező esetben príma .
Vegyük például a 100 -as számot, amely egyenletesen osztható ezekkel a számokkal:
- 2, 4, 5, 10, 20, 25, 50
Vegye figyelembe, hogy a legnagyobb tényező, 50, a fele a 100 -nak. Ez minden n -re érvényes : minden osztó kisebb vagy egyenlő .
Valójában, amikor minden lehetséges osztót tesztelünk , kétszer felfedezünk néhány tényezőt . Ennek megfigyelése érdekében írja át az osztók listáját terméklistaként, egyenként 100 -at:
- 2 × 50, 4 × 25, 5 × 20, 10 × 10, 20 × 5, 25 × 4, 50 × 2
Figyelje meg, hogy a 10 × 10 -nél korábbi termékek csupán a korábbi termékekben szereplő számokat ismételgetik. Például az 5 × 20 és a 20 × 5 azonos számokból áll. Ez igaz minden n : minden egyedi osztója n számok kisebb vagy egyenlő, mint √ n , így nem kell keresni, hogy a múlt. (Ebben a példában √ n = √ 100 = 10.)
Minden 2 -nél nagyobb páros szám is kiküszöbölhető, mivel ha páros szám oszthatja az n -t , akkor a 2 is.
Használjuk a próbaosztást a 17 primalitásának tesztelésére. Csak √ n -ig terjedő osztókra kell tesztelnünk , azaz egész vagy kisebb számokra , nevezetesen 2, 3 és 4 -re . A 4 -et kihagyhatjuk, mert ez páros szám: A 4 egyenletesen oszthatja a 17 -et, a 2 is, és 2 már szerepel a listában. Ebből 2 és 3 marad. A 17 -et elosztjuk mindegyik számmal, és azt tapasztaljuk, hogy egyik sem osztja egyenletesen a 17 -et - mindkét osztás maradékot hagy. Tehát a 17 az elsődleges.
Ezt a módszert tovább fejleszthetjük. Figyeljük meg, hogy minden 3 -nál nagyobb prímszám 6 k ± 1 alakú , ahol k bármely 0 -nál nagyobb egész szám. Ez azért van, mert minden egész szám kifejezhető (6 k + i ) formában , ahol i = -1, 0, 1 , 2, 3 vagy 4. Vegye figyelembe, hogy 2 oszt (6 k + 0), (6 k + 2) és (6 k + 4) és 3 oszt (6 k + 3) . Tehát hatékonyabb módszer annak tesztelése, hogy n osztható -e 2 -vel vagy 3 -mal, majd ellenőrizze az űrlap összes számát . Ez háromszor gyorsabb, mint az összes szám tesztelése √ n -ig .
Továbbá általánosítva, minden c # -nél nagyobb prímszám ( c primorális ) c # · k + i alakú , mert i < c #, ahol c és k egész számok, és i azokat a számokat jelöli, amelyek a c # -ig coprime . Például legyen c = 6 . Ekkor c # = 2,3,5 = 30 . Minden egész szám 30 k + i , i = 0, 1, 2, ..., 29 és k egész szám. Azonban 2 osztja a 0, 2, 4, ..., 28; 3 osztja a 0, 3, 6, ..., 27; és 5 osztja a 0, 5, 10, ..., 25. Tehát minden 30 -nál nagyobb prímszám 30 k + i alakú , i = 1, 7, 11, 13, 17, 19, 23, 29 (azaz az i <30 olyan, hogy GCD ( i , 30) = 1 ). Vegye figyelembe, hogy ha i és 30 nem lenne coprime, akkor 30 k + i osztható lenne egy 30 -as prímosztóval, nevezetesen 2 -vel, 3 -mal vagy 5 -el, és ezért nem lenne prím. (Megjegyzés: Nem minden szám felel meg a fenti feltételeknek. Például: 437 c#k+i formában van, ha c#(7) = 210, k = 2, i = 17. A 437 azonban összetett szám egyenlő 19*23).
A c → ∞ függvényében csökken azoknak az értékeknek a száma, amelyeket a c # k + i át tud venni egy bizonyos tartományon, és így csökken az n teszteléséhez szükséges idő . Ehhez a módszerhez azt is ellenőrizni kell, hogy osztható -e minden olyan prímszámmal, amely kisebb, mint c . Az előzőekhez hasonló megfigyelések rekurzívan is alkalmazhatók , így Eratosthenes szitáját kapjuk .
Jó módszer ezeknek a módszereknek (és az alábbiakban felsorolt összes többi) felgyorsításának, ha előre kiszámítjuk és tároljuk az összes prímszám listáját egy bizonyos határértékig, mondjuk az összes prímszámot 200-ig. (Egy ilyen lista kiszámítható a Eratosthenes szitája, vagy egy algoritmus segítségével, amely minden egyes növekményes m -et minden ismert prímszámmal összehasonlít < √ m ). Ezután a vizsgálat előtt n az primality komoly módszer, n először ellenőrizni kell oszthatóság minden elsődleges a listából. Ha a számok bármelyikével osztható, akkor összetett, és további tesztek kihagyhatók.
Egy egyszerű, de nagyon nem hatékony primalitási teszt Wilson -tételt használja , amely szerint p akkor és csak akkor prím, ha:
Bár ez a módszer nagyjából p moduláris szorzást igényel , de nem praktikus, a prímekre és a moduláris maradékokra vonatkozó tételek sokkal több gyakorlati módszer alapját képezik.
Példakód
Piton
A következőkben egy egyszerű primalitási tesztet végeztünk Python -ban , a korábban említett egyszerű 6 k ± 1 optimalizálással. Az alábbiakban ismertetett kifinomultabb módszerek sokkal gyorsabbak nagy n esetén .
def is_prime(n: int) -> bool:
"""Primality test using 6k+-1 optimization."""
if n <= 3:
return n > 1
if n % 2 == 0 or n % 3 == 0:
return False
i = 5
while i ** 2 <= n:
if n % i == 0 or n % (i + 2) == 0:
return False
i += 6
return True
C#
Az alábbiakban egy C# primalitási teszt látható, a fentiekkel megegyező optimalizálással.
bool IsPrime(int n)
{
if (n == 2 || n == 3)
return true;
if (n <= 1 || n % 2 == 0 || n % 3 == 0)
return false;
for (int i = 5; i * i <= n; i += 6)
{
if (n % i == 0 || n % (i + 2) == 0)
return false;
}
return true;
}
JavaScript
Az alábbiakban a JavaScript elsődlegességi tesztjét végezzük el, a fentiekkel megegyező optimalizálással.
function isPrime(num) {
if (num <= 3) return num > 1;
if ((num % 2 === 0) || (num % 3 === 0)) return false;
let count = 5;
while (Math.pow(count, 2) <= num) {
if (num % count === 0 || num % (count + 2) === 0) return false;
count += 6;
}
return true;
}
R
Az alábbiakban egy R (programozási nyelv) primalitási teszt látható, a fentiekkel megegyező optimalizálással.
is.prime <- function(number) {
if(number <= 1 || number %% 2 ==0 || number %% 3 == 0) {
return (FALSE)
} else if (number == 2 || number == 3 ) {
return(TRUE)
}
i <- 5
while (i*i <= number) {
if(number %% i == 0 || number %% (i+2)==0) {
return(FALSE)
} else {
return(TRUE)
}
i = i + 6
}
return(TRUE)
}
Heurisztikus tesztek
Ezek olyan tesztek, amelyek a gyakorlatban jól működnek, de nem bizonyítottak, ezért technikailag egyáltalán nem algoritmusok. A Fermat -teszt és a Fibonacci -teszt egyszerű példák, és nagyon hatékonyak kombinálva. John Selfridge sejtette, hogy ha p páratlan szám, és p ≡ ± 2 (mod 5), akkor p prím lesz, ha a következők mindegyike érvényes:
- 2 p −1 ≡ 1 (mod p ),
- f p +1 ≡ 0 (mod p ),
ahol f k a k -ik Fibonacci -szám . Az első feltétel a Fermat primalitási teszt, amely a 2 -es bázist használja.
Általánosságban elmondható, hogy ha p ≡ a (mod x 2 +4), ahol a másodfokú nem maradék (mod x 2 +4), akkor p legyen prímszám, ha a következő feltételek fennállnak:
- 2 p −1 ≡ 1 (mod p ),
- f ( 1 ) p +1 ≡ 0 (mod p ),
f ( x ) k a k -edik Fibonacci polinom x -nél .
Selfridge, Carl Pomerance és Samuel Wagstaff együtt 620 dollárt kínálnak ellenpéldáért. A probléma 2015. szeptember 11 -én még nyitott.
Valószínűségi tesztek
A valószínűségi tesztek szigorúbbak, mint a heurisztikák, mivel bizonyítható határokat biztosítanak az összetett számmal való becsapás valószínűségére. Sok népszerű primalitási teszt valószínűségi teszt. Ezek a tesztek a tesztelt n számon kívül néhány más a számot is használnak, amelyeket véletlenszerűen választanak ki valamely mintatérből ; a szokásos randomizált primalitási tesztek soha nem jelentenek prímszámot összetettként, de lehetséges, hogy egy összetett számot prímként kell jelenteni. A hiba valószínűsége csökkenthető a vizsgálat megismétlésével több egymástól függetlenül választott értékei egy ; A két leggyakrabban használt vizsgálatok, bármilyen összetett n legalább a felét egy „ s kimutatására n ” s összetettség, így k ismétlések csökkentése hiba valószínűsége, hogy legfeljebb 2 - k , amely lehet tetszőlegesen kicsi növelésével k .
A randomizált primalitási tesztek alapstruktúrája a következő:
- Válasszon véletlenszerűen egy számot a .
- Check egyenlőség (megfelel a választott vizsgálati) bevonásával egy , és a megadott szám n . Ha az egyenlőség nem állja meg a helyét, akkor n összetett szám, a pedig az összetettség tanúja , és a teszt leáll.
- Térjen vissza az első lépéshez, amíg el nem éri a szükséges pontosságot.
Ha egy vagy több iteráció után nem találjuk összetett számnak az n -t, akkor valószínűleg prímnek nyilvánítható .
Fermat primitális teszt
A legegyszerűbb valószínűségi primalitási teszt a Fermat -primalitási teszt (valójában összetettségi teszt). A következőképpen működik:
- Ha egy n egész számot adunk meg , válasszunk néhány egész számot egy coprime -ból n -be, és számítsunk ki egy n - 1 modulo n -t . Ha az eredmény eltér az 1 -től, akkor n összetett. Ha 1, akkor n lehet prím.
Ha egy n -1 (modulo n ) jelentése 1, de n nem prímszám, akkor n nevezzük pseudoprime a bázis egy . A gyakorlatban megfigyelhetjük, hogy ha egy n −1 (modulo n ) 1, akkor n általában prím. De itt egy ellenpélda: ha n = 341 és a = 2, akkor
annak ellenére, hogy 341 = 11 · 31 összetett. Valójában a 341 a legkisebb pszeudoprime 2 bázis (lásd 1. ábra).
Csak 21853 pszeudoprimes 2. bázis van, amelyek kisebbek, mint 2,5 × 10 10 (lásd: 1005. oldal). Ez azt jelenti, hogy n legfeljebb 2,5 × 10 10 esetén , ha 2 n −1 (modulo n ) 1, akkor n prímszám, kivéve, ha n a 21853 pszeudoprimes egyike.
Egyes összetett számoknak ( Carmichael számok ) az a tulajdonsága, hogy az n - 1 1 (modulo n ) minden olyan a esetén , amely n -nek coprime . A legkisebb példa n = 561 = 3 · 11 · 17, amelyre a 560 1 (modulo 561) minden olyan relatív prím a 561. Mindazonáltal, a Fermat tesztet gyakran használják, ha gyors szűrési számok van szükség, például a az RSA nyilvános kulcsú kriptográfiai algoritmus kulcsgenerálási fázisában .
Miller – Rabin és Solovay – Strassen elsődlegességi teszt
A Miller – Rabin elsődlegességi teszt és a Solovay – Strassen primalitási teszt kifinomultabb változatok, amelyek minden kompozitot észlelnek (ez még egyszer azt jelenti: minden n összetett szám esetén legalább 3/4 (Miller – Rabin) vagy 1/2 (Solovay) -Strassen) számok egy tanúi összetettség az n ). Ezek összetettségi tesztek is.
A Miller – Rabin elsődlegességi próba a következőképpen működik: Ha egy n egész számot adunk , válasszunk pozitív a < n egész számot . Legyen 2 s d = n - 1, ahol d páratlan. Ha
és
- mindenkinek
akkor n jelentése kompozit és egy tanú az összetettség. Ellenkező esetben az n lehet prím vagy nem. A Miller – Rabin teszt erős pszeudoprime teszt (lásd PSW 1004. oldal).
A Solovay – Strassen primalitási teszt egy másik egyenlőséget használ: Páratlan n -es szám esetén válasszon a < n egész számot , ha
- , hol van a Jacobi szimbólum ,
akkor n jelentése kompozit és egy tanú az összetettség. Ellenkező esetben az n lehet prím vagy nem. A Solovay – Strassen teszt Euler pszeudoprime teszt (lásd PSW 1003. oldal).
Minden egyes érték egy , a Solovay-Strassen-teszt gyengébb, mint a Miller-Rabin teszt. Például, ha n = 1905 és a = 2, akkor a Miller-Rabin teszt azt mutatja, hogy n összetett, de a Solovay – Strassen-teszt nem. Ennek oka az, hogy 1905 Euler pszeudoprime 2 bázis, de nem erős pszeudoprime 2 bázis (ezt a PSW 1. ábrája szemlélteti).
Frobenius primalitási teszt
A Miller – Rabin és a Solovay – Strassen elsődlegességi tesztek egyszerűek és sokkal gyorsabbak, mint a többi általános primitív teszt. A hatékonyság további javításának egyik módja bizonyos esetekben a Frobenius pszeudoprimalitási teszt ; ennek a tesztnek a fordulója körülbelül háromszor annyi időt vesz igénybe, mint egy Miller – Rabin forduló, de a hét Miller – Rabin körhöz hasonló valószínűségi kötöttséget ér el.
A Frobenius teszt a Lucas pszeudoprime teszt általánosítása .
Baillie-PSW elsődlegességi teszt
A Baillie – PSW elsődlegességi teszt egy valószínűségi primalitási teszt, amely egy Fermat- vagy Miller -Rabin -tesztet egy Lucas -féle valószínű prímeteszttel kombinál, és így kap egy olyan primalitási tesztet, amelynek nincs ismert ellenpéldája. Vagyis nincs olyan ismert összetett n , amelyre ez a teszt azt jelenti, hogy n valószínűleg prím. Kimutatták, hogy n -re nincs ellenpélda .
Egyéb tesztek
Leonard Adleman és Ming-Deh Huang az elliptikus görbe elsődlegességi tesztjének hibátlan (de várható polinomidős) változatát mutatta be . A többi valószínűségi teszttel ellentétben ez az algoritmus elsődlegességi tanúsítványt állít elő , és így bizonyítható, hogy egy szám prím. Az algoritmus a gyakorlatban rendkívül lassú.
Ha kvantumszámítógépek állnak rendelkezésre, az elsődlegességet aszimptotikusan gyorsabban lehet tesztelni , mint klasszikus számítógépek használatával. Shor algoritmusának , egy egész faktorosítási módszernek a Pocklington -primalitási teszttel való kombinációja megoldhatja a problémát .
Gyors determinisztikus tesztek
A 20. század eleje felé bebizonyosodott, hogy Fermat kis tételének következménye használható az elsődlegesség tesztelésére. Ennek eredményeként létrejött a Pocklington -féle primalitási teszt . Azonban, ahogy ez a vizsgálat szükségessé részleges faktorizációja az n - 1 a működési idő még elég lassú a legrosszabb esetben. A naiv módszereknél lényegesen gyorsabban végzett első determinisztikus primitális teszt a ciklotómia teszt volt ; annak futásidejű lehet bizonyult O ((log n ) c log log log n ), ahol n az a szám, hogy teszt primality és c jelentése függetlenül állandó n . Sok további fejlesztés történt, de egyik sem bizonyított polinomiális futási idővel. (Vegyük figyelembe, hogy időt mérik a méret a bemeneti, amely ebben az esetben az, ~ log n , hogy mivel a szükséges bitek száma, hogy képviselje a szám n .) A elliptikus görbe prímteszt bizonyíthatóan futtatni O ((log n ) 6 ), ha az analitikus számelmélet néhány feltételezése igaz. Hasonlóképpen, az általánosított Riemann -hipotézis alapján bizonyítható , hogy a determinisztikus Miller -teszt , amely a valószínűségi Miller – Rabin -teszt alapját képezi, Õ ((log n ) 4 ) -ben fut . A gyakorlatban ez az algoritmus lassabb, mint a másik kettő a számméretek esetében, amelyek egyáltalán kezelhetők. Mivel e két módszer megvalósítása meglehetősen nehéz, és programozási hibák kockázatát hordozza magában, gyakran a lassabb, de egyszerűbb teszteket részesítik előnyben.
2002 -ben Manindra Agrawal , Neeraj Kayal és Nitin Saxena találta ki az első bizonyíthatóan feltétel nélküli determinisztikus polinomiális időpróbát . Az AKS elsődlegességi tesztje Õ ((log n ) 12 ) -ben (javítva Õ -re ((log n ) 7.5 ) a papírjuk közzétett felülvizsgálatában), amely tovább csökkenthető Õ -re ((log n ) 6 ), ha Sophie Germain sejtése igaz. Ezt követően a Lenstra és a Pomerance bemutatta a tesztnek azt a változatát, amely időben fut (Õ (log n ) 6 ) feltétel nélkül.
Agrawal, Kayal és Saxena javaslatot tesz algoritmusuk egy változatára, amely akkor futna Õ ((log n ) 3 ) -ban, ha Agrawal sejtése igaz; azonban Hendrik Lenstra és Carl Pomerance heurisztikus érvelése azt sugallja, hogy valószínűleg hamis. Az Agrawal sejtésének módosított változata, az Agrawal – Popovych sejtés még mindig igaz lehet.
Bonyolultság
A számítási komplexitás elméletében a prímszámoknak megfelelő formális nyelvet PRIMES jelöli. Könnyű kimutatni, hogy a PRIMES a Co-NP-ben van : a COMPOSITES kiegészítője NP-ben van, mert az összetettséget úgy lehet eldönteni, ha nem determinisztikusan kitalálunk egy tényezőt.
1975 -ben Vaughan Pratt kimutatta, hogy létezik az elsődlegességre vonatkozó tanúsítvány, amely polinomiális időben ellenőrizhető, és így a PRIMES NP -ben , tehát NP ∩ coNP -ben van . A részleteket lásd az elsődlegességi tanúsítványban .
A Solovay – Strassen és Miller – Rabin algoritmusok későbbi felfedezése a PRIMES -t a coRP -be helyezte . 1992 -ben az Adleman – Huang algoritmus ZPP = RP ∩ coRP -re redukálta a komplexitást , ami felváltotta Pratt eredményét.
Az Adleman – Pomerance – Rumely primalitási teszt 1983-ból a PRIMES-t QP-ben ( kvázi polinomiális idő ) helyezte el , ami nem ismert, hogy összehasonlítható lenne a fent említett osztályokkal.
A gyakorlatban való kezelhetősége, a Riemann-hipotézist feltételező polinomiális idejű algoritmusok és más hasonló bizonyítékok miatt sokáig gyanították, de nem bizonyították, hogy a primitivitás polinomidőben megoldható. Az AKS elsődlegességi teszt végül megoldotta ezt a régóta fennálló kérdést, és a PRIMES-t P-be helyezte . Azonban, PRIMES nem ismert, hogy a P-teljes , és ez nem ismert, hogy abban rejlik osztályok fekvő belül P , mint NC vagy L . Ismeretes, hogy a PRIMES nincs AC 0 -ban .
Számelméleti módszerek
Bizonyos számelméleti módszerek léteznek a szám prímszámának tesztelésére, például a Lucas-teszt és a Proth-teszt . Ezek a tesztek általában n + 1, n- 1 vagy hasonló mennyiségű faktorizációt igényelnek , ami azt jelenti, hogy nem hasznosak az általános célú elsődlegességi teszteléshez, de gyakran elég erősek, ha a tesztelt n számról ismert, hogy speciális forma.
A Lucas teszt azon a tényen alapul, hogy a multiplikatív érdekében számos olyan modulo n jelentése n - 1 elsődleges n , amikor egy olyan primitív gyök . Ha meg tudjuk mutatni, hogy a primitív n -re , akkor megmutathatjuk, hogy n prím.
Hivatkozások
Források
- Richard Crandall és Carl Pomerance (2005). Prímszámok: Számítási perspektíva (2. kiadás). Springer. ISBN 0-387-25282-7.3. fejezet: Prímek és kompozitok felismerése, 109–158. 4. fejezet: Primalitási bizonyítás, 159–190. 7.6. Szakasz: Elliptikus görbe elsődlegességének bizonyítása (ECPP), 334–340.
-
Knuth, Donald (1997). "4.5.4. szakasz". A számítógépes programozás művészete . 2. kötet: Seminumerikus algoritmusok (harmadik kiadás). Addison – Wesley. 391–396. ISBN 0-201-89684-2.
|volume=extra szöveget tartalmaz ( segítség ) - Thomas H. Cormen ; Charles E. Leiserson ; Ronald L. Rivest ; Clifford Stein (2001). "31.8. Szakasz: Primalitásvizsgálat". Bevezetés az algoritmusokba (második szerk.). MIT Press és McGraw – Hill. 887–896. ISBN 0-262-03293-7.
- Papadimitriou, Christos H. (1993). "10.2. Szakasz: Primalitás". Számítási komplexitás (1. kiadás). Addison Wesley. pp. 222 -227. ISBN 0-201-53082-1. Zbl 0833.68049 .
- Riesel, Hans (1994). Prímszámok és számítógépes módszerek a faktorizáláshoz . Haladás a matematikában. 126 (második kiadás). Boston, MA: Birkhäuser. ISBN 0-8176-3743-5. Zbl 0821.11001 .
Külső linkek
- Excel képlet (ExcelExchange.com)
- Solovay-Strassen (computacion.cs.cinvestav.mx) at archive.today (archivált 2012-12-20)-A Solovay-Strassen elsődlegességi teszt végrehajtása Maple-ben
- A prímszámok megkülönböztetése az összetett számoktól, DJ Bernstein (cr.yp.to)
- A Prime Pages (primes.utm.edu)
- Lucas Primality Test Factored N- 1-vel (MathPages.com) a Kongresszusi Könyvtár webarchívumában (archiválva 2010-08-06)
- A PRIMABOINCA egy kutatási projekt, amely internethez csatlakoztatott számítógépeket használ ellenpélda keresésére néhány sejtésre. Az első sejtés ( Agrawal sejtése ) volt az alapja az első determinisztikus prímteszt algoritmus polinomiális időben ( AKS algoritmus ) megfogalmazásának.