我使用了一些取自 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