Тест простоты (Myvm hjkvmkmd)
Вопрос определения того, является ли натуральное число простым, известен как проблема простоты.
Тестом простоты (или проверкой простоты) называется алгоритм, который, приняв на входе число , позволяет либо не подтвердить предположение о том, является ли это число составным, либо точно утверждать его простоту. Во втором случае он называется истинным тестом простоты. Таким образом, тест простоты представляет собой только гипотезу о том, что если алгоритм не подтвердил предположение о составности числа , то это число может являться простым с определённой вероятностью. Это определение подразумевает меньшую уверенность в соответствии результата проверки истинному положению вещей, нежели истинное испытание на простоту, которое даёт математически подтверждённый результат.
Введение
[править | править код]Проблемы дискретной математики являются одними из самых математически сложных. Одна из них — задача факторизации, заключающаяся в поиске разложения числа на простые множители. Для её решения необходимо найти простые числа, что приводит к проблеме простоты. Задача теста простоты относится к классу сложности P, то есть время работы алгоритмов её решения зависит от размера входных данных полиномиально, что было доказано в 2002 году. Существует аналогичное, однако недоказанное, утверждение для задачи факторизации.
Некоторые приложения математики с использованием факторизации требуют ряда очень больших простых чисел, выбранных случайным образом. Алгоритм их получения, основанный на постулате Бертрана:
Алгоритм:
|
Время решения задачи этим алгоритмом не определено, но есть большая вероятность, что оно всегда является полиномиальным, пока имеется достаточно простых чисел, и они распределены более-менее равномерно. Для простых случайных чисел эти условия выполняются.
Известно (теорема Евклида), что множество простых чисел бесконечно. Теорема Дирихле (1837) гласит, что если НОД, то существует бесконечно много простых чисел, сравнимых с по модулю . Другими словами, простые числа распределены равномерно в классах вычетов по в соответствии с функцией Эйлера[1] при любом значении . Однако, если простые числа распределены равномерно, но их существует очень небольшое количество, поиск может оказаться невозможным на практике. Чтобы решить эту вторую проблему, воспользуемся теоремой о распределении простых чисел (1896), согласно которой количество простых чисел в интервале растёт с увеличением как . Это число стремится к бесконечности довольно быстро, из чего можно сделать заключение, что даже при больших значениях существует достаточно высокая вероятность () нахождения простого числа наугад. Из этого можно заключить, что описанный выше алгоритм может дать ответ за полиномиальное время, если существует полиномиальный алгоритм, позволяющий убедиться в простоте сколь угодно большого числа , что приводит к проблеме простоты.
Исторические сведения
[править | править код]Самые первые упоминания о простых числах известны у Евклида (III век до н. э.). При этом первый алгоритм нахождения простых чисел был изобретён Эратосфеном (II век до н. э.) и известен сейчас под названием решето Эратосфена. Его суть в последовательном исключении из списка целых чисел от до чисел, кратных и другим уже найденным «решетом» простым числам[2]. Значительно позже арабский математик ибн ал-Банна предложил делать перебор целых чисел не до , а до , что позволило уменьшить количество операций. Недостаток этого метода заключается в том, что вместо проверки заданного числа на простоту он предлагает последовательный перебор[3] всех целых чисел до , и поэтому является малоэффективным и требует значительных вычислительных мощностей.
В начале XIII века Леонардо Пизанский, известный как Фибоначчи, предложил последовательность чисел (названную его именем), одно из свойств которой состоит в том, что -ное число Фибоначчи может быть простым только для простых , за исключением . Это свойство может быть использовано при проверке чисел Фибоначчи на простоту. Также он независимо от ибн ал-Банна предложил метод проверки чисел на простоту перебором. Этот алгоритм является истинным (или невероятностным), поскольку ответ получается всегда, однако чрезвычайно неэффективным.
Первым, кто использовал отношения между числами для определения простоты, был Пьетро Антонио Катальди в своей работе о совершенных числах. Совершенными числами называются те, которые равны сумме своих собственных делителей. Первые семь совершенных чисел: 6, 28, 496, 8128, 33550336, 8589869056 и 137438691328. Катальди установил, что если число — простое и число — также простое, то число — совершенное.
В XVII веке французский математик Марен Мерсенн занимался исследованием чисел вида[4] , позднее названных в его честь числами Мерсенна. Мерсенн обнаружил, что из первых 257 чисел Мерсенна только 11 являются простыми (при n = 2, 3, 5, 7, 13, 17, 19, 31, 67, 127 и 257). При этом, им было сделано несколько ошибок ( не является простым при р = 67 или 257, и является при р = 61, 89 и 107). Поиск простых среди чисел Мерсенна достаточно прост благодаря тесту Люка-Лемера, позволяющему относительно быстро находить решение. Именно поэтому числа Мерсенна являются самыми большими среди ныне известных простых чисел. В переписке Мерсенна и Ферма были высказаны ещё несколько идей относительно простых чисел[4].
Так, Ферма обнаружил, что если целое число не делится нацело на простое число , то число всегда делится на (Малая теорема Ферма). Позднее теорема была обобщена Эйлером. На малой теореме Ферма основаны несколько тестов простоты. Также Ферма предположил, что простыми являются числа вида при всех натуральных . Это действительно так при . Контрпример к этому утверждению был найден Эйлером— . Для проверки чисел Ферма на простоту существует эффективный тест Пепина. На сегодняшний день ни одного нового простого числа Ферма не было найдено.
В числе других ученых вопросами простоты чисел занимались Эйлер, Лежандр, Гаусс. Значительные результаты в решении проблемы простоты были получены французским математиком Эдуардом Люка в его работах о числах Ферма и Мерсенна . Именно данный им критерий простоты чисел Мерсенна ныне известен как тест Люка-Лемера.
В 2002 году был разработан детерминированный полиномиальный тест простоты, тест Агравала — Каяла — Саксены. Его появление предсказывалось существованием полиномиальных сертификатов простоты и, как следствие, тем, что задача проверки числа на простоту принадлежала классам NP и co-NP одновременно.
Истинные и вероятностные тесты простоты
[править | править код]Существующие алгоритмы проверки числа на простоту могут быть разделены на две категории: истинные тесты простоты и вероятностные тесты простоты. Истинные тесты результатом вычислений всегда выдают факт простоты либо составности числа, вероятностный тест даёт ответ о составности числа либо его несоставности с некоторой вероятностью[2][4] . Если сказать проще, то вероятностный алгоритм говорит, что число скорее всего не является составным, однако в итоге оно может оказаться как простым, так и составным. Числа, удовлетворяющие вероятностному тесту простоты, но являющиеся составными, называются псевдопростыми[1]. Одним из примеров таких чисел являются числа Кармайкла[3]. Также можно назвать числа Эйлера-Якоби для теста Соловея-Штрассена и псевдопростые числа Люка.
Одним из примеров истинных тестов простоты является тест Люка-Лемера для чисел Мерсенна. Очевидный недостаток этого теста заключается в его применимости только к ряду чисел определённого вида. Среди других примеров можно привести основанные на малой теореме Ферма:
- Тест Пепина для чисел Ферма.
- Теорема Прота для чисел Прота.
- Тест Агравала — Каяла — Саксены, первый полиномиальный тест простоты.
- Тест Люка — Лемера — Ризеля.
А также:
- метод перебора делителей.
- Теорема Вильсона.
- Критерий Поклингтона.
- Тест Миллера.
- Тест Адлемана — Померанса — Румели, усовершенствованный[5] Коэном[англ.] и Ленстрой
- Тест простоты с использованием эллиптических кривых.
Вероятностные тесты простоты
[править | править код]К этой категории относятся:
- Тест Ферма.
- Тест Миллера — Рабина.
- Тест Соловея — Штрассена.
- Тест Бейли — Померанца — Селфриджа — Уогстаффа.
- Квадратичный тест Фробениуса.
Тесты простоты в криптографии
[править | править код]В настоящее время простые числа широко применяются в области защиты информации. Прежде всего, это вызвано изобретением метода шифрования с открытым ключом, который используется при шифровании информации и в алгоритмах электронной цифровой подписи. На данный момент по стандартам размер простых чисел, используемых при формировании цифровой подписи с использованием эллиптических кривых, составляет в соответствии с ГОСТ Р 34.10-2012 не менее 254 бит. Для столь больших чисел вопрос определения простоты числа является крайне сложным. Простые методы, такие, как метод перебора, непригодны для использования из-за того, что требуют чрезвычайно много вычислительных ресурсов и большого времени работы[6].
Также определение простоты числа необходимо при взломе информации, зашифрованной или подписанной с использованием алгоритма RSA. Для вскрытия такого сообщения необходимо уметь разлагать число на два простых сомножителя, что при больших размерах чисел является нетривиальной задачей.
С другой стороны, при генерации ключей для криптосистем с открытым ключом, схем электронной подписи и т. п. используются большие псевдослучайные простые числа. Например, при использовании протокола Диффи-Хеллмана необходимо иметь простое число, задающее конечное поле. Поэтому использование эффективного теста простоты позволяет повысить надёжность алгоритмов генерации таких ключей.
См. также
[править | править код]Примечания
[править | править код]- ↑ 1 2 Кормен Т., Лейзер Ч. Алгоритмы. Построение и анализ. — М.: МЦНМО, 2002. — С. 765—772.
- ↑ 1 2 Василенко О. Н. Теоретико-числовые алгоритмы в криптографии. — М.: МЦНМО, 2003. — 328 с.
- ↑ 1 2 Crandall R., Pomerance C. Prime Numbers: A Computational Perspective. — Springer, 2005.
- ↑ 1 2 3 Дональд Кнут. Искусство программирования, том 2. Получисленные алгоритмы. — М.: «Вильямс», 2007.
- ↑ Нестеренко Ю. В. Введение в криптографию. — Питер, 2001. — 288 с.
- ↑ Б. Шнайер. Прикладная криптография. — С. 296—300.
Литература
[править | править код]- Василенко О. Н. Глава 1. Тестирование чисел на простоту и построение больших простых чисел // Теоретико-числовые алгоритмы в криптографии. — М.: МЦНМО, 2003. — С. 12—56. — 328 с. — ISBN 5-94057-103-4. Архивная копия от 27 января 2007 на Wayback Machine
- Нестеренко Ю. В. Глава 4.6. Как проверить большое число на простоту // Введение в криптографию / Под ред. В. В. Ященко. — Питер, 2001. — 288 с. — ISBN 5-318-00443-1. Архивная копия от 25 февраля 2008 на Wayback Machine
- Шнайер Б. Часть 3. Криптографические алгоритмы. Глава 11. Математические основы. 11.5. Генерация простых чисел // Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си = Applied Cryptography. Protocols, Algorithms and Source Code in C. — М.: Триумф, 2002. — С. 296—300. — 816 с. — 3000 экз. — ISBN 5-89392-055-4.
- Кормен Т., Лейзер Ч. Глава 33.8. Проверка чисел на простоту // Алгоритмы. Построение и анализ. — М.: МЦНМО, 2002. — С. 765—772. — ISBN 5-900916-37-5.
- Crandall R., Pomerance C. Глава 3. «Recognizing Primes and Composites». Глава 4. «Primality Proving» // Prime Numbers: A Computational Perspective. — Springer, 2005. — С. 117—224. — ISBN 0-387-25282-7.
- Дональд Кнут. Глава 4.5.4. Разложение на простые множители // Искусство программирования, том 2. Получисленные алгоритмы = The Art of Computer Programming, vol. 2. Seminumerical Algorithms. — 3-е изд. — М.: «Вильямс», 2007. — С. 832. — ISBN 0-201-89684-2.
В другом языковом разделе есть более полная статья Test de primalidad (исп.). |