最大公约数
欧几里德算法
结论:\(\operatorname{gcd}(a, b)=\operatorname{gcd}(b, a \bmod b)\) 。
[!证明]
1.证明 \(\operatorname{gcd}(a, b) | \operatorname{gcd}(a\bmod b, b)\):
设 \(d = \operatorname{gcd}(a, b)\),\(a = md\),\(b = nd\)。
设 \(r = a\bmod b\),则有 \(a = kb + r\),则 \(r = a - kb\)。
\(r = md - k(nd) = d(m - nk)\),则 \(d | r\)。
令 \(g = \operatorname{gcd}(a\bmod b, b)\),则 \(d | g\)。
2.证明 \(\operatorname{gcd}(b, a\bmod b) | \operatorname{gcd}(a, b)\):
设 \(r = gt\),则 \(a = kb + r = k(gm) + gt = g(mk + t)\),则 \(g | a\),则 \(g | d\)。
3.得出结论
因为 \(d | g\) 且 \(g | d\),则 \(d = g\),即 \(\operatorname{gcd}(a, b)=\operatorname{gcd}(b, a \bmod b)\)。
代码:
int gcd(int a, int b){//gcd(a, 0) = 0return (b == 0 ? a : gcd(b, a % b));
}
时间复杂度:\(O(\log\max(a, b))\)。
[!证明]
- \(a < b\) 则 \(\operatorname{gcd}(a, b) = \operatorname{gcd}(b, a\bmod b)\)。
- \(a\ge b\) 则 \(\operatorname{gcd}(a, b) = \operatorname{gcd}(b, b/bmod a)\),而至少会让 \(a\) 折半,此种情况出现次数小于等于 \(\log a\)。
而第一种情况出现后必会出现第二种情况,而第二种情况出现次数小于等于 \(\log a\),若每次出现第二种情况后都出现第一种情况,则总递归时间复杂度为 \(O(\log\max(a, b))\)。
扩展欧几里德算法
概念:常用于求 \(ax + by = \operatorname{gcd}(a, b)\) 的一组可行解。