Вот реализация Python оригинального первичного сита, основанного на коде haskell в статье: Подлинное сито эратосфена Мелиссы Э. О'Нил
Он не использует рекурсию или пробное деление, а скорее требует памяти.
from heapq import heappush, heappop, heapreplace
def sieve():
w = [2,4,2,4,6,2,6,4,2,4,6,6,2,6,4,2,6,4,6,8,4,2,4,2,4,8,6,4,6,2,4,6,2,6,6,4,2,4,6,2,6,4,2,4,2,10,2,10]
for p in [2,3,5,7]: yield p
n,o = 11,0
t = []
l = len(w)
p = n
heappush(t, (p*p,n,o,p))
yield p
while True:
n,o = n+w[o],(o+1)%l
p = n
if not t[0][0] <= p:
heappush(t, (p*p,n,o,p))
yield p
continue
while t[0][0] <= p:
_,b,c,d = t[0]
heapreplace(t, (b*d,b+w[c],(c+1)%l,d))
Следующее:
import itertools
print list(itertools.islice(sieve(),0,10))
печать:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]