Life Goes On

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

72問目

http://projecteuler.net/index.php?section=problems&id=72
d ≦ 1,000,000 について、既約分数 n/d はいくつあるか求める。
dを分母とする既約分数の数はトーティエント関数φ(d)に一致するので、それを1000000まで足し合わせています。

import Data.List

main = print $ euler072 1000000

euler072 :: Integer -> Integer
euler072 d = sum $ map phi [2..d]

phi :: Integer -> Integer
phi n = foldl (\ m d -> m - (div m d)) n $ nub $ factors primes n

factors :: [Integer] -> Integer -> [Integer]
factors (p:ps) n
    | q < p = [n]
    | r == 0 = p : factors (p:ps) q 
    | otherwise = factors ps n
    where (q, r) = divMod n p

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

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