【发布时间】:2012-11-21 05:25:49
【问题描述】:
我正在用 Python 实现 Eratosthenes 筛法。出现的一个问题是并非所有素数都出现(主要是编号较小的素数)。
这是我的代码:
def prevPrimes(n):
from math import sqrt
from time import time
start = time()
if type(n) != int and type(n) != long:
raise TypeError("Arg (n) must be of <type 'int'> or <type 'long'>")
if n <= 2:
raise ValueError("Arg (n) must be at least 2")
limit, x, num, primes = sqrt(n), 2, {}, []
for i in range(1, n+1):
num[i] = True
while x < limit:
for i in num:
if i%x==0:
num[i] = False
x += 1
for i in num:
if num[i]:
primes.append(i)
end = time()
primes = sorted(primes)
print round((end - start), 2), ' seconds'
return primes
如果我输入>>> prevPrimes(1000),我希望结果以:[2, 3, 5, 7, 11, 13, 17] 等开头。但是,它看起来是这样的:[1, 37, 41, 43, 47, #more numbers]。
我知道问题在于它将“原始”素数(2、3、5、7、11、13、17 等)声明为 False,因为我的程序检查方式为素数。我怎样才能避免这种情况?在此先感谢:)
【问题讨论】:
-
顺便说一句,这不是埃拉托色尼的筛子。真正的算法根本不使用
%。这只是试用部门。
标签: python function primes sieve