跳到主要内容

拓展欧几里得算法

拓展欧几里得算法

拓展欧几里得算法(Extended Euclidian Algorithm),是欧几里得算法的扩展版本,用于在计算两个数的最大公约数 gcd(a,b)\gcd(a, b) 的同时,找到这两个整数的 贝祖系数(即这两个整数的线性组合等于其最大公约数的系数)。

举例而言,如果给定两个整数 a,ba, b,我们不仅可以找到这两个整数的最大公约数,还可以找到两个整数 x,yx, y,满足:

ax+by=gcd(a,b)ax + by = \gcd(a, b)

与此同时,我们也将这个方程称之为 贝祖等式(Bézout's identity)。拓展欧几里得算法在数论和计算机应用方面有着极其突出的贡献和广泛的应用。例如求解线性同余方程,本文也将会围绕求解同余方程来展开。

线性同余方程

线性同余方程指的是形如 axb(modm)ax \equiv b \pmod m 的方程,其中 aabb 表示两个已知的整数常量,xx 是需要求解的未知整数,符号 \equiv 表示同余关系,即等式两边同时对 mm 取模结果相同。

具体地说,线性同余方程要求找到一个整数 xx,使得 axax 除以 mm 所得的余数等于 bb,或者说 axaxbbmm 取余后余数相等。该类型的问题通常存在唯一的解或者无解。

拓展欧几里得算法过程推导

拓展欧几里得算法与普通的欧几里得算法相同,都可以通过递归的方式来非常简便地计算出结果。

假设有两个非负整数 aabb(在满足 aba \le b 的情况下),设 r=amodbr = a \mod b,那么根据欧几里得算法可以得出结论 gcd(a,b)=gcd(b,r)\gcd(a, b) = \gcd(b, r)。根据欧几里得算法的推到过程,可以得到:

bx1+ry1=gcd(b,r)bx_1 + ry_1 = \gcd(b, r)

因为 r=aabbr = a - \left\lfloor\frac{a}{b}\right\rfloor b,所以代入推出:

gcd(a,b)=bx1+(aabb)y1\gcd(a, b) = bx_1 + (a - \left\lfloor\frac{a}{b}\right\rfloor b)y_1

经过化简可以得到:

gcd(a,b)=ay1+b(x1aby1)\gcd(a, b) = ay_1 + b(x_1 - \left\lfloor\frac{a}{b}\right\rfloor y_1)

由此可以看出,x=y1x = y_1y=x1aby1y = x_1 - \left\lfloor\frac{a}{b}\right\rfloor y_1 是符合原式的贝祖系数。

拓展欧几里得算法代码

int extended_gcd(int a, int b, int &x, int &y) {
if (a == 0) {
x = 0, y = 1;
return b;
}
int x1, y1;
int gcd = extended_gcd(b % a, a, x1, y1);
x = y1 - (b / a) * x1;
y = x1;
return gcd;
}

参考上述代码,extended_gcd 函数接受两个整数 aabb,并计算它们的最大公约数,并通过引用参数 xxyy 返回贝祖系数。

相关引用

  1. GeeksforGeeks. Euclidean Algorithms - Basic and Extended. GeeksforGeeks, https://www.geeksforgeeks.org/euclidean-algorithms-basic-and-extended/, accessed May 22, 2024.
  2. GeeksforGeeks. Introduction to Chinese Remainder Theorem. GeeksforGeeks, https://www.geeksforgeeks.org/introduction-to-chinese-remainder-theorem/, accessed May 22, 2024.
  3. cp-algorithms contributors. "Chinese Remainder Theorem." cp-algorithms, Oct 16, 2023, https://cp-algorithms.com/algebra/chinese-remainder-theorem.html. Accessed May 22, 2024.