欧几里得算法最简单的理解方法

前言
  最近,在学习《C语言大学教程(第八版)》,在第五章学习了递归,在课后练习题5.29中遇到了求两个整数的最大公约数,使用递归的方法。
  当时,也是百思不得其解。后来,查找到了“欧几里得算法”,又叫“循环相除法”。
  定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。最大公约数(Greatest Common Divisor)缩写为GCD。
  gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0)
  定理很简单,公式表示方法也很简单。而且,根据定理,用实际的例子,可以正确的计算出最大公因数。可是,思想却是完全懵逼的。根本想不通为什么要这样做,换句话说,欧几里得算法为什么要这样。
  接着,顺理成章,想到了去证明欧几里得算法。这样,自然而然,就可以理解欧几里得算法了。但是,网上大多的证明方法,把本就懵逼的自己搞得更加凌乱了。于是,开始了自己的思考之路,想找到一种最简单的方法去理解欧几里得算法。
解析
  首先,通过一番查阅,大致可以了解,以下几条信息:
  1.欧几里得算法,属于奥数竞赛类题目。
  2.欧几里得算法,是用来求两个整数的最大公因数。
  3.求两个整数的最大公因数,出现在小学五年级左右的数学课程中。
  要想解决问题,就要钻进去,追本溯源。我们先来快速回顾以下,小学课本里面,是怎么求两个整数的最大公因数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  注意,上述教材开篇有一句话:教材呈现了找公因数的一般方法。所以,大致可以明确,欧几里得算法没有出现在教材中,不属于一般方法,而是出现在奥数领域。所以,如果你从未上过奥数培优班,对欧几里得算法感到陌生,完全不需要有什么心里负担。因为,从这一刻开始,你将开启奥数思维,以一种区别于一般方法的视角,重新看待同一个问题。
  插一句题外话,可能有人会问,为什么要进行奥数区分,为什么不把教材都设置成一样的,这就是在搞区别对待。其实,不至于这样想。既然有这样的心里问题,同理,追本溯源,我们先来看看什么是奥数。
  奥数,全称为奥林匹克数学,是一门专注于培养学生数学思维和解题能力的课程。
  奥数(奥林匹克数学)是一种高难度的数学竞赛,其深度和广度都远超小学数学课程。
  通过上述这两点,可以简单明了,奥数无法存在于正常的小学数学课程里。奥数是更深层次的能力拔高,如果在正常的小学课程中充斥着奥数,会增加整体教育的难度。小学义务教育,更偏重于基础知识,基本素养,基本常识等的培养。而像奥数这种深度培养能力的课程,需要单独拿出来,做专门的培训。
  以上这些,非常重要,它帮助我们先解决掉心里情感上的障碍。不要因此质疑自身的能力甚至智商,只有以一个健康的心态,才能够正常的去解决问题。
  接下来,开始讲欧几里得算法最简单的理解方法。
最简单的理解方法
  前面已经知晓了,在一般方法中,我们的视角会放在整除上,即最大公因数能够同时整除两个整数。但是,在欧几里得算法中,我们的视角会放在余数上,即余数为零意味着整除。
  因此,欧几里得算法的核心即是解决掉余数,当余数为零时,自然意味着整除,自然就找到了最大公因数。
  简言之,一般方法,视角放在整除上。欧几里得算法,视角放在余数上。即这两种方法,切入问题的点不同。一般方法,以整除作为切入问题的点。欧几里得算法,以余数作为切入问题的点。
  综上,奥数会让我们以一个不同的视角看待问题。这真的启发思维,很有趣。
  如果,这些文字描述,无法理解,不要紧,因为下面会用一个简单的例子来说明。
  例子:
  假设我们要找到72和30的最大公约数。首先,我们用72除以30,得到商为2,余数为12。现在的问题是,我们应该如何进一步处理这个余数12?
  我们可以观察到,余数12是72除以30后剩下的部分。也就是说,我们可以将72表示为30的倍数加上余数12:
  72 = 30 * 2 + 12
  现在,我们的目标是找到30和12的最大公约数。注意到,如果一个数能同时整除30和12,那么它也能整除72。
  然后,我们继续进行下一步。我们用30除以12,得到商为2,余数为6。现在的问题是,我们应该如何处理这个余数6?
  同样地,我们可以将30表示为12的倍数加上余数6:
  30 = 12 * 2 + 6
  现在,我们的目标是找到12和6的最大公约数。同样地,如果一个数能同时整除12和6,那么它也能整除30和72。
  我们继续这个过程,用12除以6,得到商为2,余数为0。现在的问题是,我们应该如何处理这个余数0?
  当余数为0时,我们已经找到了最大公约数,即6。
  从这个例子中,我们可以看到欧几里得算法的替换步骤是如何起作用的。通过用较大的数除以较小的数,我们可以得到一个等式,将较大的数表示为较小的数的倍数加上余数。然后,我们将较小的数替换为余数,继续进行下一步。这样,我们逐渐缩小了问题的规模,直到余数为0,找到了最大公约数。
  欧几里得算法中的替换步骤是通过观察余数在除法运算中的角色和性质而发现的。它充分利用了余数表示较大的数除去多少倍后剩余的部分这一性质,从而帮助我们逐步缩小问题规模并找到最大公约数。
  上面例子中,有一句话:“注意到,如果一个数能同时整除30和12,那么它也能整除72。”想一想,这是为什么呢?
  假设我们要找到30和12的最大公约数,并且假设某个数能同时整除30和12。我们将这个数称为d。
  如果d能整除30和12,那么它意味着30和12都是d的倍数。我们可以表示为:
  30 = d * k1 (其中k1是一个整数)
  12 = d * k2 (其中k2是一个整数)
  现在,我们将这两个等式相加:
  30 + 12 = d * k1 + d * k2
  42 = d * (k1 + k2)
  我们可以看到,42也是d的倍数。如果d能够整除30和12,那么它也能整除42。
  同样地,如果我们假设d是30、12和72的公约数,那么我们可以得出结论,如果d能够整除30和12,那么它也能整除72。推导公式如下:
  72 = 30 * 2 + 12
  假设d是30和12的最大公约数
  30 * 2 = d * k1 * 2 (其中k1是一个整数)(等号两边的乘二是可以抵消的)
  12 = d * k2 (其中k2是一个整数)
  把这两个等式相加
  30 * 2 + 12 = d * k1 * 2 + d * k2
  72 = d * k1 * 2 + d * k2
  72 = d * (k1 * 2 + k2)
  所以,如果d能够整除30和12,那么它也能整除72。
  涉及到公式推导,可能没有那么直观。到这里,如果觉得还是很混乱,也正常,接下来,我们会以一种更简单的方式阐述。总之,我们的目标就是,不断以更加简单的方式去解释问题。为什么呢,因为当你能用非常简单的方式解释清楚一个问题时,就代表着你真正理解了这个问题,书本应是越读越薄,而不越读越厚。
更简单的阐述
  求两个整数的最大公因数,我们先来思考一个问题,这两个数的关系:
  1.当这两个整数相等时,最大公因数即是本身。可是,当两个整数相等时,即是同一个数,这是没意义的,不用去讨论。
  2.当这两个整数不相等时,就会出现一种最理想的情况,较大的数除以较小的数余数为零,最大公因数即为较小的数。
  3.当上述最理想的情况没有出现时,意味着,此时,两个数的关系为,不相等且一个数大一个数小。更进一步,最大公因数的搜索范围是以较小那个数为界定的。简单来讲,最大公因数小于较小的那个数。
  有了以上三点作为基础,就可以想通,为什么欧几里得算法会使用较大的数除以较小的数。因为,我们首先从上述第2种情况开始判断,如果出现最理想的情况,则可以直接得到结果。如果没有出现最理想的情况,就通过处理掉余数,从而找到最大公约数。这即是欧几里得算法的核心,我们视角的关注点是余数,余数为零即代表整除。我们不断的用除数除以余数,直到余数被除尽,找到最大公约数。欧几里得算法,本身就是在不断缩小范围,与递归的方式一致。
  这里还剩下一个问题,那就是,在上面的阐述中,使用较大的数除以较小的数,那可不可以使用较小的数除以较大的数呢。答案是当然可以,在首次计算时,使用较小的数除以较大的数,除不尽,会直接把较小的数当做余数。下一次计算时,使用较大的数除以较小的数,顺序会被重新调整回来。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值