# count primes less than or equal to n
from random import randint
def primes(n):
b, p, ps = [True] * (n+1), 2, []
for p in xrange(2, n+1):
if b[p]:
ps.append(p)
for i in xrange(p, n+1, p):
b[i] = False
return ps
ps = primes(3163)[1:]
sieve = [True] * 500
def count(lo, hi):
for i in xrange(500):
sieve[i] = True
for p in ps:
if p*p > hi: break
q = (lo + p + 1) / -2 % p
if lo+q+q+1 < p*p: q += p
for j in xrange(q, 500, p):
sieve[j] = False
k = 0
for i in xrange((hi - lo) // 2):
if sieve[i]: k += 1
return k
piTable = [0] * 10000
for i in xrange(1, 10000):
piTable[i] = piTable[i-1] + \
count(1000 * (i-1), 1000 * i)
def pi(n):
if type(n) != int and type(n) != long:
raise TypeError('must be integer')
if n < 2: return 0
if n == 2: return 1
i = n // 1000
return piTable[i] + count(1000 * i, n+1)
print pi(1000) # 168
print pi(10000) # 1229
print pi(6543223) # 447519
print pi(9999999) # 664579
x = 0
for i in xrange(1000):
x = x + pi(randint(2,10000000))
print x
IyBjb3VudCBwcmltZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG4KCmZyb20gcmFuZG9tIGltcG9ydCByYW5kaW50CgpkZWYgcHJpbWVzKG4pOgogICAgYiwgcCwgcHMgPSBbVHJ1ZV0gKiAobisxKSwgMiwgW10KICAgIGZvciBwIGluIHhyYW5nZSgyLCBuKzEpOgogICAgICAgIGlmIGJbcF06CiAgICAgICAgICAgIHBzLmFwcGVuZChwKQogICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UocCwgbisxLCBwKToKICAgICAgICAgICAgICAgIGJbaV0gPSBGYWxzZQogICAgcmV0dXJuIHBzCgpwcyA9IHByaW1lcygzMTYzKVsxOl0KCnNpZXZlID0gW1RydWVdICogNTAwCgpkZWYgY291bnQobG8sIGhpKToKICAgIGZvciBpIGluIHhyYW5nZSg1MDApOgogICAgICAgIHNpZXZlW2ldID0gVHJ1ZQogICAgZm9yIHAgaW4gcHM6CiAgICAgICAgaWYgcCpwID4gaGk6IGJyZWFrCiAgICAgICAgcSA9IChsbyArIHAgKyAxKSAvIC0yICUgcAogICAgICAgIGlmIGxvK3ErcSsxIDwgcCpwOiBxICs9IHAKICAgICAgICBmb3IgaiBpbiB4cmFuZ2UocSwgNTAwLCBwKToKICAgICAgICAgICAgc2lldmVbal0gPSBGYWxzZQogICAgayA9IDAKICAgIGZvciBpIGluIHhyYW5nZSgoaGkgLSBsbykgLy8gMik6CiAgICAgICAgaWYgc2lldmVbaV06IGsgKz0gMQogICAgcmV0dXJuIGsKCnBpVGFibGUgPSBbMF0gKiAxMDAwMAoKZm9yIGkgaW4geHJhbmdlKDEsIDEwMDAwKToKICAgIHBpVGFibGVbaV0gPSBwaVRhYmxlW2ktMV0gKyBcCiAgICAgICAgY291bnQoMTAwMCAqIChpLTEpLCAxMDAwICogaSkKCmRlZiBwaShuKToKICAgIGlmIHR5cGUobikgIT0gaW50IGFuZCB0eXBlKG4pICE9IGxvbmc6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtdXN0IGJlIGludGVnZXInKQogICAgaWYgbiA8IDI6IHJldHVybiAwCiAgICBpZiBuID09IDI6IHJldHVybiAxCiAgICBpID0gbiAvLyAxMDAwCiAgICByZXR1cm4gcGlUYWJsZVtpXSArIGNvdW50KDEwMDAgKiBpLCBuKzEpCgpwcmludCBwaSgxMDAwKSAjIDE2OApwcmludCBwaSgxMDAwMCkgIyAxMjI5CnByaW50IHBpKDY1NDMyMjMpICMgNDQ3NTE5CnByaW50IHBpKDk5OTk5OTkpICMgNjY0NTc5Cgp4ID0gMApmb3IgaSBpbiB4cmFuZ2UoMTAwMCk6CiAgICB4ID0geCArIHBpKHJhbmRpbnQoMiwxMDAwMDAwMCkpCnByaW50IHg=