私のSieveofAtkinの実装では、限界近くの素数または限界近くのコンポジットを見落としています。一部の制限は機能し、他の制限は機能しません。私は何が悪いのか完全に混乱しています。
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の制限まで生成すると、返されるリストは完全に正しいです。