私はisPrime関数を書きました。与えられた数字が素数であるかどうかをチェックします。 最後の「素数」リストは別々に与えられます。統合機能がはるかに遅い
prime :: [Integer]
prime = 2 : filter isPrime [3..]
isPrime :: Integer -> Bool
isPrime n | n < 2 = False
isPrime n = all (\p -> n `mod` p /= 0) . takeWhile ((<=n) . (^2)) $ prime
私はpossible..soは、私は1つの関数isPrime2にisPrimeと首相を統合した場合、一つに二つの機能を統合するために、常により良いと思いました。しかし、isPrime2の性能は非常に悪いです。
isPrime2 :: Integer -> Bool
isPrime2 n | n < 2 = False
isPrime2 n = all (\p -> n `mod` p /= 0) . takeWhile ((<=n) . (^2)) $ 2 : filter isPrime2 [3..]
isPrime 40000000000000000001
=> 0.5秒
isPrime2 40000000000000000001
=> 19.8秒
私の機械はUbuntuの17.10 x86-64です。私はghc 8.2.1を使用しています。なぜ誰が知っていますか?
私は、 'prime'は定数なのでmemoisedになりますが、' isPrime2'は関数なので、そうではないと思います。しかしそれは唯一の推測です... – MathematicalOrchid
ありがとう!あなたの説明は私に洞察を与えた。 – eii0000
@ eii0000コンパイルやインタプリタをテストしていますか?あなたが 'isPrime2 n'を' all(\ p - > n 'mod' p/= 0)として単純化すれば、それはどのように比較されますか? takeWhile((<= n)。(^ 2))$ 2:[3,5 ..] ''? –