2016-09-08 13 views
0

印刷用のリストに変換し、与えられた範囲内の素数を印刷する素数篩ジェネレータを作成しようとしています。私はペアの数が正しいと確信していますが、何らかの理由でプライムではないプライムのリストにいくつか余分な値が入っています。 (私は出力の最後の値がプライムではない3599だったので、これを直ちにキャッチしました)。 任意のヘルプは素晴らしいだろうので、私は論理的なエラーのいくつかの種類を持っている場合は本当にわからないんだけど範囲内のPrime Sieve/pairs

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

うんあなたは正しい、sorrそれについてはy。なぜ私はいくつかの余分な数字を取得していたのか理解できるかどうかを確認するために境界をつぶしていただけです。それはnでなければなりません。 – greenteam

答えて

0

あなたのふるい機能が正しくありません。すべての数字に「2」で始まるプライムではないマークを付けます。 あなたはそのため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 

、私はあなたが確信しているので、あなたが総理テストを追加提案:ジャンFranç[email protected]

# 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)) 
+0

i * iから内部ループを開始する方が速くなるでしょう – marcadian

+0

それはほとんどの場合、最も良いことです。 –

+0

ああ。はい、あなたが正しい。私はあなたが実際にi * iでも始めることができると信じています。不思議にも、出力を修正していない。しかし、それをキャッチするためにありがとう。 – greenteam

関連する問題