我们发现如果 $b$ 是 $a$ 的约数,那么 $b$ 就是二者的最大公约数。
下面讨论不能整除的情况,即 $a = b \times q + r$,其中 $r < b$。
-我们通过证明可以得到$gcd(a,b)=gcd(b,a\,mod\,b)$,过程如下:
+我们通过证明可以得到$\gcd(a,b)=\gcd(b,a \mod b)$,过程如下:
* * *
-设$a=bk+c$,显然有$c=a\,mod\,b$。设$d|a\ \ \ d|b$,则
+设$a=bk+c$,显然有$c=a \mod b$。设$d|a\ \ \ d|b$,则
$c=a-bk$
$\frac{c}{d}=\frac{a}{d}-\frac{b}{d}k$
-由右边的式子可知$\frac{c}{d}$为整数,即$d|c$所以对于$a,b$的公约数,它也会是$a\,mod\,b$的公约数。
+由右边的式子可知$\frac{c}{d}$为整数,即$d|c$所以对于$a,b$的公约数,它也会是$a \mod b$的公约数。
反过来也需要证明
-设$d|b\ \ \ d|(a\,mod\,b)$,我们还是可以像之前一样得到以下式子
-$\frac{a\,mod\,b}{d}=\frac{a}{d}-\frac{b}{d}k$
-$\frac{a\,mod\,b}{d}+\frac{b}{d}k=\frac{a}{d}$
-因为左边式子显然为整数,所以$\frac{a}{d}$也为整数,即$d|a$,所以$b,a\,mod\,b$的公约数也是$a,b$的公约数。
+设$d|b\ \ \ d|(a \mod b)$,我们还是可以像之前一样得到以下式子
+$\frac{a\mod b}{d}=\frac{a}{d}-\frac{b}{d}k$
+$\frac{a\mod b}{d}+\frac{b}{d}k=\frac{a}{d}$
+因为左边式子显然为整数,所以$\frac{a}{d}$也为整数,即$d|a$,所以$b,a\mod b$的公约数也是$a,b$的公约数。
既然两式公约数都是相同的,那么最大公约数也会相同
所以得到式子
-$gcd(a,b)=gcd(b,a\,mod\,b)$
+$\gcd(a,b)=\gcd(b,a\mod b)$
既然得到了$\gcd(a, b) = \gcd(b, r)$,这里两个数的大小是不会增大的,那么我们也就得到了关于两个数的最大公约数的一个递归求法。
}
```
-递归至$b==0$(即上一步的$a\,mod\,b==0$) 的情况再返回值即可。
+递归至`b==0`(即上一步的`a%b==0`) 的情况再返回值即可。
### 多个数的
## EXGCD - 扩展欧几里得定理
-目的:求$ax+by=gcd(a,b)$的一组可行解
+目的:求$ax+by=\gcd(a,b)$的一组可行解
## 证明
设
-$ax_1+by_1=gcd(a,b)$
+$ax_1+by_1=\gcd(a,b)$
-$bx_2+(a\,mod\,b)y_2=gcd(b,a\,mod\,b)$
+$bx_2+(a\mod b)y_2=\gcd(b,a\mod b)$
由欧几里得定理可知:
-$gcd(a,b)=gcd(b,a\,mod\,b)$
+$\gcd(a,b)=\gcd(b,a\mod b)$
所以
-$ax_1+by_1=bx_2+(a\,mod\,b)y_2$
+$ax_1+by_1=bx_2+(a\mod b)y_2$
又因为
-$a\,mod\,b=a-(\lfloor\frac{a}{b}\rfloor*b)$
+$a\mod b=a-(\lfloor\frac{a}{b}\rfloor\times b)$
所以
-$ax_1+by_1=bx_2+(a-(\lfloor\frac{a}{b}\rfloor*b))y_2$
+$ax_1+by_1=bx_2+(a-(\lfloor\frac{a}{b}\rfloor\times b))y_2$
-$ax_1+by_1=ay_2+bx_2-\lfloor\frac{a}{b}\rfloor*by_2=ay_2+b(x_2-\lfloor\frac{a}{b}\rfloor y_2)$
+$ax_1+by_1=ay_2+bx_2-\lfloor\frac{a}{b}\rfloor\times by_2=ay_2+b(x_2-\lfloor\frac{a}{b}\rfloor y_2)$
因为 $a=a,b=b$ ,所以
$x_1=y_2,y_1=x_2-\lfloor\frac{a}{b}\rfloor y_2$
-将 $x_2,y_2$ 不断代入递归求解直至 GCD(最大公约数,下同) 为 $0$ 递归 $x=1,y=0$ 回去求解。
+将 $x_2,y_2$ 不断代入递归求解直至 GCD(最大公约数,下同) 为 `0` 递归 `x=1,y=0` 回去求解。
```cpp
int Exgcd(int a, int b, int &x, int &y) {