現在、整数の除数を取得する次の関数があります。
-- 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]
が素数の 2 乗であるときに除数が繰り返されたため、filter
最終的に を追加しました。これは、この問題を解決するには非常に非効率的な方法のようです。secondHalf
n
質問が 2 つあります。これが本当にアルゴリズムのボトルネックかどうかを測定するにはどうすればよいでしょうか。n
もしそうなら、 が素数の 2 乗であるときに、繰り返しを避けるためのより良い方法を見つけるにはどうすればよいでしょうか?