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