Прошу помочь людей, имевших дело с этим методом. Сразу оговорюсь, что он у меня работает, числа раскладывает, но я не понимаю, адекватно ли происходящее в процессе.
В алгоритме Бриллхарта-Моррисона получение пар A, Q для которых выполняется
происходит через разложение в цепную дробь числа
. Мало знакомый с цепными дробями, я долго искал подробный алгоритм генерации. В результате наткнулся на оригинальную работу Померанса -
Implementation of the continued fraction integer factoring algorithm, где на 4ой странице есть подробное описание следующего вида:
В общем я реализовал эту последовательность, но почему-то пары генерируются через шаг.
Тоесть не для каждого шага получается пара, а для каждых двух соседних шагов.
Чтобы объяснить понятнее, даю отрывок из файла с парами:
N = 3217104339627144632956527751747 (102 bits)
An^2 mod N =
1522905984030422 # Qn = 2064351653568051
An^2 mod N = 3217104339627143550065188676488 # Qn =
1522905984030422An^2 mod N =
2200073224775814 # Qn = 1082891339075259
An^2 mod N = 3217104339627143922939355674480 # Qn =
2200073224775814An^2 mod N =
1131588038634766 # Qn = 710017172077267
An^2 mod N = 3217104339627142234911540524884 # Qn =
1131588038634766В результате я, конечно, просто отбираю пары по диагонали и всё работает. Но я не могу понять:
так должно быть или я накосячил в реализации последовательности? Если второе, то после исправления количество шагов станет вдвое меньше.