我正在制作一个素数生成器,为了提高效率,我试图只测试我已经找到的素数而不是所有数字的数字&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
答案 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>