Problem 46 - Project Euler
早いには早いけど,素数のリストをどこまで作ったらいいかよく分からなかった.
is.prime <- function(n){ if(n == 1) return(FALSE) if(n < 4) return(TRUE) if(n%%2==0) return(FALSE) if(n < 9) return(TRUE) if(n%%3==0) return(FALSE) r <- floor(sqrt(n)) f <- 5 while(f <= r){ if(n%%f == 0) return(FALSE) if(n%%(f+2) == 0) return(FALSE) f <- f + 6 } return(TRUE) } limit <- 10^6 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) limit.p <- max(prime.list) candidate <- 35 while(1){ if(is.prime(candidate)){ candidate <- candidate + 2 next } cand.s <- (candidate - prime.list)[(candidate-prime.list)>0] if(sum(sqrt(cand.s/2)%%1 == 0)==0) break candidate <- candidate + 2 if(candidate > limit.p) break }