编程语言
首页 > 编程语言> > 浅谈 分而治之-欧几里得算法

浅谈 分而治之-欧几里得算法

作者:互联网

浅谈 分而治之-欧几里得算法


此问题讨论来源于《算法图解》[美] Aditya Bhargava

一、抛出问题

假设你有一小块田地,面积是1680*640。你要将这块地均匀地分成方块,并且分出地方块要尽可能大,你该如何分?

首先你可能想到,我直接对半分一下就好了,但是题中是需要分成的是方块;那你可能想到,我先按方块来分,然后对剩下不是方块的部分,我再分成方块。但是这就违背了均匀的题意。所以,应该如何来分呢?

我们可以使用分而治之的思想来解决问题。首先找出一个条件:一条边的长度是另一条边的整数倍。这样分出的土地正好是方块。另外一个就是如何把问题逐步分解来满足这个条件。

这个问题用到的就是分而治之的思路,同时里面也有递归的映射,这里就不做讨论了。

但是为什么会有这么一种方法呢?它背后的原理是什么呢?如果深究,就请继续看下面的欧几里得算法。

二、欧几里得算法及证明

一、算法

上面问题的解决归结到数学上,其实就属于求解两个数的最大公约数。说到这里可能很多人明白了,让我们继续往下看吧。
欧几里得算法是求解最大公约数。A和B的最大公约数使用GCD(A,B)(Greatest Common Divisor)表示。它的性质是:

使用此算法来计算上述例子,你就会发现上述例子思想就是欧几里得算法。

若你想继续深究,可以继续往下阅读欧几里得算法的性质证明,看看它是如何得出上面三个性质的。

二、证明

下面我们来证明欧几里得算法如何求得A和B的最大公约数。
首先看前两条性质,如果B=0,GCD(A,0) = B,GCD(A,B) = A;

下面我们来看第三条性质。我们需要逐步证明,来让过程看得简单:

要证明GCD(A,B) = GCD(B,R),我们先证明GCD(A,B) = GCD(B,A-B)
我们驾驶有三个数A,B,C,其中C=A-B
1、证明:GCD(A,B)整除C

2、证明:GCD(B,C)可以整除A

3、证明:GCD(A,B)=GCD(A,A-B)

4、最后证明:GCD(A,B) = GCD(B,R)

证毕

人在学习的时候,总会听自己想听的内容,从而会忽略一些重要知识,所以温故知新,建议收藏。

参考网站:https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/the-euclidean-algorithm

标签:浅谈,欧几里得,分而治之,最大公约数,证明,算法,整除,GCD
来源: https://blog.csdn.net/m0_46672151/article/details/114480806