1. 程式人生 > 實用技巧 >拓展歐幾里得演算法

拓展歐幾里得演算法

如果還不太熟歐幾里得演算法戳這裡

既然被稱為拓展歐幾里得演算法
它和\(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\)就是目標方程的一組特解了

結語

這個拓展歐幾里得演算法從歐幾里得演算法入手
可以解決一些逆元相關的問題(之後會說,會放連結的)
還是很普遍的,知識較為基礎,望大家掌握