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