年年背,年年忘,必须来记一下了
拓展欧几里得−Exgcd
即为辗转相除法的运用
这是一个常用的求 gcd(a,b) 的东西,然后由于其性质,还可以用来求诸如 ax+by=c 的二元一次不定方程,在gcd(a,b)=1 时就变成了求 ax+by=1 即 a 在 mod b 意义下的逆元: ax≡1(mod b)
性质及其原理:
1. gcd(a,b)∣c
首先,对于拓展欧几里得,它是用来求诸如 ax+by=c 的二元一次不定方程,如果想让这个方程在整数范围内有解,就必有:gcd(a,b)∣c :
证明1:
在整数范围内:
gcd(a,b)∣a 且 gcd(a,b)∣b
所以 gcd(a,b)∣(ax+by) 即 gcd(a,b)∣c
2. 辗转相除法的依据
gcd(b,(a mod b))=gcd(a,b)
证明2.
我们不妨设 a>b
则 a 可以表示为 kb+r 且 a mod b=r
所以 r=a−kb
再设 g 为 a,b 的约数,则有 g∣a 和 g∣b
所以 g∣r
所以 (a,b) 与 (b,(a mod b)) 的约数相等
又由于 r=a mod b<a
所以 gcd(b,r)≤gcd(a,b)
所以 gcd(b,(a mod b))=gcd(a,b)
3. 辗转相除法的运用
关于如何运用辗转相除求 ax+by=c ( gcd(a,b)∣c ) 和正确性。
证明3:
求 ax+by=c ( gcd(a,b)∣c )
可以转化成 :
ax′+by′=gcd(a,b)
x′=x×cgcd(a,b) y′=y×cgcd(a,b)
那么,现在我们要求 ax+by=gcd(a,b) \textcircled 1
我们先设 G=gcd(a,b)
然后,如果我们已经找到了一个有一个特解的式子:
bx1+(a mod b)y1=G \textcircled 2
(意思是若已知 x1 和 y1 )
(这个式子必然存在,原理见2.)
那么,我们就将问题变成了通过 \textcircled 2 来得到 \textcircled 1 的一组特解:
具体如下:
由 \textcircled 1\textcircled 2 得:
ax+by=bx1+(a mod b)y1
又因为:
a mod b=a−⌊ab⌋×b
所以:
ax+by=bx1+(a−⌊ab⌋×b)y1
ax+by=ay1+b(x1−⌊ab⌋×y1)
所以可得 \textcircled 1 的一组特解:
x=y1 , y=(x1−⌊ab⌋×y1)
然后,既然已知可由 \textcircled 2 的一组特解求 \textcircled 1 那现在就变成了求 \textcircled 2 的一组特解。
你会发现 \textcircled 2 也是类似于:a1x1+b1y1=G 的形式
那么我们就可以递归:
akxk+bkyk=G
bkxk+1+(ak mod bk)yk+1=G
然后设: ak+1=bk , bk+1=(ak mod bk)
就可以进行下一层了。
到最后一定有某一层 bi=0
此时 ai=G
所以我们就有了一组特解:
{xi=1 yi=0
(此时 yi 的值可以任取)
然后一层层回溯就可以求解原式子的 x0,y0
注意此时求出来的 x0 和 y0 是 ax0+by0=gcd(a,b) 的解, 最后还要乘上 cgcd(a,b) 才是原式子 ax+by=c 的解
即 x=x0×cgcd(a,b) , y=y0×cgcd(a,b)
4. 求通解
证明4:
既然已经知道了如何求某一组 x,y ,那么我们如何求出所有我们需要的 x,y 呢?
我们设一个数 d ,则有:
a(x1+db)+b(y1−da)=c
(请自行拆括号)
为方便下文的理解,我们也可以写成:
a(x1+bd)+b(y1−ad)=c
(同理)
因为我们一直都是在整数范围内研究,所以 bd,ad 都为整数。
并且我们希望可以通过这个式子来递推求出所有的解,所以我们希望它们最小。
综合以上两点,就意味着:
d∣a,d∣b ,且 d 最大
所以 d=gcd(a,b)
那么,可以设 dx=bgcd(a,b) , dy=agcd(a,b)
s 为任意整数
则所有的整数解为:
{x=x1+s×dxy=y1+s×dy
题目:
先来一道模板:
那么,上代码:
Code:
ll ls;
inline void exgcd(ll a,ll b,ll& x,ll & y)
{
if(b==0){x=1;y=0;return;}
exgcd(b,a%b,x,y);
ls=x; x=y;
y=ls-(a/b)*y;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】