扩展欧几里得算法认知
- 欧几里得算法(辗转相除法)基础
欧几里得算法用于计算两个整数 a 和 b 的最大公因数(Greatest Common Divisor,GCD)。其核心思想是:两个整数的最大公因数等于其中较小的数和两数相除余数的最大公因数。用数学公式表示为:
gcd(a,b)=gcd(b,a mod b)
例如,计算 gcd(24,18):24 mod 18=6,所以 gcd(24,18)=gcd(18,6);18 mod 6=0,此时余数为 0,则 gcd(18,6)=6,即 gcd(24,18)=6。 - 扩展欧几里得算法
扩展欧几里得算法不仅可以计算两个整数 a 和 b 的最大公因数 d,还能找到整数 x 和 y,使得 d=ax+by。这在密码学(如 RSA 算法中求私钥等场景)等领域有重要应用。 - 代码原理分析
def egcd(a, b): # 扩展欧几里得
if b == 0:
return a, 1, 0
d, x, y = egcd(b, a % b)
x, y = y, x - (a // b) \* y
return d, x, y
递归终止条件:
if b == 0:
return a, 1, 0
当 b 为 0 时,说明已经递归到了最底层(此时 a 就是最初两个数的最大公因数)。根据 d=ax+by,此时 d=a,并且可以令 x=1,y=0,因为 a=a×1+0×0,所以返回 a, 1, 0。
递归调用:
d, x, y = egcd(b, a % b)
根据欧几里得算法的原理,递归调用 egcd(b, a % b) 来计算 b 和 a % b 的最大公因数 d 以及对应的系数 x 和 y,使得 d=bx+(a mod b)y。
系数调整:
x, y = y, x - (a // b) * y
这一步是关键,用于从 egcd(b, a % b) 的结果推导出 egcd(a, b) 的系数 x 和 y。
已知 d=bx+(a mod b)y,而 a mod b=a-⌊a/b⌋×b(⌊a/b⌋ 表示 a 除以 b 的整数部分,即 a // b),将其代入上式可得:
(d=bx+(a-⌊a/b⌋×b)y=bx+ay-⌊a/b⌋×by=ay+b(x-⌊a/b⌋×y) )
此时,对于 d=ax'+by',可以得到 x'=y,y'=x-⌊a/b⌋×y,这就是代码中 x, y = y, x - (a // b) * y 的原理。
返回结果:
return d, x, y
最后返回计算得到的最大公因数 d 以及满足 d=ax+by 的系数 x 和 y。
通过这种递归的方式,扩展欧几里得算法能够在计算最大公因数的同时,求出对应的系数 x 和 y。

浙公网安备 33010602011771号