wvogel日記

自分用の技術備忘録が多めです.

最大約数

さあ、Haskellで数学を解こう!フィボナッチに続き、今日二つ目。


600851475143の素因数のうち最大のものを計算せよ、という問題。

main = print $ pickup $ filter ans [1,3..600851475141]

ans :: Int -> Bool
ans n
    | 600851475143 `mod` n == 0 = True
    | 600851475143 `mod` n /= 0 = False

pickup :: [Int] -> Int
pickup (x:xs)
    | xs == [] = x
    | otherwise = pickup xs

ans関数を使って600851475143の約数を抽出、pickup関数で、生成したリストの一番右にあるもの、つまり最大のものを取りだします。
一行目のリストが、[1,3..600851475141]となっているのは、偶数を排除し計算回数を減らすのと、600851475143自身で割ってしまうことを防ぐため。