18 October, 2008

[Project Euler] Problem 7

Project EulerのProblem 7

 Problem 3で作った素数列のStreamは10001個の素数を計算させようとするとOutOfMemoryで落ちてしまった。本当はちゃんと理由を考えるべきだよなぁ。計算を遅延しているのは確かめたし、あとは実装上で非常にメモリ効率が悪いとかそういうのなのかなぁ。うぅぅむ、Streamへの理解が足りない様だ。
 とりあえず奇素数10000個のListを作れば良いので、下記の様に済ませた。計算時間は自機で15秒程度。

object P007 {
def main(args:Array[String]) {
println(new java.util.Date())
val ps = primes(10000)
println(ps(0))
println(ps(9999))
println(new java.util.Date())
}
def primes(num:Int):List[Int] = {
def odds(n:Int):Stream[Int] = Stream.cons(n, odds(n+2))
def primes2(ps:List[Int], ss:Stream[Int]):List[Int] = {
if (ps.length >= num) ps
else {
val x = ss.head
if (ps.forall(x%_!=0)) primes2(x::ps, ss.tail) else primes2(ps, ss.tail)
}
}
primes2(Nil,odds(3))
}
}

No comments: