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