Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.Python.8-10.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
1.2 Mб
Скачать

Тест простоты

Тест простоты — алгоритм, который по заданному натуральному числу определяет, простое ли это число.

Определение простоты заданного числа в общем случае не такая уж тривиальная задача. Только в 2002 году было доказано, что она полиномиально разрешима (то есть ответ на вопрос о простоте числа из k цифр можно дать за время, пропорциональное некоторой степени числа k). Тем не менее, тестирование простоты значительно легче задачи факторизации заданного числа (разложения числа на множители), для которой полиномиального алгоритма пока не найдено.

Проверка простоты перебором делителей

Перебор делителей — алгоритм тестирования простоты числа путем полного перебора всех возможных потенциальных делителей.

Обычно перебор делителей заключается в переборе всех целых (как вариант: простых) чисел от 2 доквадратного корня из тестируемого числа n и в вычислении остатка от деления n на каждое из этих чисел. Если остаток от деления на некоторое число m равен нулю, то m является делителем n — в этом случае n объявляется составным, и алгоритм заканчивает работу. При достижении квадратного корня из n и невозможности сократить n ни на одно из меньших чисел, n объявляется простым.

Почему можно остановить перебор делителей на корне из n? Предположим, у n есть некоторый делитель p. Тогда n/p так же будет его делителем, и, очевидно, один из этих делителей не превосходит корня из n.

В практических задачах данный алгоритм применяется редко ввиду его большой асимптотической сложности, однако его применение оправдано в случае, если проверяемые числа относительно невелики, так как данный алгоритм довольно легко реализуем.

Факторизация перебором делителей

Разложение числа на простые множители называется факторизацией.

Факторизация целых чисел обеспечивается основной теоремой арифметики

Каждое натуральное число n>1 можно представить в виде n=p1∗p2∗p3∗…∗pk, где p1,p2,p3,…pk— простые числа, причём такое представление единственно с точностью до порядка следования сомножителей.

Факторизация числа методом перебора делителей производится почти так же, как и тест простоты числа методом перебора делителей. Производится перебор всех целых (как вариант: простых) чисел от 2 до квадратного корня из факторизуемого числа n и в вычислении остатка от деления n на каждое из этих чисел. Если остаток от деления на некоторое число m равен нулю, то m является делителем n. В этом случае n сокращается на m и процедура повторяется. По достижении квадратного корня из оставшегося числа и невозможности сократить его ни на одно из меньших чисел, оно объявляется простым и также приписывается к простым сомножителям исходного числа n.

Факторизация целых чисел для больших чисел является сложной задачей. Её сложность лежит в основе некоторых алгоритмов безопасности с открытым ключом шифрования, например, алгоритма RSA.

Факторизация перебором делителей на python

def factorize(n):     divisor = 2     while divisor ** 2 <= n:         if n % divisor == 0:             n //= divisor             print(divisor)         else:             divisor += 1     if n != 1:         print(n) n = int(input()) factorize(n)