Problem 50

Problem 50 - Project Euler
最初ほぼ同じのを回して40秒くらいかかった気がしたけど,今何度やっても3秒で終わる.どういうこと.

library(gmp)                            #isprime

limit <- 10^5
sievebound <- (limit-1)/2
sieve <- logical(sievebound)
crosslimit <- (floor(sqrt(limit))-1)/2
for(i in 1:crosslimit){
  if(!sieve[i]){
    for(j in seq(2*i*(i+1), sievebound, 2*i+1)){
      sieve[j] <- TRUE
    }
  }
}
prime.list <- c(2, 2*(1:sievebound)[!sieve]+1)

l.len <- length(prime.list)
limit <- 10^6
flag <- FALSE
while(sum(prime.list[1:l.len]) > limit) l.len <- l.len - 1
while(1){
  j <- 1
  if(isprime(sum(prime.list[1:l.len]))) break
  l.len <- l.len -1
  j <- 2
  while(sum(prime.list[j:(l.len+j)])<limit){
    if(isprime(sum(prime.list[j:(l.len+j)]))){
      flag <- TRUE
      break
    }
    j <- j + 1
  }
  if(flag) break
}
sum(prime.list[j:(l.len+j)])

合計が100万以下になる最長の素数列から判定かけつつ列の長さを減らしていく感じ.
すぐ見つかったので早く終わってしまったけど,列の長さを2つずつ減らせばこのままもうちょい早くできる.