拓展欧几里得算法

如果还不太熟欧几里得算法戳这里

既然被称为拓展欧几里得算法
它和\(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\)就是目标方程的一组特解了

结语

这个拓展欧几里得算法从欧几里得算法入手
可以解决一些逆元相关的问题(之后会说,会放链接的)
还是很普遍的,知识较为基础,望大家掌握

posted @ 2020-08-04 21:52  Realityang  阅读(137)  评论(0编辑  收藏  举报