1.2.5 最大公约数

1.2.5 最大公约数
两个整数A和B的最大公约数是能够被A和B整除的最大整数.
例如16和28的最大公约数是4,在第二章中,我们考察如何
实现有理数的算术,我们将需要能够计算最大公约数,为了分数的
简化操作.(为了把一个分数简化到最简化的形式,我们必须用分子与分
母除以它们的最大公约数 例如 16/28 简化为 4/7).
求最大公约数的方法是求它们的因数,再找共同的部分,然而
有一个著名的算法是更有效率的.

这个算法的思想是基于如下的发现:如果R是A除以B的余数,
那么 A和B的共同因子与B和R的共同因子是相同的.因此,
我们能够使用如下的方程:

GCD(a,b)=GCD(b,r)

为了连续化简计算GCD的问题到更小的,更小的数对。例如:

GCD(206,40)=GCD(40,6)
            =GCD(6,4)
            =GCD(4,2)
            =GCD(2,0)
            =2

把GCD(206,40)归结为GCD(2,0),结果为2。这显示出如下的过程是可能的。这个过程是开始于
任何两个正整数,执行重复的归结过程,最终生成了一个数对,它的第二个值是0。
然后,GCD是数对中的另一个值。计算GCD的这个方法有很有名的,被称为欧拉算法。

把欧拉算法表示为一个程序是很容易的。

(define (gcd a b)
   (if (= b 0)
     a
    (gcd b (remainder a b))))

这生成了一个迭代的过程,它的步骤的数量增长是一个对数级的。

欧拉算法要求的步骤的数量的事实与斐波那些数的情况有很有趣的关联。

拉美定理: 如果欧拉算法要求k个步骤,计算GCD的一些数对,
那么在数对上的更小的数,必须大于等于第K个斐波那些数。

我们能使用这个定理来估计欧拉算法的时间复杂度。让n等于程序的两个输入值中的小值,
如果执行过程有K个步骤,那么我们必须有 n>=Fib(k)约等于fin(k)*sqrt(t).
因此步骤K的数量的增长是对数级的。因此,时间复杂度是对数级的。

练习1.20
一个程序生成的执行过程当然是依赖于解释器使用的那些规则。作为一个例子,
考虑一个迭代的gcd的上面给定的程序。假定我们要解释这个程序使用自然序,
正如1.1.5部分中讨论的那样。(在练习1.5中,对于if的自然序的解释规则有描述)
使用替换模型,对于自然序,演示在解释(gcd 206 40)中生成的过程,并显示程序
remainder操作的实际执行情况。 在自然序中执行(gcd 206 40)实际需要多少个remainder操作?

猜你喜欢

转载自blog.csdn.net/gggwfn1982/article/details/81412175