return 质数的函数

Function to return prime numbers

我想在 R 中编写一个函数,它接受整数列表并且 returns 仅接受素数。

到目前为止我有这个:

 primefindlist<-function(n){
 return(n[n==2 | all(n %% seq(2,ceiling(sqrt(n)),by=1) !=0)])
 }

但是当我 运行 函数时,我不断收到错误消息,例如;

 primefindlist(c(7,11))

Error in seq.default(2, ceiling(sqrt(n)), by = 1) : 'to' must be of length 1

有人知道如何克服这个问题吗?

下面的代码也告诉我一个整数是否为质数,即 is.prime(7) 输出 TRUE

is.prime <- function(n) n == 2L || all(n %% 2L:ceiling(sqrt(n)) != 0) 

该函数未向量化。尝试

primefindlist<-function(x){
  return(x[x==2 | sapply(x, function(n)all(n %% seq(2,ceiling(sqrt(n)),by=1) !=0))])
}

primefindlist<-function(n){
  return(n[n==2 | all(n %% seq(2,ceiling(sqrt(n)),by=1) !=0)])
}
vPrimefindlist <- Vectorize(primefindlist, vectorize.args = "n")
vPrimefindlist(c(7,11))

使用 gmp 库中的 isprime 怎么样?

myPrimes <- function(x) {x[which(isprime(x)>0)]}

这里有一些测试:

set.seed(33)
randSamp <- sample(10^6,10^5)

system.time(t1 <- myPrimes(randSamp))
user  system elapsed 
0.07    0.00    0.08 

system.time(t2 <- primefindlist(randSamp))
user  system elapsed 
7.04    0.00    7.06 

all(t1==t2)
[1] TRUE

如果您有兴趣,isprime 函数实现 Miller-Rabin primality test. It is fairly easy to write this algorithm yourself if you are determined to not use any external libraries. Rosetta Code 是一个很好的起点(目前还没有 R 实现)。