TAOCP中,介绍了一个求取最大公约数的算法。假设有两个整数m,n,那么求取两个整数最大公约数的方法如下:

       E1:m除以n,余数为r;

       E2:如果r=0,那么最大公约数就是n;否则,进入E3;

       E3:n的值给m,r的值给n,然后返回E1继续。

       算法的主要难点在于:如何论证E3生成的整数对儿的最大公约数为什么与初始的m,n最大公约数一致。

【推到过程】

       经过E1,我们可以用以下表达式来表示:

                     m= qn + r(q,r为整数)

       如果此时r=0,那么算法结束,n显示是最大公约数。假如r ≠ 0,那么可以得出如下结论:

       1,m,n的所有公约数一定是m – qn = r的约数;

       2,n,r 的所有公约数一定是qn + r = m的约数。

       这样,{m,n}的公约数结合与{n,r}的公约数集合一致,也就是E3不会改变最终的结果。上面的这段是老爷子书中给出的解释,我大致进行了一下翻译。但是顺着这个思维理解了很久也没能够理解。

       其实,我们可以退回去理解一下。从第一条看,r的约数肯定包含了我们要求取的对象,也就是最大公约数肯定是r的约数的子集。而最大公约数同样是m或者n的约数的子集。这样,最大公约数肯定也是{n,r}整数对儿的最大公约数。

       其实,我个人觉得关键的理解点还是去看最大公约数存在于什么地方,每次的集合约数是不是包含了最大公约数的存在。