Problem 27

考えると頭痛い.問題の意味が今一わからない.

def cnt_prime(a,b):
    cnt = 0
    while is_prime(cnt*cnt + a * cnt + b):
        cnt += 1
    return (cnt,a,b)

bs = set(es(10**3))
cnt,a,b = max([cnt_prime(a,b) for b in bs for a in xrange(-999,1000,2)])
print a*b

is_prime()やes()は以前利用したものを使用.それぞれproblem 3,7あたりにある?と思う.カウントのマックスの時の(a,b)の組をタプルで返しているので,掛け算.
本当はループさせて,マックスを超えたら上書きとかさせる方が速い?といってもコンマ何秒の違い.こっちのほうがすっきりするのでコッチのほうが好き.ポイントは多分bsの生成を如何に早く生成するかと,どう生成するかがみそ.ぱっと思いつくのは2以上.2ってことはないだろうってことで奇数のみ,それが素数のジェネレータの利用などなど…ただしどれもぱっとしないので上限がわかっているならエラトステネスの篩を使えって遠まわしにいっている.is_primeについては10**6くらいまでの素数をエラトステネスの篩で生成してsetしてinを確かめるってのもありかも?上限がわからないので危険だけど.aは多分奇数だろうってことで.(bが素数なら大抵奇数,奇数*奇数は奇数+奇数=偶数.偶数*奇数は?偶数+偶数は?)