欧几里得算法:从证明等式gcd(m, n) = gcd(n, m mod n)对每一对正整数m, n都成立说开去
写诗或者写程序的时候,我们经常要跟欧几里得算法打交道。然而有没要考虑到为什么欧几里得算法是有效且高效的,一些偏激(好吧,请允许我用这个带有浓重个人情感色彩的词汇)的计算机科学家认为,除非程序的正确性在数学上得到了完全严格的证实,否则我们不能认为程序是正确的。既然存在即合理,因此下面我就详细得解说一下欧几里得算法,它为什么是正确的算法(算法过程就不给出了,有了思想,无论是迭代还是循环实现应该都不成问题),为什么有那么好的时间复杂性。
首先还是证明上述命题:注意到证明了该命题就证明了欧几里得算法的正确性。
证明:令d = gcd(m, n),则d|m 且d|n。设m = kn + r(0≤ r < n),则 d|(kn+r)。又有d|n,因此d|kn,所以有d|r。即我们由d|m 且d|n 这个前提可以得出d|r。换就话说,我们也可以说成由d|m 且d|n 这个前提推出了d|n 且 d|r。使用类似的推理过程同样可以得到:由d|n 且 d|r 可以推出d|m 且 d|n。注意到这里的r 即 m mod n。因此我们可以说gcd(m, n) = gcd(n, m mod n)是双向成立的,命题得证。
关于欧几里得定理我还是想多说一点,那就是欧几里得本人给出的证明过程,他的思维清晰,逻辑严密,虽然采用的几何证法,但是不失严密和优美。下面我就简略地复述一遍我们敬爱的欧几里得先生给出的证明,原版证明见欧几里得的成名作品《几何原本》:如果m 和n 互素,那么它们的最大公约数显然是1。如果两者不互素的话:首先,想象两段线段,它们的长度分别是m 和n。姑且把他们称作线段AB 和CD。我们取其中较短的一段量取另一段,姑且认为CD 是其中较短的线段,如果CD 量尽AB,这时它也量尽它自己,那么CD 就是CD、AB的一个公度数,显然CD 同时也是最大公度数,因为没有比CD 大的数能量尽CD。但是,如果CD 量不尽AB,那么从AB,CD中的较大者中不断地减去较小者,如此,将有一个余数能量尽它前面一个。我们说这个数就是m 和n 的最大公度数,为什么呢?假设这个余数不是最大公度数,那么必有大于该数的一个数能量尽AB 和 CD,最后我们能推出大于该余数的这个数能量尽这个余数,注意到这是不可能的,因为较大的数量尽较小的数是不可能的。通过这个反证的过程,我们知道没有大于该余数的数能量尽AB,CD。因而这个数就是AB 和 CD也即m 和n 的最大公度数。
好了,证明到这里先告一段落,下面我们来考察一下欧几里得算法的效率。
令r0 = m mod n, r1 = n mod r0。于是有gcd(m, n) = gcd(n, r0) = gcd(r0, r1)。只需要注意到这一事实:r0 < m/2 或者 r1 < n/2。就可以知道在两步之内算法的规模减半了,也就是说,其时间复杂度为2logn = O(logn)。这就是其时间复杂度的上界。如果你随便写一个算法,它的时间复杂度是O(logn),那么世界该有多么美好啊。
- All Rights Reserved.
- Author:海峰:)
- Copyright © xp_jiang.
- 转载请标明出处:http://www.cnblogs.com/xpjiang/p/4485409.html
欧几里得算法:从证明等式gcd(m, n) = gcd(n, m mod n)对每一对正整数m, n都成立说开去的更多相关文章
- Algorithms4th 1.1.25 欧几里得算法——数学归纳法证明
欧几里得算法的自然语言描述 计算两个非负整数p和q的最大公约数: 若q是0,则最大公约数为p.否则将p除以q得到余数r,p和q的最大公约数即为q和r的最大公约数. 数学归纳法证明 基础步骤: 若q = ...
- 浅谈欧几里得算法求最大公约数(GCD)的原理及简单应用
一.欧几里得算法及其证明 1.定义: 欧几里得算法又称辗转相除法,用于求两数的最大公约数,计算公式为GCD(a,b)=GCD(b,a%b): 2.证明: 设x为两整数a,b(a>=b)的最大公约 ...
- 欧几里得算法(gcd) 裴蜀定理 拓展欧几里得算法(exgcd)
欧几里得算法 又称辗转相除法 迭代求两数 gcd 的做法 由 (a,b) = (a,ka+b) 的性质:gcd(a,b) = gcd(b,a mod b) int gcd(int a,int b){ ...
- 欧几里得 & 拓展欧几里得算法 解说 (Euclid & Extend- Euclid Algorithm)
欧几里得& 拓展欧几里得(Euclid & Extend-Euclid) 欧几里得算法(Euclid) 背景: 欧几里德算法又称辗转相除法.用于计算两个正整数a.b的最大公约数. -- ...
- 欧几里得(Euclid)与拓展的欧几里得算法
欧几里得(Euclid)与拓展的欧几里得算法 欧几里得(Euclid)与拓展的欧几里得算法 欧几里得算法 原理 实现 拓展的欧几里得算法 原理 递归求解 迭代求解 欧几里得算法 原理 欧几里得算法是一 ...
- [数学基础] 4 欧几里得算法&扩展欧几里得算法
欧几里得算法 欧几里得算法基于的性质: 若\(d|a, a|b\),则\(d|(ax+by)\) \((a,b)=(b,a~mod~b)\) 第二条性质证明: \(\because a~mod~b=a ...
- 扩展欧几里得算法(extgcd)
相信大家对欧几里得算法,即辗转相除法不陌生吧. 代码如下: int gcd(int a, int b){ return !b ? gcd(b, a % b) : a; } 而扩展欧几里得算法,顾名思义 ...
- 关于欧几里得算法(gcd)的证明
求a,b的最大公约数我们经常用欧几里得算法解决,也称辗转相除法, 代码很简短, int gcd(int a,int b){ return (b==0)?a:gcd(b,a%b); } 但其中的道理却很 ...
- 初等数论-Base-2(扩展欧几里得算法,同余,线性同余方程,(附:裴蜀定理的证明))
我们接着上面的欧几里得算法说 扩展欧几里得算法 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式\(^①\): ax+by = gcd(a, b) =d(解一定存在,根据数论中的 ...
随机推荐
- 【BZOJ】1975: [Sdoi2010]魔法猪学院
题意 \(n(2 \le n \le 5000)\)个点,找尽量多的不同\(1\)到\(n\)的路径,每一次的花费就是路径的全值和,要求在费用不超过\(E\)的情况下路径最多. 分析 裸的最段路. 题 ...
- 【BZOJ1001】【BeiJing2006】狼抓兔子 最大流
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
- BZOJ4503: 两个串
Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字符. Input 两行两个字 ...
- iphone H5 input type="search" 不显示搜索 解决办法
H5 input type="search" 不显示搜索 解决办法 H5 input type="search" 不显示搜索 解决方法 在IOS(ipad iP ...
- UVA 558 判定负环,spfa模板题
1.UVA 558 Wormholes 2.总结:第一个spfa,好气的是用next[]数组判定Compilation error,改成nexte[]就过了..难道next还是特殊词吗 题意:科学家, ...
- MongoDB 用户配置
====[安装]====DOS下切换到文件所在盘符 例如 D:\MongoDB\bin设置数据库保存位置 mongod.exe --dbpath D:\MongoDB\Data [--auth]//用 ...
- XML参考 :XmlReader 详解、实例
XML参考 :XmlReader 详解.实例-- 详解 转:http://www.cnblogs.com/Dlonghow/archive/2008/07/28/1252191.html XML参考 ...
- Java EE 学习总结
1.Java EE WEB 工程项目文件结构 组成:静态HTML页.Servlet.JSP和其他相关的class: 每个组件在WEB应用中都有固定的存放目录. WEB应用的配置信息存放在web.xml ...
- navicat远程连接mysql
转载:http://blog.sina.com.cn/s/blog_84485e540101178p.html ERROR 1130: Host '192.168.1.81' is not a ...
- 在mapreduce中做分布式缓存的问题
一.问题描述: 主要解决一个问题,就是两个表做join,两个表都够大,单个表都无法装入内存. 怎么做呢?思路就是对做join的字段做排序两个表都排序,然后针对一个表a逐行读取,希望能够在内存中加载到另 ...