一、引言
在数论中,贝祖定理(Bézout's Identity)指出:对于任意两个整数 aa 和 bb,存在整数 xx 和 yy,使得
a⋅x+b⋅y=gcd(a,b)a⋅x+b⋅y=gcd(a,b)
其中 gcd(a,b)gcd(a,b) 是 aa 和 bb 的最大公约数。扩展欧几里得算法(Extended Euclidean Algorithm)不仅能计算 gcd(a,b)gcd(a,b),还能找到满足上述等式的系数 xx 和 yy。本文将深入解析这一算法的原理与实现。
二、欧几里得算法回顾
欧几里得算法通过递归应用以下步骤计算 gcd(a,b)gcd(a,b):
-
用较大数除以较小数,得到余数 rr。
-
将较小数作为新的较大数,余数作为新的较小数。
-
重复直到余数为零,此时非零余数即为 gcd(a,b)gcd(a,b)。
例如,计算 gcd(240,46)gcd(240,46):
-
240=5×46+10240=5×46+10
-
46=4×10+646=4×10+6
-
10=1×6+410=1×6+4
-
6=1×4+26=1×4+2
-
4=2×2+04=2×2+0
最终 gcd(240,46)=2gcd(240,46)=2。
三、扩展欧几里得算法的核心思想
扩展欧几里得算法在计算 gcd(a,b)gcd(a,b) 的同时,通过回溯欧几里得步骤构造系数 xx 和 yy。其核心在于维护以下等式:
gcd(a,b)=a⋅x+b⋅ygcd(a,b)=a⋅x+b⋅y
每一步递归或迭代中,算法更新 xx 和 yy 的值,最终得到解。
四、递归实现
递归版的扩展欧几里得算法如下:
-
终止条件:若 b=0b=0,则 gcd(a,0)=agcd(a,0)=a,此时 x=1x=1, y=0y=0。
-
递归步骤:计算 gcd(b,a%b)gcd(b,a%b),得到系数 x1x1 和 y1y1。
-
回溯更新:根据 a=b⋅q+ra=b⋅q+r,其中 q=⌊a/b⌋q=⌊a/b⌋,更新系数:
x=y1,y=x1−q⋅y1x=y1,y=x1−q⋅y1
示例:求解 240x+46y=2240x+46y=2
-
递归回溯过程:
-
最后一层:gcd(2,0)=2gcd(2,0)=2,x=1x=1, y=0y=0。
-
倒数第二层:2=4−1×22=4−1×2,得 x=0x=0, y=1y=1。
-
逐层回溯,最终得到 x=−9x=−9, y=47y=47。
-
五、迭代实现
迭代版本通过维护变量直接计算系数,避免递归开销:
-
初始化:
-
old_r=aold_r=a, r=br=b
-
old_s=1old_s=1, s=0s=0
-
old_t=0old_t=0, t=1t=1
-
-
循环更新:
-
计算商 q=⌊old_r/r⌋q=⌊old_r/r⌋
-
更新余数:(old_r,r)=(r,old_r−q⋅r)(old_r,r)=(r,old_r−q⋅r)
-
更新系数:(old_s,s)=(s,old_s−q⋅s)(old_s,s)=(s,old_s−q⋅s)
-
同理更新 tt 的值。
-
-
终止条件:当 r=0r=0 时,返回 old_rold_r(即 gcd(a,b)gcd(a,b)),以及系数 old_sold_s 和 old_told_t。
示例:再次计算 240x+46y=2240x+46y=2
-
迭代过程:
-
第1步:q=5q=5,更新后 old_s=0old_s=0, s=1s=1, old_t=1old_t=1, t=−5t=−5
-
第5步:r=0r=0,最终得到 x=−9x=−9, y=47y=47
-
-
验证:240×(−9)+46×47=−2160+2162=2240×(−9)+46×47=−2160+2162=2,正确。
六、应用场景
-
模逆元计算:在密码学中,若 gcd(e,ϕ(n))=1gcd(e,ϕ(n))=1,可通过扩展欧几里得算法求 dd 使得 e⋅d≡1mod ϕ(n)e⋅d≡1modϕ(n),用于RSA密钥生成。
-
线性同余方程:求解形如 a⋅x≡cmod ma⋅x≡cmodm 的方程。
-
分数化简:将分数表示为最简形式。
七、总结
扩展欧几里得算法通过巧妙维护系数,将简单的欧几里得算法提升为强大的数学工具。其时间复杂度为 O(logmin(a,b))O(logmin(a,b)),高效且实用。无论是理论探索还是实际应用,这一算法都展现了数论的深邃与优雅。