所以,我从http://www.javascripter.net/math/primes/miller_rabin_pseudocode.txt读取了伪代码,并认为在python中编写它会很酷。所以我写了这个:
n = input('Enter a number to test ')
n = int(n)
a=int(5)
d = n - 1
s = 0
while (d % 2 == 0):
s = s + 1
d = int(d/2)
x = a**d
x = x % n
if (x==1 or x==(n-1)):
print("probably prime")
r = int(1)
while(r<(s-1)):
x = x**2
x = x%n
if (x==1):
print ("composite")
if (x==(n-1)):
print ("probably prime")
print("if nothing above is printed n is composite")
它工作得很好,但是当我进入六位数字时,速度非常慢。所以我发现了http://rosettacode.org/wiki/Miller-Rabin_primality_test#Python的一些代码,即使数据量很大(10 ^ 30),也几乎是即时的。
那么,我在上面的代码中做了什么错误使它变得如此慢?
答案 0 :(得分:4)
您还应该替换:
x = a**d
x = x % n
使用:
x = pow(a, d, n)
模幂运算比天真方法快得多,因为它在每次乘法时采用模数,而不是建立一个巨大的数字并取出模数。
答案 1 :(得分:3)
链接代码中的第二个循环最多只执行5次迭代,而您执行的操作类似于log(n)。
编辑: 甚至更多 - “r”变量永远不会被修改,因此循环的退出条件永远不会得到满足。退出循环的唯一可能是休息。