exgcd|扩展欧几里得算法|扩展欧几里得算法证明|exgcd求逆元 一文说明白
exgcd
扩展欧几里得算法(Extended Euclidean algorithm, EXGCD),常用于求 \(ax+by=\gcd(a,b)\) 的一组可行解。
部分选自OI Wiki
扩展欧几里得算法
是 欧几里得算法 的扩展。
扩展欧几里得算法证明
很简单,我们一步一步来(我们定义 \(a\geq b\)):
根据 欧几里得算法 得到 \(\gcd(a,b)=\gcd(b,a\mod b)\) ,所以 \(a \times x_1 + b \times y_1 = b \times x_2 + (a \mod b) \times y_2\) 。
因为 \(a \mod b = a-\lfloor\frac{a}{b}\rfloor \times b\) (这一点很容易理解)
所以 \(a \times x_1 + b \times y_1 = b \times x_2 + (a-\lfloor\frac{a}{b}\rfloor \times b) \times y_2\) 。
把 \(b \times x_2 + (a-\lfloor\frac{a}{b}\rfloor \times b) \times y_2\) 化简得 \(b \times x_2 + a \times y_2-\lfloor\frac{a}{b}\rfloor \times b \times y_2\) 。
再整理一下得 \(a \times y_2 + b \times (x_2 -\lfloor\frac{a}{b}\rfloor \times y_2)\)
和 \(a \times x_1 + b \times y_1\) 一一对应得到:
即
欸,这样不就可以通过递归算出了吗?(可以自己手算一下)
扩展欧几里得算法边界
我们的 扩展欧几里得算法 总需要一个边界,所以我们规定了当 \(b=0\) 时(在 欧几里得算法 中我们也是以b=0为边界,具体可看那篇文章),我们的 \(a \times 1 + b \times 0 = a = \gcd(a,b)\) ,所以当 b=0 时
扩展欧几里得算法代码
template<typename T>
void exgcd(T a,T b,T &x,T &y){
if(b==0){
x=1,y=0;
return;
}
exgcd(b,a%b,y,x); // 注意x,y的顺序
// 计算x,y
y-=a/b*x;
}
例题
求逆元
(upd:20230816)
老是会忘,记一下
逆元的定义:
我们是不是可以用exgcd求 b 了