Life Goes On

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

87問目

http://projecteuler.net/index.php?section=problems&id=87
28 = 22 + 23 + 24 であり、素数の2乗、3乗、4乗の和として表すことができる。
このような数は五千万未満でいくつあるか求める。
色々な素数について2乗、3乗、4乗の和を求め、重複するものを除いています。

import Data.List

main = print $ length $ group $ sort $ euler087 50000000

euler087 :: Integer -> [Integer]
euler087 n = [ a^2+b^3+c^4 |
    let cm = floor $ fromIntegral (n-2^3-2^2) ** (1/4),
    c <- takeWhile (<= cm) primes,
    let bm = floor $ fromIntegral (n-c^4-2^2) ** (1/3),   
    b <- takeWhile (<= bm) primes,
    let am = floor $ fromIntegral (n-c^4-b^3) ** (1/2),
    a <- takeWhile (<= am) primes ]

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

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