Here is one that's traduced... er... adapted from material from the classic textbook "Structure and Interpretation of Computer Programs":
######
from itertools import ifilter, count
def notDivisibleBy(n):
... def f(x): ... return x % n != 0 ... return f ...
def sieve(iterable):
... nextPrime = iterable.next() ... yield nextPrime ... restOfPrimes = sieve(ifilter(notDivisibleBy(nextPrime), iterable)) ... for prime in restOfPrimes: ... yield prime ...
primes = sieve(count(2)) primes.next()
which is cool, until you try to use it (-:
It dies at 999 primes due to an overloaded stack. Bummer. It is such a nifty implementation.
I modified this version to follow it better.
from itertools import ifilter, count
def notDivisibleBy(n): def f(x): return x % n != 0 return f
def sieve(iterable): nextPrime = iterable.next() print 'x', nextPrime yield nextPrime restOfPrimes = sieve(ifilter(notDivisibleBy(nextPrime), iterable)) for prime in restOfPrimes: print 'p', prime yield prime
primes = sieve(count(2)) current = primes.next() count = 1 while current <= 20: print 'Prime:', current current = primes.next() count += 1
The output is (note this is each prime < 20): x 2 Prime: 2 x 3 p 3 Prime: 3 x 5 p 5 p 5 Prime: 5 x 7 p 7 p 7 p 7 Prime: 7 x 11 p 11 p 11 p 11 p 11 Prime: 11 x 13 p 13 p 13 p 13 p 13 p 13 Prime: 13 x 17 p 17 p 17 p 17 p 17 p 17 p 17 Prime: 17 x 19 p 19 p 19 p 19 p 19 p 19 p 19 p 19 Prime: 19 x 23 p 23 p 23 p 23 p 23 p 23 p 23 p 23 p 23
Not exactly efficient. _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor