doSieve2 <- (function(){ require("Rcpp") cppFunction('LogicalVector sieve(LogicalVector isAPrime) { int n = isAPrime.size(); int p = 3; while(pow(p,2) < n){ if(isAPrime[p-1]){ for(int i=pow(p,2); i<=n; i=i+2*p){ isAPrime[i-1] = false; } } p = p + 2; } return(isAPrime); }') return(function(n){ isAPrime <- c(rep(c(TRUE,FALSE), length=n)) isAPrime[c(1,2)] <- c(FALSE,TRUE) isAPrime <- sieve(isAPrime) return((1:n)[isAPrime]) }) })()