Problem 146

Probem 145は前に解いたので(Problem 145 - もうカツ丼でいいよな)146。
Problem 146 - Project Euler

n^2+1, n^2+3, n^2+7, n^2+9, n^2+13, n^2+27が連続する素数となる最小のnは10である。100万未満でそのようなnの総和は1242490になる。
1億5千万未満についてこのようなnの総和を求めよ。

ダメダメ。そもそも素数判定確率的だし。「1億未満の〜」とか出てくるとどうも毎回ダメな感じになってしまう。

library(gmp)

limit <- 150000000
ans <- 0
nlist <- seq(10, limit, by=10)
nlist <- nlist[nlist %% 30 == 10 | nlist %% 30 == 20]

sieve <- logical(length(nlist))
for(i in 1:length(sieve)){
  if(isprime(as.bigz(nlist[i])^2 + 1, reps=1) != 0) sieve[i] <- TRUE
}
nlist <- nlist[sieve]

sieve <- logical(length(nlist))
for(i in 1:length(sieve)){
  if(isprime(as.bigz(nlist[i])^2 + 3, reps=1) != 0) sieve[i] <- TRUE
}
nlist <- nlist[sieve]

sieve <- logical(length(nlist))
for(i in 1:length(sieve)){
  if(isprime(as.bigz(nlist[i])^2 + 7, reps=1) != 0) sieve[i] <- TRUE
}
nlist <- nlist[sieve]

sieve <- logical(length(nlist))
for(i in 1:length(sieve)){
  if(isprime(as.bigz(nlist[i])^2 + 9, reps=1) != 0) sieve[i] <- TRUE
}
nlist <- nlist[sieve]

sieve <- logical(length(nlist))
for(i in 1:length(sieve)){
  if(isprime(as.bigz(nlist[i])^2 + 13, reps=1) != 0) sieve[i] <- TRUE
}
nlist <- nlist[sieve]

sieve <- logical(length(nlist))
for(i in 1:length(sieve)){
  if(isprime(as.bigz(nlist[i])^2 + 27, reps=1) != 0) sieve[i] <- TRUE
}
nlist <- nlist[sieve]

ans <- 0
for(i in nlist){
  k <- as.bigz(i^2) + 1
  if(isprime(k)){
    k <- nextprime(k)
    if(k == as.bigz(i^2) + 3){
      k <- nextprime(k)
      if(k == as.bigz(i^2) + 7){
        k <- nextprime(k)
        if(k == as.bigz(i^2) + 9){
          k <- nextprime(k)
          if(k == as.bigz(i^2) + 13){
            k <- nextprime(k)
            if(k == as.bigz(i^2) + 27){
              ans <- ans + i
            }
          }
        }
      }
    }
  }
}
ans