Life Goes On

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

69問目

http://projecteuler.net/index.php?section=problems&id=69
n ≦ 1,000,000 について、オイラーのトーティエント関数 φ(n) を考えるとき、 n/φ(n) が最大になるような n を求める。
n の素因数の種類が多いほど φ(n) は小さくなるので、素数を小さいものから掛け合わせ、1000000以下で最大の値を求めます。

main = print $ euler069 1000000

euler069 :: Int -> Int
euler069 m = last $ takeWhile (<= m) $ scanl1 (*) primes

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

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