拓展欧几里得算法
如果还不太熟欧几里得算法戳这里
既然被称为拓展欧几里得算法
它和\(a,b,a\)%\(b\)脱不了干系
首先我们设方程\(ax+by=gcd(a,b)\)
若已知道了\(x1,y1满足bx1+(a\)%\(b)y2=gcd(a,b)\)的一组解
要求\(ax+by=gcd(a,b)\)的一组解
而\(a\)%\(b=a-(a/b)*b\)
则可列出式子:
\(bx1+(a-(a/b)*b)y1=gcd(a,b)\)
开始整理:
\(bx1+ay1-(a/b)*b*y1=gcd(a,b)\)
提出\(a,b\):
\(ay1+b(x1-a/b*y1)=gcd(a,b)\)
\(ax+by=gcd(a,b)\)
对比发现当\(x\)取\(y1,y\)取\(x1-a/b*y1\)时方程成立!
于是就可以快乐地赋值求解了
然后当\(b==0\)时方程变为了\(ax+0y=gcd(a,b)=a\)
则此时的解为\(x=1,y=0\)
这样子再递归回溯就可以解出\(ax+by=gcd(a,b)\)的解了
代码长这样↓
int exgcd(int a,int b){
if(b==0){
x1=1,y1=0;
return a;
}
return exgcd(b,a%b);
int x=y1,y=x1-a/b*y1;
x1=x,y1=y;
}
最后的\(x1\)和\(y1\)就是目标方程的一组特解了
结语
这个拓展欧几里得算法从欧几里得算法入手
可以解决一些逆元相关的问题(之后会说,会放链接的)
还是很普遍的,知识较为基础,望大家掌握
Reality&Imagine