我有一个Miller-Rabin原始测试器的伪代码:
function isPrime(n, k=5)
if n < 2 then return False
for p in [2,3,5,7,11,13,17,19,23,29]
if n % p == 0 then return n == p
s, d = 0, n-1
while d % 2 == 0
s, d = s+1, d/2
for i from 0 to k
x = powerMod(randint(2, n-1), d, n)
if x == 1 or x == n-1 then next i
for r from 1 to s
x = (x * x) % n
if x == 1 then return False
if x == n-1 then next i
return False
return True但是将其转换到Python是很困难的,因为内部next i循环中的for语句必须中断两个循环。Python中没有goto。在堆栈溢出问题上提出这个问题的其他提问者被告知使用带有return、try/except条件或额外布尔标志的本地函数,但这些解决方案要么不适用于这里,要么会极大地丑化这个可爱的伪代码。
对于这个问题,毕达内的方法是什么?
发布于 2014-06-11 18:25:06
我认为pythonic方法应该是尝试/除了,可读性更倾向于一种方法或布尔值,但我认为可以通过添加一行来解决这个问题:
for i in xrange(k):
x = powerMod(randint(2, n-1), d, n)
if x == 1 or x == n-1: continue
for r in xrange(1,s):
x = (x * x) % n
if x == 1: return False
if x == n-1: break #*
if x != n-1: #added line
return False
return True中断标记为#*的行是有问题的,因为它返回false,但是如果我们修复它,它就像"next i“一样。
tobias_k建议的另一种解决方案是使用for/else:
for i in xrange(k):
x = powerMod(randint(2, n-1), d, n)
if x == 1 or x == n-1: continue
for r in xrange(1,s):
x = (x * x) % n
if x == 1: return False
if x == n-1: break
else: #added line
return False
return True如果循环是break-ed,则不会调用它--只有当它耗尽时才调用它。
发布于 2014-06-11 18:25:22
您可以使用break和continue作为for: else。
for i from 0 to k
x = powerMod(randint(2, n-1), d, n)
# Use 'continue' to go to next i (skip inner loop).
if x == 1 or x == n-1 then next i
for r from 1 to s
x = (x * x) % n
if x == 1 then return False
# Use 'break' to exit this loop and go to next i
# since this loop is at the end of the i loop.
if x == n-1 then next i
else:
# This is only reached if no `break` occurred
return False
return Truehttps://stackoverflow.com/questions/24169803
复制相似问题