扩展欧几里得算法(Extended Euclidean Algorithm)
扩展欧几里得算法是基于经典的欧几里得算法,用于计算两个整数 a和 b的最大公约数,同时还能够找到一组整数系数 x和 y,使得以下等式成立:
上式是一个典型的线性丢番图方程,其实扩展欧几里得算法也常用于计算线性丢番图方程的一组特解
实现:
- 初始化:设置初始值 ,同时设置系数 和
- 执行辗转相除直到余数为0 (求gcd过程).对于每次迭代 :
- 计算商和余数
- 更新系数和
- 结束条件:当某个余数 时,前一个非零余数 就是 和 的最大公约数,而对应的 和 即为满足等式的系数 和
int exgcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1;
y = 0;
return a; // 返回gcd(a, b)
}
int r = exgcd(b, a % b, x, y);
int t = y;
y = x - (a / b) * y;
x = t;
return r;
}
上述代码中传入参数x,y最后会变为一组特解,返回的r是a,b的最大公因数