嗨,我只需要一些帮助来理解函数中的这一行代码即可得到质数(有关整个函数,请参见下文):
if (i == 2L || all(i %% 2L:ceiling(sqrt(i)) != 0))
i == 2L
和ceiling(sqrt(i))
的功能一样。该函数基本上只是生成一个质数向量,或者仅返回该向量中的最后一个质数。我不太了解这两个部分的用途。
通常我只会检查像这样的素数all(i %% 2:(i-1) !=0)
,为什么在代码中更改了这两个元素?
get_prime <- function(n, all = TRUE, i = 1, primes = c()){
if ( n <= 0) {
stop("Not a valid number")
}
if (length(primes) < n) {
if (i == 2L || all(i %% 2L:ceiling(sqrt(i)) != 0)) {
get_prime(n, all = all, i = i + 1, primes = c(primes, i))
} else {
get_prime(n, all = all, i = i + 1, primes = primes)
}
} else {
if (all) {
return(primes)
} else {
return(tail(primes, 1))
}
}
}
答案 0 :(得分:1)
想象一下,您必须检查q = 1,000,001是否为质数。 最简单的方法是检查[2,1000000]中是否有整数是q的因数。 假设存在q个因子f,但它不在[2,ceiling(sqrt(q))]中。 所以f>上限(sqrt(q))和q / f <= q / sqrt(q)= sqrt(q) 因此,无论q / f是多少,它都位于[2,ceiling(sqrt(q))]。
这就是为什么您只需要检查最高限额(sqrt(q))