项目Euler#3:解决了R但是"用完了应用程序内存"

时间:2014-11-25 22:09:25

标签: r

我是学习R的新手,目前正在通过Project Euler工作。我似乎已经解决了其中一个问题,但是在完成计算之前,我得到一个错误告诉我我的应用程序内存耗尽(迫使我退出)。反过来,我想问一下我的选择。

问题是:

  

13195的主要因素是5,7,13和29。

     

600851475143号码的最大主要因素是什么?

我做的第一件事就是花一些时间找出代码来找到13195的解决方案:

library(matlab)

> x <- 1:13195

> primes <- x[isprime(x) == TRUE]

> div_primes <- primes[13195 %% primes == 0]

> max(div_primes)
[1] 29

由于我成功了,我认为我可以扩展到600851475143。但是,我没有足够的应用程序内存来​​完成计算:

library(matlab)

> x <- 1:600851475143

> primes <- x[isprime(x) == TRUE]

> div_primes <- primes[600851475143 %% primes == 0]

> max(div_primes)
[1] 29

我阅读了帖子here,他们正在使用名为Sieve of Eratosthenes的算法。要弄清楚如何实现这一点与在matlab库中使用isprimes()函数有根本的不同吗?

如果没有,还有其他建议可以使这个可行吗?

1 个答案:

答案 0 :(得分:1)

isprime()的来源表明它只是primes()的一个包装器,根据其文档使用的是#34; Eratosthenes筛选器的变体&#34;算法:

p <- seq(1, n, by = 2)
p[1] <- 2
q <- length(p)
if (n >= 9) {
    for (k in seq(3, sqrt(n), by = 2)) {
        if (p[(k + 1)/2] != 0) {
            p[seq((k * k + 1)/2, q, by = k)] <- 0
        }
    }
}
p[p > 0]