import Data.List (find)

isqrt :: (Integral n) => n -> n
isqrt = floor . sqrt . fromIntegral

primeFactors :: (Integral n) => n -> [n]
primeFactors n =
  case find ((== 0) . (n `mod`)) [2 .. isqrt n] of
    Nothing -> [n]
    Just m -> m : primeFactors (n `div` m)