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 }
ははは、圧勝じゃないか!