# 擴展歐幾里德算法 ---- 給定整數$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$