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 了
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现