最大公约数及扩展欧几里得算法
定理一
\(a\ mod\ b = a - b * \lfloor \frac {a}{b} \rfloor\)
证明:
\[\because a = k * b + r
\\\therefore \lfloor \frac{a}{b} \rfloor = k
\\即 a \ mod \ b = r, a - b * \lfloor \frac{a}{b} \rfloor
\]
定理二 辗转相除法
\(gcd(a,b) = gcd(b, a\ mod\ b)\)
证明:
\[设d = gcd(a, b)
\\则有d|a,\ d|b
\\令c = a\ mod\ b
\\\because a = k * b + c
\\\therefore d|a = d|(k * b + c)\Longrightarrow d|c
\\即d|b,\ d|gcd(a, b)
\\d = gcd(b, a\ mod\ b)
\]
int gcd(int a, int b) return b ? gcd(b, a % b) : a;
定理三 裴蜀定理
\(ax + by = c有整数解 \iff gcd(a,b)|c\)
证明:
首先证明必要性:
\[\because gcd(a,b) | a,\ gcd(a,b) | b
\\\therefore gcd(a,b) | (ax + by)
\\即gcd(a, b) | c
\]
再证明充分性:
\[设d = gcd(a, b)
\\则d|a,\ d|b,\ d|(ax + by)
\\设s=ax + by线性组合中的最小正元
\\令q=\lfloor \frac{a}{s} \rfloor
\\由定理一可得a\ mod\ s = a - q * s
\\即r = a\ mod\ s = a - q * (ax + by) = a * (1 - qx) + b * (-qy)
\\可以说明r也是ax + by线性组合中的元素
\\\because 0 <= r < s,s是最小正元
\\\therefore r = 0
\\即s|a
\\同理可以说明 s|b
\\即s是a,b的一个公约数
\\\because d >= s, d|s
\\\therefore d = s
\\即gcd(a,b)是ax + by线性组合中的最小正元,得证
\]
推理
\(ax + by = 1有整数解 \iff 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)
\\由定理一、二可得ax_1 + by_1 = bx_2 + (a\ mod\ b)y_2 = bx_2 + (a - \lfloor \frac{a}{b} \rfloor b)y_2
\\可得ax_1 + by_1 = ay_2 + b(x_2 - \lfloor \frac{a}{b} \rfloor)y_2
\\由对应项相等可得 x_1 = y_2,\ \ y_1 = x_2 - \lfloor \frac{a}{b} \rfloor y_2
\]
int exgcd(int a, int b, int &x, int &y) {
int d = a;
if(b) {
d = exgcd(b, a % b, y, x);
y -= (a / b) * x;
} else {
x = 1, y = 0;
}
return d;
}