擴展歐幾里得算法複習筆記(未完成)

參考資料:https://www.cnblogs.com/haveyoueverbeen/p/4612753.html

求方程 ax+by=c (x,yZ)ax+by=c\:(x,y \in \Z) 的解

擴展歐幾里得算法是一種用來求關於 x,yx,y 的方程 ax+by=gcd(a,b) (x,yZ)ax+by=gcd\left(a,b\right)\:(x,y \in \Z) 的一組解的算法.

考慮方程 ax+by=gcd(a,b) (a>b)ax+by=\gcd\left(a,b\right)\:(a>b)(方程 (1)),

1. b=0b=0 時,gcd(a,b)=a\gcd\left(a,b\right)=a(1,0)\left(1,0\right) 是該方程的一組解;

2. 設 (x1,y1)\left(x_1,y_1\right) 是方程 bx+(amod  b)y=gcd(b,amod  b)bx+\left(a \mod b\right)y=gcd\left(b,a \mod b\right)(方程 (2)) 的一組解,
所以 bx1+(amod  b)y1=gcd(b,amod  b)bx_1+\left(a \mod b\right)y_1=gcd\left(b,a \mod b\right).
gcd(a,b)=gcd(b,amod  b)\gcd\left(a,b\right)=\gcd\left(b,a \mod b\right)
bx1+(amod  b)y1=gcd(a,b)bx_1+\left(a \mod b\right)y_1=\gcd\left(a,b\right)
bx1+(aabb)y1=gcd(a,b)bx_1+\left(a - \left\lfloor\dfrac{a}{b}\right\rfloor b\right)y_1=\gcd\left(a,b\right)
ay1+b(x1aby1)=gcd(a,b)ay_1+b\left(x_1-\left\lfloor\dfrac{a}{b}\right\rfloor y_1\right)=\gcd\left(a,b\right).
所以 (y1,x1aby1)\left(y_1,x_1-\left\lfloor\dfrac{a}{b}\right\rfloor y_1\right) 是該方程的一組解.

因此要(yào)求方程 (1)的一組解,我們先考慮 bb,如果 b=0b=0​,方程 (1)的一組解就是 (1,0)(1,0)​,否則遞歸求方程 (2) 的一組解,然後利用方程2的一組解得到方程 (1) 的一組解。

代碼:

template<typename T>
pair<T, T> exgcd(const T a, const T b)
//exgcd(x,y):返回關於 x,y 的方程 ax+by=gcd(a,b) 的一組解
{
	if(b == 0)
		return pair<T, T>(1, 0);
	pair<T, T> tmp = exgcd(b, a % b);
	return pair<T, T>(tmp.sec, tmp.fir - (a / b) * tmp.sec);
}

通過這個算法,我們得到了方程 (1) 的一組解,可以由這組特解寫出它的通解:x=x1+kb,y=y1kax=x_1+kb,y=y_1-ka.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章