我正在尝试使用Python进行简单的质数测试。
根据维基百科,质数测试 如下:
给定一个输入数字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。
n-1
。只需要检查到sqrt(n)
就足够了,因为任何大于此值的数肯定不能被整除,或者已经被小于其平方根的数字检查过了。 - Paul Mantaxs = range(1, x, 2); xs[0] = 2
不会进行复制,并且使用xrange
(在3.x中是普通的range
)和itertools.chain
,甚至可以避免同时存储多个候选项。 - user395760range
不接受浮点数,而sqrt(n)
返回的是浮点数,强制转换为整数会因四舍五入误差而导致结果出错。 - Mahmoud Hanafy