【问题标题】:Explanation of a single line of code for prime numbers解释素数的单行代码
【发布时间】:2019-03-28 19:34:08
【问题描述】:

您好,我只需要一些帮助来理解从函数中获取素数的这行代码(整个函数见下文):

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

【问题讨论】:

  • 好吧,我明白 ceiling(sqrt(i)) 只是你应该检查的素数但只是 i == 2L 我不明白
  • 2L 是类integer 中的数字2,而不是numeric,如果你输入2,你会得到它。不过,不知道你为什么需要它

标签: r function loops


【解决方案1】:

假设您必须检查 q=1,000,001 是否为质数。 最简单的方法是检查 [2, 1000000] 中的任何整数是否是 q 的因子。 假设 q 的因子 f 确实存在并且不在 [2, ceiling(sqrt(q))] 中。 所以 f > 上限(sqrt(q)) 和 q/f

这就是为什么你只需要检查到上限(sqrt(q))

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 2015-02-11
    • 2017-08-18
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多