2017-04-23 2 views
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を分割する点はありません。整数が素数であるかどうかをテストします。

答えて

3

ここでは、整数の最小素因数が2であるため、最大は最大でn/2になるという事実を利用しています。

より良いアルゴリズムは、因子があるかどうかを見つけるために、sqrt(n)までの数字をチェックします。あなたは

UPDATE

nまでの短絡(n)の平方根とのチェックに非プライムのような特殊なケースとして1を処理する必要があるものの、この

prime n = null [ k | k <- [2..n], k*k <= n, mod n k == 0 ] 

よう

何か素数の場合、これはより良いアプローチかもしれません。

+0

これは '2.n 'をループし、' sqrt n..n'からのすべての数を直ちに捨てなければならないので、平方根のみをチェックする最良の方法ではありません。それらの数字をすべて破棄するには多くの時間がかかります。問題のコードは、これが行う数字の半分しか扱っていません。 –

+0

はい、右にフィルタリングされたバージョンが追加されました。 – karakfa

関連する問題