《算法基础》——2.2 寻找最大公约数

2.2 寻找最大公约数

两个整数的最大公约数(Greatest Common Divisor,GCD)是指两个整数共有约数中最大的一个。例如,GCD(60,24)为12,因为12是60和24共有约数中最大的。(最大公约数也许看起来像一个深奥的功能,但是它实际上在加密程序中十分有用,这些加密程序被广泛用于金融通信安全等领域。)
注 如果GCD(A,B)=1,那么A和B被称作互质(relatively prime或coprime)。
一个找到最大公约数的方法是将两个因数分解并且找到它们共有的因数。但是希腊数学家欧几里得在他著于公元前300年的论述《几何原本》中记录了一个更快捷的方法。以下伪代码展示了这个算法的现代版。因为它是基于欧几里得的著作,这个算法被叫做欧几里得算法(Euclidian algorithm或Euclid抯 algorithm):

例如,计算GCD(4831,3003)。表2-2展示了A、B和每一步B除以A的余数M的值。

当B为0时,变量A即为最大公约数,本例中最大公约数为231。验证一下结果,考虑到4851=231×21,而3003=231×13,因此231是两数的公约数。21和13除1之外没有共同的因数,所以231是4851和3003的最大公约数。
最大公约数
如果你愿意的话,这是另一个可以跳过的数学解释。
欧几里得算法的关键是这个事实:GCD(A, B)=GCD(B, A Mod B)。
要理解为什么这是正确的,可以考虑取模运算符的定义。如果余数R=A Mod B,那么对于整数m,A=m×B+R。如果g是A和B的最大公约数,g是B的约数,所以g也必定是m×B的约数。因为g是A的约数并且A=m×B+R,g必定是m×B+R的约数。因为g是m×B的约数,它也一定是R的约数。
这证明了g是B和R的约数。g=GCD(B,R)的意思是g是能够约分B和R的最大整数。
假设G是一个比g大的整数,并且G 是B和R的约数,那么G也是m×B的约数。但是A=m×B+R,所以G也是A的约数。这就意味着g不是A和B的最大公约数。这与g是A和B最大公约数的条件矛盾,因为这与G>g的假定产生了矛盾,因此不存在这样的G,故g为A和B的最大公约数。

这个算法是较为快捷的,每两次While循环中,B值被一个因数至少减少为其1/2。因为B值在每两次迭代中被一个因数减少至少1/2,所以这个算法的运行时间复杂度至多为O(log B)。
对速度的需求
欧几里得算法中的B值在每两次While循环中被一个因数至少减少为其1/2。为了一探究竟,令Ak、Bk和Rk为第k次迭代中A、B和R的值,并且认为对于任意整数m,A1= m1×B1+R1。在第二次迭代中,A2=B1而B2=A1。
如果R1≤B1/2,那么可知B2≤B1。
假设R1>B1,在第三次迭代中,A3=B2=R1并且B3=R2。根据定义,R2=A2 Mod B2,且与B1 Mod R1相等。由于我们假设R1>B1/2,所以R1能够除B1一次并且留下余数(B1-R1)。
由于我们假设R1>B1/2,故可知(B1-R1)≤B1/2。
回到最初的方程式:(B1-R1)=(B1 Mod R1)=(A2 Mod R2)=R2=B3。因此B3≤B1/2,这是我们要证明的。

时间: 2024-10-22 09:26:47

《算法基础》——2.2 寻找最大公约数的相关文章

《算法基础》——导读

**前言**算法是使高效的程序成为可能的方法.它们解释了如何排列记录.搜索项.计算数值(比如质因子分解).查找一个街道网络中的最短路径.确定可能通过通信网络的最大流.算法好坏的差别可能意味着是在一秒.一个小时内解决问题,还是永远也不能解决问题.学习算法使你能建立有用的方法工具来解决具体的问题.它能帮助你理解在不同的情况下,哪个算法是最有效的,所以对于一个特定的问题,你就能选择最适合的算法.对某些数据而言性能优异的算法可能对其他的数据而言表现糟糕.所以知道如何选择一个最适合当前情况的算法是很重要的

《算法基础》——第2章 数值算法 2.1 随机化数据

第2章 数值算法 数值算法就是对数值进行计算,这些算法执行随机取数.分解质因数.寻找最大公约数和几何面积计算等任务.所有的这些算法在不同情况下有各自的用途,但是它们也展示了有效的算法技巧,比如自适应算法.蒙特卡罗方法和用表格来存储中间结果. 2.1 随机化数据 随机化在许多应用中起到重要作用.这种算法让一个程序模仿随机过程,测试算法在随机输入时的表现并寻找复杂问题的解决方案.2.5节描述的蒙特卡罗积分,即采用随机选点的办法来估算复杂几何面积的大小.在任何一种随机的算法中,第一步都是建立随机数表.

《算法基础》——第1章 算法基础知识 1.1 方法

第1章 算法基础知识 在开始算法学习之前,你需要一点背景知识.简单地说,首先需要知道的是算法是完成某些事情的方法.它定义了用某个方法执行一个任务的步骤.这个定义看起来足够简单,但是没有人为了做一件十分简单的工作而写算法.没有人写指令来获取数组中的第四个元素.这只是假设这是一个数组定义的一部分,并且你知道怎么去做(如果你知道如何在这个问题中使用编程语言).一般来说,人们只是为了完成复杂的任务而写算法.算法解释了如何找到一个复杂代数问题的答案,如何在一个包含数千条街道的网络中找到最短路径,抑或是如何

《算法基础》——2.7 总结

2.7 总结 一些数值计算算法(如随机化方法)在各种各样的应用中是有用的.其他算法(如质因子.寻找最大公约数)的用途可能是有限的.如果程序不需要寻找最大公约数,那么最大公约数的算法不会有太大的帮助.然而,通过这些算法表现出的技术和概念可以在其他许多情况下非常有用.例如,一个算法可以是概率性的,这个想法是在许多应用中都非常重要的.这种想法可以帮助你想出其他的算法,这是个具有不确定性的完美工作(这些问题很容易在面试时遇到). 本章阐述了公平和偏差的概念,这两个概念对于任何种类的随机化算法都非常重要,

一道算法基础题 uva1586

问题描述 一道算法基础题 uva1586 题目链接在这儿 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=830&page=show_problem&problem=4461 我自己做的代码如下 但是通不过 测了好多数据都没问题 #include<cstdio> #include<cstring> using namespace std; in

java 算法基础之二快速排序算法

http://www.cnblogs.com/hexiaochun/archive/2012/09/03/2668324.html java 算法基础之二快速排序算法 所谓的快速排序的思想就是,首先把数组的第一个数拿出来做为一个key,在前后分别设置一个i,j做为标识,然后拿这个key对这个数组从后面往前遍历,及j--,直到找到第一个小于这个key的那个数,然后交换这两个值,交换完成后,我们拿着这个key要从i往后遍历了,及i++;一直循环到i=j结束,当这里结束后,我们会发现大于这个key的值

《算法技术手册》一第3章 算法基础

第3章 算法基础 虽说开发软件是为了解决问题,但程序员们往往太执着于是否能够解决问题本身,而不去确认这一问题是否已有解决之法.即便程序员们知道前人已在类似情况下解决了问题,但"已有的解决之法"最终是否适用于特写的问题仍是一个未知数.更重要的是,要找到完全不需要修改或者只需要稍作修改便能解决手头问题的代码并不容易.不同的人对待算法的态度各有千秋.很多人就只是简单地在一本书中或者网站上找个算法,复制代码,运行一次,然后可能还会测试一次,如果结果正确,就开始做下一个任务.但是,在我们看来,这

《算法基础:打开算法之门》一2.4 递归

2.4 递归 利用递归技术,能将一个问题转化为同一个样子问题的求解过程.这是我最喜欢的经典的递归例子:计算n!("n的阶乘"),它被定义为如下,对于一个非负数n,当n=0时,n!=1且n!=n(n-1)(n-2)(n-3)-3•2•1(如果n≥1).例如,5!=5•4•3•2•1=120.22观察得(n-1)!=(n-1)(n-2)(n-3)-3•2•1,并且得n!=n•(n-1)!(对于n≥1).针对n!这个问题,我们定义了"较小的"问题,也就是(n-1)!.我们

《算法基础》——1.3 伪代码

1.3 伪代码 为了使本书中描述的算法尽可能有用,首先我们用直观的术语来描述它们.有了这个高层次的解释,可以能够用大多数的编程语言来实现这些算法.然而,一个算法的实现经常包含很多难以实现的琐碎细节.为了使这些细节易于处理,算法也用伪代码来描述.伪代码是很像编程语言但又不是真正的编程语言的一种文本.伪代码提供了代码实现算法过程中会用到的结构和细节,同时又不与某种特定的编程语言联系在一起.希望你能把这些伪代码翻译成真正的代码,然后在你的计算机上执行.下面的代码片段展示了计算两个整数的最大公约数(GC