【发布时间】:2014-03-14 00:55:24
【问题描述】:
我正在尝试实现维基百科链接中给出的阿特金筛算法如下:
到目前为止,我尝试的是以下代码给出的 Python 实现:
import math
is_prime = list()
limit = 100
for i in range(5,limit):
is_prime.append(False)
for x in range(1,int(math.sqrt(limit))+1):
for y in range(1,int(math.sqrt(limit))+1):
n = 4*x**2 + y**2
if n<=limit and (n%12==1 or n%12==5):
# print "1st if"
is_prime[n] = not is_prime[n]
n = 3*x**2+y**2
if n<= limit and n%12==7:
# print "Second if"
is_prime[n] = not is_prime[n]
n = 3*x**2 - y**2
if x>y and n<=limit and n%12==11:
# print "third if"
is_prime[n] = not is_prime[n]
for n in range(5,int(math.sqrt(limit))):
if is_prime[n]:
for k in range(n**2,limit+1,n**2):
is_prime[k] = False
print 2,3
for n in range(5,limit):
if is_prime[n]: print n
现在我得到错误
is_prime[n] = not is_prime[n]
IndexError: list index out of range
这意味着我正在访问列表中索引大于列表长度的值。考虑 x,y = 100 时的条件,那么当然条件 n=4x^2+y^2 将给出大于列表长度的值。我在这里做错了吗?请帮忙。
编辑 1 正如 Gabe 所建议的,使用
is_prime = [False] * (limit + 1)
安装:
for i in range(5,limit):
is_prime.append(False)
确实解决了问题。
【问题讨论】:
-
按照 gabe 的建议添加该行时,代码运行良好。
标签: python