我目前有以下函数来获取整数的除数:
-- All divisors of a number
divisors :: Integer -> [Integer]
divisors 1 = [1]
divisors n = firstHalf ++ secondHalf
where firstHalf = filter (divides n) (candidates n)
secondHalf = filter (\d -> n `div` d /= d) (map (n `div`) (reverse firstHalf))
candidates n = takeWhile (\d -> d * d <= n) [1..n]
我最终添加了filter
to,secondHalf
因为除数在n
素数的平方时重复。这似乎是解决此问题的一种非常低效的方法。
所以我有两个问题:如何衡量这是否真的是我算法的瓶颈?n
如果是的话,当素数的平方是多少时,我该如何寻找一种更好的方法来避免重复?