Project Euler 10

Problem 10
(略)200万より小さい全ての素数の和を求めよ
http://projecteuler.net/index.php?section=problems&id=10

個別に素数を求めるのは非常に遅いので、エラトステネスのふるいを使いましょう。
配列を最初に0,0,2,3,4,5,…と初期化して、素数でないと分かったら0にします。こうしておくとそのまま和を取ればよいことになります。


def primes(max_p):
a = range(max_p)
a[1] = 0
for p in xrange(2, max_p):
if a[p]:
if p == 2:
init = p * 2
delta = p
else:
init = p * 3
delta = p * 2
for n in xrange(init, max_p, delta):
a[n] = 0
return a

N = 2 * 10 ** 6
print sum(primes(N))