Project Euler 77

問題文の日本語は下のリンクから。
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2077
素数の和としての表し方が5000通り以上になる最初の数を求めよ。」

この手の問題は再帰を使ってとくのが定石のような気がします。分割統治法って言うんだっけ?
とりあえずソースだけ載せておいて、解説はあとで書くことにします。

from number_theory import *
def howmany(n, m):
    global many
    if not n:
        many += 1
        return
    candidates = [x for x in range(m, n+1) if isPrime(x)]
    if not candidates:
        return
    for x in candidates:
        howmany(n - x, x)

max = 0
ans = 2
while True:
    many = 0
    howmany(ans, 2)
    if max < many:
        max = many
    if max > 5000:
        print ans
        break
    else:
        ans += 1
def isPrime(n):
    if n == 1:return False
    if n == 2:return True
    if not n % 2: return False
    num = 3
    while num <= n**0.5:
        if not n % num:return False
        num += 2
    return True

実行時間は、手元のMBA(3,2) (Core2duo 2.14GH)で、2.6秒ほど