Реализация сита Аткина в Python

Я пытаюсь реализовать алгоритм Сита Аткина, приведенный в ссылке на Википедию, как показано ниже:

Сито Аткин

До сих пор я пробовал реализацию в Python, представленную следующим кодом:

import math
is_prime = list()
limit = 100
for i in range(5,limit):
    is_prime.append(False)

for x in range(1,int(math.sqrt(limit))+1):
    for y in range(1,int(math.sqrt(limit))+1):
        n = 4*x**2 + y**2

        if n<=limit and (n%12==1 or n%12==5):
            # print "1st if"
            is_prime[n] = not is_prime[n]
        n = 3*x**2+y**2
        if n<= limit and n%12==7:
            # print "Second if"
            is_prime[n] = not is_prime[n]
        n = 3*x**2 - y**2
        if x>y and n<=limit and n%12==11:
            # print "third if"
            is_prime[n] = not is_prime[n]

for n in range(5,int(math.sqrt(limit))):
    if is_prime[n]:
        for k in range(n**2,limit+1,n**2):
            is_prime[k] = False
print 2,3
for n in range(5,limit):
    if is_prime[n]: print n

Теперь я получаю ошибку как

is_prime[n] = not is_prime[n]
IndexError: list index out of range

это означает, что я обращаюсь к значению в списке, где индекс больше длины списка. Рассмотрим Условие, когда x, y = 100, тогда, конечно, условие n = 4x ^ 2 + y ^ 2 даст значение, которое больше длины списка. Я что-то здесь не так делаю? Пожалуйста помоги.

РЕДАКТИРОВАТЬ 1 Как предположил Гейб, используя

is_prime = [False] * (limit + 1)

инстед из:

for i in range(5,limit):
    is_prime.append(False)

действительно решил проблему.

Ответы на вопрос(2)

Ваш ответ на вопрос