返回素数的函数

问题描述 投票:1回答:2

我想在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) 
r primes
2个回答
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
投票

如何使用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实现)。

© www.soinside.com 2019 - 2024. All rights reserved.