伪·从零开始学算法 - 2.2 求最大公约数

简介

两个或多个正整数数的公约数是,对于这些数,存在一个正整数,可以整除它们。公约数可能有若干个,而其中最大的就是最大公约数。

也就是:

A: card(A) ≥ 2, (∀ a ∈ A, a ∈ N*) ;
B = {n ∈ N* | ∀ x ∈ A, x mod n = 0};
k = max{B};
k即为A中各数的最大公约数。

从人类的做法推导

我们计算最大公约数的时候,通常用短除法来计算。具体的方法是:同时让这些数除以一个比较小的公约数,得到的结果再这样操作,直到找不到大于等于2的公约数;将除数相乘即得到最大公约数。比如:

短除法计算最大公约数

通过经验,人是可以快速找到一些较小的公约数,写在除数上的。但是,计算机却无法这么做。但是计算机可以从1开始,判断某个整数是否能整除所有给定的数。如果能,即为公约数,记下来;否则,除数加1,再试。

但是,算法是有限的,到什么时候停止呢?根据常理,一组数的最大公约数一定不大于这组数的最小的数。因此,如果算到这组数的最小值的话,就不用再算下去了。

由此可以推导出流程图如下:

计算最大公约数流程图(1)

鉴于1能够整除所有正整数,我们可以让循环从2开始。这样,流程图如下:

计算最大公约数流程图(2)

如果我们把“∀ a ∈ A, a mod i = 0?”的判断展开,则如下:

计算最大公约数流程图(3)

已经非常复杂了。

实际应用中,我们更多的是计算两个数之间的最大公约数。这样,流程图可以简化如下:

计算两个数的最大公约数流程图

不过这个方法在计算的时候,如果是小的数字还可以,遇到大数的时候,计算时间就非常长。

这时候还可以使用更加简便的算法。

辗转相除法

辗转相除法又称欧几里得算法,首次出现于《几何原本》中,被人们认为是史上第一个算法。它可以用于求两数的最大公约数。

首先,用两数中较大数除以较小数,求得数;再用较小数和余数按上述操作进行相除;直到余数为0。此时的除数即为最大公约数。

流程图表示如下:

辗转相除法(1)

考虑到许多编程语言使用的是DO-WHILE型的直到型循环结构,还有一些语言没有直到型循环结构,流程图改写为如下:

辗转相除法(2)

其中当型的流程图在循环结构前有一个定义变量r的操作。这里的r的赋值只要不等于0就可以了。

此外,还有递归型的流程图:

辗转相除法(递归)

更相减损术

更相减损术是《九章算术》中给出的求两个数的最大公约数的方法:

可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。

算法描述为:

第一步:任意给两个正整数;判断它们是否都是偶数,如果是,用2约简,并记下次数;否则,进行下一步;

第二步:以较大的数减去较小的数,把差与较小的数相比,并用大数减小数。继续此操作,使所得数相等为止。记下这个数。

第三步:如果第一步有约简,第二步所得的数乘上2乘约简次数就是最大公约数。否则,第二步所得的数就是最大公约数。

(人教版的教科书上对这个的解释有问题……粗体字表示增加的内容)

流程图如下:

更相减损术(1)

标准化后如下:

更相减损术(2)

看起来非常麻烦。

不过,还有一个简单的算法:

更相减损术(3)

实际上这和辗转相除法很相似了。在维基百科上,它们是在一个词条内的,而且上面的算法被称为欧几里得算法的减法形式。

三者的比较

在现代,算法之间的比较主要体现在效率上。在下面,我将使用IPython的工具来测试它们的运行速度(使用语言为Python,在安装Windows 10 专业版和Python 3.6的华硕N551ZU上进行,结果仅供参考)。

各种算法的执行时间测试

演示视频

从这里就能看出来,虽然现在电脑硬件水平的发展相当成熟,但是各个算法之间的运行速度还是有比较明显的差别的。

之前的那个直接求最大公约数的方法,运算速度相对于其他的算法都比较慢,尤其是在两个数都非常大的情况下。相比之下,其他算法的运算速度和它的运算速度相差悬殊。

另外,更相减损术在两数相差悬殊的时候,运算速度也会减慢。

从这里我们可以看出优化算法的意义——可以显著减少运行时间,提高效率,节能。这个测试还是在比较好的机器上进行的,如果是在简单的单片机上,差别就更加明显了。

参考资料

如果大家想了解关于这两个算法的更多内容,也可以看看。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 基本概念 因数 :若A=m×n,则称m,n是A的因数;A是m,n的倍数 一个数的最大因数和最小倍数都...
    AQ王浩阅读 2,126评论 0 4
  • 第一章数和数的运算 一概念 (一)整数 1整数的意义 自然数和0都是整数。 2自然数 我们在数物体的时候,用来表示...
    meychang阅读 2,588评论 0 5
  • 一、最大公约数(Greatest Common Divisor) 几个自然数,公有的因数,叫做这几个数的公约数;其...
    海天一树X阅读 1,028评论 0 1
  • 邵阳市黄金时代汽车维修中心,专业维修各类中小型汽车及柴油车皮卡车等,是江铃轻汽特约维修站,服务包括:柴汽机修,发动...
    2e3d5453944e阅读 234评论 0 0
  • 好多人都在增肌期间有过这样的烦恼和疑惑:为什么我每天练那么狠,但还是不见肌肉增长?对于这种达到瓶颈期的增肌群众,我...
    几何很木讷阅读 15,327评论 7 33