首先感谢 C20210413 大佬, C20211711LJS 社花大佬,14大佬对于正确使用 (markdown) 语法给予的帮助
人物介绍
欧几里得:(英文:(Euclid);希腊文:Ευκλειδης ,约公元前330年—公元前275年),古希腊人,数学家,被称为“几何之父”。他最著名的著作《几何原本》是欧洲数学的基础,提出五大公设,欧几里得几何,被广泛的认为是历史上最成功的教科书。欧几里得也写了一些关于透视、圆锥曲线、球面几何学及数论的作品。
算法本身
欧几里得算法,即辗转相除法,用于求 (a, b) 两数的最大公约数数------ (gcd(a, b))
结论:(gcd(a, b) = gcd(b, a mod b))
证明:我们设 (r = a mod b),显然 (r) 也可以表示为 (r = a - k imes b),其中 (k = a / b)。
假设 (d) 是 (a, b) 的一个公约数,则有:(a mod d = 0),(b mod d = 0)。
设 (a = x imes d, b = y imes d),且 (x, y) 为整数。而 (r = a - k imes b)。
所以 (r = x imes d - y imes d imes k = (x - k imes y) imes d),显然,(x - k imes y) 为整数。
所以 (r) 是 (d) 的倍数。所以 (r mod d = 0),又因为 (b mod d = 0),且 (r = a mod b)。
所以有:(d = gcd(b, a mod b))
根据以上原理,经过一步代换后,一定会出现 (a > b)。以后的每次代换一定会将 (a, b) 不断的缩小,而当 (b = 0) 时,它们的最大公约数为 (a)。
代码实现
int gcd(int a, int b) {
if(b == 0) return a;
return gcd(b, a % b);
}
已被严格证明时间复杂度为:(O(log max(a, b)))
扩展欧几里得算法
简称扩欧。
可以在已知整数 (a, b) 的情况下求不定方程 (a imes x + b imes y = gcd(a, b)) 的一组整数解。
首先,我们来证明一个结论:对于整数 (a, b),必定存在整数 (x, y) 满足 (a imes x + b imes y = gcd(a, b))。
证明:设 (a imes x1 + b imes y1 = gcd(a, b)),且 (b imes x2 + (a mod b) imes y2 = gcd(b, a mod b))。
由欧几里得算法知:(gcd(a, b) = gcd(b, a mod b))。
所以 (a imes x1 + b imes y1 = b imes x2 + (a mod b) imes y2)。
因为 (a mod b = a - b imes k),所以 (a imes x1 + b imes y1 = b imes x2 + (a - b imes k) imes y2)。
又因为 (k = a / b),所以 (a imes x1 + b imes y1 = b imes x2 + (a - b imes (a / b)) imes y2)
整理得,(a imes x1 + b imes y1 = a imes y2 + b imes (x2 - (a / b) imes y2))
显然,(x1 = y2, y1 = (x2 - (a / b) imes y2)),其中 (x2, y2) 是关于 (gcd(b, amod b)) 的不定方程的解。这就和欧几里得算法联系起来了,因为 (x1, x2) 是由 (x2, y2) 得来的,且 (x2, y2) 关于 (gcd(b, a mod b)) 不断变小。
最后,当 (x, y) 是关于 (gcd(a, 0)) 的不定方程的解时,不难发现 (a imes x + b imes y = a), 所以此时 (x = 1, y = 0)。这就是递归求解的边界。故因为边界确定,所以对于整数 (a, b),必定存在整数 (x, y) 满足 (a imes x + b imes y = gcd(a, b))。
不难通过刚刚的证明过程,写出代码:
long long x, y;
void Ex_Gcd(long long a, long long b) {
if(b == 0) {
x = 1;
y = 0;
return ;
}
Ex_Gcd(b, a % b);
long long t = x;
x = y;
y = t - a / b * y;
}
应用
Part 1 判断不定方程 (a imes x + b imes y = c) 是否有解
根据扩欧:假设 (d = gcd(a, b)) ,则 (a imes x + b imes y = d) 一定有解。
所以 ((a imes x + b imes y) imes k = d imes k) 一定有解 ((k) 为整数)。
显然 (a imes x + b imes y = d imes k) 一定有解。
所以不定方程 (a imes x + b imes y = c) 中当 (c mod gcd(a, b) = 0) 时,方程有解。否则无解。
Part 2 不定方程 (a imes x + b imes y = c) 的通解
对于不定方程 (a imes x + b imes y = c),我们设 (d = gcd(a, b))。当 (c mod d = 0) 时有解。
利用扩欧求出 (a imes x' + b imes y' = gcd(a, b) = d) 的一组解 (x', y')。
则 (a imes x + b imes y = c) 一定有一组解为 (x = x' imes c / d, y = y' imes c / d)。
又因为原方程可化为 (a imes x + k imes a imes b + b imes y - k imes a imes b = c)。其中 (k) 为整数。
即 (a imes (x + b imes k) + b imes (y - a imes k) = c)。
所以 :
(x = x' imes c / d + b imes k / d)
(y = y' imes c / d - a imes k / d)
Part 3 模线性方程 (a imes x equiv b) ((mod) (n)) 的解
首先,如果 (a equiv b) ((mod) (n)),则 ((a - b) mod n = 0)。
所以,如果 (a imes x equiv b) ((mod) (n)),则 ((a imes x - b) mod n = 0)。
于是,我们设 (a imes x - b = n imes y),其中 (y) 为整数。
那么模线性方程 (a imes x equiv b) ((mod) (n))可化为不定方程 (a imes x - n imes y = b)。
解法详见 (Part 2)。
Part 4 乘法逆元
首先,(a imes x equiv1) ((mod) (n))的解称为 (a) 关于模 (n) 的乘法逆元。
什么情况下 (a) 的逆元存在?由 (Part 3) 可得当 (ax - ny = 1) 有解时,存在 (a) 的逆元。
所以由 (Part 1) 得 (1) 是 (gcd(a, n)) 的倍数。所以 (gcd(a, n) = 1),即 (a) 和 (n) 互质。
故,在 (gcd(a, n) = 1) 的前提下,(a imes x equiv1) ((mod) (n))的解就是 (a) 关于模 (n) 的乘法逆元。
(其中, (x < n) 或者说 (x = x mod n))
补充
1.费马小定理
费马: 皮埃尔·德·费马,法国律师和业余数学家。他在数学上的成就不比职业数学家差,他似乎对数论最有兴趣,亦对现代微积分的建立有所贡献。被誉为“业余数学家之王”。
定理本身: 如果 (p) 为质数,且 (a) 与 (p) 互质,即 (gcd(a, p) = 1),那么一定有 (a^{p - 1} equiv 1) ((mod) (p))
求乘法逆元: 因为 (a^{p - 1} equiv 1) ((mod) (p)),所以 (a imes a^{p - 2} equiv 1) ((mod) (p))。故 (a^{p - 2}) 就是 (a) 关于模 (p) 的乘法逆元
2.关于同余的一些证明
- 1) 如果 (a equiv b) ((mod) (m)),(x equiv y) ((mod) (m)),则 (a + x equiv b + y) ((mod) (m))。
证明:首先,我们一定能找到 (k_a) 与 (k_b) 使得 (a - k_a imes m = b - k_b imes m),也存在 (k_x) 与 (k_y) 使得 (x - k_x imes m = y - k_y imes m)。
所以 (a - k_a imes m + x - k_x imes m = b - k_b imes m + y - k_y imes m),即 (a + x - m imes (k_a + k_x) = b + y - m imes (k_b + k_y))。
故 (a + x equiv b + y) ((mod) (m))
- 2) 如果 (a equiv b) ((mod) (m)),(x equiv y) ((mod) (m)),则 (a imes x equiv b imes y) ((mod) (m))。
证明:首先,我们一定能找到 (k_a) 与 (k_b) 使得 (a - k_a imes m = b - k_b imes m),也存在 (k_x) 与 (k_y) 使得 (x - k_x imes m = y - k_y imes m)(同上)。
所以 ((a - k_a imes m) imes (x - k_x imes m) = (b - k_b imes m) imes (y - k_y imes m)),展开后必然得到 (a imes x - m imes (...) = b imes y - m imes (...))。
故 (a imes x equiv b imes y) ((mod) (m))
- 3) 如果 (a imes c equiv b imes c) ((mod) (m)),(gcd(c, m) = 1),则 (a equiv b) ((mod) (m))。
证明:首先,我们一定能找到 (k_{ac}) 与 (k_{bc}) 使得 (a imes c - k_{ac} imes m = b imes c - k_{bc} imes m)。移项可得 (a imes c - b imes c = k_{ac} imes m - k_{bc} imes m),即 ((a - b) imes c = m imes (k_{ac} - k_{bc}))
又因为 (gcd(c, m) = 1) 所以 ((a - b)) 一定被 (m) 整除。
故 (a equiv b) ((mod) (m))。
完结撒花~