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

Haskell で Project Euler を解く素人遊び

Problem 7

10001番目の素数を求める

まずは伝統的なアレを使ってまっすぐやってみる。当然これで解決するが、思いの外計算が重い。素数列の生成に関しては速いパッケージが存在するので、それを使えばいいじゃないかという(内なる)声もあるが、人のふんどしでパズルを解いて何が嬉しいのかという(内なる)声もあるので、自分なりにスピードを上げる工夫を考えてみる。


自分の力量で優れたアルゴリズムを生み出すのは不可能なので、せめてメモリの節約で軽くなってくれと祈りながらprimeを少しいじってみる。そのために、与えられた自然数素数かどうかを判定する関数isPrimeを作成。これを使って奇数列を走査する方式にしたところ、計算時間が約1/5に短縮された。


isPrimeはnを評価するために2から√nの間にある自然数で割り切れるかどうかをチェックしている。一見ごちゃごちゃしているように見えるのは、sqrtを使うと型エラーが起こってしまうため。Int型の世界の中で完結するようにしたかったので、こういう形になった。関数fromIntegralを使う方法もあるが、小技チックであんまり好みじゃないのでやめた。


計算が早くなると嬉しい☆