[Edu-sig] Kirby Urner's Sieve of Eratosthenes
Kirby Urner
pdx4d@teleport.com
Mon, 05 Jun 2000 16:28:52 -0700
Ka-Ping Yee wrote:
>You can use the "filter" function to obtain your results
>at the end, and you can use the third argument to the
>"range" function to perform the stepping more succinctly
>and clearly:
>
> def eratosthenes(max):
> sieve = [0, 0] + [1] * max
> prime = 2
> while prime < max:
> for i in range(prime * 2, max + 1, prime):
> sieve[i] = 0
> while prime < max:
> prime = prime + 1
> if sieve[prime]: break
> return filter(lambda i, sieve=sieve: sieve[i], range(max + 1))
>
This I like quite a bit! Good job.
I'd probably keep the cut-off at 2nd root, even if I don't
use root function, plus given the preponderance of 0s after
awhile, I'd like to use the list.index(n) primitive to search
a sliced sieve for the next 1, vs stepping by 1 through a
break loop, i.e.:
def erastosthenes(max): # with thanks to Ka-Ping Yee
"""Sieve of Erastosthenes"""
sieve = [0, 0] + [1] * max
prime = 2
while prime*prime <= max:
for i in range(prime * 2, max + 1, prime):
sieve[i] = 0
prime = prime+1 + sieve[prime+1:].index(1)
return filter(lambda i, final=sieve: final[i], range(max + 1))
Ka-Ping, if you have no objection, maybe I'll swap in the
above on http://www.inetarena.com/~pdx4d/ocn/numeracy2.html ?
Note: also change var name to final in the lamda, as
sieve=sieve looks more cryptic IMO.
Kirby