我想在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)
答案 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实现)。