最初の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
