素因数分解

ちょっとなまった。ただでさえたいしたことないのに。

import List (intersperse)

primes n = erat (2:[3,5..n])
  where
    erat [] = []
    erat (x:xs) = x : erat [y | y <- xs, y `mod` x /= 0]

calc n m = (m, length (calc' n m))
  where
    calc' n m = let (a, b) = divMod n m
                          in if b == 0
                            then (a, b):calc' a m
                            else []

factorize n = filter ((/= 0) . snd) $ map (calc n) (primes n)

toStrFactorize = concat . intersperse "," . map toStr . factorize
  where
    toStr :: (Show a) => (a, a) -> String
    toStr (x, y) = (show x) ++ "^" ++ (show y)