我是学习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()
函数有根本的不同吗?
如果没有,还有其他建议可以使这个可行吗?
答案 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]