Задача 25 ЕГЭ по информатике: разложение на множители, простые числа, количество делителей.
Задача 25 ЕГЭ по информатике: разложение на множители, простые числа, количество делителей.
В задачах ЕГЭ по информатике часто требуется находить множители числа и проверять, является ли данное число простым. Рассмотрим способы делать это достаточно быстро.
Разложение на множители.
Самый простой способ разложения числа на множители: проверить его делимость на все числа, начиная с 2 и кончая числом, равным половине исходного. Но этот способ - слишком медленный.
Ускорить процедуру можно, если учесть тот факт, что если число n делится на число k, то оно делится и на n//k. Тогда можно проверить лишь числа от 2 до квадратного корня из n. Когда мы находим число k, на которое делится число n, то добавляем в список делителей два делителя: k и n//k. Один тонкий момент: если число n является точным квадратом числа k, то и k, и n//k - это одинаковые числа. Поэтому нужно ввести проверку и добавлять в список делителей n//k только в том случае, если это число не равно k. Тем самым мы избежим включения в массив делителей двух одинаковых чисел.
Приведем текст функции на Питоне, которая вычисляет все делители числа n, кроме единицы и самого числа n (так называемые нетривиальные делители) и возвращает массив, содержащий эти делители.
def divisors(n):
d=[]
k=2 # или 1, если требуются все делители
while k*k <= n:
if n%k == 0:
d.append(k)
k2 = n//k
if k2 > k: d.append(k2)
k += 1
return d
Условие k*k <= n прекращает выполнение цикла поиска делителей, когда k станет больше, чем квадратный корень из n. Почему мы записали его так, а не в виде k<=sqrt(n)? На это есть две причины.
Во-первых, операция умножения выполняется гораздо быстрее, чем извлечение корня. Во-вторых, функция извлечения корня возвращает вещественный результат. А операции над вещественными числами выполняются лишь приближенно, и квадратный корень из 4 при вычислениях может оказаться равным 2.0000000001, а может и 1.9999999999. Понятно, что это может сказаться на результате сравнения самым пагубным образом.
Данная функция находит только нетривиальные делители числа n, т.е. в список не попадает единица и само число n. Если требуются все делители, то строку k=2 в начале фунации следует заменить на k=1.
Делители в массиве не упорядочены по возрастанию. Так, для числа 60 получается следующий результат:
[2, 30, 3, 20, 4, 15, 5, 12, 6, 10]
Если требуется упорядоченность, то нужно отсортировать полученный массив.
Проверка числа на простоту.
Проверка, является ли данное число простым, имеет много общего с поиском делителей. Если число простое, то оно не имеет нетривиальных делителей. Поэтому для данной цели можно использовать приведенную выше функцию: если результатом ее является пустой массив, то число простое.
Но можно написать для этой цели и отдельную функцию. Приведем её текст:
def isprime(n):
k=2
while k*k <= n:
if n%k == 0: return False
k += 1
return True
Функция возвращает True, если число n - простое.
Данная функция работает несколько быстрее, чем функция divisors, т.к. она завершает работу после того, как найден первый делитель, а не ищет все делители.
Существуют и более быстрые алгоритмы для решения данных задач, но они достаточно сложны, и на ЕГЭ их не имеет смысла применять.
Количество делителей числа.
Вернемся к функции поиска делителей. Она находит делители парами (k и n//k). Единственное исключение - случай, когда наше число n является точным квадратом некоторого целого числа.
Отсюда следует очень важный факт:
Количество делителей числа n>1 нечетно тогда и только тогда, когда n - квадрат некоторого числа.
Рассмотрим вопрос о количестве делителей более подробно.
Любое натуральное число можно единственным образом представить в виде
p1m1p2m2...pnmn,
где pi - простые числа, а mi - натуральные. (Это утверждение называется основной теоремой арифметики.)
Делителем данного числа будет являться любое число вида
p1k1p2k2...pnkn,
где 0<=ki<=mi
Очевидно, что каждое ki может принимать mi+1 различных значений (0, 1, ..., mi). А количество всех делителей (включая 1 и само число) есть
(m1+1)(m2+1)...(mn+1)
Пример: число 12 можно представить в виде 22*31. Следовательно, у числа 12 должно быть (2+1)(1+1)=6 делителей. В самом деле, делители числа 12 - это 1, 2, 3, 4, 6 и 12.
Отсюда, в частности, следует, что если количество всех делителей некоторого числа n - простое число m, то n должно иметь вид pm-1 (где p - простое число).
Это помогает решать задачи, в которых надо найти числа, имеющие, например, ровно 5 делителей. Так как 5 - простое число, то все такие числа должны иметь вид p4, где p - простое число. Пример такого числа - 81, т.е. 34: его делители - 1, 3, 9, 27 и 81.
(c) Ю.Д.Красильников, 2021-2024 г.
Комментарии
Отправить комментарий