如果还不太熟欧几里得算法戳这里
既然被称为拓展欧几里得算法
它和(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)就是目标方程的一组特解了
结语
这个拓展欧几里得算法从欧几里得算法入手
可以解决一些逆元相关的问题(之后会说,会放链接的)
还是很普遍的,知识较为基础,望大家掌握