小学二年级都能看懂的扩展欧几里得学习笔记
一些闲扯
上次学扩展欧几里得是两年前,结果中考复习期间不动电脑,直接忘得一干二净
然后两个月前又看了一遍,今天要用的时候发现还是不熟练(看了个寂寞属于是)
别人化身狂暴切题组长的时候我在复习
而且网上的一大堆博客看得我晕晕乎乎费老大劲才彻底搞明白,这时其他人已经a了三四道了orz
于是下定决心开了个blog,直接自己写一个小学二年级都能看懂的学习笔记,这样我再忘掉知识点的时候就直接看这篇就能秒懂了罢(希望)
这是本人第一篇blog,不知写得怎么样(虽然写得差我也改不了)
前置算法——欧几里得(辗转相除)
计算a与b的最大公约数
令
即
又
所以
同理,令
所以
故
递归下去,直到
此时
代码如下,非常简单:
void gcd(ll a,int b){ if(!b){ return a; } return gcd(b,a%b); }
拓展欧几里得
介绍
总之就是求解不定方程
直接讲方法
原理
首先考虑证明对于
首先证明必要性,这非常简单。
因为
所以
所以
接下来证明充分性,而这就涉及到裴蜀定理
裴蜀定理
裴蜀定理内容如下:设
说人话就是当
(直接解出来
证明如下:
设
显然
可见
又因为
也就是说,在
所以
所以
令
由于
由于
所以
所以
证毕
解方程
在证明了上面的结论后,我们就可以尝试解决
首先由于只有
对于
上面一部分或许有点绕。简而言之,我们列出了两个方程:
根据
可得
然后将右边表示成
由于
不难发现,如果知道
而为了解出
以此类推解出
我们假设我们得到这么一个方程
根据前面欧几里得算法可得知,当
此时原方程可表示为
显然此方程有一组解
将其递归回去,即可解出
代码也是非常简单
void exgcd(ll a,int b,ll &x,ll &y){ if(!b){ x=1,y=0; } else{ exgcd(b,a%b,y,x);//此时 x=y1,即为方程的解,y=x1 y-=x*(a/b); //此时 y=y-x*(a/b)=x1-y1*(a/b) 为方程的解 } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】