ミラーラビン素数判定法&Pythonでの実装
投稿日: 更新日:
ミラーラビン素数判定法
整数が素数であるとします。そして、(は奇数)と置きます。この時を満たす自然数について以下の2つの条件のうちどちらかが成立します。
この定理が示すのは、「が素数」→「条件1か2を満たす」ということです。つまり、対偶をとると、「条件1,2のどちらも満たさない」→「は素数でない」となります。
ランダムにを選び、判定する回数を回としたとき、合成数が素数と判定されてしまう確率はということが知られています。
証明
前提知識:フェルマーの小定理
は素数であるのでフェルマーの小定理より以下が成立します。
ところで、より、
となります。
数列の中に、1と合同でないものがある場合、その最大の数をとします。数列での次の数、つまりは1と合同であるので、それをもとにして以下のことが分かります。
は1と合同でなかったので、となります。この時、は条件2を満たすことになります。また、このようなが存在しない場合、つまり、どのも1と合同の場合、条件1を満たすことになります。
Pythonでの実装
Pythonで実装したコードです。
import random
# 素数の場合はTrue、合成数の場合はFalseを返す
def miller_rabin(n):
# 1,2,偶数はあらかじめ処理しておく
if n == 2:
return True
if n == 1 or n%2 == 0:
return False
# n-1 = 2^s * tを満たすs, tを求める
s = 0
t = 1
while (n-1 >> s)%2 == 0:
s += 1
t = (n-1) // pow(2, s)
# ランダムにaを選び、条件を満たすか判定する
# 回数を増やすことで精度が上がる
for _ in range(10):
a = random.randint(2, n-1)
# 条件1の判定
if pow(a, t, n) == 1:
continue
# 条件2の判定
ok = False
for i in range(0, s):
if pow(a, 2**i * t, n) == n-1:
ok = True
if not ok:
# 条件1,2どちらも満たさない場合は合成数
return False
return True
参考文献
IPUSIRON (2017) 暗号技術のすべて 翔永社