It's an iterator that returns prime numbers.

Got the idea from here: www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf

1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ```
from itertools import count
from collections import defaultdict
def seive():
table = defaultdict(list)
for x in count(2):
facts = table[x]
if facts:
del table[x]
for p in facts:
table[x+p] = table[x+p] + [p]
else:
table[x*x] = [x]
yield x
``` |

maybe

could be

if you change line 7 to :

you don't need line 9 anymore.

Even numbers can be omitted. Here is a simple variant:

def seive(): yield 2 table = defaultdict(list) for x in count(3,2): facts = table.pop(x,None) if facts: for p in facts: table[x+2

p].append(p) else: table[xx] = [x] yield xSorry: seive is not correctly formatted.

@Louis @Deiter Thanks for your comment and corrections!

I am afraid that the code of Dieter is an infinite loop.

That is intention. seive is a generator for an infinite list (restricted by system resources) of primes.

A little less infinite...but useful:

this variant is faster.

The version below is even faster. As p and q are both odd and x should be odd, we can add 2p to x and skip the test to check if x is odd. In Python 3: