Прошу помочь людей, имевших дело с этим методом. Сразу оговорюсь, что он у меня работает, числа раскладывает, но я не понимаю, адекватно ли происходящее в процессе.
В алгоритме Бриллхарта-Моррисона получение пар A, Q для которых выполняется
![$Q = A^2 mod N$ $Q = A^2 mod N$](https://dxdy-02.korotkov.co.uk/f/5/7/c/57c90ad95f73b2c323a18b9a4ea3787482.png)
происходит через разложение в цепную дробь числа
![$\sqrt N$ $\sqrt N$](https://dxdy-02.korotkov.co.uk/f/9/3/b/93bae80aec1828734687ff45296d800982.png)
. Мало знакомый с цепными дробями, я долго искал подробный алгоритм генерации. В результате наткнулся на оригинальную работу Померанса -
Implementation of the continued fraction integer factoring algorithm, где на 4ой странице есть подробное описание следующего вида:
![$Q_n = Q_{n-2} + q_{n-1}*(r_{n-1} - r_{n-2})$ $Q_n = Q_{n-2} + q_{n-1}*(r_{n-1} - r_{n-2})$](https://dxdy-02.korotkov.co.uk/f/9/c/a/9ca7a97d0af081b677667fa8b27642f182.png)
![$G_n = 2*g - r_{n-1}$ $G_n = 2*g - r_{n-1}$](https://dxdy-02.korotkov.co.uk/f/1/8/e/18e461c8abaa11f62b183b481d915d6b82.png)
![$q_n = [G_n/Q_n]$ $q_n = [G_n/Q_n]$](https://dxdy-03.korotkov.co.uk/f/6/3/1/631fd6f82c4991bbb91559bce77c6bf782.png)
![$r_n = G(n) - q(n)*Q(n)$ $r_n = G(n) - q(n)*Q(n)$](https://dxdy-02.korotkov.co.uk/f/5/b/c/5bc566b27832f587cf8ab24256d26b8882.png)
![$A_n = (q_n*A_{n-1} + A_{n-2}) mod N$ $A_n = (q_n*A_{n-1} + A_{n-2}) mod N$](https://dxdy-03.korotkov.co.uk/f/a/5/8/a584ab91e4a68972b5fe2cef4573681182.png)
![$g = \sqrt N$ $g = \sqrt N$](https://dxdy-01.korotkov.co.uk/f/4/8/c/48c288562a0d08588c5d210181c4770382.png)
![$Q_{-1} = N$ $Q_{-1} = N$](https://dxdy-04.korotkov.co.uk/f/b/f/3/bf3fa816b228b8bf1df69221091442c182.png)
![$Q_0 = 1$ $Q_0 = 1$](https://dxdy-02.korotkov.co.uk/f/d/1/a/d1ae0b909e951ac142f91949591838be82.png)
![$q_0 = g$ $q_0 = g$](https://dxdy-03.korotkov.co.uk/f/a/5/0/a5011f4ecae7f7d876c4a2f0beca9c7182.png)
![$r_{-1} = g$ $r_{-1} = g$](https://dxdy-03.korotkov.co.uk/f/a/2/5/a250c3bcacc2cc7e688f96fd219f940f82.png)
![$r_0 = 0$ $r_0 = 0$](https://dxdy-03.korotkov.co.uk/f/e/d/4/ed415ec13a0212c16c33dbd0b88b749982.png)
![$A_{-1} = 1$ $A_{-1} = 1$](https://dxdy-04.korotkov.co.uk/f/f/e/2/fe289497c88d04e198304607460fa71c82.png)
В общем я реализовал эту последовательность, но почему-то пары генерируются через шаг.
Тоесть не для каждого шага получается пара, а для каждых двух соседних шагов.
Чтобы объяснить понятнее, даю отрывок из файла с парами:
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В результате я, конечно, просто отбираю пары по диагонали и всё работает. Но я не могу понять:
так должно быть или я накосячил в реализации последовательности? Если второе, то после исправления количество шагов станет вдвое меньше.