Приведите пример целочисленного уравнения вида x^2 - Dy^2 = 1 (пелевскоe) для некоторого D, для которого решение имеет нетривиальные свойства, опишите метод нахождения бесконечной последовательности решений и исследуйте, как меняется сложность при различном D
Пример. Возьмём D=61D=61D=61. Ненулевое (фундаментальное) решение известное и «необычно большое»: x1=1766319049,y1=226153980,
x_1=1766319049,\qquad y_1=226153980, x1=1766319049,y1=226153980,
потому что 17663190492−61⋅2261539802=1.
1766319049^2-61\cdot 226153980^2=1. 17663190492−61⋅2261539802=1. Метод нахождения бесконечной последовательности решений (кратко и формально). 1) Нахождение фундаментального решения через цепную дробь корня. Разложите D\sqrt{D}D в периодическую непрерывную цепную дробь D=[a0;(a1,a2,…,ak)],
\sqrt{D}=[a_0;(a_1,a_2,\dots,a_k)], D=[a0;(a1,a2,…,ak)],
где kkk — длина периода. Пусть pn/qnp_n/q_npn/qn — n-ая приближённая дробь (сходящаяся). Тогда фундаментальное решение (x1,y1)(x_1,y_1)(x1,y1) даётся так: - если kkk чётно, то (x1,y1)=(pk−1,qk−1)(x_1,y_1)=(p_{k-1},q_{k-1})(x1,y1)=(pk−1,qk−1); - если kkk нечётно, то (x1,y1)=(p2k−1,q2k−1)(x_1,y_1)=(p_{2k-1},q_{2k-1})(x1,y1)=(p2k−1,q2k−1). (Идея: продолжение периода один или два раза даёт подходящую приближающую дробь, которая удовлетворяет уравнению.) 2) Генерация всех решений. Если найдено фундаментальное решение x1+y1Dx_1+y_1\sqrt{D}x1+y1D, то все положительные целые решения получаются степенями этого юнита в поле Q(D)\mathbb{Q}(\sqrt{D})Q(D): xn+ynD=(x1+y1D)n,n=1,2,3,…
x_n+y_n\sqrt{D}=(x_1+y_1\sqrt{D})^n,\qquad n=1,2,3,\dots xn+ynD=(x1+y1D)n,n=1,2,3,…
Эквивалентно рекуррентно: xn+1=x1xn+D y1yn,yn+1=x1yn+y1xn,
x_{n+1}=x_1x_n+D\,y_1y_n,\qquad y_{n+1}=x_1y_n+y_1x_n, xn+1=x1xn+Dy1yn,yn+1=x1yn+y1xn,
или через матрицу (xnDynynxn)=(x1Dy1y1x1)n.
\begin{pmatrix}x_n & D y_n\\[4pt] y_n & x_n\end{pmatrix} = \begin{pmatrix}x_1 & D y_1\\[4pt] y_1 & x_1\end{pmatrix}^n. (xnynDynxn)=(x1y1Dy1x1)n. Как меняется сложность при различном DDD (кратко). - Ключевой параметр — длина периода kkk цепной дроби D\sqrt{D}D и величина фундаментального юнита x1+y1Dx_1+y_1\sqrt{D}x1+y1D. Если kkk маленькое, то обычно x1,y1x_1,y_1x1,y1 небольшие (напр., D=2D=2D=2: (x1,y1)=(3,2)(x_1,y_1)=(3,2)(x1,y1)=(3,2); D=3D=3D=3: (2,1)(2,1)(2,1); D=5D=5D=5: (9,4)(9,4)(9,4)). Если kkk большое (или нечётное и требует удвоения периода), то x1,y1x_1,y_1x1,y1 могут быть очень большими — как в примере D=61D=61D=61. - Вычислительная стоимость: получение цепной дроби до периода требует порядка O(k)O(k)O(k) шагов, но числа в шаге растут до размера порядка числа цифр x1x_1x1. Поэтому реальная сложность определяется (i) длиной периода kkk и (ii) стоимостью операций с большими целыми числами (умножение/деление больших целых). При простых алгоритмах время примерно пропорционально kkk умножённому на стоимость арифметики с числом длины NNN (где NNN — число десятичных цифр x1x_1x1). - Поведение «в худшем случае»: для некоторых DDD фундаментальное решение экспоненциально велико по отношению к D\sqrt{D}D (существуют примеры с очень большими x1x_1x1), поэтому вычисления становятся тяжёлыми. Нет простого формулы для размера x1x_1x1 в терминах DDD; поведение весьма вариативно и связано с арифметикой квадратичного поля (регулятор, класс-группа). - Практические ускорения: быстрое целочисленное умножение, алгоритмы для цепных дробей квадратичных иррациональностей, использование модульных и блоковых методов, методы в теории идеалов в Q(D)\mathbb{Q}(\sqrt{D})Q(D) — всё это существенно снижает время на большие DDD. Короткое резюме: метод — вычислить периодическую цепную дробь D\sqrt{D}D, взять соответствующую сходящуюся дробь как фундаментальное решение, затем возводить в степени для получения всех решений. Сложность сильно зависит от длины периода и от величины фундаментального решения; для некоторых DDD (например, 616161) фундаментальное решение чрезвычайно велико, что делает вычисления ресурсоёмкими.
x1=1766319049,y1=226153980, x_1=1766319049,\qquad y_1=226153980,
x1 =1766319049,y1 =226153980, потому что
17663190492−61⋅2261539802=1. 1766319049^2-61\cdot 226153980^2=1.
17663190492−61⋅2261539802=1.
Метод нахождения бесконечной последовательности решений (кратко и формально).
1) Нахождение фундаментального решения через цепную дробь корня. Разложите D\sqrt{D}D в периодическую непрерывную цепную дробь
D=[a0;(a1,a2,…,ak)], \sqrt{D}=[a_0;(a_1,a_2,\dots,a_k)],
D =[a0 ;(a1 ,a2 ,…,ak )], где kkk — длина периода. Пусть pn/qnp_n/q_npn /qn — n-ая приближённая дробь (сходящаяся). Тогда фундаментальное решение (x1,y1)(x_1,y_1)(x1 ,y1 ) даётся так:
- если kkk чётно, то (x1,y1)=(pk−1,qk−1)(x_1,y_1)=(p_{k-1},q_{k-1})(x1 ,y1 )=(pk−1 ,qk−1 );
- если kkk нечётно, то (x1,y1)=(p2k−1,q2k−1)(x_1,y_1)=(p_{2k-1},q_{2k-1})(x1 ,y1 )=(p2k−1 ,q2k−1 ).
(Идея: продолжение периода один или два раза даёт подходящую приближающую дробь, которая удовлетворяет уравнению.)
2) Генерация всех решений. Если найдено фундаментальное решение x1+y1Dx_1+y_1\sqrt{D}x1 +y1 D , то все положительные целые решения получаются степенями этого юнита в поле Q(D)\mathbb{Q}(\sqrt{D})Q(D ):
xn+ynD=(x1+y1D)n,n=1,2,3,… x_n+y_n\sqrt{D}=(x_1+y_1\sqrt{D})^n,\qquad n=1,2,3,\dots
xn +yn D =(x1 +y1 D )n,n=1,2,3,… Эквивалентно рекуррентно:
xn+1=x1xn+D y1yn,yn+1=x1yn+y1xn, x_{n+1}=x_1x_n+D\,y_1y_n,\qquad y_{n+1}=x_1y_n+y_1x_n,
xn+1 =x1 xn +Dy1 yn ,yn+1 =x1 yn +y1 xn , или через матрицу
(xnDynynxn)=(x1Dy1y1x1)n. \begin{pmatrix}x_n & D y_n\\[4pt] y_n & x_n\end{pmatrix}
=
\begin{pmatrix}x_1 & D y_1\\[4pt] y_1 & x_1\end{pmatrix}^n.
(xn yn Dyn xn )=(x1 y1 Dy1 x1 )n.
Как меняется сложность при различном DDD (кратко).
- Ключевой параметр — длина периода kkk цепной дроби D\sqrt{D}D и величина фундаментального юнита x1+y1Dx_1+y_1\sqrt{D}x1 +y1 D . Если kkk маленькое, то обычно x1,y1x_1,y_1x1 ,y1 небольшие (напр., D=2D=2D=2: (x1,y1)=(3,2)(x_1,y_1)=(3,2)(x1 ,y1 )=(3,2); D=3D=3D=3: (2,1)(2,1)(2,1); D=5D=5D=5: (9,4)(9,4)(9,4)). Если kkk большое (или нечётное и требует удвоения периода), то x1,y1x_1,y_1x1 ,y1 могут быть очень большими — как в примере D=61D=61D=61.
- Вычислительная стоимость: получение цепной дроби до периода требует порядка O(k)O(k)O(k) шагов, но числа в шаге растут до размера порядка числа цифр x1x_1x1 . Поэтому реальная сложность определяется (i) длиной периода kkk и (ii) стоимостью операций с большими целыми числами (умножение/деление больших целых). При простых алгоритмах время примерно пропорционально kkk умножённому на стоимость арифметики с числом длины NNN (где NNN — число десятичных цифр x1x_1x1 ).
- Поведение «в худшем случае»: для некоторых DDD фундаментальное решение экспоненциально велико по отношению к D\sqrt{D}D (существуют примеры с очень большими x1x_1x1 ), поэтому вычисления становятся тяжёлыми. Нет простого формулы для размера x1x_1x1 в терминах DDD; поведение весьма вариативно и связано с арифметикой квадратичного поля (регулятор, класс-группа).
- Практические ускорения: быстрое целочисленное умножение, алгоритмы для цепных дробей квадратичных иррациональностей, использование модульных и блоковых методов, методы в теории идеалов в Q(D)\mathbb{Q}(\sqrt{D})Q(D ) — всё это существенно снижает время на большие DDD.
Короткое резюме: метод — вычислить периодическую цепную дробь D\sqrt{D}D , взять соответствующую сходящуюся дробь как фундаментальное решение, затем возводить в степени для получения всех решений. Сложность сильно зависит от длины периода и от величины фундаментального решения; для некоторых DDD (например, 616161) фундаментальное решение чрезвычайно велико, что делает вычисления ресурсоёмкими.