なぜ私の実施にふるいのアトキンを一望番号の指定はどのようなものですか。

StackOverflow https://stackoverflow.com/questions/2398894

質問

私の実施 ふるいのアトキン のいずれか一望素数近くは制限又は複合材料の近くに制限します。一部の限界やその他かないようになりましたよ。私のいと混乱しないように気をつける何かが間違っている。

def AtkinSieve (limit):
results = [2,3,5]
sieve = [False]*limit
factor = int(math.sqrt(lim))
for i in range(1,factor):
    for j in range(1, factor):
        n = 4*i**2+j**2
        if (n <= lim) and (n % 12 == 1 or n % 12 == 5):
            sieve[n] = not sieve[n]
        n = 3*i**2+j**2
        if (n <= lim) and (n % 12 == 7):
            sieve[n] = not sieve[n]
        if i>j:
            n = 3*i**2-j**2
            if (n <= lim) and (n % 12 == 11):
                sieve[n] = not sieve[n]
for index in range(5,factor):
    if sieve[index]:
        for jndex in range(index**2, limit, index**2):
            sieve[jndex] = False
for index in range(7,limit):
    if sieve[index]:
        results.append(index)
return results

例えば、私が生成する素数の制限は1000は、アトキンはふるいにかヒントを盛り997ものを含む複合965.がんの発生に限定5000のリストを返しますが全く正しい。

役に立ちましたか?

解決

  • 変化 limlimit.もちろんよく知っていた。
  • 以降 sieve = [False]*limit, 最大の指標れていますので、それを考慮して limit-1.

    しかし、この線

    if (n <= limit) and (n % 12 == 1 or n % 12 == 5):
    

    ご確認の場合 n<=limit.の場合 n==limit その sieve[n] おかげIndexError.お試しアルゴリズムに小さい値に limit (例:n=50).ただこのエラーに注目してきました。簡単に固定で使用

    sieve = [False]*(limit+1)
    

    の固定は無駄からふるいに[0]がことがあります。いと思いますがりの修正は sieve = [False]*limit, が、全ての他のコードによるステッピングのインデックス sieve なります。(E.g.) 変化 sieve[n]sieve[n-1] もの等) しかし、この力に数多くのsubtractionsないきます。そのeasy/無駄な解決は実際のものより良いオプションです。

  • による http://en.wikipedia.org/wiki/Sieve_of_Atkin, xは数[1,sqrt(制限)]、インクルーシブの評価.

    コード

    factor = int(math.sqrt(limit))
    

    intmath.sqrt(limit).さらに、

    range(1,factor) から1因子-1に示します。していただく必要がありオフによる1.

    で変更する必要があることを

    factor = int(math.sqrt(limit))+1
    

  • トリストのすべての素数N 選択肢(上)の実施にふるいのアトキンは、Steve Krenzel.

def AtkinSieve (limit):
    results = [2,3,5]
    sieve = [False]*(limit+1)
    factor = int(math.sqrt(limit))+1
    for i in range(1,factor):
        for j in range(1, factor):
            n = 4*i**2+j**2
            if (n <= limit) and (n % 12 == 1 or n % 12 == 5):
                sieve[n] = not sieve[n]
            n = 3*i**2+j**2
            if (n <= limit) and (n % 12 == 7):
                sieve[n] = not sieve[n]
            if i>j:
                n = 3*i**2-j**2
                if (n <= limit) and (n % 12 == 11):
                    sieve[n] = not sieve[n]
    for index in range(5,factor):
        if sieve[index]:
            for jndex in range(index**2, limit, index**2):
                sieve[jndex] = False
    for index in range(7,limit):
        if sieve[index]:
            results.append(index)
    return results
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top