Life Goes On

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

77問目

http://projecteuler.net/index.php?section=problems&id=77
10 を素数の和として表す方法は 5 通りある。素数の和として 5000 より多い方法で表せる最初の数を求める。
まっすぐ計算。何も工夫してません。

main = print $ euler077 5000

euler077 :: Integer -> Integer
euler077 m = head $ filter (\ n -> (partByPrimes n n) > m) [1..]

partByPrimes :: Integer -> Integer -> Integer
partByPrimes 0 _ = 1
partByPrimes n 2 = 1 - (mod n 2)
partByPrimes n m =
    sum [ partByPrimes (n - x) x | x <- takeWhile (<= (min n m)) primes ]

primes :: [Integer]
primes = 2 : filter isPrime [3..]

isPrime :: Integer -> Bool
isPrime x = all ((/= 0) . mod x) $
    takeWhile (<= (floor $ sqrt $ fromIntegral x)) primes