0
isPrime::Integer->Bool
isPrime n=not (hasfactor n 2(div n 2))
hasfactor::Integer->Integer->Integer->Bool
hasfactor n low high
|low>high=False
|mod n low==0=True
|otherwise = hasfactor n (low+1) high
2行目以外のほとんどのコードは、not (hasfactor n 2(div n 2))
です。なぜ上限は(div n 2)
ですか? test 8
と入力した場合、(hasfactor n 2(div n 2))
はhasfactor 8 2 4
となりますが、ここでは8
を分割する点はありません。整数が素数であるかどうかをテストします。
これは '2.n 'をループし、' sqrt n..n'からのすべての数を直ちに捨てなければならないので、平方根のみをチェックする最良の方法ではありません。それらの数字をすべて破棄するには多くの時間がかかります。問題のコードは、これが行う数字の半分しか扱っていません。 –
はい、右にフィルタリングされたバージョンが追加されました。 – karakfa