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 fdef sieve(iterable):
nextPrime = iterable.next()
print 'x', nextPrime
yield nextPrime
restOfPrimes = sieve(ifilter(notDivisibleBy(nextPrime), iterable))
for prime in restOfPrimes:
print 'p', prime
yield primeprimes = sieve(count(2))
current = primes.next()
count = 1
while current <= 20:
print 'Prime:', current
current = primes.next()
count += 1The 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 - [email protected] http://mail.python.org/mailman/listinfo/tutor
