AKS test primality - AKS primality test
Test primality AKS (také známý jako test primarity Agrawal – Kayal – Saxena a cyklotomický test AKS ) je deterministický algoritmus prokazující primalitu vytvořený a publikovaný Manindrou Agrawalem , Neerajem Kayalem a Nitinem Saxenou , počítačovými vědci z Indického technologického institutu Kanpur , 6. srpna 2002, v článku s názvem „PRIMES je v P“. Algoritmus byl první, který dokázal prokazatelně určit, zda je dané číslo v polynomiálním čase prvočíselné nebo složené , aniž by se spoléhalo na matematické dohady , jako je zobecněná Riemannova hypotéza . Důkaz je také pozoruhodný tím, že se nespoléhá na oblast analýzy . V roce 2006 obdržel autoři oba Cenu Gödel a fulkersonova cena za jejich práci.
Důležitost
AKS je první algoritmus prokazující primalitu, který je současně obecný , polynomický , deterministický a bezpodmínečný . Předchozí algoritmy byly vyvíjeny po staletí a dosahovaly maximálně tří z těchto vlastností, ale ne všech čtyř.
- Algoritmus AKS lze použít k ověření primality jakéhokoli obecného čísla. Je známo mnoho rychlých testů primality, které fungují pouze pro čísla s určitými vlastnostmi. Například test Lucas – Lehmer funguje pouze pro čísla Mersenne , zatímco Pépinův test lze použít pouze pro čísla Fermat .
- Maximální doba běhu algoritmu může být vyjádřena jako polynom přes počet číslic v cílovém čísle. ECPP a APR přesvědčivě dokazují nebo vyvracejí, že dané číslo je prvočíslo, ale není známo, že by měly polynomické časové limity pro všechny vstupy.
- Algoritmus zaručeně deterministicky rozlišuje, zda je cílové číslo primární nebo složené. Randomizované testy, jako jsou Miller – Rabin a Baillie – PSW , mohou testovat libovolné dané číslo na primalitu v polynomiálním čase, ale je známo, že produkují pouze pravděpodobnostní výsledek.
- Správnost AKS není podmíněna žádnou dceřinou neprokázanou hypotézou . Naproti tomu Millerova verze Miller-Rabinova testu je plně deterministická a probíhá v polynomiálním čase na všech vstupech, ale jeho správnost závisí na pravdivosti dosud neprokázané generalizované Riemannovy hypotézy .
Přestože má tento algoritmus obrovský teoretický význam, v praxi se nepoužívá, což z něj činí galaktický algoritmus . U 64bitových vstupů je test primality Baillie – PSW deterministický a běží o mnoho řádů rychleji. U větších vstupů je výkon (také bezpodmínečně správných) testů ECPP a APR mnohem lepší než AKS. Navíc ECPP může vydávat osvědčení primality , který umožňuje nezávislé a rychlé ověření výsledků, což není možné u algoritmu AKS.
Pojmy
Test primality AKS je založen na následující větě: Vzhledem k tomu, že celočíselné a celočíselné coprime je , je primární právě tehdy, pokud je vztah polynomické kongruence
-
( 1 )
drží v polynomiálním kruhu . Všimněte si, že označuje neurčitý, který generuje tento polynomiální kruh.
Tato věta je zobecněním polynomů Fermatovy malé věty . V jednom směru to lze snadno dokázat pomocí binomické věty společně s následující vlastností binomického koeficientu :
- pro všechny, pokud je primární.
Zatímco vztah ( 1 ) představuje test primality sám o sobě, jeho ověření vyžaduje exponenciální čas : přístup hrubou silou by vyžadoval expanzi polynomu a redukci výsledných koeficientů.
Shoda je rovnost v polynomiálním kruhu . Vyhodnocení v kvocientovém kruhu vytvoří horní hranici pro stupeň zahrnutých polynomů. AKS vyhodnotí rovnost v , takže složitost výpočtu závisí na velikosti . Pro srozumitelnost je to vyjádřeno jako shoda
-
( 2 )
což je stejné jako:
-
( 3 )
u některých polynomů a .
Všimněte si, že všechny prvočísla splňují tento vztah (výběr v ( 3 ) dává ( 1 ), který platí pro prvočíslo). Tuto shodu lze zkontrolovat v polynomiálním čase, kdy je polynomický vůči číslicím . Algoritmus AKS vyhodnotí tuto shodu pro velkou sadu hodnot, jejichž velikost je polynomiální k číslicím . Důkaz platnosti algoritmu AKS ukazuje, že je možné najít a sadu hodnot s výše uvedenými vlastnostmi tak, že pokud kongruence platí, pak je to síla prvočísla.
Historie a doba běhu
V první verzi výše citovaného článku autoři dokázali, že asymptotická časová složitost algoritmu je (pomocí Õ z velké O notace )-dvanáctá mocnina počtu číslic v n násobku polylogaritmického faktoru počet číslic. Tato horní hranice však byla poněkud volná; široce rozšířené dohady o distribuci prvočísel Sophie Germainové by v případě pravdy okamžitě omezily nejhorší případ .
V měsících následujících po objevu se objevily nové varianty (Lenstra 2002, Pomerance 2002, Berrizbeitia 2002, Cheng 2003, Bernstein 2003a/b, Lenstra a Pomerance 2003), které výrazně zlepšily rychlost výpočtu. Vzhledem k existenci mnoha variant odkazují Crandall a Papadopoulos na „třídu AKS“ algoritmů ve své vědecké práci „O implementaci testů primality třídy AKS“, publikované v březnu 2003.
V reakci na některé z těchto variant a na další zpětnou vazbu byl článek „PRIMES is in P“ aktualizován o novou formulaci algoritmu AKS a jeho důkaz správnosti. (Tato verze byla nakonec publikována v Annals of Mathematics .) Přestože základní myšlenka zůstala stejná, r bylo vybráno novým způsobem a důkaz správnosti byl koherentněji organizován. Nový důkaz se téměř výhradně opíral o chování cyklotomických polynomů nad konečnými poli . Nová horní hranice časové složitosti byla později snížena pomocí dalších výsledků z teorie sít na .
V roce 2005 Pomerance a Lenstra předvedli variantu AKS, která běží v operacích, což vedlo k další aktualizované verzi papíru. Agrawal, Kayal a Saxena navrhli variantu, která by se objevila, kdyby byly Agrawalovy dohady pravdivé; heuristický argument Pomerance a Lenstra však naznačoval, že je pravděpodobně nepravdivý.
Algoritmus
Algoritmus je následující:
- Vstup: celé číslo n > 1 .
- Zkontrolujte, zda n je dokonalá mocnina : pokud n = a b pro celá čísla a > 1 a b > 1 , výstup složený .
- Najděte nejmenší r tak, aby ord r ( n )> (log 2 n ) 2 . (pokud r a n nejsou coprime, pak toto r přeskočte )
- U všech 2 ≤ a ≤ min ( r , n −1) zkontrolujte, zda a nedělí n : Pokud a | n pro nějaké 2 ≤ a ≤ min ( r , n −1), výstupní kompozit .
- Pokud n ≤ r , výstup primární .
- Pro = 1 až dělat
- pokud ( X + a ) n ≠ X n + a (mod X r - 1, n ), výstupní složený ;
- Výstup primární .
Zde ord r ( n ) je multiplikativní pořadí z n modulo r , log 2 je binární logaritmus , a je Eulerova totient funkce z r .
Krok 3 je v papíru uveden jako kontrola 1 <( a , n ) < n pro všechna a ≤ r . Je vidět, že je to ekvivalentní zkušebnímu dělení do r , které lze provést velmi efektivně bez použití gcd . Podobně porovnání v kroku 4 lze nahradit tím, že má zkušební divize zpáteční prime jakmile bude kontrolovat všechny hodnoty až do
Krok za velmi malými vstupy ovládá čas 5. Zásadního snížení složitosti (z exponenciálního na polynom) je dosaženo provedením všech výpočtů v konečném prstenci
skládající se z prvků. Tento prstenec obsahuje pouze monomialy a koeficienty jsou ve kterých má všechny prvky kódovatelné v bitech.
Většina pozdějších vylepšení algoritmu se soustředila na zmenšení velikosti r, což činí operaci jádra v kroku 5 rychlejší, a na zmenšení velikosti s počet smyček provedených v kroku 5. Obvykle tyto změny nemění výpočet složitost, ale může vést k tomu, že mnoho řádů zabere méně času, např. Bernsteinova konečná verze má teoretické zrychlení více než 2 miliony.
Osvědčení o platnosti
Aby byl algoritmus správný, musí být správné všechny kroky, které identifikují n . Kroky 1, 3 a 4 jsou triviálně správné, protože jsou založeny na přímých testech dělitelnosti n . Krok 5 je také správné: od (2) platí pro jakoukoliv volbu a coprime k n a r , jestliže n je prvočíslo, nerovnost znamená, že n musí být kompozitní.
Obtížným případem algoritmu je iterované tvrzení v kroku 5. Pokud toto v konečném prstenci R náhodou způsobí nesoulad
toto je ekvivalentní
- ,
takže po redukci na r monomial pomocí pouze musí být zkontrolováno.
Příklad 1: n = 31 je prvočíslo
- Vstup: celé číslo n = 31> 1.
If n = ab for integers a > 1 and b > 1, output composite. For [ b=2, b <= log2(n), b++, a=n1/b; If [ a is integer, Return[Composite]] ]; a=n1/2...n1/4={5.568, 3.141, 2.360}Find the smallest r such that Or(n) > (log2 n)2. maxk=⌊(log2 n)2⌋; maxr=Max[3, ⌈(Log2 n)5⌉]; (*maxr really isn't needed*) nextR=True; For [r=2, nextR && r < maxr, r++, nextR=False; For [k=1,(!nextR) &&k ≤ maxk, k++, nextR=(Mod[nk, r]==1 || Mod[nk, r]==0) ] ]; r--; (*the loop over increments by one*) r = 29If 1 < gcd(a,n) < n for some a ≤ r, output composite. For [a=r, a > 1, a--, If [(gcd=GCD[a,n]) > 1 && gcd < n, Return[Composite]] ]; gcd={GCD(29,31)=1, GCD(28,31)=1, ..., GCD(2,31)=1} ≯ 1
If n ≤ r, output prime. If [n ≤ r, Return[Prime]]; (* this step may be omitted if n > 5690034 *) 31 > 29For a = 1 to do if (X+a)n≠ Xn+a (mod Xr − 1,n), output composite; φ[x_]:=EulerPhi[x]; PolyModulo[f_]:=PolynomialMod[ PolynomialRemainder[f,xr-1,x],n]; max=Floor[Log[2,n]√φ[r]]; For[a=1, a ≤ max, a++, If[PolyModulo[(x+a)n-PolynomialRemainder[xn+a, xr-1], x]≠0, Return[Composite] ] ]; (x+a)31 = a31 +31a30x +465a29x2 +4495a28x3 +31465a27x4 +169911a26x5 +736281a25x6 +2629575a24x7 +7888725a23x8 +20160075a22x9 +44352165a21x10 +84672315a20x11 +141120525a19x12 +206253075a18x13 +265182525a17x14 +300540195a16x15 +300540195a15x16 +265182525a14x17 +206253075a13x18 +141120525a12x19 +84672315a11x20 +44352165a10x21 +20160075a9x22 +7888725a8x23 +2629575a7x24 +736281a6x25 +169911a5x26 +31465a4x27 +4495a3x28 +465a2x29 +31ax30 +x31 PolynomialRemainder [(x+a)31, x29-1] = 465a2 +a31 +(31a+31a30)x +(1+465a29)x2 +4495a28x3 +31465a27x4 +169911a26x5 +736281a25x6 +2629575a24x7 +7888725a23x8 +20160075a22x9 +44352165a21x10 +84672315a20x11 +141120525a19x12 +206253075a18x13 +265182525a17x14 +300540195a16x15 +300540195a15x16 +265182525a14x17 +206253075a13x18 +141120525a12x19 +84672315a11x20 +44352165a10x21 +20160075a9x22 +7888725a8x23 +2629575a7x24 +736281a6x25 +169911a5x26 +31465a4x27 +4495a3x28 (A) PolynomialMod [PolynomialRemainder [(x+a)31, x29-1], 31] = a31+x2 (B) PolynomialRemainder [x31+a, x29-1] = a+x2 (A) - (B) = a31+x2 - (a+x2) = a31-a max = = 26 {131-1=0 (mod 31), 231-2=0 (mod 31), 331-3=0 (mod 31), ..., 2631-26=0 (mod 31)}
Output prime. 31 Must be Prime
Kde PolynomialMod je termínově modulo redukce polynomu. např. PolynomialMod [x +2x 2 +3x 3 , 3] = x +2x 2 +0x 3
Reference
Další čtení
- Dietzfelbinger, Martin (2004). Testování primality v polynomiálním čase. Z randomizovaných algoritmů PRIMES je v P . Přednášky z informatiky. 3000 . Berlín: Springer-Verlag . ISBN 3-540-40344-2. Zbl 1058.11070 .
externí odkazy
- Weisstein, Eric W. „Test prvenství AKS“ . MathWorld .
- R. Crandall, Apple ACG a J. Papadopoulos (18. března 2003): O implementaci testů primality třídy AKS (PDF)
- Článek Bornemana, obsahující fotografie a informace o třech indických vědcích (PDF)
- Andrew Granville: Je snadné určit, zda je dané celé číslo prvočíslo
- Hlavní fakta: Od Euclida po AKS , Scott Aaronson (PDF)
- PRIMES je v P little FAQ od Anton Stiglic
- 2006 Citace Gödelovy ceny
- 2006 Citace Fulkersonovy ceny
- Prostředek algoritmu AKS „PRIMES in P“
- Grime, doktor James. „Fool -proof test pro prvočísla - Numberphile“ (video) . Brady Haran . [video popisuje exponenciální časový vztah (1), kterému se říká AKS]