\(GCD(a,b)=GCD(b,a\%b)\)spa
设\(a=bk+c\),显然有\(c=a\%b\)。设\(d|a\ \ \ d|b\),则code
\[ c=a-bk \]递归
\[ \frac{c}{d}=\frac{a}{d}-\frac{b}{d}k \]element
由右边的式子可知\(\frac{c}{d}\)为整数,即\(d|c\)因此对于\(a,b\)的公约数,它也会是\(a\%b\)的公约数。io
反过来也须要证实class
设\(d|b\ \ \ d|(a\%b)\),咱们仍是能够像以前同样获得如下式子扩展
\[ \frac{a\%b}{d}=\frac{a}{d}-\frac{b}{d}k \]gc
\[ \frac{a\%b}{d}+\frac{b}{d}k=\frac{a}{d} \]方法
由于左边式子显然为整数,因此\(\frac{a}{d}\)也为整数,即\(d|a\),因此\(b,a\%b\)的公约数也是\(a,b\)的公约数。di
既然两式公约数都是相同的,那么最大公约数也会相同
因此获得式子
\[ gcd(a,b)=gcd(b,a\%b) \]
因此咱们能够写出一个递归式,层层深刻,直到 \(b%(a%b)==0\),即正好为倍数整除时,递归回去就好了
int gcd(int a,int b) { if(b==0) return a; return gcd(b,a%b); }
最后的返回值天然为\(a,b\)的最大公因数
目的:求\(ax+by=gcd(a,b)\)的一组可行解
证实
---
设
\[ ax_1+by_1=gcd(a,b) \]
\[ bx_2+(a\,mod\,b)y_2=gcd(b,a\,mod\,b) \]
由欧几里得定理可知:
\[ gcd(a,b)=gcd(b,a\,mod\,b) \]
因此
\[ ax_1+by_1=bx_2+(a\,mod\,b)y_2 \]
又由于
\[ a\,mod\,b=a-(\lfloor\frac{a}{b}\rfloor*b) \]
因此
\[ ax_1+by_1=bx_2+(a-(\lfloor\frac{a}{b}\rfloor*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) \]
由于\(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\)回去求解,就像\(GCD\)同样的方法
int Exgcd(int a,int b,int &x,int &y) { if (!b) { x=1;y=0; return a; } int d=Exgcd(b,a%b,x,y); int t=x; x=y; y=t-(a/b)*y; return d; }
返回的值为\(GCD\),在这个过程当中计算\(x,y\)便可