Project Euler – 問題7

最初の6つの素数を列挙すると2,3,5,7,11,13となるので、6番目の素数は13であ ることがわかる。

10001番目の素数を求めよ。

この問題もわりと簡単な計算問題である。問題2で使用した素数の定義を使うこ とにする。リストのn番目の要素を返す関数は!!である。先頭の要素は0番目な ので10001番目の要素を求めるのは以下のようなプログラムになる。

euler007 = primes !! 10000

ただしこのプログラムは若干遅い。環境によっては実行が長すぎて気になるか もしれない。原因は素数を求めるコードが遅いからだ。ここでは本質的な問題 は棚上げにして別の方法を考える。ghcにはインタプリタのghciとコンパイラの ghcがあるが、コンパイルすることで若干実行速度を改善することができる。コ ンパイルした場合main関数が実行されることになるので問題7を解くプログラム は以下のように書ける。

sieve (x:xs) = x : sieve [y | y <- xs, y `mod` x /= 0]
primes = sieve $ 2 : [3, 5 ..]
euler007 = primes !! 10000
main = putStrLn $ show euler007

ここでshowは渡された値を文字列に変換する関数、putStrLnは文字列を画面に 表示する関数である。インタプリタが暗黙のうちに行っている処理に相当する 部分である。このコードが書かれたファイルをeuler007.hsとして以下のように コンパイルすることができる。今回はこれで実行時間の問題は解決されたこと にしよう。

[hoge@huga foo]$ ghc -O3 -o euler007 euler007.hs