Dmitriy40, спасибо! Метод факторизации Ферма — это как раз то, про что я спрашивал. Кроме того, так или иначе он является прародителем большинства (если не всех) современных методов быстрой факторизации.
Если я правильно понял, метод Ферма заключается в следующем. Имеется
нечётное число
, являющееся произведение двух неизвестных сомножителей
a и
b. Чтобы их найти мы пытаемся представить это число в виде разности квадратов
двух целых чисел, чтобы воспользоваться формулой разности квадратов. Для этого мы берём в качестве
x число
и все следующие за ним (
,
), поставляем в формулу и находим
y, до тех пор, пока
y не окажется целым числом.
Я тут поковырялся с формулами, и мне кажется их удобно привести к такому виду:
На каждой итерации приходится вычислять квадратный корень, но если искомые сомножители близки, то этих итераций будет, как показывает практика, очень мало.
Далее, меня заинтересовало, на каком приблизительно
k закончится поиск в зависимости от величины
N. Получились такие выкладки:
Эта формула для
точная. Однако, сомножители заранее неизвестны, поэтому приходится перебирать все возможные значения от нуля. Видно, так же, что если сомножители близки, то перебирать придётся значительно меньше вариантов. Чтобы понять на столько меньше положим, что
. Тогда:
Но что мне показалось особенно забавным в методе Ферма, так это
оптимизация множителем! Если
сильно отличается от единицы, но его приблизительное значение известно, то можно подобрать такие два числа
c и
d, чтобы
. Тогда домножив факторизуемое число
N на произведение этих новых чисел получим:
, где
. Разложение нового числа на новые множители за счёт их близости произойдёт гораздо быстрее, несмотря на его большую величину нового факторизуемого числа.
Например, если известно, что
(при этом
), то за счёт умножения исходного числа на
получим
и
, то есть ускорение в 20 раз. Сложность алгоритма, правда, остаётся всё той же:
.
Если б только был волшебный способ оценить
по
N не находя
a и
b!