浅谈辗转相除法

辗转相除法和辗转相减法 欧几里得算法(辗转相除法),辗转相减法(更相减损术)知识总结 阅读详情

写在前面

本文主要包含辗转相除法的正确性证明,以及时间复杂度证明。已经懂了的老铁可以右滑退出了(或者拉倒最下面点亮小手)~

如何求最大公约数

给定两个正整数,求解最大公约数,代码很简单,比如直接使用__gcd:

int gcd = __gcd(a, b);

或者撸一个辗转相除法,像下面这样:

int gcd(int a, int b) {
  return b ? gcd(b, a%b) : a;
}

代码很简单,不过还是应该掌握它的证明过程和时间复杂度~

辗转相除法是什么

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

辗转相除法的正确性依赖于下述定理:

两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。

以求 46 与 28 的最大公约数为例:

  • 第一次迭代, a = 44, b = 28, 较小数为 28, 余数为 16。
  • 第二次迭代, a = 28, b = 16, 较小数为 16, 余数为 12。
  • 第三次迭代, a = 16, b = 12, 较小数为 12, 余数为 4。
  • 第四次迭代, a = 12, b = 4, 较小数为 4, 余数为 0。
  • 第五次迭代, a = 4, b = 0, 因为0能被任何整数整除,易得4和0的最大公约数为4,算法结束。

观察每次迭代的a 和 b, 不难发现, <44,28>,<28,16>,<16,12>,<12,4><44,28>, <28,16>, <16,12>, <12, 4><44,28>,<28,16>,<16,12>,<12,4>的最大公约数都是4。即上述定理所说的,两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。

正确性证明

设有两个整数 x, y, 有 x > y。x 和 y 的最大公约数为 d,x除以y的余数为 r。

为了描述方便,不妨假设 x 和 y 均为非负整数。这并不影响算法的结果,因为是求最大公约数,两个负数的最大公约数和其绝对值的最大公约数是相等的。

要证明该算法的正确性,无非就是要证明:如果 x 和 y 的最大公约数为 d,那么 y 和 r 的最大公约数也是 d。 接下来对该结论进行证明。

因为 d 是 x 和 y 的公约数,所以 x, y, r 可借由 d 表示为
{x=m∗dy=n∗dr=(m−k∗n)∗d \left\{ \begin{array}{c} x = m*d \\ y = n*d \\ r = (m-k*n)*d \\ \end{array}\right. ⎩⎨⎧​x=m∗dy=n∗dr=(m−k∗n)∗d​

其中,k 为 ⌊m/n⌋\lfloor m/n \rfloor⌊m/n⌋。而且,m 与 n 是互质的,这个很好证明:如果 m 和 n 不互质,则存在整数 p>1 且 p 能整除 m 和 n,则 m 和 n 的最大公约数应大于 d,这与 d 的定义相悖。

不难看出,r 也能被 d 整除,即 d 是 y 和 r 的公约数。

又因为,m 和 n 互质,所以不存在整数 q > 1 能同时整除 n 和 (m−k∗n)(m-k*n)(m−k∗n),所以 d 是 y 和 r 的最大公约数。

综上所述,如果 x 和 y 的最大公约数为 d,那么 y 和 r 的最大公约数也是 d, 所以辗转相除法,可以正确求得 x 和 y 的最大公约数。

时间复杂度

设有两个正整数 x 和 y,不妨假设 x > y。另设 r = x%y。

不难发现,r≤⌊x/2⌋r \le \lfloor x/2 \rfloorr≤⌊x/2⌋。证明如下:

  • 当 y≤⌊x/2⌋y \le \lfloor x/2 \rfloory≤⌊x/2⌋ 时,由取余运算的性质可知,$ r \lt y \le \lfloor x/2 \rfloor$
  • 当 ⌊x/2⌋<y≤x\lfloor x/2 \rfloor \lt y \le x⌊x/2⌋<y≤x时,取余运算退化为减法运算,r=x−y≤⌊x/2⌋r = x-y \le \lfloor x/2 \rfloorr=x−y≤⌊x/2⌋

换言之,每经过两次区域的操作,新的 x‘,y‘x^`, y^`x‘,y‘ 最差也会变为原来的一半 ,所以时间复杂度的上限为 Θ(lgx)\Theta(lg x)Θ(lgx)。

至于下限如何证明,我还没想出来,欢迎老铁后台留言指点迷津~

取余运算与取模运算

既然本文中用到了运算符 %,那就多说几句。

% 在 C++ 中代表取余运算,在 Python 中代表取模运算。那两种运算有何不同呢?

设有两个整数 x 和 y,两种运算的过程都是:

  • c = x/y
  • r = x - c*y

不同之处在于第一步的取整:取余运算在取c的值时,向0方向舍入。取模运算是向−∞-∞−∞方向舍入。

举个例子,x = -7,y = 4:

  • 第一步,求 c 的值:

    • 求模:c = -2(向无穷小方向舍入)
    • 求余: c = -1(向0方向舍入);
  • 第二步,求 r 的值:

    • 求模:r = 1
    • 求余:r = -3

总结一下:

  • 当x和y符号一致时,两种运算结果一致。
  • 当符号不一致时,两种运算结果不一致。求模运算结果的符号和y一致,求余运算结果的符号和x一致。

求最大公约数不同算法的时间比较(辗转相除法,更相减损术等) 后附完整源代码:(含有求最大公倍数的函数,此代码测试的是面对不同组数据,各种算法的性能分析,如需输出最大公约数,只需加个输出就好!) 一、 题目分析 首先,题目要求我们求出俩个正整数的最大公约数和最小公倍数,并提供了6种不同的算法(递归与非递归算俩种) 1. 辗转相除法:此种方法核心如其名,辗转,大数放a中,小数放b中。大的除以小的,余数为零,则小数为最大公约数,不为零则,将余数与b比较大的放a,... 阅读详情

相关推荐

浅谈欧几里得算法(辗转相除法)证明

前言 之前只知道一味的背辗转相除法的biao,连它是欧几里得算法都不知道,所以决定写一篇证明 百度百科了解一下 欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。应用领域有数学和计算机两个方面。 计算公式gcd(a,b) = gcd(b,a mod b)。//这就是我接下来要证明的东东 证明 假设 1.求n、m的最小公倍数 2、a、b分别是 m div n 和 ...

自以为心若顽石,却终究人非草木。 516

欧几里得算法(辗转相除法) 证明及复杂度分析

欧几里得算法核心: gcd( a , b ) = gcd( b , a%b ) ,其中 gcd 表示 a 和 b 的最大公约数; 证明: 设 a 和 b 的最大公约数为 c ; 则有 c = gcd( a , b ) ; 设 a = x * c , b = y * c , 其中 x 与 y 互质 (因为 c 是最大公约数) 设 g = a%b = a - i * b = (x - i * y )...

weixin_43670649的博客 1万+

浅谈拓展欧几里得算法(辗转相除法)

前言 前天讲了一堆的数论,还没什么时间整理,拓欧我也只是第一次接触(果然还是太蒟),搞了半个晚上才弄懂。避免遗忘或弄丢,写篇博文。 拓展欧几里得算法 了解一下:扩展欧几里得算法,简称 exgcd,一般用来求解不定方程,求解线性同余方程,求解模的逆元等 引理:存在 x , y 使得 gcd(a,b)=ax+by,求 x,y 证明: part 1: (1)由gcd(a,b)= gc...

自以为心若顽石,却终究人非草木。 618

辗转相除法的时间复杂度

以下程序是用辗转相除法来计算两个非负数之间的最大公约数: long long gcd(long long x, long long y) {     if (y == 0)         return x;     else         return gcd(y, x % y); }  我们假设x,y中最大的那个数的长度为n,x>y,基本运算时间复杂度为O(1),那么该程序的时间复杂

I feel lost 1万+

《IC验证必看|IC验证的全流程概览(从DUT到回归交付)》

本文系统介绍了IC验证的全流程,从理解设计需求到最终交付验证结果。主要内容包括:1)深入理解DUT的功能和接口;2)制定详细的测试计划(Testplan);3)搭建UVM验证平台;4)执行定向和随机测试并进行回归;5)分析功能、代码和断言覆盖率;6)交付完整的验证报告。文章强调验证是一个闭环过程,特别指出新手容易忽视测试计划和覆盖率分析这两个关键环节,导致验证不充分。文末还提出思考题,引导读者反思验证计划的制定方法。

m0_46663240的博客 1261

Vue3集成百度实时语音识别

Vue3集成百度实时语音识别

weixin_61769998的博客 548

C语言经典算法之辗转相除法

在C语言中,辗转相除法(也称欧几里得算法)是用来求两个正整数最大公约数(GCD,Greatest Common Divisor)的一种有效方法。这个算法基于一个数学原理:对于任何两个非零自然数a和b,它们的最大公约数等于a除以b的余数c和b之间的最大公约数。

weixin_56154577的博客 5893

博途WinCC多语言项目配置指南

在博途(TIA Portal)中为WinCC项目配置多语言功能,需通过系统化步骤实现界面文本的动态切换。

dhaimo的博客 2470

浅谈最大公约数-辗转相除法

最大公约数-辗转相除法 思想:   使用较大的数,除以较小的数,如果余数为0,较小的数为最大公约数,如果除不尽,用较小的数字除以余数,重复操作,直到余数为0,此时这个除数的值就是最大公约数。 #include <stdio.h> int main() { int a = 28; int b = 77; int c; while(1) { c = a % b; if (c == 0) { break; } else { a = b; b = c; } } printf("%d\n", b);

李木子的博客 772

嵌入式系统实战:DroneCAN协议栈移植与避坑指南

本文详细介绍了在嵌入式系统中移植DroneCAN协议栈的完整流程与实战技巧。内容涵盖移植前的准备工作、内存管理优化、CRC校验实现、多帧数据处理及硬件平台适配等关键环节,并以STM32F4为例提供了具体的移植步骤和避坑指南,帮助开发者高效完成DroneCAN在嵌入式设备上的集成与应用。

solidity8miner的博客 547

ASPICE1-配置管理

SUP.8配置管理 BP1:开发配置管理策略 BP2:识别配置项 BP3:建立配置项管理系统 BP4:建立分支管理 BP5:控制变更和发布 BP6: 建立基线 BP7:报告配置项状态 BP8:验证配置项信息 BP9:管理配置项和基线的存储 1.配置管理概念 配置管理(Configuration Management,CM)是通过使用技术或行政手段对软件产品进行控制,以实现对软件开发过程和生命周期进行控制、规范的一系列措施。 完整性、一致性、可控性。 2.配置管理的主要活动: 1.

HDZQ2005的专栏 3687

数论浅谈

数论浅谈符号定义欧拉定理定理证明过程完全分解定理组合数学卢卡斯定理定理证明过程辗转相除法求最大公因数Legendre定理定理应用好处 符号定义 在数论中,有许许多多的符号需要我们知道,比如这些: ϕ(p)\phi(p)ϕ(p),它表示,在比p小且与p互质的个数 (a,b),表示a和b的最大公因数 [a,b],表示a和b的最小公倍数 n!,表示1~n这n个数相乘 鉴于无法使用向下取整, 目前,我们只...

nobody_like_you的博客 656

工业质检实战:如何用MVTec AD数据集训练你的第一个无监督异常检测模型

本文提供了一份基于MVTec AD数据集的工业质检实战指南,详细介绍了如何从零开始训练一个无监督异常检测模型。内容涵盖数据预处理、模型架构选型(如CAE、GAN与特征字典方法)、特征提取、损失函数设计以及关键的阈值确定与后处理流程,旨在帮助工程师快速掌握将AI技术落地于实际产线质检的核心步骤与调参经验。

weixin_29182481的博客 459

【辗转相除法的进阶】欧几里得扩展算法

文章目录前言一、欧几里得算法二、欧几里得算法扩展总结 前言 本文浅谈欧几里得扩展算法! 一、欧几里得算法 首先来谈谈欧几里得算法!这个也就是我们平常所称的辗转相除法。(小白专属) 这个算法最大应用就是求最大公因子。 欧几里得给出一个定理就是: (a,b) = (b,a%b) = ..... =(x,0) 这个x就是a b 的最大公因子,至于为什么这里有证明估计大家也不想看(哈哈,其实我自己写完也不太想看的!) 大家一定关心怎么使用这个算法,很简单(使用递归),也是很短的一个算法。 int gcd(in.

吃醋不爱蘸饺子的胡诌乱造 384

Pyside6实战:3种.ui文件加载方式对比(附完整代码示例)

本文深入解析Pyside6中3种.ui文件加载方式的优劣与性能优化策略,包括动态加载QUiLoader、预编译方案及混合策略。通过实测数据和完整代码示例,帮助开发者根据项目需求选择最优解,提升界面加载效率与内存管理。

weixin_30897233的博客 88

OpenCV入门(一)Python环境的搭建

因为有点Python基础,并且Python是比较好入门的编程语言,所以,机器视觉后面打算在Python这个平台下进行。

小幽余生不加糖 8122

浅谈扩展欧几里得算法

什么是拓展欧几里得?简单的说,就是求关于x,y的方程 ax + by = gcd(a,b) 的所有整数解 现在我们来解决一下三个问题 怎么求上述方程的特解? 怎么求由特解推出其他的所有解? 如何求的是ax + by = c,则解为什么? 一、求特解 我们都知道,欧几里得公式可以由这个式子表达 gcd(a, b) = gcd(b, a % b) 通过这个式子,我们可以不断递推到b = 0, 此时a即为a和b的最大公约数 现在我们对这个式子进行展开,看看有什么好玩的嘛 gcd(a, b) = a * x

Suryxin's blogs 1110

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

浅谈拓展欧几里得算法

有了上面的了解,我们就可以知道,欧几里得算法的底层原理,那么思考下面一个问题,给出。普通的欧几里得算法依据是辗转相除法,也就是,比如求。同样的,我们根据辗转相除法的思路,当。的时候找到最大公约数,此时。等于0,证明此时的原先。的最大公约数就是当前的。那么最小正整数解就是。否则最小正整数解就是。

cjp_kangkang_的博客 366

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

浅谈拓展欧几里得算法、最小正整数解与乘法逆元

欧几里得: 首先要明确欧几里得算法,就是我们所说的辗转相除法。 就是求两个数a,b的最大公因数gcd(a,b) ll gcd(ll a,ll b) //欧几里得算法 { //辗转相除法 if(a%b==0) return b; return gcd(b,a%b); } 拓展欧几里得算法 通俗来说就是求二元一次方程 Ax+By=C ...

wmy0536的博客 970

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

浅谈gcd

gcd是数论的开始,也是数论的基础, 辗转相除法求最小公因数从小学起我们就已经知道是个什么了 但是为什么辗转相除法是对的呢? 它的时间复杂度是什么呢? 这些东西直到最近我才发现(应该是我比较菜吧QAQ) 首先证明gcd的正确性: gcd(a,b)=gcd(b,a % b)(a>=b) 设gcd(a,b)=k,那么a=xk,b=yk ...

weixin_33696106的博客 175

浅谈数学在c语言编程中的,浅谈数学在语言编程中的应用毕业论文.doc

浅谈数学在语言编程中的应用毕业论文浅谈数学在C语言编程中的应用【】【】C语言对学习者的数学基础要求较高对一部分学生来说学好C语言有一定的困难。本文就本专业知识和自身对C语言的学习经验对数学在C语言编程中的应用做出讲解,以帮助部分学生更好的学习C语言。1 与数学的关系C语言要知道C语言与数学的关系可以通过以下几个关系来得出。1.1:编程语言与程序的关系程序(program)是为实现特定目标或解决特定...

weixin_33300389的博客 348

浅谈求最大公约数--java实现

求两个数的最大公约数常用的两种方法 : 解法一:辗转相除法,辗转相除法的原理很聪明,早在公元前300多年,欧几里得就在他的著作《几何原本》中给出了高效的解法,假设用f(x,y)表示想x,y的最大公约数,取 k=x/y,b=x%y,则x=k*y+b,如果能同时整除x和y的,即x和y的最大公约数与b和y的最大公约数是相同的,其最大公约数也是相同的,则f(x,y)=f(y,x%y)(x>=y>0),

cy402133150的专栏 374

浅谈欧几里德算法 GCD和LCM

首先介绍什么欧几里得算法 最大公约数问题是最早被研究的算法问题之一了,并且是ACM竞赛中能涉及到的很多数论内容,比如模线性方程,模线性方程组的基础。 欧几里得算法 (Euclidean algorithm) ,即大部分选手所知的“辗转相除法”,其核心在于不断将两数规模变小,最后实现对数时间内求解两个数的最大公约数。 其核心定理是: gcd(a,b)=gcd(b,a%b) 下面先证明这个核心定理: 证明:设a=kb+r,其中k和r分别为a除以b得到的商和余数。 则有r=a-kb成立。 设d为a

skill_Carney的博客 616

c语言在数学方面的应用编程,浅谈数学在C语言编程中的应用.doc

浅谈数学在C语言编程中的应用浅谈数学在C语言编程中的应用【】【】C语言对学习者的数学基础要求较高对一部分学生来说学好C语言有一定的困难。本文就本专业知识和自身对C语言的学习经验对数学在C语言编程中的应用做出讲解,以帮助部分学生更好的学习C语言。1 与数学的关系C语言要知道C语言与数学的关系可以通过以下几个关系来得出。1.1:编程语言与程序的关系程序(program)是为实现特定目标或解决特定问题而...

weixin_39713833的博客 1227

浅谈皮克定理

皮克定理: 皮克定理是指一个计算点阵中顶点在格点上的多边形面积公式。 皮克定理:S=a+b2−1 皮克定理:S = a + \frac{b}{2} -1 皮克定理:S=a+2b​−1 S表示多边形的面积 a表示多边形内的整数点 b表示多边形边界上的整数点 皮克定理适用于平面坐标系。已知其中两个就可以求另外一个。 要注意的是在平面中求两点之间的整数点,要考虑到有重点(求两条相交边可能会重复计算...

飞机飞过天空的博客 5114
上一篇: 《算法导论》第四章 分治策略
下一篇: 乘法逆元的解法及证明
Time_Limit
博客等级 码龄7年 264粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值