The @Pierre Lafortune code is neat and not too slow, but I would suggest a different approach, which is significantly faster.
, n R " n+k ". , 1:(n+k) , , numbers::Primes().
n+k, n (k1) , . , (n+1):(n+k1) k2 , . , , ... .
- : , (non-prime) , . : () ( , , ). , , .
, , :
library(numbers)
n_composite2 <- function(n, from = 2) {
endRange <- from + n - 1
numbers <- seq(from = from, to = endRange)
primes <- Primes(n1 = from, n2 = endRange)
composites <- numbers[!(numbers %in% primes)]
nPrimes <- length(primes)
if (nPrimes >= 1) return(c(composites, n_composite2(nPrimes, from = endRange + 1)))
return(composites)
}
( ), numbers::Primes() . , , [number of primes in previous step] , .
, , (n_composite()):
> all(n_composite(1e4) == n_composite2(1e4))
[1] TRUE
, n_composite2() 19 :
library(microbenchmark)
microbenchmark(
"n_composite2" = n_composite2(1e4),
"n_composite" = n_composite(1e4),
times=5
)
Unit: milliseconds
expr min lq mean median uq max neval
n_composite2 34.44039 34.51352 35.10659 34.71281 35.21145 36.65476 5
n_composite 642.34106 661.15725 666.02819 662.99657 671.52093 692.12512 5
: "" " . numbers::Primes() while, , n_composite(). " " , n . , , ( ).