主要是寫在這裡供自己以後複習查閱所用。
求特解
由輾轉相除法(歐幾里得演算法)可得 \(\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)\)