扩展欧几里得学习笔记
温馨提示:本文推式子比较多,建议跟着文章自己推一推。
扩展欧几里得是什么
扩展欧几里得(exgcd)是一个可以用来求
求解
首先,如果
设此方程的解为
那么我们需要做的就是将
设另一个方程:
令
则该方程转化为
我们会发现它和原方程的格式是一样的,而且根据欧几里得原理,它可以一直递推到
那假设我们已经求得了该结果,那如何推导出
我们首先研究如何从
因为
且根据欧几里得定理,
所以
且
所以
这样,我们就由
于是乎:
struct node
{
int x,y;
};
node exgcd(int a,int b)
{
if(b==0)
{
node tmp;
tmp.x=1,tmp.y=0;
return tmp;
}
node tmp=exgcd(b,a%b);//递归求出x_(k+1)和y_(k+1)
node ans;
ans.x=tmp.y,ans.y=(tmp.x)-a/b*(tmp.y);//推导出x_k和y_k
return ans;
}
这样,我们就求出了
的一组解
我们已经求出了
那么我们就可以知道
又因为要求
所以
所以很简单:
3. 的所有解
我们已经求出了
即
将它加上再减去
在
所以
这个变换进行多次,即可得到
和 各自的最小正整数解
以
求出任意一组解
因为将
同理对于
完结撒花
至此,你已经学完了扩展欧几里得的基础用法,如有不懂的地方,建议对照着文章自己推一推,悟一悟。
做个题练习一下吧:洛谷 P5656 【模板】二元一次不定方程 (exgcd)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步