顾名思义, 扩展欧几里德算法 是在 欧几里德算法 基础上扩展的算法.
欧几里德算法 和 扩展欧几里德算法 在用途上的区别:
即 辗转相除法.
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 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 (其中的 /
为整除). 得:
所以得到 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