gcd和扩展欧几里得exgcd--zhengjun
\(\gcd\)
定义:求出两个数的最大公因数。
算法定律:\(\gcd(a,b)=\gcd(b,a\bmod b)\)
证明:
设\(\gcd(a,b)=k,a=t_1\times k,b=t_2\times k\)
可知,\(\gcd(t_1,t_2)=1\),如果还有一个\(t\),那么就可以说明\(a,b\)还有一个公共素因数\(t\),与原意不符。
所以\(\gcd(t_2\times k,(t_1\times k)\bmod(t_2\times k))\)
\(=\gcd(t_2\times k,(t_1\bmod t_2)\times k)\)
由于\(t_1,t_2\)互质,所以\(t_2\)和\(t_1\bmod t_2\)互质,所以\(\gcd(t_2\times k,(t_1\bmod t_2)\times k)=k\),命题得证
代码
int gcd(int x,int y){
if(!y)return x;
return gcd(y,x%y);
}
扩展欧几里得,exgcd
定义:求出方程\(ax+by=c\)的解
为了使原方程有解,则\(\gcd(a,b)|c\),(\(c\)能被\(\gcd(x,y)\)整除)
证明:反正就是一个裴蜀定理,我就不说了。
然后,只要我求出方程\(ax+by=\gcd(a,b)\),就可以求出上面方程了。
当\(b=0\)时,\(x=1,y=0\)
当\(b\ne0\)时,因为\(ax+by=\gcd(a,b)=\gcd(b,a\bmod b)=bx'+a\bmod b\times y'\)
所以\(ax+by=bx'+a\bmod b\times y'=bx'+(a-\lfloor\frac{a}{b}\rfloor\times b)y'=bx'+ay'-\lfloor\frac{a}{b}\rfloor\times b\times y'=ay'+b(x'-\lfloor\frac{a}{b}\rfloor y')\)
所以,左右\(a,b\)的系数对应得
所以代码就是:
int x,y;
void exgcd(int a,int b,int x,int y){
if(b==0){x=1;y=0;return;}
exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
}