Rosetta Code から抜粋したコードを使用しました。いくつかの名前を変更しましたが、実際には何も変更していません。
import random
def is_probable_prime(n, num_trials = 5):
assert n >= 2
if n == 2:
return True
if n % 2 == 0:
return False
s = 0
d = n-1
while True:
quotient, remainder = divmod(d, 2)
if remainder == 1:
break
s += 1
d = quotient
assert(2**s * d == n-1)
def try_composite(a):
if pow(a, d, n) == 1:
return False
for i in range(s):
if pow(a, 2**i * d, n) == n-1:
return False
return True
for i in range(num_trials):
a = random.randrange(2, n)
if try_composite(a):
return False
return True
これは、いくつかの疑似コードと非常によく一致します。ただし、番号をテストすると
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901
戻りますFalse
。Miller-Rabin の他の (python および java) 実装はTrue
、おそらく素数を返します。いくつかのテストの後、ラウンドのみの後にtry_composite
戻ります! エラーを知りたいのですが、インデントが間違っているか、知らない機能があると思います。True
2