• 欧几里得算法


    首先感谢 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))


    完结撒花~

  • 相关阅读:
    TCP源码—连接建立
    TCP系列02—连接管理—1、三次握手与四次挥手
    TCP系列01—概述及协议头格式
    ubuntu软件管理apt与dpkg
    318. Maximum Product of Word Lengths
    317. Shortest Distance from All Buildings
    316. Remove Duplicate Letters
    315. Count of Smaller Numbers After Self
    314. Binary Tree Vertical Order Traversal
    313. Super Ugly Number
  • 原文地址:https://www.cnblogs.com/Chain-Forward-Star/p/13868261.html
Copyright © 2020-2023  润新知