---
# System prepended metadata

title: 擴展歐幾里德算法

---

# 擴展歐幾里德算法

----

給定整數$a、b$，求一組滿足$ax+by=gcd(a,b)$的整數解$(x,y)$
假設$a>b$
$1.$當$gcd(a,b)=b$時，可得$x=0,y=1$

$2.$根據歐幾里德算法(輾轉相除法)可得$gcd(a,b)=gcd(b,a$ $mod$ $b)=gcd(b,a-k*b)$，$k=\lfloor \frac{a}{b} \rfloor$
故$ax_1+by_1=gcd(a,b)=gcd(b,a-k*b)=bx_2+(a-k*b)y_2$
展開後得到$ax_1+by_1=a*y_2+b*(x_2-k*y_2)$
故$x_1=y_2，y_1=x_2-k*y_2$
於是我們可以用遞迴的方式得出一組解$x_1，y_1$

程式碼:
```=C++
void exgcd(int a,int b,int &x,int &y)
{
	if(a%b==0)
	{
		x=0; y=1;
		return ;
	}
	exgcd(b,a%b,x,y);
	int k=a/b,x2=x;
	x=y; y=x2-k*y;
}
```

----
# 求解不定方程
一不定方程式$ax+by=c$有解若且唯若$gcd(a,b)\mid c$

設$(x_1，y_1)$滿足$ax_1+by_1=gcd(a,b)$，另一組解為$(x_2，y_2)$
$ax_1+by_1=gcd(a,b)=ax_2+by_2$，移項後得$a(x_1-x_2)=b(y_2-y_1)$
同除以$gcd(a,b)$得$a'(x_1-x_2)=b'(y_2-y_1)$，其中$a'=\frac{a}{gcd(a,b)}，b'= \frac{b}{gcd(a,b)}$
因$a'、b'$互質，故$b' \mid (x_1-x_2)$
設$(x_1-x_2)=kb'$，則$a'(x_1-x_2)=a'b'k=b'(y_2-y_1)$，$a'k=(y_2-y_1)$
由上可得以下結論
設$(x,y)$為$ax+by=gcd(a,b)$的一組解，則其他整數解$(x',y')$滿足$x'=x-k*\frac{b}{gcd(a,b)}，y'=y+k*\frac{a}{gcd(a,b)}$，其中$k$為任意整數
而$ax+by=c$的解只要將$(x_1，y_1)$同乘以$\frac{c}{gcd(a,b)}$便能得到

----
# 求解線性同餘方程
$ax≡b$ $mod$  $n$可以寫成$ax=b+kn$
移項後得$ax-nk=b=ax+n(-k)=b$
由上述可知此線性同餘方程有解若且唯若$gcd(a,n)\mid b$
於是便可利用求解不定方程的方法求出$x$
但因為是在模運算下，所以只求$0\leq x<n$的解即可

----
# 求模逆元
相當於求$ax≡1$ $mod$  $n$ $(n!=1)$
可知$a$在模$n$下的模逆元存在若且唯若$gcd(a,n)=1$