Try   HackMD

素数判定が NP というはなし

参考資料 : https://www.cmi.ac.in/~ramprasad/lecturenotes/comp_numb_theory/lecture17.pdf

素数判定問題

n bit
(n2)
の整数
x
が与えられる。
x
が素数であるか判定せよ。

素数判定問題は co-NP

x が素数でない証拠が与えられたとき、
n
の多項式時間で
x
が素数でないことを検証することができるならば、素数判定問題は co-NP に属すると言います。

例えば、以下のようにすれば、多項式時間で

x が素数でないことを検証することができます。

証拠 :

2 以上の整数
a,b
であって、
a×b=x
を満たすもの
検証アルゴリズム :
a,b
2
以上であること、
a×b=x
であることを確認する。

n bit の掛け算は
O(nlognloglogn)
時間とかでできるので、多項式時間です。

素数判定問題は NP

x が素数である証拠が与えられたとき、
n
の多項式時間で
x
が素数であることを検証することができるならば、素数判定問題は NP に属すると言います。

多項式時間で

x が素数であることを検証するため、原始根 を用います。

整数

1a<x に対し、
a0,a1,a2,(modx)
は周期的である。(オイラーの定理)
x
が素数であるとき、ある整数 (原始根)
1a<x
が存在して、
a0,a1,a2,(modx)
の周期は
x1
である。
x
が合成数であるとき、どんな整数
1a<x
に対しても、
a0,a1,a2,(modx)
の周期は
x1
より小さい。

1 から始まって
1
に帰ってくるまでが
1
周期となるので、原始根
a
を証拠として、以下を検証すれば良いです。

  • ax1=1(modx)
    • これにより、周期が
      x1
      の約数であることがわかる
  • x1
    の素因数分解を
    x1=p1×p2××pk
    としたとき、各
    pi
    について、
    a(x1)/pi1(modx)
    である。

ここで、

x1 の素因数分解は簡単に行えるものではないので、証拠に追加してこれを検証することにします。つまり、再帰的に素数であることの検証を行います。

まとめると、以下のようになります。

x
が素数であることの証拠

  • 原始根
    a
  • x1
    の素因数分解
    x1=p1×p2××pk
  • pi
    が素数であることの証拠

検証アルゴリズム

  • pi
    が素数であることを再帰的に検証
  • x1=p1×p2××pk
    であることを確認
  • ax1=1(modx)
    であることを確認
  • pi
    に対し、
    a(x1)/pi1(modx)
    であることを確認

これが多項式時間であることを確認します。

まず、再帰部分以外が多項式時間であることを確認します。

n bit の掛け算が
O(n2)
時間であり、
kn
であることから、再帰部分以外は
O(n4)
時間で抑えられます。

x>2 のとき、
x1
2
で割れるので、再帰の深さは
n
以下です。また、ある深さにおける
n
の合計が元々の
n
の定数倍で抑えられることから、再帰部分を含めても、全体で
O(n5)
時間となります。

素数判定問題は P

証拠が与えられなくても、

n の多項式時間で
x
が素数であるかどうかを判定することができるならば、素数判定問題は P に属すると言います。

実は、素数判定問題は P に属することが知られています。

https://ja.wikipedia.org/wiki/AKS素数判定法