IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> C++ 最大公约数和最小公倍数模板 -> 正文阅读

[网络协议]C++ 最大公约数和最小公倍数模板


下文中 ( a , b ) (a, b) (a,b) 可能表示 a a a b b b 的最大公约数,同理 [ a , b ] [a, b] [a,b] 可能表示 a a a b b b 的最小公倍数。

最大公约数

更相减损术(《九章算术》)

内容

? a , b ∈ N , a ≥ b : ( a , b ) = ( a , a ? b ) = ( b , a ? b ) ? ? ? ① \forall a, b \in \mathbb{N}, a \geq b: (a, b) = (a, a - b) = (b, a - b) \ \cdots \cdots① ?a,bN,ab:(a,b)=(a,a?b)=(b,a?b)???
? a , b ∈ N : ( 2 a , 2 b ) = 2 × ( a , b ) ? ? ? ② \forall a, b \in \mathbb{N}: (2a, 2b) = 2 \times (a, b) \ \cdots \cdots ② ?a,bN:(2a,2b)=2×(a,b)???

证明


设集合 S = { s ∈ N ∣ s ∣ a , ? s ∣ b } S = \{ s \in \mathbb{N} \mid s | a,\ s | b \} S={sNsa,?sb}
? s ∈ N ? : s ∣ a , ? s ∣ b ?? ? ?? s ∣ ( a ? b ) \forall s \in \mathbb{N}^*: s | a, \ s | b \implies s | (a - b) ?sN?:sa,?sb?s(a?b)
设集合 T = { t ∈ N ∣ t ∣ a , ? t ∣ ( a ? b ) } T = \{ t \in \mathbb{N} \mid t | a,\ t | (a - b) \} T={tNta,?t(a?b)}
∴ S = T \therefore S = T S=T
∴ max ? { S } = max ? { T } \therefore \max\{S\} = \max\{T\} max{S}=max{T}
∴ ( a , b ) = ( a , a ? b ) \therefore (a, b) = (a, a - b) (a,b)=(a,a?b)
同理可得 ( a , b ) = ( b , a ? b ) (a, b) = (b, a - b) (a,b)=(b,a?b)
∴ ( a , b ) = ( a , a ? b ) = ( b , a ? b ) \therefore (a, b) = (a, a - b) = (b, a - b) (a,b)=(a,a?b)=(b,a?b)

显然。

代码模板

// 非递归
template <typename uint_t>
uint_t gcd(uint_t a, uint_t b)
{
    while (a && b && a ^ b) // a != b
    {
        if (a > b)
        {
            a -= b;
        }
        else
        {
            b -= a;
        }
    }
    return (a ?: b); // a ? a : b
}
// 递归
template <typename uint_t>
uint_t gcd(uint_t a, uint_t b)
{
    return ((a && b && a ^ b) ? ((a > b) ? gcd(a - b, b) : gcd(a, b - a)) : a);
    /*
    if (a && b && a != b)
    {
        if (a > b)
        {
            return gcd(a - b, b);
        }
        else
        {
            return gcd(a, b - a);
        }
    }
    else
    {
        return a;
    }
    */
}

时间复杂度

且让我引用一段百度百科。

辗转相除法也可以用来求两个数的最大公约数。
更相减损术和辗转相除法的主要区别在于前者所使用的运算是“减”,后者是“除”。从算法思想上看,两者并没有本质上的区别,但是在计算过程中,如果遇到一个数很大,另一个数比较小的情况,可能要进行很多次减法才能达到一次除法的效果,从而使得算法的时间复杂度退化为 Θ ( max ? { a , b } ) \Theta(\max\{a, b\}) Θ(max{a,b})。相比之下,辗转相除法的时间复杂度稳定于 Θ ( log ? ( max ? { a , b } ) ) \Theta(\log(\max\{a, b\})) Θ(log(max{a,b}))

用途

  1. 求整数,尤其高精度整数的最大公约数(不需要实现高精度取模运算);

欧几里德算法:辗转相除法

内容

? a ∈ N , ? b ∈ N ? : ( a , b ) = ( b , a ? m o d ? b ) \forall a \in \mathbb{N},\ b \in \mathbb{N}^*: (a, b) = (b, a\ {\rm mod}\ b) ?aN,?bN?:(a,b)=(b,a?mod?b)

证明

a < b a < b a<b:显然。
a ≥ b a \geq b ab
k = ? a b ? , m = a ? m o d ? b k = \lfloor \frac{a}{b} \rfloor,m = a\ {\rm mod}\ b k=?ba??m=a?mod?b,即 a = k × b + m ? ( k ∈ N , m ∈ N ∩ [ 0 , b ) ) a = k \times b + m\ (k \in \mathbb{N}, m \in \mathbb{N} \cap [0, b)) a=k×b+m?(kN,mN[0,b))
∵ ? d ∈ N ? , d ∣ a , d ∣ b : d ∣ ( k × b ) 。 \because \forall d \in \mathbb{N}^*, d | a, d | b: d | (k \times b)。 ?dN?,da,db:d(k×b)
∴ d ∣ ( a ? k × b ) \therefore d | (a - k \times b) d(a?k×b) d ∣ m d | m dm
设集合 S = { s ∈ N ? ∣ s ∣ a , ? s ∣ b } S = \{ s \in \mathbb{N}^* \mid s|a,\ s|b \} S={sN?sa,?sb},集合 T = { t ∈ N ? ∣ t ∣ b , ? t ∣ ( a ? m o d ? b ) } T = \{ t \in \mathbb{N}^* \mid t | b,\ t | (a\ {\rm mod}\ b) \} T={tN?tb,?t(a?mod?b)}
S = T S = T S=T
∴ ( a , b ) = max ? { S } = max ? { T } = ( b , a ? m o d ? b ) \therefore (a, b) = \max\{S\} = \max\{T\} = (b, a\ {\rm mod}\ b) (a,b)=max{S}=max{T}=(b,a?mod?b)

代码模板

// 非递归
template <typename uint_t>
uint_t gcd(uint_t a, uint_t b)
{
    uint_t t;
    while (b)
    {
        t = b;
        b = a % b;
        a = t;
    }
    return a;
}
// 递归
template <typename uint_t>
uint_t gcd(uint_t a, uint_t b)
{
    return (b ? gcd(b, a % b) : a);
}

时间复杂度: Θ ( log ? 2 ( max ? { a , b } ) ) \Theta(\log_2(\max\{a, b\})) Θ(log2?(max{a,b}))

最小公倍数

算法原理

[ a , b ] = a ÷ ( a , b ) ? b [a, b] = a \div (a, b) * b [a,b]=a÷(a,b)?b

证明

由最大公约数和最小公倍数的定义可得
[ a , b ] = a ÷ ( a , b ) ? b [a, b] = a \div (a, b) * b [a,b]=a÷(a,b)?b

代码模板

template <typename uint_t>
uint_t lcm(uint_t a, uint_t b)
{
    return (a / gcd(a, b) * b);
}

注意事项

建议不要写成a * b / gcd(a, b)的形式,以免a * b的结果溢出造成结果错误。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 16:25:55  更:2022-04-06 16:27:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:20:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码