import math
def prime_sieve(limit):
primes = [1 for x in xrange(limit)]
primes[0] = 0
primes[1] = 0
imax = int(math.sqrt(limit) + 1)
i = 2
while (i < imax):
j = i * i # was: i+i
while j < limit:
primes[j] = 0
j += i
while True:
i += 1
if primes[i] == 1:
break
return primes
### s = prime_sieve(2000000)
### print( len( list( (i for i in xrange(len(s)) if s[i] == 1))))
# --i+i-- # --i*i--
# N n # N n
# 10k 1229 0.02s-7.9M #
# 2mln 148933 1.13s-7.9M # 2mln 148933 1.12s-7.9M
# 4mln 283146 2.30s-7.9M n^1.11 # 4mln 283146 2.25s-7.9M n^1.09
# 8mln 539777 4.58s-7.9M n^1.07 # 8mln 539777 4.38s-7.9M n^1.03
# 16mln 1031130 9.12s-7.9M n^1.06 # 16mln 1031130 8.82s-7.9M n^1.08
def sieve(max):
primes = range(2,max+1)
for i in primes:
# print i,
j = i # was: j = 2
while i * j <= primes[-1]:
if i * j in primes:
primes.remove(i*j)
j += 1
return primes
count = 0
for x in sieve(30000):
count += 1
print count
# --j=2-- # --j=i--
# N n # N n
# 5k 669 0.35s-7.9M # 5k 669 0.28s-7.9M
# 10k 1229 1.37s-7.9M n^2.24 # 10k 1229 1.16s-7.9M n^2.34
# 20k 2262 5.21s-7.9M n^2.19 # 20k 2262 4.66s-7.9M n^2.28
# 30k 3245 11.76s-7.9M n^2.26 # 30k 3245 11.24s-7.9M n^2.44
aW1wb3J0IG1hdGgKICAgIApkZWYgcHJpbWVfc2lldmUobGltaXQpOgogICAgcHJpbWVzID0gWzEgZm9yIHggaW4geHJhbmdlKGxpbWl0KV0KICAgIHByaW1lc1swXSA9IDAKICAgIHByaW1lc1sxXSA9IDAKICAgIGltYXggPSBpbnQobWF0aC5zcXJ0KGxpbWl0KSArIDEpCgogICAgaSA9IDIKICAgIHdoaWxlIChpIDwgaW1heCk6CiAgICAgICAgaiA9IGkgKiBpICAgICAgICAgICAgIyB3YXM6IGkraQogICAgICAgIHdoaWxlIGogPCBsaW1pdDoKICAgICAgICAgICAgcHJpbWVzW2pdID0gMAogICAgICAgICAgICBqICs9IGkKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBpICs9IDEKICAgICAgICAgICAgaWYgcHJpbWVzW2ldID09IDE6CiAgICAgICAgICAgICAgICBicmVhawogICAgcmV0dXJuIHByaW1lcwoKIyMjIHMgPSBwcmltZV9zaWV2ZSgyMDAwMDAwKQojIyMgcHJpbnQoIGxlbiggbGlzdCggKGkgZm9yIGkgaW4geHJhbmdlKGxlbihzKSkgaWYgc1tpXSA9PSAxKSkpKQoKIyAtLWkraS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAtLWkqaS0tCiMgICBOICAgICAgIG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgTiAgICAgICBuICAKIyAgMTBrICAgICAxMjI5ICAwLjAycy03LjlNICAgICAgICAgICAgICAgIwojICAybWxuICAxNDg5MzMgIDEuMTNzLTcuOU0gICAgICAgICAgICAgICAjICAybWxuICAxNDg5MzMgIDEuMTJzLTcuOU0gIAojICA0bWxuICAyODMxNDYgIDIuMzBzLTcuOU0gIG5eMS4xMSAgICAgICAjICA0bWxuICAyODMxNDYgIDIuMjVzLTcuOU0gIG5eMS4wOQojICA4bWxuICA1Mzk3NzcgIDQuNThzLTcuOU0gIG5eMS4wNyAgICAgICAjICA4bWxuICA1Mzk3NzcgIDQuMzhzLTcuOU0gIG5eMS4wMwojIDE2bWxuIDEwMzExMzAgIDkuMTJzLTcuOU0gIG5eMS4wNiAgICAgICAjIDE2bWxuIDEwMzExMzAgIDguODJzLTcuOU0gIG5eMS4wOAoKCgpkZWYgc2lldmUobWF4KToKICBwcmltZXMgPSByYW5nZSgyLG1heCsxKQogIGZvciBpIGluIHByaW1lczoKICAgICMgcHJpbnQgaSwgCiAgICBqID0gaSAgICAgICAgICAgICAgICAgICAgICAgICMgd2FzOiBqID0gMgogICAgd2hpbGUgaSAqIGogPD0gcHJpbWVzWy0xXToKICAgICAgaWYgaSAqIGogaW4gcHJpbWVzOgogICAgICAgIHByaW1lcy5yZW1vdmUoaSpqKQogICAgICBqICs9IDEKICByZXR1cm4gcHJpbWVzCiAgCmNvdW50ID0gMApmb3IgeCBpbiBzaWV2ZSgzMDAwMCk6CiAgICBjb3VudCArPSAxCnByaW50IGNvdW50CgoKIyAtLWo9Mi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIC0taj1pLS0KIyAgIE4gICAgIG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgTiAgICAgbiAgCiMgICA1ayAgIDY2OSAgIDAuMzVzLTcuOU0gICAgICAgICAgICAgICAgIyAgIDVrICAgNjY5ICAgMC4yOHMtNy45TQojICAxMGsgIDEyMjkgICAxLjM3cy03LjlNICBuXjIuMjQgICAgICAgICMgIDEwayAgMTIyOSAgIDEuMTZzLTcuOU0gIG5eMi4zNAojICAyMGsgIDIyNjIgICA1LjIxcy03LjlNICBuXjIuMTkgICAgICAgICMgIDIwayAgMjI2MiAgIDQuNjZzLTcuOU0gIG5eMi4yOAojICAzMGsgIDMyNDUgIDExLjc2cy03LjlNICBuXjIuMjYgICAgICAgICMgIDMwayAgMzI0NSAgMTEuMjRzLTcuOU0gIG5eMi40NA==