Prime筛/成对范围

时间:2016-09-08 20:10:37

标签: python primes sieve-of-eratosthenes sieve

我正在尝试编写一个主滤网生成器,我将其转换为打印列表,然后打印给定范围内的素数。我很确定我的对数是正确的,但由于某种原因,我在我的素数列表中得到了一些额外的值,而不是素数。 (我立即抓住了这个,因为我输出的最后一个值是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)

1 个答案:

答案 0 :(得分:0)

您的筛选功能不正确。您将所有数字标记为非素数,从&#34; 2&#34;开始。 你需要从素数的下一个倍数开始,即prime*prime

因此,您必须从i*i而不是i开始(我使用了i*2但它是多余的,因为i==2时第一个循环已经涵盖了

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))