扩展欧几里德算法 递归法 递推法 手算法 原理及实现
顾名思义, 扩展欧几里德算法 是在 欧几里德算法 基础上扩展的算法.
欧几里德算法 和 扩展欧几里德算法 在用途上的区别:
- 欧几里德算法(gcd): 即求两个整数的 最大公约数.
- 扩展欧几里德算法:
- 用于求 乘法逆元.
- 用于求 贝组等式 的一个解.
欧几里德算法
即 辗转相除法.
C 语言实现:
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a%b);
}
注意此算法的 终止条件 是 b == 0
.
扩展欧几里德-递归法
设初始值: a 1 = m a_1 = m a1=m, b 1 = n b_1 = n b1=n, 且 m > n m > n m>n.
设 a 1 x 1 + b 1 y 1 = gcd ( a 1 , b 1 ) a_1x_1 + b_1y_1 = \gcd(a_1, b_1) a1x1+b1y1=gcd(a1,b1), 则:
在 欧几里德算法 中, a i + 1 = b i , b i + 1 = a i m o d b i a_{i + 1} = b_i, b_{i + 1} = a_i \mod b_i ai+1=bi,bi+1=aimodbi, 所以:
- a 2 x 2 + b 2 y 2 = b 1 x 2 + ( a 1 m o d b 1 ) y 2 = gcd ( a 2 , b 2 ) a_2x_2 + b_2y_2 = b_1x_2 + (a_1 \mod b_1)y_2 = \gcd(a_2, b_2) a2x2+b2y2=b1x2+(a1modb1)y2=gcd(a2,b2).
因为
a
1
m
o
d
b
1
=
a
1
−
(
a
1
/
b
1
)
⋅
b
1
a_1 \mod b_1 = a_1 - (a_1 / b_1) \cdot b_1
a1modb1=a1−(a1/b1)⋅b1 (其中的 /
为整除). 得:
- a 1 x 1 + b 1 y 1 = b 1 x 2 + ( a 1 − ( a 1 / b 1 ) b 1 ) y 2 = a 1 y 2 + b 1 ( x 2 − ( a 1 / b 1 ) y 2 ) a_1x_1 + b_1y_1 = b_1x_2 + (a_1 - (a_1 / b_1)b_1)y_2 = a_1y_2 + b_1(x_2 - (a_1 / b_1)y_2) a1x1+b1y1=b1x2+(a1−(a1/b1)b1)y2=a1y2+b1(x2−(a1/b1)y2)
所以得到 x 1 = y 2 , y 1 = x 2 − ( a 1 / b 1 ) y 2 x_1 = y_2, \quad y_1 = x_2 - (a_1 / b_1)y_2 x1=y2,y1=x2−(a1/b1)y2.
由以上推广得到:
推论 1: x i = y i + 1 , y i = x i + 1 − ( a i / b i ) y i + 1 \boxed{x_i = y_{i + 1}, \quad y_i = x_{i + 1} - (a_i / b_i)y_{i + 1}} xi=yi+1,yi=xi+1−(ai/bi)yi+1
在 欧几里德算法 中, 迭代的终止条件是 b == 0
, 并且此时
a
i
x
i
+
b
i
y
i
=
gcd
(
a
i
,
b
i
)
=
gcd
(
a
i
,
0
)
=
a
i
a_ix_i + b_iy_i = \gcd(a_i, b_i) = \gcd(a_i, 0) = a_i
aixi+biyi=gcd(ai,bi)=gcd(ai,0)=ai, 显然此时的
x
i
=
1
,
y
i
=
0
x_i = 1, y_i = 0
xi=1,yi=0, 所以有:
推论 2: 当 b i = 0 时 , x i = 1 , y i = 0. \boxed{当 b_i = 0 时, x_i = 1, y_i = 0.} 当bi=0时,xi=1,yi=0.
以上标识符(比如
a
1
a_1
a1,
b
2
b_2
b2)的下标数字是指在 欧几里德算法 的 gcd()
函数里的迭代次数.
为了更好的理解, 下面用实例进行说明, 假设 m = 1756, n = 551,
q
q
q 代表
a
/
b
a / b
a/b, /
表示整除:
(1) a 1 = 1756 b 1 = 551 q 1 = 3 a_1 = 1756 \quad b_1 = 551 \quad q_1 = 3 a1=1756b1=551q1=3
(2) a 2 = 551 b 2 = 103 q 2 = 5 a_2 = 551 \quad b_2 = 103 \quad q_2 = 5 a2=551b2=103q2=5
(3) a 3 = 103 b 3 = 36 q 3 = 2 a_3 = 103 \quad b_3 = 36 \quad q_3 = 2 a3=103b3=36q3=2
(4) a 4 = 36 b 4 = 31 q 4 = 1 a_4 = 36 \quad b_4 = 31 \quad q_4 = 1 a4=36b4=31q4=1
(5) a 5 = 31 b 5 = 5 q 5 = 6 a_5 = 31 \quad b_5 = 5 \quad q_5 = 6 a5=31b5=5q5=6
(6) a 6 = 5 b 6 = 1 q 6 = 5 a_6 = 5 \quad b_6 = 1 \quad q_6 = 5 a6=5b6=1q6=5
(7) a 7 = 1 b 7 = 0 a_7 = 1 \quad b_7 = 0 a7=1b7=0 ( b 7 b_7 b7 为 0, 终止, 所以 x 7 = 1 , y 7 = 0 x_7 = 1, y_7 = 0 x7=1,y7=0)
因为我们要求的是 x 1 , y 1 x_1, y_1 x1,y1 于是乎:
-
递归最深处: 返回 x 7 = 1 , y 7 = 0 x_7 = 1, y_7 = 0 x7=1,y7=0.
-
第 6 深: 返回
x 6 = y 7 = 0 \begin{aligned}x_6 &= y_7 = 0\end{aligned} x6=y7=0
y 6 = x 7 − q 6 y 7 = 1 − 0 = 1 \begin{aligned}y_6 &= x_7 - q_6y_7 \\ &= 1- 0 = 1\end{aligned} y6=x7−q6y7=1−0=1
-
第 5 深: 返回
x 5 = y 6 = 1 \begin{aligned}x_5 &= y_6 = 1\end{aligned} x5=y6=1
y 5 = x 6 − q 5 y 6 = 0 − 6 ⋅ 1 = − 6 \begin{aligned}y_5 &= x_6 - q_5y_6 \\ &= 0 - 6 \cdot 1 = -6\end{aligned} y5=x6−q5y6=0−6⋅1=−6
-
第 4 深: 返回
x 4 = y 5 = − 6 \begin{aligned}x_4 &= y_5 = -6\end{aligned} x4=y5=−6
y 4 = x 5 − q 4 y 5 = 1 − 1 ⋅ ( − 6 ) = 7 \begin{aligned}y_4 &= x_5 - q_4y_5 \\ &= 1 - 1 \cdot (-6) = 7\end{aligned} y4=x5−q4y5=1−1⋅(−6)=7
-
第 3 深: 返回
x 3 = y 4 = 7 \begin{aligned}x_3 &= y_4 = 7\end{aligned} x3=y4=7
y 3 = x 4 − q 3 y 4 = − 6 − 2 ⋅ 7 = − 20 \begin{aligned}y_3 &= x_4 - q_3y_4 \\ &= -6 - 2 \cdot 7 = -20\end{aligned} y3=x4−q3y4=−6−2⋅7=−20
-
第 2 深: 返回
x 2 = y 3 = − 20 \begin{aligned}x_2 &= y_3 = -20\end{aligned} x2=y3=−20
y 2 = x 3 − q 2 y 3 = 7 − 5 ⋅ ( − 20 ) = 107 \begin{aligned}y_2 &= x_3 - q_2y_3 \\ &= 7 - 5 \cdot (-20) = 107\end{aligned} y2=x3−q2y3=7−5⋅(−20)=107
-
第 1 深: 返回
x 1 = y 2 = 107 \begin{aligned}x_1 &= y_2 = 107\end{aligned} x1=y2=107
y 1 = x 2 − q 1 y 2 = − 20 − 3 ⋅ 107 = − 341 \begin{aligned}y_1 &= x_2 - q_1y_2 \\ &= -20 - 3 \cdot 107 = -341\end{aligned} y1=x2−q1y2=−20−3⋅107=−341
即求得 x = 107 , y = − 341 x = 107, y = -341 x=107,y=−341, 代入 1756 x + 551 y = gcd ( 1756 , 551 ) = 1 1756x + 551y = \gcd(1756, 551) = 1 1756x+551y=gcd(1756,551)=1 中验算成立.
写出 C 语言代码为:
#include <stdio.h>
struct Solution {
int x;
int y;
};
struct Solution extended_euclid(int a, int b) {
if (b == 0) {
return Solution{1, 0};
}
struct Solution t = extended_euclid(b, a % b);
int q = a / b;
return Solution{t.y, t.x - q * t.y};
}
int main() {
int m = 1756, n = 551;
printf("for %dx + %dy = gcd(%d, %d)\n", m, n, m, n);
struct Solution res = extended_euclid(m, n);
printf("the solution is: x = %d, y = %d\n", res.x, res.y);
return 0;
}
程序运行结果为:
for 1756x + 551y = gcd(1756, 551)
the solution is: x = 107, y = -341
扩展欧几里德-递推法
扩展欧几里德算法 在密码学中算是很常用的了, 古典密码中的 仿射密码 以及各种公钥密码好像都用的挺多, 递推法的一个好处是方便手算, 尤其是在期末考试 (ˉ▽ˉ;)…
跟递归法一样, 我们先设: a 1 = m a_1 = m a1=m, b 1 = n b_1 = n b1=n, 且 m > n m > n m>n.
然后以下式子成立是必然的:
a 1 = 1 ⋅ a 1 + 0 ⋅ b 1 b 1 = 0 ⋅ a 1 + 1 ⋅ b 1 \begin{gather} a_1 = 1 \cdot a_1 + 0 \cdot b_1 \\ b_1 = 0 \cdot a_1 + 1 \cdot b_1 \end{gather} a1=1⋅a1+0⋅b1b1=0⋅a1+1⋅b1
我们根据上式 (1) 设 x − 1 = 1 , y − 1 = 0 x_{-1} = 1, y_{-1} = 0 x−1=1,y−1=0.
根据上式 (2) 设 x 0 = 0 , y 0 = 1 x_0 = 0, y_0 = 1 x0=0,y0=1.
设 q q q 表示 a 和 b 商, u u u 表示 a ÷ b a \div b a÷b 的余数, 则:
-
第一轮:
a 1 = m = 1 ⋅ a 1 + 0 ⋅ b 1 b 1 = n = 0 ⋅ a 1 + 1 ⋅ b 1 a_1 = m = 1 \cdot a_1 + 0 \cdot b_1 \\ b_1 = n = 0 \cdot a_1 + 1 \cdot b_1 a1=m=1⋅a1+0⋅b1b1=n=0⋅a1+1⋅b1
q 1 = a 1 / b 1 q_1 = a_1 / b_1 q1=a1/b1 (
/
表示整除)u 1 = a 1 − q 1 b 1 ( 关键 ! 将 a 1 , b 1 代入 ) = ( 1 ⋅ a 1 + 0 ⋅ b 1 ) − q 1 ( 0 ⋅ a 1 + 1 ⋅ b 1 ) = a 1 + ( − q 1 ) b 1 = x 1 a 1 + y 1 b 1 \begin{aligned}u_1 &= a_1 - q_1b_1 \quad \color{red}{(关键! 将 a_1, b_1 代入)} \\ &= (1 \cdot a_1 + 0 \cdot b_1) - q_1(0 \cdot a_1 + 1 \cdot b_1) \\ &= a_1 + (-q_1)b_1 \\ &= x_1a_1 + y_1b_1 \end{aligned} u1=a1−q1b1(关键!将a1,b1代入)=(1⋅a1+0⋅b1)−q1(0⋅a1+1⋅b1)=a1+(−q1)b1=x1a1+y1b1
得到: x 1 = 1 , y 1 = − q 1 x_1 = 1, y_1 = -q_1 x1=1,y1=−q1.
-
第二轮:
a 2 = b 1 = x 0 a 1 + y 0 b 1 b 2 = u 1 = x 1 a 1 + y 1 b 1 a_2 = b_1 = x_0a_1 + y_0b_1 \\ b_2 = u_1 = x_1a_1 + y_1b_1 a2=b1=x0a1+y0b1b2=u1=x1a1+y1b1
q 2 = a 2 / b 2 q_2 = a_2 / b_2 q2=a2/b2
u 2 = a 2 − q 2 b 2 = ( x 0 a 1 + y 0 b 1 ) − q 2 ( x 1 a 1 + y 1 b 1 ) = ( x 0 − q 2 x 1 ) a 1 + ( y 0 − q 2 y 1 ) b 1 = x 2 a 1 + y 2 b 1 \begin{aligned} u_2 &= a_2 - q_2b_2 \\ &= (x_0a_1 + y_0b_1) - q_2(x_1a_1 + y_1b_1) \\ &= (x_0 - q_2x_1)a_1 + (y_0 - q_2y_1)b_1 \\ &= x_2a_1 + y_2b_1 \end{aligned} u2=a2−q2b2=(x0a1+y0b1)−q2(x1a1+y1b1)=(x0−q2x1)a1+(y0−q2y1)b1=x2a1+y2b1
得到: x 2 = x 0 − q 2 x 1 , y 2 = y 0 − q 2 y 1 x_2 = x_0 - q_2x_1, y_2 = y_0 - q_2y_1 x2=x0−q2x1,y2=y0−q2y1
-
第三轮:
a 3 = b 2 = x 1 a 1 + y 1 b 1 b 3 = u 2 = x 2 a 1 + y 2 b 1 a_3 = b_2 = x_1a_1 + y_1b_1 \\ b_3 = u_2 = x_2a_1 + y_2b_1 a3=b2=x1a1+y1b1b3=u2=x2a1+y2b1
q 3 = a 3 / b 3 q_3 = a_3 / b_3 q3=a3/b3
u 3 = a 3 − q 3 b 3 = ( x 1 a 1 + y 1 b 1 ) − q 2 ( x 2 a 1 + y 2 b 1 ) = ( x 1 − q 3 x 2 ) a 1 + ( y 1 − q 3 y 2 ) b 1 = x 3 a 1 + y 3 b 1 \begin{aligned} u_3 &= a_3 - q_3b_3 \\ &= (x_1a_1 + y_1b_1) - q_2(x_2a_1 + y_2b_1) \\ &= (x_1 - q_3x_2)a_1 + (y_1 - q_3y_2)b_1 \\ &= x_3a_1 + y_3b_1 \end{aligned} u3=a3−q3b3=(x1a1+y1b1)−q2(x2a1+y2b1)=(x1−q3x2)a1+(y1−q3y2)b1=x3a1+y3b1
得到: x 3 = x 1 − q 3 x 2 , y 3 = y 1 − q 3 y 2 x_3 = x_1 - q_3x_2, y_3 = y_1 - q_3y_2 x3=x1−q3x2,y3=y1−q3y2
-
…
-
第 i 轮:
a i = b i − 1 = u i − 2 = x i − 2 a 1 + y i − 2 b 1 b i = u i − 1 = x i − 1 a 1 + y i − 1 b 1 a_i = b_{i - 1} = u_{i - 2} = x_{i - 2}a_1 + y_{i - 2}b_1 \\ b_i = u_{i - 1} = x_{i - 1}a_1 + y_{i - 1}b_1 ai=bi−1=ui−2=xi−2a1+yi−2b1bi=ui−1=xi−1a1+yi−1b1
q i = a i / b i q_i = a_i / b_i qi=ai/bi
u i = a i − q i b i = ( x i − 2 a 1 + y i − 2 b 1 ) − q 2 ( x i − 1 a 1 + y i − 1 b 1 ) = ( x i − 2 − q i x i − 1 ) a 1 + ( y i − 2 − q i y i − 1 ) b 1 = x i a 1 + y i b 1 \begin{aligned} u_i &= a_i - q_ib_i \\ &= (x_{i - 2}a_1 + y_{i - 2}b_1) - q_2(x_{i - 1}a_1 + y_{i - 1}b_1) \\ &= (x_{i - 2} - q_ix_{i - 1})a_1 + (y_{i - 2} - q_iy_{i - 1})b_1 \\ &= x_ia_1 + y_ib_1 \end{aligned} ui=ai−qibi=(xi−2a1+yi−2b1)−q2(xi−1a1+yi−1b1)=(xi−2−qixi−1)a1+(yi−2−qiyi−1)b1=xia1+yib1
得到 推理: x i = x i − 2 − q i x i − 1 , y i = y i − 2 − q i y i − 1 \boxed{x_i = x_{i - 2} - q_ix_{i - 1}, y_i = y_{i - 2} - q_iy_{i - 1}} xi=xi−2−qixi−1,yi=yi−2−qiyi−1
关于终止条件:
因为我们要求解的是 x a 1 + y b 1 = gcd ( a 1 , b 1 ) xa_1 + yb_1 = \gcd(a_1, b_1) xa1+yb1=gcd(a1,b1), 只有当 u i + 1 u_{i + 1} ui+1 为 0 时, 其第 i 轮的 u i u_i ui 才等于 gcd ( a 1 , b 1 ) \gcd(a_1, b_1) gcd(a1,b1). 所以我们判断终止有两种方法:
- 判断 u i + 1 u_{i + 1} ui+1 为 0 时, 其解为 x i x_i xi 和 y i y_i yi.
- 判断 u i u_i ui 为 0 时, 其解为 x i − 1 x_{i - 1} xi−1 和 y i − 1 y_{i - 1} yi−1.
在手算时用第一种好一点. 在代码中我使用第二种.
实例讲解, 还是使用上面的例子:
假设 m = 1756, n = 551,
q
q
q 代表
a
/
b
a / b
a/b, /
表示整除:
-
第一轮:
a 1 = 1756 b 1 = 551 a_1 = 1756 \quad b_1 = 551 a1=1756b1=551
q 1 = a 1 / b 1 = 3 q_1 = a_1 / b_1 = 3 q1=a1/b1=3
u 1 = a 1 m o d b 1 = 103 u_1 = a_1 \mod b_1 = 103 u1=a1modb1=103
x 1 = x − 1 − q 1 x 0 = 1 − 3 ⋅ 0 = 1 x_1 = x_{-1} - q_1x_0 = 1 - 3 \cdot 0 = 1 x1=x−1−q1x0=1−3⋅0=1
y 1 = y − 1 − q 1 y 0 = 0 − 3 ⋅ 1 = − 3 y_1 = y_{-1} - q_1y_0 = 0 - 3 \cdot 1 = -3 y1=y−1−q1y0=0−3⋅1=−3
u 2 = b 1 m o d u 1 = 36 u_2 = b_1 \mod u_1 = 36 u2=b1modu1=36 不为 0, 继续.
-
第二轮:
a 2 = b 1 = 551 b 2 = u 1 = 103 a_2 = b_1 = 551 \quad b_2 = u_1 = 103 a2=b1=551b2=u1=103
q 2 = a 2 / b 2 = 5 q_2 = a_2 / b_2 = 5 q2=a2/b2=5
u 2 = a 2 m o d b 2 = 36 u_2 = a_2 \mod b_2 = 36 u2=a2modb2=36
x 2 = x 0 − q 2 x 1 = 0 − 5 ⋅ 1 = − 5 x_2 = x_{0} - q_2x_1 = 0 - 5 \cdot 1 = -5 x2=x0−q2x1=0−5⋅1=−5
y 2 = y 0 − q 2 y 1 = 1 − 5 ⋅ ( − 3 ) = 16 y_2 = y_{0} - q_2y_1 = 1 - 5 \cdot (-3) = 16 y2=y0−q2y1=1−5⋅(−3)=16
u 3 = b 2 m o d u 2 = 31 u_3 = b_2 \mod u_2 = 31 u3=b2modu2=31 不为 0, 继续.
-
第三轮:
a 3 = b 2 = 103 b 3 = u 2 = 36 a_3 = b_2 = 103 \quad b_3 = u_2 = 36 a3=b2=103b3=u2=36
q 3 = a 3 / b 3 = 2 q_3 = a_3 / b_3 = 2 q3=a3/b3=2
u 3 = a 3 m o d b 3 = 31 u_3 = a_3 \mod b_3 = 31 u3=a3modb3=31
x 3 = x 1 − q 3 x 2 = 1 − 2 ⋅ ( − 5 ) = 11 x_3 = x_{1} - q_3x_2 = 1 - 2 \cdot (-5) = 11 x3=x1−q3x2=1−2⋅(−5)=11
y 3 = y 1 − q 3 y 2 = − 3 − 2 ⋅ 16 = − 35 y_3 = y_{1} - q_3y_2 = -3 - 2 \cdot 16 = -35 y3=y1−q3y2=−3−2⋅16=−35
u 4 = b 3 m o d u 3 = 5 u_4 = b_3 \mod u_3 = 5 u4=b3modu3=5 不为 0, 继续.
-
第四轮:
a 4 = b 3 = 36 b 4 = u 3 = 31 a_4 = b_3 = 36 \quad b_4 = u_3 = 31 a4=b3=36b4=u3=31
q 4 = a 4 / b 4 = 1 q_4 = a_4 / b_4 = 1 q4=a4/b4=1
u 4 = a 4 m o d b 4 = 5 u_4 = a_4 \mod b_4 = 5 u4=a4modb4=5
x 4 = x 2 − q 4 x 3 = − 5 − 1 ⋅ 11 = − 16 x_4 = x_{2} - q_4x_3 = -5 - 1 \cdot 11 = -16 x4=x2−q4x3=−5−1⋅11=−16
y 4 = y 2 − q 4 y 3 = 16 − 1 ⋅ ( − 35 ) = 51 y_4 = y_{2} - q_4y_3 = 16 - 1 \cdot (-35) = 51 y4=y2−q4y3=16−1⋅(−35)=51
u 5 = b 4 m o d u 4 = 1 u_5 = b_4 \mod u_4 = 1 u5=b4modu4=1 不为 0, 继续.
-
第五轮:
a 5 = b 4 = 31 b 5 = u 4 = 5 a_5 = b_4 = 31 \quad b_5 = u_4 = 5 a5=b4=31b5=u4=5
q 5 = a 5 / b 5 = 6 q_5 = a_5 / b_5 = 6 q5=a5/b5=6
u 5 = a 5 m o d b 5 = 1 u_5 = a_5 \mod b_5 = 1 u5=a5modb5=1
x 5 = x 3 − q 5 x 4 = 11 − 6 ⋅ ( − 16 ) = 107 x_5 = x_{3} - q_5x_4 = 11 - 6 \cdot (-16) = 107 x5=x3−q5x4=11−6⋅(−16)=107
y 5 = y 3 − q 5 y 4 = − 35 − 6 ⋅ 51 = − 341 y_5 = y_{3} - q_5y_4 = -35 - 6 \cdot 51 = -341 y5=y3−q5y4=−35−6⋅51=−341
u 6 = b 5 m o d u 5 = 0 u_6 = b_5 \mod u_5 = 0 u6=b5modu5=0 为 0, 终止!!!
即得到解 x = x 5 = 107 , y = y 5 = − 341 x = x_5 = 107, y = y_5 = -341 x=x5=107,y=y5=−341.
写出 C 语言代码为:
#include <stdio.h>
struct Solution
{
int x;
int y;
};
struct Solution extended_euclid2(int m, int n)
{
// 初始
int x_i_2 = 1; // x_{i - 2}
int y_i_2 = 0; // y_{i - 2}
int x_i_1 = 0; // x_{i - 1}
int y_i_1 = 1; // y_{i - 1}
int a = m;
int b = n;
int x, y;
while (true)
{
int q = a / b; // q_i a_i b_i
int u = a % b; // u_i
// 当 u_i 为 0 则终止
if (u == 0)
{
x = x_i_1; // 得出解 x = x_{i - 1}
y = y_i_1; // 得出解 y = y_{i - 1}
break;
}
x = x_i_2 - q * x_i_1; // x_i
y = y_i_2 - q * y_i_1; // y_i
x_i_2 = x_i_1;
y_i_2 = y_i_1;
x_i_1 = x;
y_i_1 = y;
a = b; // a_{i + 1}
b = u; // b_{i + 1}
}
// 返回求得的 x y.
return Solution{x, y};
}
int main()
{
int m = 1756, n = 551;
printf("for %dx + %dy = gcd(%d, %d)\n", m, n, m, n);
struct Solution res = extended_euclid2(m, n);
printf("the solution is: x = %d, y = %d\n", res.x, res.y);
return 0;
}
程序运行结果为:
for 1756x + 551y = gcd(1756, 551)
the solution is: x = 107, y = -341
扩展欧几里德-手算法
其方法跟 扩展欧几里德-递推法 里的例子大同小异, 主要是我们密码学老师喜欢用这种方法手算:
建表, u u u 代表余数, q q q 代表商:
u | x | y | q |
---|---|---|---|
a 1 a_1 a1 | x − 1 x_{-1} x−1 | y − 1 y_{-1} y−1 | |
b 1 b_1 b1 | x 0 x_0 x0 | y 0 y_0 y0 | q 1 q_1 q1 |
u 1 u_1 u1 | x 1 = x − 1 − q 1 x 0 x_1 = x_{-1} - q_1x_0 x1=x−1−q1x0 | y 1 = y − 1 − q 1 y 0 y_1 = y_{-1} - q_1y_0 y1=y−1−q1y0 | q 2 q_2 q2 |
u 2 u_2 u2 | x 2 = x 0 − q 2 x 1 x_2 = x_0 - q_2x_1 x2=x0−q2x1 | y 2 = y 0 − q 2 y 1 y_2 = y_0 - q_2y_1 y2=y0−q2y1 | q 3 q_3 q3 |
u 3 u_3 u3 | x 3 = x 1 − q 3 x 2 x_3 = x_1 - q_3x_2 x3=x1−q3x2 | y 3 = y 1 − q 3 y 2 y_3 = y_1 - q_3y_2 y3=y1−q3y2 | q 4 q_4 q4 |
… | |||
u i u_i ui | x i = x i − 2 − q i x i − 1 x_i = x_{i - 2} - q_ix_{i - 1} xi=xi−2−qixi−1 | y i = y i − 2 − q i y i − 1 y_i = y_{i - 2} - q_iy_{i - 1} yi=yi−2−qiyi−1 | q i + 1 q_{i + 1} qi+1 |
其 终止条件 是: 判断 u i + 1 u_{i + 1} ui+1 为 0, 解为 x i x_i xi 和 y i y_i yi.
还是以 m = 1756, n = 551 为例, 建表:
u | x | y | q |
---|---|---|---|
1756 | 1 | 0 | |
551 | 0 | 1 | 3 |
103 | 1 | -3 | 5 |
36 | -5 | 16 | 2 |
31 | 11 | -35 | 1 |
5 | -16 | 51 | 6 |
1 | 107 | -347 | 0 |
0 |
嗯, 差不多就是这样╮(╯▽╰)╭.