Problem 7

素数を小さい方から6つ並べると 2, 3, 5, 7, 11, 13 であり、6番目の素数は 13 である。

10001 番目の素数を求めよ。

Problem 7 - PukiWiki

Ruby

def prime?(n)
  (2..Math.sqrt(n)).each do |i|
    return FALSE if n%i == 0
  end
  return TRUE
end


c = 0
k = 1

while c < 10001 do
  k += 1
  c += 1 if prime?(k)
end

puts k

全然最適化とかしてなくてむしろ遅くなる感じに書いた。それでもこれくらいならすぐ計算できるもんなんですね。

R

is.prime <- function(n) {
  i <- 2
  while(i*i <= n) {
    if(n%%i == 0) {
      return(FALSE)
    }
    i <- i+1
  }
  return(TRUE)
}

c <- 0
k <- 1

while(c < 10001) {
  k <- k+1
  if(is.prime(k)) {
    c <- c+1
  }
}

print(k)

なんか遅い…

% time R -q --vanilla < 007.r
R -q --vanilla < 007.r  19.96s user 0.15s system 99% cpu 20.110 total
% time ruby 007.rb
ruby 007.rb  4.34s user 0.01s system 99% cpu 4.350 total

(´・ω・`)

Haskell

main = print $ last $ primes [] [2..]
    where
      primes p (x:xs)
          | (length p) == 10001 = p
          | otherwise = primes (p++[x]) [y|y<-xs, (mod y x)/=0]

折角無限リストが使えるので調子乗って篩いっぽく書いたらすげー遅くなった…26秒…
最適化オプションをつけたら早くなる…なんて事は全然なかったぜ!!