Project Euler Problem 3

http://projecteuler.net/index.php?section=problems&id=3
600851475143の素因数のうち最大のもの

main = print $ last $ primeFactors 600851475143 2

primeFactors :: Integer -> Integer -> [Integer]
primeFactors x y
      | x > y = if (x `mod` y == 0) then [y] ++ (primeFactors (floor $ (fromIntegral x) / (fromIntegral y)) $ nextPrime y)
                                    else [] ++ (primeFactors x $ nextPrime y)
      | otherwise = [y]

nextPrime :: Integer -> Integer
nextPrime n = head $ filter (\n -> isPrime n) [n+1..]

isPrime :: Integer -> Bool
isPrime 1 = False
isPrime n = null [x | x <- [2..n-1], n `mod` x == 0]

参考:http://www.shido.info/hs/haskell4.html#int


もっと素直で短い解答:http://d.hatena.ne.jp/rst76/20080314/1205500266


/しか思いつかんかった俺のバカ

div関数
マイナス無限大に向かって丸める
quot関数
0に向かって丸める


(2009/05/23追記)
たまたま答えは合ってただけでprimeFactors間違ってた

main = print $ last $ primeFactors 2 600851475143

primeFactors :: Integer -> Integer -> [Integer]
primeFactors x y
      | y > x = if (y `mod` x == 0) then [x] ++ (primeFactors (nextPrime x) $ (continueToDiv y x))
                                    else [] ++ (primeFactors (nextPrime x) y)
      | otherwise = if y == 1 then [] else [y]

--割り切れなくなるまで割る
continueToDiv :: Integer -> Integer -> Integer
continueToDiv a b = if (a `mod` b) == 0 then continueToDiv (a `div` b) b else a

(2009/05/26追記)
更に修正->Project Euler Problem 7 - souta-bot log