gcd

最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为 $ gcd(a,b) $ ,同样的,a,b,c的最大公约数记为 $ gcd(a,b,c) $ ,多个整数的最大公约数也有同样的记号。

部分选自百度百科

欧几里得算法

欧几里得算法是用来求两个正整数最大公约数的算法。古希腊数学家欧几里得在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里得算法。

扩展欧几里得算法可用于RSA加密等领域。

假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:

1997 ÷ 615 = 3 (余 152)
615 ÷ 152 = 4(余7)
152 ÷ 7 = 21(余5)
7 ÷ 5 = 1 (余2)
5 ÷ 2 = 2 (余1)
2 ÷ 1 = 2 (余0)
至此,最大公约数为1

以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。

部分选自百度百科

欧几里得算法 证明

设有 $ gcd(a,b)=d(a>b) $ ,则 $ d|a $ 、$ d|b $(也就是d既是a的因数也是b的因数)。

设有 $ k=\lfloor\frac{a}{b}\rfloor $ 、 $ r=a \mod b $,则 $ a=bk+r $。

举个栗子,因为 $ a = 5b+1 = 5 \times 2+1 = 11 $ ,则

\[\begin{cases}
k=5\\
r=1
\end{cases}
\]

因为 $ d|b $,所以 $ d|kb $(请感性理解)

因为 $ d|kb+r $ (也就是 $ d|a $ )

所以 $ d|r $ (kb是d的倍数,kb+r也是d的倍数,那么r也就是d的倍数了)

上面整理一下就是 $ d|b $ 且 $ d|r $

所以 $ gcd(b,r)=d $ 了……吗?

并不是,应该是 $ gcd(b,r) \geq d $ (自己可以举个例子)。

我们希望能证明 $ gcd(a,b)=gcd(b,r)=gcd(b,a\mod b) $

所以我们用反证法去证 $ gcd(b,r)>d $ 是不存在的。

反证 $ gcd(b,r)>d $ 是不存在的

设有 $ gcd(b,r)=D>d $,则 $ D|b $ 且 $ D|r $,所以 $ D|kb $。(这里和上面差不多)

因为 $ D|kb $ 而且 $ D|r $,所以 $ D|kb+r $ (转换一下得 $ D|a $ )。现在我们有了 $ D|a $ $ D|b $ ,所以 $ gcd(a,b) \geq D $。

根据最开始说 $ gcd(a,b)=d $ ,所以 $ gcd(a,b)=d \geq D $ ,与 \(D>d\) 矛盾了。

故只有 \(D=d\) 时该假设成立,即 \(gcd(b,r)=d\)

所以\(gcd(a,b)=gcd(b,r)=d\)

化简一下就可以完结撒花: \(gcd(a,b)=gcd(b,a\mod b)\)

……了吗?

我们要设定一个限制条件,即 \(gcd(a,0)=a\)

为什么一定是\(gcd(a,0)=a\)

倒推上去

\(gcd(ak,a)=gcd(a,0)\)

此时ak与a的最大公约数即为a,故\(gcd(a,0)=a\)

最终就有:

\[gcd(a,b) = \begin{cases}
a &\text{如果} b=0\\
gcd(b,a\mod b) &\text{如果} b\neq 0
\end{cases}
\]

欧几里得算法求 gcd 代码

template<typename T>
T gcd(T a,T b){
if(b==0) return a;
return gcd(b,a%b);
}

gcd|最大公约数|欧几里得算法|欧几里得算法证明 一文说明白的更多相关文章

  1. Summary: gcd最大公约数、lcm最小公倍数算法

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + ...

  2. [问题2014A02] 解答二(求和法+拆分法,由张诚纯同学提供)

    [问题2014A02] 解答二(求和法+拆分法,由张诚纯同学提供) 将行列式 \(|A|\) 的第二列,\(\cdots\),第 \(n\) 列全部加到第一列,可得 \[ |A|=\begin{vma ...

  3. 【译】N 皇后问题 – 构造法原理与证明 时间复杂度O(1)

    [原] E.J.Hoffman; J.C.Loessi; R.C.Moore The Johns Hopkins University Applied Physics Laboratory *[译]* ...

  4. poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)

    Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30529   Accep ...

  5. 最小圆覆盖(随机增量法&模拟退火法)

    http://acm.hdu.edu.cn/showproblem.php?pid=3007 相关题型连接: http://acm.hdu.edu.cn/showproblem.php?pid=393 ...

  6. c/c++ 算法之快速排序法 冒泡排序法,选择排序法,插入排序法

    本文详细叙述和实现了快速排序算法,冒泡排序 选择排序 插入排序比较简单,原理在这里不再详述,直接用代码进行了实现. 快速排序法(quicksort)是目前所公认最快的排序方法之一(视解题的对象而定), ...

  7. HDU 2504 又见GCD(最大公约数与最小公倍数变形题)

    又见GCD Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  8. Java 快速排序法 冒泡排序法 选择排序法 插入排序法

    1.快速排序的原理: 选择一个关键值作为基准值.比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的). 从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果 ...

  9. 求逆序数的方法--线段树法&归并排序法

    逆序数的概念:对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆 ...

  10. GCD最大公约数

    说明: 最初跟鹏哥学习最大公约数的算法是辗转相除,确实印象很深刻,那种辗转赋值的思想在好多题目中都有运用,但随着进一步学习,我也参考了其他几种方便快捷的最大公约数求法,在这里做一个总结. . int ...

随机推荐

  1. Navicat 连接Oracle ORA-28547: connection to server failed, probable Oracle Net admin error

    Navicat 连接 Oracle 报 ORA-03135: connection lost contact ORA-28547: connection to server failed, proba ...

  2. 正确处理 CSV 文件的引号和逗号

    CSV(Comma-Separated Values,逗号分割值),就是用纯文本的形式存储表格数据,最大的特点就是方便. 作为开发,我们经常面临导数据的问题,特别是后台系统,产品或者运营的同事常常会提 ...

  3. c# 文件在线预览功能

    using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using DocumentF ...

  4. Kubernets常用命令

    查看所有namespace的pods运行情况 kubectl get pods --all-namespaces kubectl get service -ALL kubectl get deploy ...

  5. Linux 标准目录结构 FHS ——原文链接https://www.cnblogs.com/woider/p/6618295.html

    因为利用 Linux 来开发产品或 distribution 的团队实在太多了,如果每个人都用自己的想法来配置文件放置的目录,那么将可能造成很多管理上的困扰.所以,后来就有了 Filesystem H ...

  6. 青少年CTF平台 Web签到

    题目说明 Web一星简单题,Web签到. 直接启动环境,等待30秒左右访问题目链接. 做题过程 进入后,题目好像没有告诉我们什么有用的信息, F12,看遍了题目源码,也没有发现flag,正当我怀疑这个 ...

  7. 为何每个开发者都在谈论Go?

    本文深入探讨了Go语言的多个关键方面,从其简洁的语法.强大的并发支持到出色的性能优势,进一步解析了Go在云原生领域的显著应用和广泛的跨平台支持.文章结构严谨,逐一分析了Go语言在现代软件开发中所占据的 ...

  8. Web攻防--JNDI注入--Log4j漏洞--Fastjson反序列化漏洞

    JNDI注入 什么是JNDI JNDI全称为 Java Naming and Directory Interface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统 ...

  9. 使用HTML一键打包APK工具打包KRPANO全景项目

    "HMTL一键打包APK工具"可以把本地HTML项目或者网站打包为一个安卓应用APK文件,无需编写任何代码,支持在安卓设备上安装运行. 打包工具群:429338543 下载地址: ...

  10. Azure Data Factory(九)基础知识回顾

    一,引言 在本文中,我们将继续了解什么是 Azure Data Factory,Azure Data Factory 的工作原理,Azure Data Factory 数据工程中的数据管道,并了解继承 ...