Факторизация целых чисел (Sgtmkjn[genx eyld] cnvyl)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Factorization.gif/342px-Factorization.gif)
Факториза́цией натурального числа называется его разложение в произведение простых множителей. Существование и единственность (с точностью до порядка следования множителей) такого разложения следует из основной теоремы арифметики.
В отличие от задачи распознавания простоты числа, факторизация предположительно является вычислительно сложной задачей. В настоящее время неизвестно, существует ли эффективный не квантовый алгоритм факторизации целых чисел. Однако доказательства того, что не существует решения этой задачи за полиномиальное время, также нет.
Предположение о том, что для больших чисел задача факторизации является вычислительно сложной, лежит в основе широко используемых алгоритмов (например, RSA). Многие области математики и информатики находят применение в решении этой задачи. Среди них: эллиптические кривые, алгебраическая теория чисел и квантовые вычисления.
История
[править | править код]Задача поиска эффективных способов разложения целых чисел на множители интересовала математиков с давних времён, особенно специалистов в области теории чисел. Существуют предположения о том, что Ферма был одним из первых, кто предложил метод разложения, заключающийся в том, чтобы представить число в виде разности квадратов , а затем, вычисляя , попытаться найти нетривиальный делитель . Данный способ позволяет находить два мало различающихся по величине делителя числа быстрее, чем простой перебор делителей[1].
Далее Лежандр обнаружил, что при таком подходе достаточно получить сравнение , и использовал для этого цепные дроби. Также Эйлером и Гауссом были предложены некоторые способы нахождения чисел, связанных этим сравнением[1].
Одним из ключевых моментов в развитии факторизации целых чисел было создание алгоритма RSA, что возобновило интерес учёных в данном направлении, так как имело практическое применение в области шифрования. Этот алгоритм был предложен в 1977 году тремя учёными Рональдом Ривестом, Ади Шамиром и Леонардом Адлеманом из Массачусетского технологического института и назван по первым буквам фамилий авторов методом RSA. Он основан на идее криптографии с открытым ключом и для взлома системы необходимо выполнить разложение числа на простые сомножители. На момент публикации алгоритма RSA были известны методы, которые позволяли факторизовать числа, состоящие не более чем из 25—30 цифр, а наиболее известным и применяемым все ещё оставался метод Ферма. Метод RSA позволяет факторизовать числа[уточнить] из 100 и более десятичных знаков. Создатели, в свою очередь, пообещали за факторизацию числа из 129 десятичных знаков символические сто долларов США[2].
![](http://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Rsa_logo.png/245px-Rsa_logo.png)
На популярность задачи факторизации также повлияла публикация в 1977 году в журнале Scientific American Мартина Гарднера «Новый алгоритм шифрования, для взлома которого потребуются миллионы лет».[3] Столь громкое название было воспринято в качестве вызова всему математическому сообществу. В результате этой гонки было предложено несколько новых и нестандартных идей факторизации[2].
Эпопея с разложением 129-значного числа завершилась в 1994 году, когда коллектив под руководством А. Ленстры, используя 1600 компьютеров, подготовил за 220 дней систему линейных уравнений, содержавшую более полумиллиона неизвестных. Решение этой системы суперкомпьютером заняло два дня. Несмотря на то, что в то время уже были известны методы решета числового поля, данный результат был получен с помощью алгоритма квадратичного решета[2].
Алгоритмы факторизации
[править | править код]Как правило, на вход таких алгоритмов подаётся число , которое необходимо факторизовать, состоящее из символов (если представлено в двоичном виде)[4]. При этом алгоритм ищет первый простой делитель, после чего, при необходимости, можно запустить алгоритм заново для дальнейшей факторизации. Также, прежде чем начинать факторизацию большого числа, следует убедиться в том, что оно не простое. Для этого достаточно пройти тест числа на простоту. Эта задача детерминированно разрешима за полиномиальное время[5].
В зависимости от сложности алгоритмы факторизации можно разбить на две группы. Первая группа — экспоненциальные алгоритмы, сложность которых экспоненциально зависит от длины входящих параметров (то есть от длины самого числа в бинарном представлении). Вторая группа — субэкспоненциальные алгоритмы.
Вопрос о существовании алгоритма факторизации с полиномиальной сложностью на классическом компьютере является одной из важных открытых проблем современной теории чисел. В то же время факторизация с полиномиальной сложностью возможна на квантовом компьютере с помощью алгоритма Шора (класс BQP)[6].
Экспоненциальные алгоритмы
[править | править код]Перебор возможных делителей
[править | править код]Сложность или .
Один из самых простых и очевидных алгоритмов факторизации, заключающийся в том, чтобы последовательно делить факторизуемое число на натуральные числа от до . Формально достаточно делить только на простые числа в этом интервале, однако, для этого необходимо знать их множество. На практике составляется таблица простых чисел и производится проверка небольших чисел (например, до ). Для очень больших чисел алгоритм не используется в силу низкой скорости работы[7].
Шаг 1. Начальная установка. Присвоить (В ходе выполнения алгоритма переменные подчинены следующим условиям: и не имеет простых множителей, меньших )
Шаг 2. Если , алгоритм заканчивается.
Шаг 3. Разделить. Присвоить (Здесь и соответственно частное и остаток от деления числа на .)
Шаг 4. Остаток равен нулю? Если , то перейти к шагу 6.
Шаг 5. Множитель найден. Увеличить на и присвоить . Возвратиться к шагу 2.
Шаг 6. Частное мало? Если , увеличить на 1 и возвратиться к шагу 3.
Шаг 7. n — простое число. Увеличить на , присвоить и завершить выполнение алгоритма.
Метод факторизации Ферма
[править | править код]Сложность или .
Идея алгоритма заключается в поиске таких чисел и , что факторизуемое число n представимо в виде: . Как и метод пробного деления, обычно не применяется на практике для факторизации больших чисел, так как имеет экспоненциальную сложность. Метод реализуем без операции деления, а только лишь с операциями сложения и вычитания[9]. Если , при условии того, что и — простые числа, не сильно различающиеся по величине, то метод Ферма факторизует n достаточно быстро[10].
Шаг 1. Начальная установка. Присвоить (Во время выполнения этого алгоритма величины x, y, r отвечают соответственно величинам в уравнении . Должно соблюдаться условие .)
Шаг 2. Выполнено? Если , то выполнение алгоритма завершается. Имеем
Шаг 3. Шаг по x. Присвоить и .
Шаг 4. Шаг по y. Присвоить и .
Шаг 5. Проверить r. Если , то возвратиться к шагу 4, иначе возвратиться к шагу 2.
ρ-алгоритм Полларда
[править | править код]Сложность .
Алгоритм Полларда является вероятностным алгоритмом, позволяющим находить делитель составного числа , работающим со сложностью, зависящей лишь от величины делителя, но не величины факторизуемого числа . Это обуславливает удобство применимости данного алгоритма в тех случаях, когда другие алгоритмы, сложность которых зависит от , становятся неэффективны[12]. Примечателен также тем, что существует вариант реализации такого алгоритма, при котором достаточно в памяти хранить всего 3 целых числа[13].
Шаг 1. Выбираем небольшое число и строим последовательность чисел определяя каждое следующее по формуле:
Шаг 2. Одновременно на каждом шаге вычисляем НОД числа и всевозможных разностей , где .
Шаг 3. Когда будет найден НОД, отличный от , вычисление заканчивается. Найденное является делителем . Если не является простым числом, то процедуру можно продолжить, взяв вместо число .
Алгоритм Ленстры
[править | править код]Сложность .
Несмотря на относительно неплохую эффективность среди экспоненциальных алгоритмов, в алгоритме Ленстры есть необходимость неоднократно вычислять квадратный корень в одном из шагов алгоритма, что является более трудоёмким, чем сложение или вычитание[15].
Пусть — натуральные числа, удовлетворяющие условиям
Шаг 1. С помощью обобщённого алгоритма Евклида найти . Найти такое, что .
Шаг 2. Для очередного значения найти числа по следующим правилам:
при :
— частное от деления на , за исключением случая, когда нечётно и остаток от деления равен нулю.
Шаг 3. Для очередного выбора найти все целые числа , удовлетворяющие условиям
,
если четное,
если нечетное.
Шаг 4. Для каждого c из шага 3 решить в целых числах систему уравнений
Если и окажутся неотрицательными целыми числами, то добавить
Шаг 5. Если , то алгоритм заканчивает работу. Иначе, возвращаемся на шаг 2 к следующему значению .
Алгоритм Полларда — Штрассена
[править | править код]Сложность .
Данный алгоритм имеет оценку сложности схожую с методом квадратичных форм Шенкса (что является наилучшей среди детерминированных алгоритмов факторизации), однако требует выделение памяти. Он может использоваться непосредственно для факторизации не очень больших целых чисел, а также в качестве вспомогательного алгоритма в субэкспоненциальном методе Диксона[17] и для ускорения вычислений второго этапа метода факторизации с помощью эллиптических кривых.[18]
Теорема. Пусть . Тогда для любого натурального числа наименьший простой делитель числа может быть найден за арифметических операций.
Алгоритм. Положим . Далее с помощью алгоритма теоремы найдём наименьший простой делитель числа . Поскольку делится на наименьший простой делитель числа , то алгоритм выдаст именно это число .
Метод квадратичных форм Шенкса
[править | править код]Гарантированная сложность и при верности гипотезы Римана .
В отличие от алгоритма Полларда - Штрассена не требует выделения больших объёмов памяти, к тому же имеет достаточно простые расчётные формулы[19].
P-1 алгоритм Полларда
[править | править код]Сложность [20].
Несмотря на экспоненциальную оценку сложности, алгоритм во всех случаях быстро находит небольшие простые делители , потому что они являются степенно-гладкими для небольшой границы гладкости . В практических задачах данный алгоритм обычно используется до применения субэкспоненциальных алгоритмов факторизации, чтобы отделить небольшие простые делители числа [20].
Метод Лемана
[править | править код]Сложность .
В настоящее время алгоритм представляет скорее исторический, чем практический интерес, так как этот алгоритм был первым детерминированным алгоритмом со сложностью выполнения быстрее, чем .
Шаг 1. Для всех от до выполнять:
Если , то вернуть в качестве делителя числа m и завершить алгоритм.
Шаг 2. Для всех от до выполнять:
- Шаг 2.1 Определить и
- Шаг 2.2 Определить и
- Шаг 2.3 Если является полным квадратом, то определить и завершить алгоритм.
- Шаг 2.4 Определить .
- Шаг 2.5 Если , то вычислить новое значение , в противном случае вернуться на шаг 2.2
Шаг 3. Запустить алгоритм с уведомлением, что факторизуемое число — простое.
Субэкспоненциальные алгоритмы
[править | править код]Для обозначения сложности принята L-нотация[4]:
где — число подлежащее факторизации, и — некоторые константы.
Алгоритм Диксона
[править | править код]Сложность .
Шаг 1. Выбрать случайное , и вычислить .
Шаг 2. Пробными делениями попытаться разложить на простые множители из факторной базы.
Шаг 3. Если является -числом, т.е.Шаг 4. Найти (например, решая с помощью алгоритма последовательного исключения неизвестных Гаусса однородную систему линейных уравнений относительно неизвестных ) соотношение линейной зависимости
Положить
Шаг 5. Проверить . Если это так, то повторить процедуру генерации. Если нет, то найдено нетривиальное разложение
Факторизация методом непрерывных дробей
[править | править код]Сложность [26].
Метод квадратичного решета
[править | править код]Сложность [26].
Данный метод с использованием нескольких многочленов эффективен и достаточно легко реализуем на компьютере. Есть основания полагать, что он является наилучшим из известных алгоритмов факторизации для (не считая метод факторизации с помощью эллиптических кривых, который в некоторых случаях может работать быстрее. Для чисел алгоритмы решета числового поля сработают быстрее, чем метод квадратичного решета[27].
Факторизация Ленстры с помощью эллиптических кривых
[править | править код]Сложность , где — наименьшее простое, которое делит [28].
Параметры выбираются случайно. Значения следует выбирать эмпирически, рассмотрев некоторую серию возрастающих значений[28]. На практике при заданных алгоритм заключается в том, чтобы выполнить алгоритм с одной кривой. Это повторяется до тех пор, пока не разложится на множители или пока время, отведённое для алгоритма, не закончится.
Существуют модификации алгоритма, позволяющие работать с несколькими кривыми одновременно[28].
На вход алгоритма поступает число , которое необходимо факторизовать, параметры , зависящие от , кроме того, задаются такие, что и для выполнено условие . Алгоритм находит натуральный делитель числа .
Для каждого , полагается
А также
Пусть . Тогда лежит на эллиптической кривой над , определённой уравнением . Необходимо вычислить точку по правилам арифметики над эллиптическими кривыми. Если в ходе вычисления найден делитель числа , то разложилось на множители. Если найден , а делитель не найден, то алгоритм завершает работу и выдаёт сообщение о неудачной попытке факторизации.
Решето числового поля
[править | править код]В настоящее время самыми эффективными алгоритмами факторизации являются вариации решета числового поля[29]:
- Специальный метод решета числового поля со сложностью [30] (метод применим для факторизации чисел только специального вида);
- Общий метод решета числового поля со сложностью [30] (метод применим ко всем числам).
Применение в криптографии
[править | править код]Предполагаемая большая вычислительная сложность задачи факторизации лежит в основе криптостойкости некоторых алгоритмов шифрования с открытым ключом, таких как RSA. Более того, если известен хотя бы один из параметров ключей RSA, то система взламывается однозначно, кроме того, существует множество алгоритмов восстановления всех ключей в системе, обладая какими-то данными[31].
Текущее состояние
[править | править код]В марте 1994 года с помощью двойной вариации множественного полиномиального QS командой математиков под руководством Ленстры было разложено на множители 129-разрядное (428-битовое) число. Вычисления выполнялись добровольцами в Интернете — в течение восьми месяцев трудились 600 человек и 1600 компьютеров. Компьютеры соединялись по электронной почте, передавая свои результаты в центральное хранилище, где выполнялся окончательный анализ. В этих вычислениях использовались QS и теория пятилетней давности, NFS мог бы ускорить выполнение расчётов. Группа учёных сделала вывод о том, что широко используемые 512-битовые модули RSA могут быть вскрыты организацией, готовой потратить несколько миллионов долларов и подождать несколько месяцев[32].
С целью развития искусства разложения на множители RSA Data Security, Inc. в марте 1991 года объявило о программе RSA Factoring Challenge (состязание RSA по разложению на множители). Состязание состоит в разложении на множители ряда трудных чисел, каждое из которых является произведением двух простых чисел примерно одинакового размера. Каждое простое число было выбрано конгруэнтным 2 по модулю 3. Всего было предложено 42 числа, по одному в диапазоне от 100 до 500 разрядов с шагом в 10 разрядов (плюс одно дополнительное, 129-разрядное число. Подробнее: RSA Factoring Challenge[англ.][32].
Примечания
[править | править код]- ↑ 1 2 Ященко, 1999, с. 107.
- ↑ 1 2 3 Ишмухаметов, 2011, с. 7—8.
- ↑ Gardner M. A New Kind of Cipher that Would Take Millions of Years to Break (англ.) // Scientific American — New York City: NPG, 1977. — Vol. 237, Iss. 2. — P. 120—124. — 5 p. — ISSN 0036-8733; 1946-7087 — doi:10.1038/SCIENTIFICAMERICAN0877-120
- ↑ 1 2 Василенко, 2003, с. 9.
- ↑ Василенко, 2003, с. 48.
- ↑ Ишмухаметов, 2011, с. 52.
- ↑ Нестеренко, 2012, с. 142—143.
- ↑ Кнут, 2007, с. 424.
- ↑ Ишмухаметов, 2011, с. 52—54.
- ↑ Василенко, 2003, с. 57.
- ↑ Кнут, 2007, с. 431.
- ↑ Ишмухаметов, 2011, с. 64.
- ↑ Ишмухаметов, 2011, с. 63.
- ↑ Ишмухаметов, 2011, с. 62.
- ↑ 1 2 Василенко, 2003, с. 73.
- ↑ Василенко, 2003, с. 69.
- ↑ Василенко, 2003, с. 73—74.
- ↑ 20 Years of ECM.
- ↑ JASON E. GOWER AND SAMUEL S. WAGSTAFF, JR. SQUARE FORM FACTORIZATION // MATHEMATICS OF COMPUTATION. Архивировано 24 августа 2017 года.
- ↑ 1 2 Василенко, 2003, с. 62.
- ↑ Ишмухаметов, 2011, с. 57.
- ↑ Ишмухаметов, 2011, с. 55.
- ↑ Ишмухаметов, 2011, с. 56.
- ↑ Нестеренко, 2012, с. 151.
- ↑ Черемушкин, 2002, с. 78.
- ↑ 1 2 Василенко, 2003, с. 87.
- ↑ Василенко, 2003, с. 92.
- ↑ 1 2 3 4 Василенко, 2003, с. 113.
- ↑ Шнайер, 2002, 11.4.
- ↑ 1 2 Василенко, 2003, с. 93.
- ↑ Черемушкин, 2002, с. 87.
- ↑ 1 2 Шнайер, 2002, par.11.4.
Литература
[править | править код]- на русском языке
- Коблиц Н. Курс теории чисел и криптографии — 2-е издание — М.: Научное издательство ТВП, 2001. — 254 с. — ISBN 978-5-85484-014-9, 978-5-85484-012-5
- Черемушкин А. В. Лекции по арифметическим алгоритмам в криптографии — М.: МЦНМО, 2002. — 104 с. — ISBN 978-5-94057-060-8
- Василенко О. Н. Теоретико-числовые алгоритмы в криптографии — М.: МЦНМО, 2003. — 328 с. — ISBN 978-5-94057-103-2
- Ишмухаметов Ш. Т. Методы факторизации натуральных чисел: учебное пособие — Казань: Казанский университет, 2011. — 190 с.
- Нестеренко А. Ю. Теоретико-числовые методы в криптографии — М.: Московский государственный институт электроники и математики, 2012. — 224 с. — ISBN 978-5-94506-320-4
- Кнут, Д. Искусство программирования = The Art of Computer Programming. — Москва: Вильямс, 2007. — Т. 2. — 832 с. — ISBN 978-5-8459-0081-4.
- Введение в криптографию / Ященко, В. В.. — Москва: МЦНМО, 1999. — 272 с. — ISBN 5-900916-40-5.
- Шнайер, Б. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си = Applied Cryptography. Protocols, Algorithms and Source Code in C. — Москва: Триумф, 2002. — 816 с. — 3000 экз. — ISBN 5-89392-055-4.
- на английском языке
- Bressoud, D. M. Factorization and Primality Testing. — N. Y.: Springer-Verlag, 1989. — 260 p. — ISBN 0-387-97040-1.
- Mahoney, M. S. The Mathematical Career of Pierre de Fermat. — 2. — Princeton: Princeton Univercity Press, 1994. — P. 324—332. — 438 p. — ISBN 0-691-03666-7.
Эта статья входит в число добротных статей русскоязычного раздела Википедии. |