のてすきあ − 完全独習非プログラマー −

Haskell で Project Euler を解く素人遊び

Problem 10

2,000,000以下の全ての素数の和を求める

素数列の生成は problem 7 で用いたものを使う。

mitstream.hatenablog.jp

あとは足すだけ…だよね?すごく時間が掛かるんですけど、原理的に高速化する方法がないように思えます。何かあるんでしょうか?どこかに無駄はないか。

…。

あった。isPrime でnを評価する際に√n以下の自然数で割り切れないことを確認しているが、ここは√n以下の素数だけ調べれば良い。例えば、ある数が2と3で割り切れないなら、6で割り切れるか調べる意味はない。

ということで、Haskellらしく primes と isPrime の相互再起の形に書き直す。ちなみに takeWhile の条件にラムダ式を使うのも、自分的にはプチ発見。こういう書き方もできるとは意識していなかった。なお、d2 を d*d と表記するのは、ただの趣味。深い意味はない。

これでこの問題に関しては、計算が20倍以上早くなった。



やった☆