Объяснение одной строки кода для простых чисел

#r #function #loops

#r #функция #циклы

Вопрос:

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

 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. Хорошо, я понимаю ceiling(sqrt(i)) , что это просто число, которое вы должны проверить на наличие простых чисел, но просто i == 2L я не понимаю

2. 2L является ли число 2 классом integer в отличие от numeric , которое вы получаете, если вводите 2 . Не уверен, зачем вам это нужно, хотя

Ответ №1:

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

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