《欧几里德算法》原理及应用

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数 。其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b)
解释:a和b的最大公约数,等于b和a除以b余数的最大公约数
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
d|a, d|b,而r = a - kb,因此d|r ----->a可以被d整除,b可以被d整除,则a-kb也可以被d整除 。即r可以被d整除
因此d是(b,a mod b)的公约数
假设d 是(b,a mod b)的公约数,则
d | b,d |r,但是a = kb +r
因此d也是(a,b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证 。
案例:
假设你是农场主,有一小块土地 。
如何将一块地均匀地分成方块,并确保分出的方块是最大的呢?使用D&C策略!D&C算法是递归的 。使用D&C解决问题的过程包括两个步骤 。
(1) 找出基线条件,这种条件必须尽可能简单 。
(2) 不断将问题分解(或者说缩小规模),直到符合基线条件 。
下面就来使用D&C找出前述问题的解决方案 。可你能使用的最大方块有多大呢?
【《欧几里德算法》原理及应用】首先,找出基线条件 。最容易处理的情况是,一条边的长度是另一条边的整数倍 。
如果一边长25m,另一边长50m,那么可使用的最大方块为25m×25m 。换言之,可以将这块地分成两个这样的方块 。
现在需要找出递归条件,这正是D&C的用武之地 。根据D&C的定义,每次递归调用都必须缩小问题的规模 。如何缩小前述问题的规模呢?我们首先找出这块地可容纳的最大方块 。
你可以从这块地中划出两个640 m×640 m的方块,同时余下一小块地 。现在是顿悟时刻:何不对余下的那一小块地使用相同的算法呢?
最初要划分的土地尺寸为1680 m×640 m,而现在要划分的土地更小,为640 m×400 m 。适用于这小块地的最大方块,也是适用于整块地的最大方块 。换言之,你将均匀划分1680 m×640 m土地的问题,简化成了均匀划分640 m×400 m土地的问题!
欧几里得算法
前面说“适用于这小块地的最大方块,也是适用于整块地的最大方块”,如果你觉得这一点不好理解,也不用担心 。这确实不好理解,但遗憾的是,要证明这一点,需要的篇幅有点长,在本书中无法这样做,因此你只能选择相信这种说法是正确的 。如果你想搞明白其中的原因,可参阅欧几里得算法 。

《欧几里德算法》原理及应用

文章插图
下面再次使用同样的算法 。对于640 m × 400 m的土地,可从中划出的最大方块为400 m × 400 m 。
这将余下一块更小的土地,其尺寸为400 m × 240 m 。
你可从这块土地中划出最大的方块,余下一块更小的土地,其尺寸为240m × 160 m 。
接下来,从这块土地中划出最大的方块,余下一块更小的土地 。
余下的这块土地满足基线条件,因为160是80的整数倍 。将这块土地分成两个方块后,将不会余下任何土地!
因此,对于最初的那片土地,适用的最大方块为80m×80m 。
这里重申一下D&C的工作原理:
(1) 找出简单的基线条件;
(2) 确定如何缩小问题的规模,使其符合基线条件