Life Goes On

まあまあだけど楽しんでる方です

27問目

http://projecteuler.net/index.php?section=problems&id=27
n2 + an + b, |a| < 1000, |b| < 1000
で表される数列があったとき、連続する素数の数が最大となるようなa,bの積を求める。
n=0,1のときの条件からbが素数、a>-bだと分かるのでそれで範囲を狭めて、あとはひたすら調べてます。

import Data.List
import Data.Ord

main = print $ euler027 1000

euler027 :: Int -> Int
euler027 n = fst $ maximumBy (comparing snd) $
    [(a * b, con a b) | b <- takeWhile (< n) primes, a <- [-b..(n-1)]]

con :: Int -> Int -> Int
con a b = length $ takeWhile (isPrime primes) $ map (f a b) [0..]

f :: Int -> Int -> Int -> Int
f a b n = (n ^ 2) + a * n + b

primes :: [Int]
primes = 2 : filter (isPrime primes) [3..]

isPrime :: [Int] -> Int -> Bool
isPrime primes x
    | (x <= 1) = False
    | otherwise = all ((/= 0) . mod x) $
        takeWhile (<= (floor $ sqrt $ fromIntegral x)) primes