扩欧(exgcd讲解)
注意本文的证明都来源于这位大大大大大大大牛
知识点.扩展欧几里得求逆元
看完下面的证明后建议联系一下这题同余方程
可以对exgcd的用途和写法有有初步了解。
\(问题描述:对于三个自然数 a,b,c ,求解 ax+by=c 的 (x,y) 的整数解\)
\(先说一下贝祖定理: 两个整数 a、b 是互质的,等价于方程 ax+by=1有整数解。\)
\(更一般的,对于任意的k有ax+by=gcd(a,b)*k\)有整数解
注意,接下来才是正题
我们想求一组x,y使得
\[ax+by=gcd(a,b)
\]
\(根据b!=0可得\)
\[gcd(a,b)=gcd(b,a\%b)
\]
那就可以假设有\(x'、y'满足\)
\[bx'+(a\%b)y'=gcd(b,a\%b)
\]
\(替换一下也就是\)
\[ax+by=bx'+(a\%b)y'
\]
\(注意到(\frac{a}{b}向下取整)\)
\[a\ \%\ b=a-(\frac{a}{b})b
\]
\(替换进去得到\)
\[ax+by=bx'+(a-(\frac{a}{b})b)y'
\]
\(既然左边有a,b。那我们也对右边提取a,b\)
\[ax+by=ay'+b(x'-\frac{a}{b}y')
\]
聪明的你一定发现了这个东西是个递归的式子,那么我们肯定要找到那组base case(也就是递归基).
\(这样递归下去,当b=0时要满足ax+by=gcd(a,b).即为x=1,y=0\)
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b) x=1,y=0;
else exgcd(b,a%b,y,x),y-=a/b*x;
}
\(算i对p的逆元时\)
\(exgcd(i,p,x,y)算出的x就是逆元了。\)