【发布时间】:2011-12-22 14:10:57
【问题描述】:
我正在尝试用 Python 做一个简单的素数测试。
根据维基百科,primality test 如下:
给定一个输入数 n,检查从 2 到 n - 1 的任何整数 m 是否能整除 n。如果 n 能被任何 m 整除,则 n 是合数,否则是素数。
我开始排除偶数 - 除了 2 - 作为素数的候选者
def prime_candidates(x):
odd = range(1, x, 2)
odd.insert(0, 2)
odd.remove(1)
return odd
然后根据上面的规则编写一个检查素数的函数。
def isprime(x):
for i in range(2, x-1):
if x % i == 0:
return False
else:
return True
这是主函数,它遍历 8000 个素数候选者的列表并测试它们的素数
def main():
end = 8000
candidates = prime_candidates(end)
for i in candidates:
if isprime(i) and i < end:
print 'prime found ' + str(i)
问题在于 isprime 函数对非素数返回 True。
【问题讨论】:
-
candidates可能只是[2] + range(3, end, 2)。我不知道你为什么包括零。而且你不需要测试and i < end;这是由range(..., end, ...)保证的。 -
请注意,您不必检查到
n-1。检查到sqrt(n)就足够了,因为任何高于此的值肯定不会将其除或已经被一个小于平方根的数字检查。 -
还要注意,所有提到的候选生成方法都会产生不必要的复制。
xs = range(1, x, 2); xs[0] = 2不进行复制,使用xrange(3.x 中的纯range)和itertools.chain甚至可以避免一次存储多个候选者。 -
@PaulManta
range不接受sqrt(n)返回的浮点数,并且由于舍入错误,转换为 int 会弄乱结果。