なぜ私の実施にふるいのアトキンを一望番号の指定はどのようなものですか。
-
25-09-2019 - |
質問
私の実施 ふるいのアトキン のいずれか一望素数近くは制限又は複合材料の近くに制限します。一部の限界やその他かないようになりましたよ。私のいと混乱しないように気をつける何かが間違っている。
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のリストを返しますが全く正しい。
解決
- 変化
lim
へlimit
.もちろんよく知っていた。 -
以降
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))
や
int
の 階 のmath.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
所属していません StackOverflow