首页 > 编程语言 >【知识点】欧几里得算法求最大公约数

【知识点】欧几里得算法求最大公约数

时间:2024-04-26 22:44:07浏览次数:20  
标签:知识点 gcd int 欧几里得 最大公约数 整数 算法

最大公约数

所为的最大公约数,是指两个或多个整数共有的约数中最大的那个数。换句话说,它是能同时整除给定的整数的最大整数。

例如,对于整数 \(12\) 和 \(18\),它们的公约数有 \(1、2、3、6\),其中最大的公约数为6,因此它们的最大公约数为 \(6\)。最大公约数通常用符号 \(\gcd(a, b)\) 来表示,其中 \(a\) 和 \(b\) 是要找到最大公约数的两个整数。

最大公约数的应用范围非常的广泛,我们常见的加密算法、分数的简化、时间频率的调整都离不开计算两个数的最大公约数。

普通算法求解最大公约数

对于求两个较小的数字的最大公约数,一个非常简单的方法就是遍历所有小于这两个数字的数字,并通过枚举的方法求出所有因数中最大的那一个因数。

具体代码如下:

int gcd(int a, int b) {
    // 初始化最大公约数为1,因为1是所有整数的公约数
    int result = 1; 
    for (int i = 2; i <= a && i <= b; ++i) {
        if (a % i == 0 && b % i == 0) {
            // 更新最大公约数
            result = i; 
        }
    }
    return result;
}

这种方法固然简便,但是速度比较慢。若给定的两个数字都是质数,那么这两个数的最大公因数都是 \(1\),就算是经过枚举优化的代码时间复杂度也是 \(O(n)\) 级别的。

显然我们需要找到一个更优的算法来解决寻找最大公因数问题的解。

欧几里得算法

早在古希腊时期,著名几何学之父欧几里得就在他的作品中提到过 GCD 算法。在计算机史上,这可以称之为是世界上第一个"算法",算法的概念也就从此诞生了。

欧几里得算法的内容就是快速求出两个数字 \(A, B\) 的最大公因数。具体地,欧几里得算法如下,其中 \(A \space \text{mod} \space B\) 表示 \(A \div B\) 的余数:

\[\gcd(A, B) = \gcd(B, A \space \text{mod} \space B) \]

再根据余数的基本性质:

  1. \(\gcd(A, 0) = 0\)
  2. \(\gcd(0, B) = 0\)

这样子就可以通过递归的方式快速求的 \(\gcd(A, B)\) 的值(显然,这个递归版本的代码竟然比暴力计算 GCD 的代码更佳清爽和简洁):

int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

欧几里得算法的证明

首先要证明递归的有穷性,即证明算法会在有限步骤内结束。在递归的过程中,每一步两个参数的值都会减少。而在有限的步数内,被除数必然会等于 \(0\),因为每一步的被除数都是上一层递归的除数,而除数在每一步都变为上一步的余数,余数必然小于除数,因此被除数在每一步都会减小。由于被除数是一个非负整数,所以它必然会在有限步骤内变为 \(0\),因此算法必然会终止,不会无限递归下去。

众所周知,无法证明正确性的算法不是好算法(事实上,算法的五大要素之一就是正确性)。尽管欧几里得算法有许多证明方法,但这里就提供一个最好理解的(归纳法)。

欧几里得算法的正确性来源于数学上的一个基本事实:如果一个数能同时整除两个数,那么它也能整除它们的差。 例如数字 \(5\),它可以整除 \(15\) 和 \(20\),那么它一定可以整除这两个数的差 \(\lvert15, 20\rvert = 5\)。

因此,如果两个整数的最大公约数是 \(d\),那么它们可以表示为 \(a = md\) 和 \(b = nd\),其中 \(m\) 和 \(n\) 是整数,而 \(d\) 是最大公约数。那么 \(a - b = (m - n) \cdot d\),即 \(a\) 和 \(b\) 的差是 \(d\) 的倍数。所以 \(d\) 同时是 \(a\) 和 \(b\) 的公约数。

到此为止,有关欧几里得算法的内容全部结束了。本文后续将会更新一些有关 GCD 算法的一些实际应用。

相关链接引用

Khan Academy - The Euclidean Algorithm

标签:知识点,gcd,int,欧几里得,最大公约数,整数,算法
From: https://www.cnblogs.com/Macw07/p/18161021

相关文章

  • 【知识点】快速幂与矩阵快速幂
    什么是快速幂,为什么要使用快速幂?Macw:快速幂有好多好处。Penelope:例如?Macw:它比较快。见名知意,快速幂算法可以在非常短的时间内求出一个数的\(n\)次幂。虽然快速幂在初学阶段的应用不算太多,但是快速幂背后的思想是非常值得我们去理解的。举例而言,如果我们要求出\(3^......
  • Redis 面试知识点
    1、Redis缓存数据库一致性采用最终一致性,而不是采用强一致性,强一致性会导致系统吞吐量变差;采用双删除的策略,第二次删除,采用延迟删除;推荐采用,先操作数据库,直接删除缓存的方式;删除失败的情况,采用异步方式,重试操作;读取binlog异步删除,使用开源框架canal,监听canal......
  • 2024-04-24 vue2知识点小结
    Vue实例的创建和基本使用方法:使用newVue()创建一个Vue实例。传入一个包含选项的对象,如data、methods、computed、watch等。使用el选项来指定Vue实例挂载的元素。数据绑定:双向数据绑定:使用v-model指令实现表单元素与数据的双向绑定。单向数据绑定:使用v......
  • 深度学习Python代码小知识点(备忘,因为没有脑子)
    现在是2024年4月24日16:58,今天摸鱼有点多,备忘一下,都写到一篇内容里面,免得分散。 1.np.concatenate()函数'np.concatenate'是NumPy库中用来合并两个或多个数组的函数。它可以在任意指定的轴上连接数组,是数据预处理和特征工程中常用的工具。基本语法:numpy.concatenate((a1,a2......
  • GreatSQL统计信息相关知识点
    相关知识点:INNODB_STATS_PERSIST=ON或用STATS_PERSIST=1定义单个表时,优化器统计信息将持久化到磁盘。默认情况下,innodb_stats_persistent是启用的。持久统计信息存储在mysql.innodb_table_stats和mysql.innodb_index_stats表中。默认情况下启用的innodb_stats_auto_recalc变量......
  • 求最大公约数和最小公倍数
    1.最大公约数辗转相除法intt;while(b!=0){t=a%b;a=b;b=t;}printf("thegcdis%d\n",a);2.最小公倍数最小公倍数乘以最大公约数等于两数乘积,所以最小公倍数等于两数乘积除以最大公约数。include<stdio.h>include<math.h>intmain(void){printf("pleaseinputtwo......
  • 编写一个函数,找到两个数的最大公约数
    /***********************************************************************************filename:004_最大公约数.cauthor:[email protected]:2024/04/18function:算出两个数的最大公约数note:No......
  • 最大公约数和最小公倍数
    最大公约数(GCD)和最小公倍数(LCM)最大公约数定义:如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数;几个自然数公有的约数,叫做这几个自然数的公约数;公约数中最大的一个公约数,称为这几个自然数的最大公约数(greatestcommond......
  • Linux常用命令知识点总结
    目录目录目录基础指令Linux命令基本格式文件操作文件格式文件权限创建文件查看文件删除文件移动文件复制文件编辑文件查找文件查找命令路径vim文本编辑器一般指令模式(commandmode)编辑模式(insertmode)指令列命令模式command-linemode目录操作打印路径查看目录切换目录创建目......
  • 肖sir__app的知识点
    1、appium实现原理 ========================================二、app测试中遇到的问题(一)、app出现ANR(无响应),是什么原因导致的?那么导致ANR的根本原因是什么呢?简单的总结有以下两点:1.主线程执行了耗时操作,比如数据库操作或网络编程2.其他进程(就是其他程序)占用CPU导致本进程......