2017-02-24 3 views
4

私はPythonでEratosthenesの篩を実装しています。これは、探索範囲の端部近傍複合数値を返す:Eratosthenesのふるいは大きな合成番号を返します(これはエラーです)

def primes_Ero(n=1000): 
    primes = [] 
    a = [True]*(n+1) 
    a[0] = a[1] = False 
    for (i,isprime) in enumerate(a): 
     if isprime: 
      for n in range(i*i,n+1, i):   
       a[n] = False 
      primes.append(i) 
    return primes 

大きな数字を使用して、N、私は合成数で終わります。私は間違って何をやっている

n= 100; [] 
n= 500; [493, 497] 
n= 1000; [961, 989] 
n= 10000; [9701, 9727, 9797, 9853, 9869, 9917, 9943, 9953, 9983, 9991, 9997] 

:私はどのような数字が複合され、

n個を考えると、(ブルートフォース方式と比較して)複合された番号を確認するチェックを作ったのですか?まず nがパラメータ値(デフォルト= 1000)が、ループの最初に実行N i < n < i + nを保持した後に設定されている

for n in range(i*i, n+1, i): 

+0

if i == 31: 'の意図は何ですか? –

+5

また、2つの異なるものに 'n'を使用しています。 –

+1

@PaulHankinさんが持っています。内側のforループの変数を変更します。たとえば、 'for k in range(i * i、n + 1、i):'のようになり、問題は解決します。 – jas

答えて

4

問題は、この行です。 forループが2回目に実行されたときに障害が発生しています。

使用しているnのいずれかの名前を変更する必要があります。 sieve_sizeのような適切な名前を付けることを検討してください。これは実際に何を説明していますか?

私が指摘したいことは、あなたのコードは賢明ですが、です。あなたが反復処理しているリストを変更していることです。これは一般に悪い習慣とみなされます。

+1

ありがとうございます!私はいくつかの異なるアイデアをまとめていて、パーツの名前をわかりやすいものに変更するのを忘れていました。これは多くの助けとなりました。 – LascieL

+0

最後の段落へのコメント:リストを反復しながらインデックスの値を変更することは問題ありません。リストの途中から値を挿入したり削除したりするのは、後のすべての値のインデックスを変更するためです。 – Blckknght

関連する問題