我想在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):'to'的长度必须为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))
如何使用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实现)。