I implemented the following for Project 3 in Project Euler:
--Problem 3. The prime factors of 13195 are 5, 7, 13 and 29. What is the
--largest prime factor of the number 600851475143?
prime :: Integer -> Bool
prime x = prime' x (x `div` 2) where
prime' _ 1 = True
prime' x y = if x `mod` y == 0 then False
else prime' x (y - 1)
largestPrimeFactor :: Integer => Maybe Integer
largestPrimeFactor x = largestPrimeFactor' x (x `div` 2)
where largestPrimeFactor' _ 1 = Nothing
largestPrimeFactor' x y = if x `mod` y == 0 && prime y then Just y
else largestPrimeFactor' x (y - 1)
I was able to get Just 29
per the introduction to this problem from Project Euler:
*Main> largestPrimeFactor 13195
Just 29
*Main> largestPrimeFactor 600851475143 -- running for (as of now) 15 hours!
My implementation succeeded for getting 29
from 13195
, but the computation for 600851475143
has been running for 15 hours so far.
Please review my implementation for correctness and idiomatic Haskell.
Integer
is an arbitrary precision length. \$\endgroup\$