【发布时间】:2019-03-31 17:15:39
【问题描述】:
我正在尝试为一些正在运行的项目实施Miller-Rabin primality checker。但是,该算法不适用于诸如 101、103、107、109 之类的素数……我不知道问题出在哪里。提前感谢所有帮助。
def miller_rabin_is_prime(number, k=10):
if number < 2:
return False
elif number <= 3:
return True
else:
odd_num, power_of_two, factor_out = 0, 0, number - 1
while number != (2 ** power_of_two)*odd_num + 1:
if factor_out / 2 == int(factor_out / 2):
power_of_two += 1
factor_out /= 2
else:
odd_num = (number - 1) / (2 ** power_of_two)
for _ in range(k):
random = randint(2, number - 2)
checker = (random**odd_num) % number
if (checker == 1) or (checker == number - 1):
continue
try:
for loop in range(power_of_two - 1):
checker = (checker**2) % number
if checker == number - 1:
raise TypeError
except TypeError:
continue
return False
return True
我希望 101 的输出为 True,但实际输出为 False。
【问题讨论】:
-
注:
if factor_out / 2 == int(factor_out / 2)可分性检查可以由if factor_out % 2 == 0完成。 (%是模运算符。) -
不要使用浮点除法。这没有道理。要查看整数
x是否可以被整数y整除,只需使用x % y == 0。如果你真的想将它们分开,请使用整数除法(由双斜杠指定),即x // y。 -
天啊。真对不起。我完全忘记了。你是对的。
标签: python python-3.x math primes