【发布时间】:2020-10-15 14:37:37
【问题描述】:
我正在尝试在 Python 上实现 Miller-Rabin 算法。
我已经按照教科书的伪代码进行了编码,但由于某种原因,它没有按我的预期工作。
具体来说,函数“test”在进行 Fermat 测试时有时会返回“true”。
def miller_rabin(n, s):
if n == 2:
return Prime
elif n % 2 == 0:
return Composite
for _ in range(s):
a = random.randint(1, n-1)
if test(a, n) == True:
return Composite
return Prime
def test(a, n):
t, u = 0, n-1
while (u % 2 == 0):
t += 1 #t >= 1, u is odd, n=1 = 2^t * u
u //= 2 #initialization
x = exp(a, u, n) #initializing x0 = a^u mod n
for _ in range(t-1): #for i = 1 to t
x_prev = x #xi-1
x = exp(x_prev, 2, n) #xi = (xi-1)^2 mod n
if x == 1 and x_prev != 1 and x_prev != (n-1): #NSR test
return True
if x != 1: #Fermat test
return True
return False
我为此苦苦挣扎了几个小时,但仍然找不到代码的哪一部分是问题所在。如果您有任何建议,请告诉我。 附言exp (a,b,c) 返回 a^b mod c。
【问题讨论】: