主发生器中的递归

时间:2010-10-04 19:55:08

标签: r primes

我正在制作一个素数生成器,为了提高效率,我试图只测试我已经找到的素数而不是所有数字的数字&lt;正在测试的数字的sqrt。我试图让我成为我的素数列表,但我不知道如何让它在我的第二个for循环中重复出现。我认为这仅针对a <- 2而非a <- c(a,i)

进行测试
x <- 3:1000
a <- 2
for (i in x)
 {for (j in a)
  {if (i %% j == 0)
   {next}
  else {a <- unique(c(a,i))}}}
a

2 个答案:

答案 0 :(得分:3)

解决方案可能是删除第二个循环,而是将您建议的素数与整个向量进行比较,如:

x <- 3:1000
a <- 2
for (i in x) {
  if (!any(i %% a == 0)) {
    a <- c(a,i)
  }
}

这似乎对我有用。

答案 1 :(得分:1)

使用简单素数函数的非递归模型,其速度与您在R中的速度一样快,如下所示。而不是循环遍历每个单独的值并测试它的最终性,它会删除大块中的所有素数倍数。这将每个后续剩余值隔离为素数。因此,它取出2倍,然后是3倍,然后4消失,所以5倍的值。这是在R.中最有效的方式。

primest <- function(n){
    p <- 2:n
    i <- 1
    while (p[i] <= sqrt(n)) {
        p <-  p[p %% p[i] != 0 | p==p[i]]
        i <- i+1
    }
    p
}

(您可能希望看到this堆栈问题,以便使用筛子更快的方法以及我的功能时间。上面的内容将运行50,可能比您正在使用的版本快500倍。)< / p>