擴充套件歐幾里得演算法公式快速推導

Jerrycyx發表於2024-10-25

主要是寫在這裡供自己以後複習查閱所用。


求特解

由輾轉相除法(歐幾里得演算法)可得 \(\gcd(a,b)=\gcd(b,a \bmod b)\)

由裴蜀定理,存在 \(x,y\) 使得 \(xa+yb=\gcd(a,b)\),存在 \(x',y'\) 使得 \(x'b+y'(a \bmod b)=\gcd(b,a \bmod b)\)

所以 \(xa+yb = x'b+y'(a \bmod b)\)

又因為 \(a \bmod b\) 可以寫成 \(a - \left\lfloor \dfrac{a}{b} \right\rfloor \times b\)

所以 \(xa+yb = x'b + y' \left( a - \left\lfloor \dfrac{a}{b} \right\rfloor \times b \right)\)

轉化右式,\(xa+yb = y'a + \left( x'- \left\lfloor \dfrac{a}{b} \right\rfloor \times y' \right) b\)

這樣,左右式就變成了同一個形式,在每次進行輾轉相除返回時時令:

\[\left\{ \begin{aligned} x&=y'\\ y&=x'- \left\lfloor \dfrac{a}{b} \right\rfloor \times y' \end{aligned} \right. \]

其中 \(x',y'\) 分別表示後面遞迴返回的 \(x,y\)

\(b=0\) 時,因為 \(a+b=a=\gcd(a,0)=\gcd(a,b)\),所以此時 \(x=1,y=1\)

模板程式碼:

int exgcd(int a,int b,int &x,int &y)
{
	if(b)
	{
		int res=exgcd(b,a%b,x,y);
		int x_=x;
		x=y,y=(x_-(a/b)*y);
		return res;
	}
	else
	{
		x=1,y=1;
		return a;
	}
}

求通解

解不定方程 \(xa+yb=c\)

\(d=\gcd(a,b)\)

相關文章