我正在尝试编写一个主滤网生成器,我将其转换为打印列表,然后打印给定范围内的素数。我很确定我的对数是正确的,但由于某种原因,我在我的素数列表中得到了一些额外的值,而不是素数。 (我立即抓住了这个,因为我输出的最后一个值是3599,这不是素数)。 我不确定我是否有某种逻辑错误,所以任何帮助都会很棒
def sieve(n):
a = [True] * (n)
a[0] = a[1] = False
for (i, isPrime) in enumerate(a):
if isPrime:
yield i
for n in range(i*i, n, i):
a[n] = False
def pairs(li):
pair = 0
for i, x in enumerate(li):
if i < len(li)-1:
if li[i] + 2 == li[i+1]:
pair += 1
return pair
p_3600 = list(sieve(3600))
ans = [vals for vals in p_3600 if vals > 1600]
print ans
print "pairs:", pairs(ans)
答案 0 :(得分:0)
您的筛选功能不正确。您将所有数字标记为非素数,从&#34; 2&#34;开始。
你需要从素数的下一个倍数开始,即prime*prime
因此,您必须从i*i
而不是i
开始(我使用了i*2
但它是多余的,因为i==2
时第一个循环已经涵盖了1} p>
def sieve(n):
a = [True] * n
a[0] = a[1] = False
for (i, isPrime) in enumerate(a):
if isPrime:
yield i
for j in range(i*i, n, i):
a[j] = False
测试你的清单,我建议你添加一个主要测试,所以你确定:
# make sure it works: time-costly but reassuring
import math
for i in ans:
si = int(math.sqrt(i))+1
for j in range(2,si):
if i%j==0:
raise Exception("%d is not prime (%d)" % (i,j))