暗号等を作成する場合,その数が素数であるか,合成数であるか判定することは重要なことです。そのため素数判定について多くの研究がなされ,現在ではかなり大きな数でも素数かどうか判定することができます。 最も簡単な方法として,フェルマーの小定理の項で,フェルマーテストについて説明しました。ここでは,それを更に精密化したミラーの判定法(Miller's Test)について説明します。
ミラーの判定法はフェルマーの小定理
と,素数についての次の基本的な性質
を基にしています。 (1)はフェルマーの小定理の項で説明しました。ここでまず(2)を証明しましょう。この性質の証明は素数の基本性質
を使うと簡単です。この性質は,拡張ユークリッドの互除法を使って次の様に示されます。
上の性質を使うと,(2)は次のように証明されます。
上のことから,整数n>2が素数なら,上の(1),(2)が成立します。従って,(1)または(2)が成立しないような数が見つかれば,nは素数でないことが分かります。そこでn>2に対して次のような操作を行います。
ミラーの判定法の結論では,幸運ならnが合成数であることは確実に分かりますが,素数であることは恐らくという不確かな結果です。勿論十分沢山のb(実際はn/4個以上)に対して上の操作を実行すれば,合成数か素数か確実に判定できることが示されていますが,あまり多くのbに対して実行するのは現実的ではありません。 しかし,実際は比較的少ないbについて調べるだけで合成数という判定はかなり可能です。
n=15841 に対して上の操作を実行してみましょう。b=2 として, 215840≡1 (mod 15841) ですから,フェルマーの判定法では判定できません。そこで,n1=15840 とし,更にn1=n1/2=7920として, 27920≡1 (mod 15841) となります。以下指数を順次2で割り,順次計算すると, 23960≡1 (mod 15841), 21980≡1 (mod 15841), 2990≡1 (mod 15841), 2495≡1 (mod 15841) となり,指数が奇数になり,b=2では判定できません。 そこで次に b=3とします。 315840≡1 (mod 15841) ですから,フェルマーの判定法では判定できません。そこで,n1=15840 とし,更にn1=n1/2=7920として, 37920≡1 (mod 15841) となります。以下指数を順次2で割り,順次計算すると, 33960≡1 (mod 15841), 31980≡1 (mod 15841), 3990≡218 (mod 15841), となります。これは,x=3990とした場合,x2≡1 (mod 15841),であるにもかかわらず,x≡218 (mod 15841)となり,上の性質(2)に反しますから,15841は素数でないことが分かります。
ミラーの判定法は,かなり高速に合成数であることを判定します。(実際フェルマーの判定法で多くのものが既に判定されます。)実際,b=2,3程度でもかなりの合成数を判定してくれます。 例えば,上のアルゴリズムで,b=5まで必要な最小な合成数はどれくらいでしょうか? ミラーの判定法のプログラムMillerTest.tbtはここです。 |