质数的单行代码说明

时间:2019-03-28 19:34:09

标签: r function loops

嗨,我只需要一些帮助来理解函数中的这一行代码即可得到质数(有关整个函数,请参见下文):

if (i == 2L || all(i %% 2L:ceiling(sqrt(i)) != 0))

i == 2Lceiling(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))
    }
  }
}

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))