Объяснение одной строки кода для простых чисел - PullRequest
0 голосов
/ 28 марта 2019

Привет, мне просто нужна помощь в понимании этой строки кода из функции, чтобы получить простые числа (см. Ниже всю функцию):

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

Что делает i == 2L так же, как ceiling(sqrt(i)). Эта функция в основном просто генерирует вектор простых чисел или просто возвращает последнее простое число в векторе. Я не совсем понимаю, для чего используются эти 2 раздела.

Обычно я просто проверял бы простое число, подобное этому 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 Ответ

1 голос
/ 28 марта 2019

Представьте, что вам нужно проверить, было ли q = 1 000 001 простым числом.Самый простой способ сделать это - проверить, является ли любое целое число в [2, 1000000] фактором q.Предположим, что фактор f для q существует, и его нет в [2, floor (sqrt (q))].Таким образом, f> потолок (sqrt (q)) и q / f <= q / sqrt (q) = sqrt (q) Так что, независимо от того, что q / f есть, оно лежит в [2, потолок (sqrt (q))]. </p>

Вот почему вам нужно только проверить до потолка (sqrt (q))

...