scala 2.9 collection.parallel を実戦投入です!!

プログラミング問題サイトProject Euler第216問に、こんな問題が出た。

1 < n ≤ 50,000,000 の自然数 n について、2*n2-1 が素数となるものの個数を求めよ

普通に素数判定すると計算時間がかかる(一時間くらい?)ので工夫したアルゴリズムで解け、というのが出題意図と思う。たぶん。

でもアルゴリズム考えるの面倒なんで、出題意図を無視して、力押し。我々には、scala.collection.parallel という強い味方がある。

object Prob216Par {
  def isPrime(n: Long) = BigInt(n).isProbablePrime(32)
  def solve {
    val N = 50000000 //10000
    val t: Int => Long = (n) => 2L * n * n - 1

    //val ans = (2 to N) count { n => // 普通の直列(?)計算
    val ans = (2 to N).toParSeq count { n => // こうするだけだけで並列計算に
      if (n % 500000 == 0) println("n ="+n)
      isPrime(t(n))
    }
    println(ans)
  }
}

object Main extends Application {
  Prob216Par.solve
}

ははは、圧勝じゃないか!