gcd, exgcd
\(gcd(a,b)=gcd(b,a\%b)\)
int gcd(int a, int b) return b ? gcd(b, a % b), a;
证明 :
\(设r=a\%b,则a=kb+r.\)
\(设d是(a,b)的公约数,则d\mid a, d\mid b,因为r=a-kb,所以d\mid r,因此d也是(b,a\%b)的公约数.\)
\(设d是(b,a\%b)的公约数,则d\mid b, d\mid r, 因为a=kb+r,所以d\mid a,因此d也是(a,b)的公约数.\)
\(综上,gcd(a,b)=gcd(b,a\%b).\)
扩展欧几里得定理 : \(exgcd(a,b,x,y)\)
对于任意正整数\(a,b\), 必能找到整数\(x,y\), 使得 \(ax+by=gcd(a,b).\)
void exgcd(int a, int b, int &x, int &y) {
if (!b) {
x = 1, y = 0;
return;
}
exgcd(a, b, y, x);
y -= a / b * x;
}
推导 :
\(设gcd(a,b)=d.\)
\(bx_1+(a\%b)y_1=d\)
\(即:bx_1+(a-[\frac{a}{b}]*b)y_1=d\)
\(整理得:ay_1+b(x_1-[\frac{a}{b}]*y_1)=d\)
\(因此:\)
\(x_0=y_1\)
\(y_0=x1-[\frac{a}{b}]*y_1\)