【总结】扩展欧几里得算法

扩展欧几里得定理

(开头日常唠叨)扩展欧几里得定理它好像只是被板子就行,但你要是自己推一遍的话肯定印象更深刻啊qwq

我们已知(ax + by = gcd(a, b)) 求x, y的值

考虑当b =0的时候(gcd(a,b))= a,此时y = 0,x = 1;

我们在朴素的欧几里得定理中

int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}

最终的状态中b同样也等于0,我们猜想可以借助欧几里得定理求解上述的二元一次方程

假设(bx′ +(a mod b)y′ = gcd(a, b))有解,求原方程的解

我们可以对式子进行化解

[a mod b=a-lfloor frac {a}{b} floor \ bx′+(a-lfloor frac {a}{b} floor)y′ = gcd(a,b) \ ay'+b(x'-lfloor frac{a}{b} floor*y')=gcd(a,b) ]

又因为原方程

[ax+by=gcd(a,b) ]

所以$x=y' (并且)y=x'-lfloor frac{a}{b} floor*y'$

所以我们可以在每次递归过程求解gcd中求解出满足方程的x,y

算是一些小推论?

1.在a和b互质的情况下

ax+by=1一定存在一组解,并且x是a的逆元

2.对于c是gcd(a,b)的倍数,ax+by=c也一定有解

Code

特别提醒一点啊qwq

如果x和y并不是全局变量需要写成gcd(ll a,ll b,&x,&y);

因为每一次x和y的值都要记录返回到上一状态里

void gcd(ll a,ll b){
	if(b==0){x=1;y=0;return;}
	gcd(b,a%b);
	ll temp=x;
	x=y;y=temp-a/b*y;
} 

嗯,没了没了没了别看了qwq

原文地址:https://www.cnblogs.com/huixinxinw/p/12207417.html