AKS素数判定法

AKS素数判定法（AKSそすうはんていほう）は、与えられた自然数が素数であるかどうかを決定的多項式時間で判定できる、世界初のアルゴリズムである。ここで、素数判定法が多項式時間であるとは、与えられた自然数 n {\displaystyle n} が素数であるかどうかを判定するのにかかる時間が log ⁡ ( n ) {\displaystyle \log(n)} の多項式を上界とすることをいう。 n {\displaystyle n} の多項式ではないことに注意する必要がある。 AKS素数判定法は2002年8月6日に "PRIMES is in P" と題された論文で発表された。Agrawal-Kayal-Saxena 素数判定法としても知られ、論文の著者であるインド工科大学のマニンドラ・アグラワル教授と、2人の学生ニラジュ・カヤル、ナイティン・サクセナ（英語版）の3人の名前から付けられた。 この素数判定法が発見される以前にも、素数の判定方法は多数知られていたが、リーマン予想などの仮説を用いずに、決定的多項式時間で判定できるアルゴリズムは存在しなかった。 素数判定という重要な問題が実際にクラスPに属することを示した点で理論的には大躍進であった。しかし実用的には、多項式の次数が高すぎるので、今まで判定できなかった素数を高速に判定できるようになったわけではない（まだ「一般数体篩法」で因数分解した方がよい）。 AKS素数判定法は、ある意味ではフェルマーテストの改良と見ることができる。 フェルマーの小定理の対偶である次のような命題を考える。 a {\displaystyle a} , n {\displaystyle n} が互いに素な自然数であるとする。 a n   ≢   a ( mod n ) {\displaystyle a^{n}\ \not \equiv \ a{\pmod {n}}} であるとき、 n {\displaystyle n} は合成数である。 フェルマーテストはこの十分条件によって確率的素数判定を行うものであったが、上は必要条件ではないので、合成数であるにもかかわらずそれを検出できない場合があった。特に、カーマイケル数と呼ばれる合成数が無限個存在し、これらはいかなる a {\displaystyle a} を用いても合成数であることを検出できない。 そこで、この条件を次のように改良する。 a {\displaystyle a} , n {\displaystyle n} が互いに素な自然数であるとする。 ( X + a ) n   ≢   X n + a ( mod n ) {\displaystyle (X+a)^{n}\ \not \equiv \ X^{n}+a{\pmod {n}}} であることは、 n {\displaystyle n} は合成数であることと同値である。 このことは、二項定理により各次数の係数を評価すれば容易に証明できる。 上の式は、 X {\displaystyle X} が恒等的に 0 だと思えばフェルマーの小定理の対偶そのものである。つまり、上の条件による判定はフェルマーテストをより厳密にしたものといえる。 厳密にしたことによりフェルマーテストとは異なり必要十分条件を与えている。したがって上の合同式を真面目に評価してやれば素数性を判定する決定性アルゴリズムができるが、これは時間がかかりすぎる。つまり、最悪の場合 n {\displaystyle n} 個の係数を評価しなければならないので、これは n {\displaystyle n} のビット数に対して指数関数時間である。 そこでもう少し大雑把に評価することにする。具体的には、何らかの小さい r {\displaystyle r} をとって X r − 1 {\displaystyle X^{r}-1} を法として評価する。すると、 X r − 1 {\displaystyle X^{r}-1} による剰余は高々 r − 1 {\displaystyle r-1} 次だから、評価する係数の数を減らすことができる。 ( X + a ) n   ≢   X n + a ( mod X r − 1 , n ) {\displaystyle (X+a)^{n}\ \not \equiv \ X^{n}+a{\pmod {X^{r}-1,n}}} しかし、これは「大雑把な評価」である。評価を楽にした分、その精度も落ちている。このままでは、合成数なのに誤って素数であると判定してしまう恐れがある。そこで、パラメータ a {\displaystyle a} を動かして、たくさんの a {\displaystyle a} に対して上の合同式を評価することで埋め合わせにする。 この発想が、AKSアルゴリズムの肝である。つまり、十分にたくさんの a {\displaystyle a} について上の合同式を確かめれば、 X r − 1 {\displaystyle X^{r}-1} を法としたままでも素数性を厳密に判定することができる（これは自明ではないが、証明できる）。そして、 a {\displaystyle a} を動かす範囲や適切な r {\displaystyle r} の値は n {\displaystyle n} に対してそれほど大きくならないので、この方法は最初の合同式を真面目に評価するより速く、多項式時間で動作する。 素数性を判定すべき、2以上の自然数 n {\displaystyle n} を入力する。 もし、 n {\displaystyle n} が累乗数であるならば「合成数である」と出力してアルゴリズムを終了する。 o r ( n ) > 4 log 2 ⁡ n {\displaystyle o_{r}(n)>4\log ^{2}n} になる最小の r {\displaystyle r} を見つける。 もし、ある a ≤ r {\displaystyle a\leq r} に対して 1 < ( a , n ) < n {\displaystyle 1<(a,n)<n} ならば、「合成数である」と出力してアルゴリズムを終了する。 もし、 n ≤ r {\displaystyle n\leq r} ならば、「素数である」と出力してアルゴリズムを終了する。 1 {\displaystyle 1} から [ 2 ϕ ( r ) log ⁡ n ] {\displaystyle [2{\sqrt {\phi (r)}}\log n]} まで、順に a {\displaystyle a} を動かすものとする。もし ( X + a ) n   ≢   X n + a ( mod X r − 1 , n ) {\displaystyle (X+a)^{n}\ \not \equiv \ X^{n}+a{\pmod {X^{r}-1,n}}} ならば、「合成数である」と出力してアルゴリズムを終了する。 「素数である」と出力してアルゴリズムを終了する。 ただし、上において、 ( a , b ) {\displaystyle (a,b)} は a {\displaystyle a} , b {\displaystyle b} の最大公約数 o r ( n ) {\displaystyle o_{r}(n)} は r {\displaystyle r} を法とした n {\displaystyle n} の位数、つまり n e ≡ 1 ( mod r ) {\displaystyle n^{e}\equiv 1{\pmod {r}}} なる最小の自然数 e {\displaystyle e} である。 [ x ] {\displaystyle [x]} はガウス記号 ϕ {\displaystyle \phi } はオイラーのφ関数 第5ステップで用いている判定法は、累乗数についてはうまく働かない。累乗数であるならばすなわち合成数なのだから、最初のステップにおいて累乗数であると判明した場合には「合成数である」と出力して終了する。 次に、 n {\displaystyle n} の位数が十分に大きくなるような法 r {\displaystyle r} を求める。このような r {\displaystyle r} が存在するのかどうかが問題となるが、最小公倍数に関する議論から r ≤ ⌈ 16 log ⁡ ( n ) 5 ⌉ {\displaystyle r\leq \lceil 16\log(n)^{5}\rceil } までに存在することが示される。 その次に、 n {\displaystyle n} が実際に ( Z / r Z ) × {\displaystyle (\mathbb {Z} /r\mathbb {Z} )^{\times }} の元であるかを確かめている。これは第5ステップが正しく動作するために必要である。 ( Z / r Z ) × {\displaystyle (\mathbb {Z} /r\mathbb {Z} )^{\times }} に属する必要十分条件が (n, r) = 1 であるが、この段階で最大公約数が 1 でなかったなら、それはつまり n {\displaystyle n} の非自明な因数が発見されたということであるから、「合成数である」と出力して終了する。 第4ステップでは、もしこの段階で n ≤ r {\displaystyle n\leq r} であったならば、第3ステップにおいて n {\displaystyle n} が n − 1 {\displaystyle n-1} までのすべての数と互いに素であると確認したことになるから、「素数である」と出力して終了する。これは、 n {\displaystyle n} が非常に小さい数の場合に発生するケースであり、400 より大きい n {\displaystyle n} についてはあまり起こらない。 第5ステップは、アルゴリズムの中心的な部分である。ここでいずれかの a {\displaystyle a} についてこの合同式が不成立であれば、 n {\displaystyle n} は合成数である。このことは二項定理を用いて係数を真面目に評価すれば容易に証明できる。 第5ステップにおいて、十分に多くの a {\displaystyle a} を用いても合成数であることを検出できなかったなら、そのとき n {\displaystyle n} は実際に素数である。このことがAKSアルゴリズムの中核であり、PRIMES is in P の半ばはその証明に費やされている。 AKSアルゴリズムの時間的計算量は高々 O ~ ( log ⁡ ( n ) 7.5 ) {\displaystyle {\tilde {O}}(\log(n)^{7.5})} である。 PRIMES is in P の初版では、このアルゴリズムは O ~ ( log ⁡ ( n ) 12 ) {\displaystyle {\tilde {O}}(\log(n)^{12})} のアルゴリズムとして提示された。その後の改訂を経て、現在では O ~ ( log ⁡ ( n ) 7.5 ) {\displaystyle {\tilde {O}}(\log(n)^{7.5})} であることが証明されている。しかし、実際には O ~ ( log ⁡ ( n ) 6 ) {\displaystyle {\tilde {O}}(\log(n)^{6})} であろうと考えられている。また、現在の証明は篩理論の高度な結果によっているが、初歩的な代数学の知識だけでも O ~ ( log ⁡ ( n ) 10.5 ) {\displaystyle {\tilde {O}}(\log(n)^{10.5})} であることは証明できる。 ただし、記法 O ~ {\displaystyle {\tilde {O}}} は、次のように定義される。 f ( x ) = O ~ ( g ( x ) ) ⇔ f ( x ) = O ( g ( x ) ⋅ P o l y ( log ⁡ g ( x ) ) ) {\displaystyle f(x)={\tilde {O}}(g(x))\Leftrightarrow f(x)=O(g(x)\cdot \mathrm {Poly} (\log g(x)))} 即ち、記号 O ~ {\displaystyle {\tilde {O}}} はランダウの記号 O を少しだけ弱めたものである。 f ( x ) = O ~ ( g ( x ) ) {\displaystyle f(x)={\tilde {O}}(g(x))} ならば、任意の ϵ > 0 {\displaystyle \epsilon >0} について f ( x ) = O ( g ( x ) 1 + ϵ ) {\displaystyle f(x)=O\left(g(x)^{1+\epsilon }\right)} が成立する（逆は成り立たない）。 p進のニュートン法を用いれば、各自然数 b {\displaystyle b} について n b {\displaystyle {\sqrt[{b}]{n}}} は O ~ ( log ⁡ ( n ) 2 ) {\displaystyle {\tilde {O}}(\log(n)^{2})} で計算できる。 n = a b {\displaystyle n=a^{b}} なる b {\displaystyle b} の上界は log 2 ⁡ n {\displaystyle \log _{2}n} であるから、最初のステップは O ~ ( log ⁡ ( n ) 3 ) {\displaystyle {\tilde {O}}(\log(n)^{3})} で動作する。 第2ステップは、 r ≤ ⌈ 16 log ⁡ ( n ) 5 ⌉ {\displaystyle r\leq \lceil 16\log(n)^{5}\rceil } であったことを思い出せば、 O ~ ( log ⁡ ( n ) 7 ) {\displaystyle {\tilde {O}}(\log(n)^{7})} で動作するといえる。 第3ステップでは、ユークリッドの互除法を用いれば最大公約数 1 つを O ~ ( log ⁡ ( n ) ) {\displaystyle {\tilde {O}}(\log(n))} で計算できる。これを O ( r ) = O ( log ⁡ ( n ) 5 ) {\displaystyle O(r)=O(\log(n)^{5})} 回繰り返すので、第3ステップにかかる時間は O ~ ( log ⁡ ( n ) 6 ) {\displaystyle {\tilde {O}}(\log(n)^{6})} である。 第4ステップは、単に比較するだけであるから O ( log ⁡ n ) {\displaystyle O(\log n)} である。 第5ステップでは、 mod X r − 1 {\displaystyle \mod X^{r}-1} で考えているので多項式の次数は高々 r − 1 {\displaystyle r-1} であり、 mod n {\displaystyle \mod n} で考えているので係数は高々 n − 1 {\displaystyle n-1} である。高速フーリエ変換を用いれば、このような多項式の冪は O ~ ( r log ⁡ ( n ) 2 ) {\displaystyle {\tilde {O}}(r\log(n)^{2})} で計算される。繰り返しの回数をかければ、第5ステップは O ~ ( r ϕ ( r ) log ⁡ ( n ) 3 ) = O ~ ( log ⁡ ( n ) 10.5 ) {\displaystyle {\tilde {O}}(r{\sqrt {\phi (r)}}\log(n)^{3})={\tilde {O}}(\log(n)^{10.5})} で動作するといえる。 第6ステップは、定数時間である。 したがって、全体の時間は O ~ ( log ⁡ ( n ) 10.5 ) {\displaystyle {\tilde {O}}(\log(n)^{10.5})} であるといえる。 全体の時間を支配しているのは、第5ステップの時間であり、ひいては r {\displaystyle r} の大きさである。したがって、実は r {\displaystyle r} は ⌈ 16 log ⁡ ( n ) 5 ⌉ {\displaystyle \lceil 16\log(n)^{5}\rceil } よりも小さく定まるということを証明できれば、計算量の評価を改善することができる。 篩理論より r = O ( log ⁡ ( n ) 3 ) {\displaystyle r=O(\log(n)^{3})} であるということが分かるので、実際にはアルゴリズムは O ~ ( log ⁡ ( n ) 7.5 ) {\displaystyle {\tilde {O}}(\log(n)^{7.5})} で動作する。 更に、いくつかの証明されていない仮説を認めるならば、 r {\displaystyle r} の評価をより小さくできる。 アルチン予想を認めるならば r = O ( log ⁡ ( n ) 2 ) {\displaystyle r=O(\log(n)^{2})} である。 ソフィー・ジェルマン素数の密度予想が正しいと仮定すれば、 r = O ~ ( log ⁡ ( n ) 2 ) {\displaystyle r={\tilde {O}}(\log(n)^{2})} である。 これらの仮説はともに一般リーマン仮説を認めれば証明できる。多くの数学者がリーマン仮説は正しいと信じていることを考えれば、 r = O ( log ⁡ ( n ) 2 ) {\displaystyle r=O(\log(n)^{2})} つまり、AKSアルゴリズムの時間的計算量が O ~ ( log ⁡ ( n ) 6 ) {\displaystyle {\tilde {O}}(\log(n)^{6})} である見込みは高い。 素数 素数判定 Manindra's home page - Agrawal教授のサイト Agrawal, M., Kayal, N., and Saxena, N.: Primes in P, Aug. 6, 2002 - 原著論文 PRIMES is in P, August, 2005 version - 6訂版 原著論文の日本語による解説のサイト - ウェイバックマシン（2003年6月5日アーカイブ分） 小澤伸二, 宮田大輔: AKS予想の実装と検証, パソコンリテラシ, 28(5), (2003)，8-13