最大公约数、最小公倍数、辗转相除法的求解和证明

2023-11-04

  两个正整数的最大公约数(Greatest Common Divisor,GCD)在计算机中通常使用辗转相除法计算,最小公倍数(Least Common Multiple, LCM)可以使用GCD来计算。下面首先介绍GCD和LCM。然后介绍辗转相除法的计算形式,并证明为什么可以得出GCD。

最大公约数

性质

  若正整数$\{a_1,a_2,...,a_n\}$的GCD为$r$,则$\{a_1/r,a_2/r,...,a_n/r\}$互质(GCD为1)。

充分性

  假设正整数$\{a_1,a_2,...,a_n\}$的GCD为$r$,则它们可以被表示为$\{p_1r,p_2r,...,p_nr\}$。若$\{p_1,p_2,...,p_n\}$不互质,有最大公约数$r_1\ne 1$,则$\{a_1,a_2,...,a_n\}$的最大公约数为$r_1r$与假设不符。

必要性

  显然成立:一系列正整数除以某一数,如果结果互质,则这个数是这些正整数的GCD。

多个数的最大公约数

  任意正整数$\{a_1,a_2,...,a_n\}$都可以被它们对应的所有质因子的乘积表示。将它们所有质因子分别表示为集合$A_1,A_2,...,A_n$(给重复质因子加下标),则它们的最大公约数的质因子为

$\begin{aligned}&A_1\cap A_2\cap...\cap A_n\\=&(...((A_1\cap A_2)\cap A_3)\cap...)\cap A_n\end{aligned}$

  因此多个数的GCD可以通过,两两数之间的GCD迭代求出。两个正整数的GCD则可以使用辗转相除法解决。

最小公倍数

性质

  若正整数$\{a_1,a_2,...,a_n\}$的LCM为$R$,则$\{R/a_1,R/a_2,...,R/a_n\}$互质。

充分性

  假设$\{a_1,a_2,...,a_n\}$的LCM为$R$,若$\{R/a_1,R/a_2,...,R/a_n\}$不互质,有公因子$r$,则有更小的公倍数$R/r$,与假设不符。

必要性

  对于正整数$\{a_1,a_2,...,a_n\}$,假设存在正整数$R_1\ne R_2$,使得$\{R_1/a_1,R_1/a_2,...,R_1/a_n\}$互质,且$\{R_2/a_1,R_2/a_2,...,R_2/a_n\}$互质。

  若$R_1/R_2=k$为正整数,则

$\{R_1/a_1,R_1/a_2,...,R_1/a_n\}=\{kR_2/a_1,kR_2/a_2,...,kR_2/a_n\}$

  有$k$为因子,不互质,与假设不符。

  若$R_1/R_2=k$不是整数,则

$\{R_1/a_1,R_1/a_2,...,R_1/a_n\}=\{kR_2/a_1,kR_2/a_2,...,kR_2/a_n\}$

  不是正整数,与假设不符(互质前提是正整数)。  

  综上不可能存在两个或以上不同的$R$,使得$\{R/a_1,R/a_2,...,R/a_n\}$互质。

  又由于最小公倍数$R$一定存在,使得$\{R/a_1,R/a_2,...,R/a_n\}$互质。所以这样的$R$只存在一个,且是LCM。

多个数的最小公倍数

  上面证明得出,对于正整数$\{a_1,a_2,...,a_n\}$,只要获得某个$R$,使得$\{R/a_1,R/a_2,...,R/a_n\}$互质,这个$R$就是LCM。

  将正整数表示为GCD和对应互质数的乘积

$\{a_1,a_2,...,a_n\}=\{p_1r,p_2r,...,p_nr\}$

  令$R=p_1p_2...p_nr$,可以发现$\{R/a_1,R/a_2,...,R/a_n\}$互质(证明写下面)。因此$\{a_1,a_2,...,a_n\}$的LCM为

$\displaystyle R=p_1p_2...p_nr=\frac{a_1a_2...a_n}{r^{n-1}}$

互质证明

  将$\{p_1,p_2,...,p_n\}$的所有质因子分别表示为集合$A_1,A_2,...,A_n$,显然有$A_1\cap A_2\cap...\cap A_n=\varnothing$。设全集$E=A_1\cup A_2\cup...\cup A_n$,则$\{R/a_1,R/a_2,...,R/a_n\}$的质因子集合为$\sim A_1,\sim A_2,...,\sim A_n$。由于

$\begin{aligned}&\sim A_1\cap\sim A_2\cap...\cap\sim A_n\\=&\sim(A_1\cup A_2\cup...\cup A_n)\\=&\sim E\\=&\varnothing\end{aligned}$

  所以$\{R/a_1,R/a_2,...,R/a_n\}$互质。

辗转相除法

  辗转相除法通过迭代计算两个正整数的GCD。每次用较小数对较大数取余,然后将较小数赋值到较大数,余数赋值到较小数,直到余数为0,此时较小数为最大公约数。

例子

  计算319,377的最大公约数(算法迭代过程):

 迭代   较大数   较小数   余数 
0 - 377 319
1 377 319 58
2 319 58 29
3 58 29 0

  得出最大公约数为29。

证明  

  假设正整数$a>b$,计算它们的最大公约数。首先计算出它们的余数$t$:

$a \, \text{mod}\, b = t$

  则$a$可以表示为:

$a=pb+t$

  其中$p$为$a/b$的正整数商。若$t=0$,则显然$b$为$a,b$的最大公约数。若$t\neq 0$,我们只需证明$\{a,b\}$与$\{b,t\}$有相同的最大公约数,迭代就可以进行下去。

  将$\{a,b\}$的公约数表示为$r_1\in R_1$,$R_1=\{a,b的公约数\}$,则有:

$t =a-pb= p_ar_1-pp_br_1=(p_a-pp_b)r_1$

  显然$\{a,b\}$的公约数$r_1$也是$t$的约数,因而$r_1$是$\{a,b,t\}$的公约数,有$R_1\subseteq R$,$R=\{a,b,t的公约数\}$。又因为$\{a,b,t\}$的公约数一定是$\{a,b\}$的公约数,所以有$R\subseteq R_1$。因此$R_1=R$。

  将$\{b,t\}$的公约数表示为$r_2\in R_2$,$R_2=\{b,t的公约数\}$,则有:

$a =pb+t= pp_{b1}r_2+p_tr_2=(pp_{b1}+p_t)r_2$

  显然$\{b,t\}$的公约数$r_2$也是$a$的约数,因而$r_2$是$\{a,b,t\}$的公约数,有$R_2\subseteq R$。与上同理,得出$R_2 = R$。

  于是$R_1=R=R2$,因此,$\{a,b\}$与$\{b,t\}$有相同的最大公约数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最大公约数、最小公倍数、辗转相除法的求解和证明 的相关文章

  • 关于Marching Cubes算法的澄清

    关于Marching Cubes 我对其算法和实现有一些疑问 我已经阅读了 Marching Cubes 的 Paul Bourke 优秀文章以及网站上可用的源代码 但是 我在理解以及如何以自己的方式实现算法方面仍然遇到了一些问题 问题如下
  • 定点数学比浮点运算快吗?

    多年前 即 20 世纪 90 年代初期 我构建了图形软件包 该软件包基于定点算术和预先计算的 cos sin 表格以及使用牛顿近似方法进行 sqrt 和对数近似的缩放方程来优化计算 这些先进技术似乎已经成为图形和内置数学处理器的一部分 大约
  • 自动跟踪算法

    我正在尝试写一个simple跟踪例程来跟踪电影中的某些点 本质上我有一系列 100 帧长的电影 在黑暗背景上显示一些亮点 我每帧有大约 100 150 个点 它们在电影的过程中移动 我想跟踪它们 所以我正在寻找一些有效的 但可能不会过度实施
  • Python Pandas:沿一列比较两个数据帧,并返回另一个数据帧中两个数据帧的行内容

    我正在处理两个 csv 文件并作为数据框 df1 和 df2 导入 df1 有 50000 行 df2 有 150000 行 我想将 df2 的 时间 与 df1 求时间差并返回所有列的值 对应相似的行 保存在df3中 时间同步 例如 35
  • 分而治之算法找到两个有序元素之间的最大差异

    给定一个整数数组 arr 找出任意两个元素之间的差异 使得较大的元素出现在 arr 中较小的数字之后 Max Difference Max arr x arr y x gt y 例子 如果数组是 2 3 10 6 4 8 1 7 那么返回值
  • 什么是“朴素”算法,什么是“封闭式”解决方案?

    我有一些关于描述算法时使用的术语语义的问题 首先 朴素 算法是什么意思 这与给定问题的其他解决方案有何不同 解决方案还可以采取哪些其他形式 其次 我听到很多人提到 封闭式 解决方案 我也不知道这意味着什么 但在尝试解决递归关系时经常会出现
  • 如何求两个地点的经纬度距离?

    我有一组位置的纬度和经度 怎么找distance从集合中的一个位置到另一个位置 有公式吗 半正矢公式假定地球是球形的 然而 地球的形状更为复杂 扁球体模型会给出更好的结果 如果需要这样的精度 你应该更好地使用文森特逆公式 See http
  • 当给定块大小时反转单链表

    有一个单连接链表 并给出了块大小 例如 如果我的链表是1 gt 2 gt 3 gt 4 gt 5 gt 6 gt 7 gt 8 NULL我的块大小是4然后反转第一个4元素 然后是第二个 4 个元素 问题的输出应该是4 gt 3 gt 2 g
  • Python 旅行商贪婪算法 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 因此 我为旅行推销员问题创建了一种排序 并按 x 坐标和 y 坐标进行排序 我正在尝试实施贪婪搜索 但无法做到 此外 每
  • 如何在C中实现带连分数的自然对数?

    这里我有一个小问题 根据这个公式创建一些东西 这就是我所拥有的 但它不起作用 弗兰基 我真的不明白它应该如何工作 我尝试用一 些错误的指令对其进行编码 N 是迭代次数和分数部分 我认为它会以某种方式导致递归 但不知道如何 谢谢你的帮助 do
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • 如何计算 3D Morton 数(交织 3 个整数的位)

    我正在寻找一种快速计算 3D Morton 数的方法 这个网站 http www graphics stanford edu seander bithacks html InterleaveBMN有一个基于幻数的技巧来处理 2D Morto
  • 颜色逻辑算法

    我们正在构建一个体育应用程序 并希望将团队颜色融入到应用程序的各个部分 现在 每个团队都可以使用几种不同的颜色来表示 我想做的是执行检查以验证两个团队颜色是否在彼此一定的范围内 这样我就不会显示两个相似的颜色 因此 如果团队 1 的主要团队
  • 排序矩阵的选择算法

    这是谷歌面试问题 给定一个 N N 矩阵 所有行均已排序 所有列均已排序 找到矩阵的第 K 个最大元素 在 n 2 中执行它很简单 我们可以使用堆或合并排序 n lg n 对它进行排序 然后得到它 但是有没有更好的方法 比 n lg n 更
  • 当满足动态条件时退出递归函数

    使用来自的函数生成汉明距离 t 内的所有比特序列 https stackoverflow com questions 40813022 generate all sequences of bits within hamming distan
  • String.contains() 的时间复杂度

    String contains 的时间复杂度是多少 假设 n 是与另一个长度为 k 的字符串进行比较的字符串的长度 如果不知道您感兴趣的 String contains 的实际实现 就没有答案 或者你打算使用什么算法 一个完全幼稚的实现可能
  • 大 ר 符号到底代表什么?

    我真的很困惑大 O 大 Omega 和大 Theta 表示法之间的区别 我知道大 O 是上限 大 Omega 是下限 但是大 theta 到底代表什么 我读过这意味着紧束缚 但是 这是什么意思 首先我们来了解一下什么是大O 大Theta和大
  • 用于在链表中查找结点的生产代码

    我在一次采访中被问到这个问题 我被要求编写代码 用于在 O 1 空间和线性时间的生产环境中在链表 其形式为 Y 形式 双臂不一定相等 中查找结点 我想出了这个解决方案 我以前在某处见过 1 Measure lengths of both l
  • while循环的时间复杂度是多少?

    我正在尝试找出 while 循环的时间复杂度 但我不知道从哪里开始 我了解如何找到 for 循环的复杂性类别 但是当涉及到 while 循环时 我完全迷失了 关于从哪里开始有什么建议 提示吗 这是一个问题的示例 x 0 A n some a
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • pod状态

    Pending 该Pod已被Kubernetes系统接受 但是尚未创建一个或多个Container映像 这包括计划之前的时间以及通过网络下载图像所花费的时间 这可能需要一段时间 Running Pod已绑定到节点 并且所有容器都已创建 至少
  • 不习惯的 Vue3 起步三 の computed 和 watch

    计算属性和侦听器 Computed计算属性 在模板内表达式非常简单 如果在模板内放入过多的逻辑会使得模板过重并且难以维护 示例
  • deepsort代码改进

    DeepSORT是一个非常流行的多目标跟踪算法 但是可以通过对其代码进行改进来提高其性能和适应性 以下是一些DeepSORT代码改进的建议 使用更好的特征提取器 DeepSORT使用卷积神经网络 CNN 来提取特征 但是可以尝试使用更好的C
  • js绑定键盘快捷键实战

    下面这个函数用来响应键盘事件 标签相应onkeydown事件后调用这个函数就可以实现按键的转换功能 设置快捷键绑定function setShortcutBinding var a window event keyCode if a 8 退
  • 观点

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 本文作者认为 深度学习只是一种计算机视觉工具 而不是包治百病的良药 不要因为流行就一味地使用它 传统的计算机视觉技术仍然可以大显身手 了解它们可以为你省去很多的时间和烦恼
  • C++构造函数是否可以定义为private

    思考下 什么时候构造函数需要定义为private 1 如果一个类的构造函数只有一个且为private 这是可以编译通过的 class Parent private Parent cout lt lt parent private lt
  • 多智能体强化学习入门(六)——MFMARL算法(Mean Field Multi-Agent RL)

    本节内容见https zhuanlan zhihu com p 56049023
  • lua 定时器以及应用

    function update timer fun for k v in pairs update timer m process time fun do v k update timer m porcess run time k end
  • qt操作excel表

    https blog csdn net cannon qi article details 79972258
  • day-37 代码随想录算法训练营(19)贪心part06

    738 单调递增的数字 思路 在给的数字中找到第一个开始递减的两个数字 将前一个数字减1 后面的数字全部变为最大值9 968 监控二叉树 思路 分三种状态 0无覆盖 1有监控 2有覆盖 分四种情况 1 两边都有覆盖 返回0 2 两边有一边无
  • 在关系数据库中。存放在数据库中的逻辑结构以什么为主 (4选一)

    C 哈希表
  • 笔试题2:如何用八进制和十六进制来表示整型数据

    八进制的含义在于每位数字的进位大小为8 也就是0 8的9个数字 十六进制的进位大小为16 除了0 9的10个数字 还包括a b c d e f来表示10 11 12 13 14 15 答案 Java的八进制采用0开头 十六进制采用0x开头
  • iOS宏定义的黑魔法 - 宏菜鸟起飞手册

    转自 OneV s Den的博客 宏定义在C系开发中可以说占有举足轻重的作用 底层框架自不必说 为了编译优化和方便 以及跨平台能力 宏被大量使用 可以说底层开发离开define将寸步难行 而在更高层级进行开发时 我们会将更多的重心放在业务逻
  • 计算机虚拟化+网络

    计算机虚拟化 网络 cookie 什么是 Cookie cookie的生命周期 cookie Cookie 用于存储 web 页面的用户信息 什么是 Cookie Cookie 是一些数据 存储于你电脑上的文本文件中 当 web 服务器向浏
  • C++像素游戏

    我的作品 鼠标板 黑科技之橡素 代码 include
  • Verilog语言实现FPGA上的计数器

    Verilog语言实现FPGA上的计数器 计数器是数字电路中经常使用的基本元素之一 它用于生成指定脉冲数量或者指定计数范围内的计数信号 在现代数字电路设计中 FPGA Field Programmable Gate Array 作为一种可编
  • QT+Opencv 时报错Failed to load module “canberra-gtk-module“

    解决方案 sudo apt get install libcanberra gtk module
  • 二维数组作为参数,传入函数(最好用的)

    二维数组作为参数 传入函数 最好用的 很多时候我都是直接通过传入一个 固定的数字来传递一个二维数组 比如这样子定义函数 int fun int a 3 int n 调用函数是 fun a n 这样子调用的二维数组只能是固定已经知道的 不够灵
  • 使用Kettle实现数据排序

    一 Kettle的安装 1 下载Kettle的安装包文件 在Windows系统中打开浏览器 访问Kettle官网 https sourceforge net projects pentaho 下载Kettle安装文件pdi ce 9 1 0
  • 最大公约数、最小公倍数、辗转相除法的求解和证明

    两个正整数的最大公约数 Greatest Common Divisor GCD 在计算机中通常使用辗转相除法计算 最小公倍数 Least Common Multiple LCM 可以使用GCD来计算 下面首先介绍GCD和LCM 然后介绍辗转