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