拓展欧几里得算法

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

既然被称为拓展欧几里得算法
它和(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
原文地址:https://www.cnblogs.com/yang-RA-NOI/p/13436345.html