素因数分解

素朴な素因数分解Haskell
Integerを使っているので桁数を気にしなくてよい。

--------------------------------------------------
-- factors.hs
--------------------------------------------------
import System.Environment(getArgs)


--------------------------------------------------
-- num : dividend
-- i : first divisor
-- return minimum factor
--------------------------------------------------
findMinFactor :: Integer -> Integer -> Integer
findMinFactor num i
  | (mod num i) == 0  = i
  | otherwise         = findMinFactor num (i+1)

--------------------------------------------------
-- num : dividend
-- return : list of factors
--------------------------------------------------
findFactors :: Integer -> [Integer]
findFactors num
  | f == num     = [num]
  | otherwise    = f : findFactors (div num f)
  where f = findMinFactor num 2


--------------------------------------------------
-- argument : dividend
-- print list of factors
--------------------------------------------------
main = do
  arg1:rest <- getArgs
  let x = read arg1 :: Integer
  let factors = findFactors x
  print factors