В начале XVII века во Франции математические идеи начали активно распространяться между учёными посредством переписки. В 1638 году к кругу переписывающихся учёных присоединился Пьер Ферма. Переписка была удобным способом общения, так как Ферма жил в Тулузе, а многие его знакомые учёные жили в Париже. Одним из таких учёных был Марен Мерсенн, занимавшийся распространением писем, пересылкой и связью многих учёных между собой. 26 декабря 1638 года в письме МерсеннуФерма упомянул, что нашёл метод, с помощью которого можно находить делители положительных чисел, но какие-либо подробности и описание метода он опустил. На тот момент Мерсенн также вёл переписку с французским математиком Бернаром Френиклем де Бесси, занимавшимся, как и Ферма, теорией чисел, в частности, делителяминатуральных чисел и совершенными числами. В начале 1640 года, узнав о том, что Ферма получил метод нахождения делителей, Френикль пишет Мерсенну, и тот пересылает письмо Ферма. Мерсенн долгое время был связующим звеном между двумя математиками в их переписке. Именно в письмах Френиклю Ферма смог доказать корректность метода факторизации, а также впервые сформулировать и обосновать основные положения теоремы, которая позже была названа малой теоремой Ферма[1][2].
Обоснование
Метод Ферма основан на теореме о представлении числа в виде разности двух квадратов:
Если нечётно, то существует взаимно однозначное соответствие между разложением на множители и представлением в виде разности квадратов с , задаваемое формулами
Доказательство
Если задана факторизация , то имеет место соотношение: . Таким образом получается представление в виде разности двух квадратов.
Обратно, если дано, что , то правую часть можно разложить на множители: [3].
Описание алгоритма
Для разложения на множители нечётного числа ищется пара чисел таких, что , или . При этом числа и являются делителями , возможно, тривиальными (то есть одно из них равно 1, а другое — ).
В нетривиальном случае равенство равносильно , то есть тому, что является квадратом.
Поиск квадрата такого вида начинается с — наименьшего числа, при котором разность неотрицательна.
Для каждого значения начиная с , вычисляют и проверяют, не является ли это число точным квадратом. Если не является, то увеличивают на единицу и переходят на следующую итерацию.
Если является точным квадратом, то есть то получено разложение:
в котором
Если оно является тривиальным и единственным, то — простое.
На практике значение выражения на -м шаге вычисляется с учётом значения на -м шаге:
где
Примеры
Пример с малым числом итераций
Возьмём число . Вычислим Для будем вычислять значения функции . Для дальнейшей простоты построим таблицу, которая будет содержать значения и на каждом шаге итерации. Получим:
1
363
19,052
2
576
24
Как видно из таблицы, уже на втором шаге итерации было получено целое значение .
Таким образом имеет место следующее выражение: . Отсюда следует, что
Пример с большим числом итераций
Пусть Тогда или
77
52374
228,854
78
53129
230,497
79
53886
232,134
80
54645
233,763
81
55406
235,385
82
56169
237
Данное разложение является не конечным, так как, очевидно, что число не является простым:
В итоге, конечное разложение исходного числа на произведение простых множителей
Оценка производительности
Наибольшая эффективность расчёта методом факторизации Ферма достигается в случае, когда множители числа примерно равны между собой. Это обеспечивает относительно короткий поиск последовательности[4]
В наихудшем варианте, когда, к примеру, близко к а близко к 1, алгоритм Ферма работает хуже по сравнению с методом перебора делителей. Число итераций для данного случая
то есть, очевидно, что оно имеет порядок
Метод факторизации Ферма будет работать не хуже метода перебора делителей, если отсюда можно получить оценку для большего делителя Следовательно, метод Ферма имеет экспоненциальную оценку и, как метод пробного деления, не подходит для разложения больших чисел. Можно повысить эффективность, если выполнить сначала пробное деление числа на числа от 2 до некоторой константы B, а затем выполнить поиск делителей методом Ферма. Такой подход помогает избавиться от малых делителей числа [5].
Оптимизация методом перебора делителей
Предположим, что мы пытаемся разложить на множители число n = 2345678917 методом Ферма, но кроме b вычисляем также и a − b. Начиная с , можно записать:
a
48 433
48 434
48 435
48 436
b2
76 572
173 439
270 308
367 179
b
276,7
416,5
519,9
605,9
a − b
48 156,3
48 017,5
47 915,1
47 830,1
Если бы теперь для разложения числа стали использовать метод перебора делителей, то имело бы смысл проверять делители только до 47 830, а не до 48 432, так как если бы существовал делитель больше, то он был бы найден методом Ферма. Итак, всего за четыре этапа методом Ферма были проверены все делители от 47 830 до 48 432.
Таким образом, можно комбинировать метод Ферма с методом перебора делителей. Достаточно выбрать число и использовать метод Ферма для проверки делителей между и , а оставшиеся делители можно проверить методом перебора делителей, причём проверять делители нужно только до числа [6].
В примере выше, когда , делители необходимо перебирать до числа 47830. Также, к примеру, можно выбрать число , дающее границу 28937.
Комбинация методов хороша, так как при достаточной разнице между делителями числа метод перебора делителей эффективнее метода Ферма[5]. Это иллюстрирует следующий пример:
a
60 001
60 002
b2
1 254 441 084
1 254 561 087
b
35 418,1
35 419,8
a − b
24 582,9
24 582,2
Метод решета
При поиске квадрата натурального числа в последовательности чисел можно не вычислять квадратный корень из каждого значения этой последовательности, и даже не проверять все возможные значения для a. Для примера рассмотрим число :
a
48 433
48 434
48 435
48 436
b2
76 572
173 439
270 308
367 179
b
276,7
416,5
519,9
605,9
Можно сразу, не вычисляя квадратного корня, сказать, что ни одно из значений в таблице не является квадратом. Достаточно, например, воспользоваться тем, что все квадраты натуральных чисел, взятые по модулю 20, равны одному из следующих значений: 0, 1, 4, 5, 9, 16. Эти значения повторяются при каждом увеличении a на 10. В примере по модулю 20, поэтому отнимая 17 (или добавляя 3), получаем, что число по модулю 20 равно одному из следующих: 3, 4, 7, 8, 12, 19. Но так как — натуральное число, то отсюда получаем, что по модулю 20 может быть равно только 4. Следовательно, по модулю 20 и или по модулю 10. Таким образом, можно проверять корень выражения не для всех , а только для тех, которые оканчиваются на 1 или 9[6].
Аналогично в качестве модуля можно использовать любые степени различных простых чисел. Например, взяв то же число , находим
По модулю 16:
Квадраты равны
0, 1, 4 или 9
n mod 16 равно
5
следовательно, равно
9
и a равно
3, 5, 11 или 13 по модулю 16
По модулю 9:
Квадраты равны
0, 1, 4, или 7
n mod 9 равно
7
следовательно, равно
7
и a равно
4 или 5 по модулю 9
Оптимизация множителем
Метод Ферма хорошо работает в случае, когда у числа есть множитель, приблизительно равный квадратному корню из [5].
Если известно примерное соотношение между множителями числа , то можно выбрать рациональное число , приблизительно равное этому соотношению. Тогда можно записать следующее равенство: , где множители и близки в силу сделанных предположений. Поэтому применив метод Ферма для разложения числа , их можно быстро найти. Далее для нахождения и можно использовать равенства и (в случае, если не делится на и не делится на ).
В общем случае, когда соотношение между множителями не известно, можно попытаться использовать разные соотношения , и пробовать разложить получившееся в результате число . Алгоритм, основанный на данном методе, был впервые предложен американским математиком Шерманом Леманом в 1974 году[7] и называется метод Лемана. Алгоритм детерминированно раскладывает данное натуральное число на множители за арифметических операций[8], однако в настоящее время представляет только исторический интерес и на практике почти не используется[9].
Метод Крайчика — Ферма
Обобщение метода Ферма было предложено Морисом Крайчиком[англ.] в 1926 году. Он предложил рассматривать вместо пар чисел которые удовлетворяют соотношению искать пары чисел, удовлетворяющих более общему сравнению Такое сравнение можно найти, перемножив несколько сравнений вида , где — небольшие числа, произведения которых будет квадратом. Для этого можно рассмотреть пары чисел , где — целый числа чуть больше , а . Крайчик заметил, что многие из полученных таким образом чисел раскладываются на небольшие простые множители, то есть числа являются гладкими[10].
С помощью метода Крайчика — Ферма разложим число Число является первым, чей квадрат больше числа :
Вычислим значение функции для всех Мы получим
По методу Ферма, нужно было бы продолжать вычисления пока не был бы найден квадрат какого-либо числа. По методу Крайчика — Ферма далее нужно последовательно искать такие , для которых Тогда
Из алгоритма Крайчика — Ферма следует, что все полученные числа можно легко факторизовать.
Действительно:
Очевидно, что произведение полученных четырёх чисел будет квадратом: Тогда теперь можно вычислить
Алгоритм Диксона основан на понятии о факторных базах и является обобщением алгоритма факторизации Ферма. В алгоритме вместо пар чисел, удовлетворяющих уравнению ищутся пары чисел, удовлетворяющих более общему уравнению , для решения которого Крайчиком было замечено несколько полезных фактов. Вычислительная сложность алгоритма[17]
где
Другие улучшения
Идея метода факторизации Ферма лежит в основе одних из самых быстрых алгоритмов для факторизации больших полупростых чисел — методе квадратичного решета и общем методе решета числового поля. Основное отличие метода квадратичного решета от метода Ферма заключается в том, что вместо поиска квадрата в последовательности находятся пары таких чисел, чьи квадраты равны по модулю (каждая из этих пар может являться разложением числа ). Затем уже среди найденных пар чисел ищется та пара, которая и является разложением числа .[18]
Развитием метода факторизации Ферма является метод квадратичных форм Шенкса (также известен как SQUFOF), основанный на применении квадратичных форм. Интересно то, что для 32-разрядных компьютеров алгоритмы, основанные на данном методе, являются безусловными лидерами среди алгоритмов факторизации для чисел от до [19].
Применение
Алгоритм факторизации Ферма может быть применён для криптоанализа RSA. Если простые числа , произведение которых равно , близки друг другу, то они могут быть найдены методом факторизации Ферма. После чего можно найти секретную экспоненту , взломав таким образом RSA[20][21]. На момент опубликования алгоритма RSA было известно лишь небольшое количество алгоритмов факторизации, самым известным из которых являлся метод Ферма.
Интересные факты
Известный английский экономист и логист У. С. Джевонс сделал в своей книге «Принципы науки» (англ.The Principles of Science, 1874 год) следующее предположение[22]:
По данным двум числам можно найти их произведение простым и надёжным способом, но совсем другое дело, когда для большого числа необходимо найти его множители. Можно ли сказать, какие два числа перемножены, чтобы получилось число 8 616 460 799? Я думаю, что вряд ли кто-либо кроме меня знает это.
Интересно то, что указанное Джевонсом число может быть разложено вручную методом Ферма с применением метода решета примерно за 10 минут. Действительно, . Используя метод решета, можно быстро прийти к соотношению
Таким образом разложение на простые множители имеет вид .
Основная же мысль Джевонса о сложности разложения чисел на простые множители по сравнению с их перемножением справедлива, но только в том случае, когда речь идёт о произведении чисел, не настолько близких друг к другу[23].
↑Pierre de Fermat; Paul Tannery; Charles Henry; Apollonius, of Perga.; Jacques de Billy.2 // Œuvres de Fermat. — Paris: Gauthier-Villars et fils, 1894.
Дональд Кнут. Искусство программирования, том 2. Получисленные методы = The Art of Computer Programming, vol.2. Seminumerical Algorithms. — 3-е изд. — М.: «Вильямс», 2007. — 832 с. — ISBN 5-8459-0081-6.