返回素数的函数

时间:2015-03-07 16:20:26

标签: r primes

我想在R中编写一个函数,它接受一个整数列表,只返回素数值。

到目前为止,我有这个:

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

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

 primefindlist(c(7,11))
  

seq.default中的错误(2,ceiling(sqrt(n)),by = 1):     &#39;到&#39;必须长度为1

任何人都有任何想法如何克服这个?

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

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

2 个答案:

答案 0 :(得分:3)

该功能未矢量化。尝试

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))

答案 1 :(得分:1)

如何使用isprime库中的gmp

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。如果您决定不使用任何外部库,那么自己编写此算法相当容易。 Rosetta Code是一个很好的起点(目前还没有R实现)。