今天在做杭电OJ的一道题时突然想到了一个之前一直在用但是不知道其原理的一个古老的算法——辗转相除法!奋战许久之后,终于完美理解了。下面我将用比较浅显易懂的语言来进行描述以及给出证明!
在这之前,我们先来复习一些小学数学的概念(别笑,不是所有人都能够知道的!)
整除:如果整数a除以非零整数b,若余数为零,则我们称a能被b整除!或者说,b能整除a!其中,a为被除数,b为除数!
可能有的人会乱,那么你可以这样想:a经过“除法”这种运算之后变小了,所以是“被除”的数,而“除以”a的数b就是“除”数。这样的话,a能被b整除或者b能整除a就可以理解了!
理解了上面的概念之后,就可以进入重头戏了:证明辗转相除法!首先我们需要几个公理!
公理1:如果a能被b整除,且k为正整数,则ka也能被b整除!
公理2:如果a能被c整除,b也能被c整除,则a±b(a-b > 0)也能被c整除!
有了这两个公理,我们就可以来证明辗转相除法了!我们先来约定一个符号:a = gcd(m,n)就是表示 a 是 m 和 n 的最大公因数!
若:P 和 R 是 M 除以 N 的商和余数,及M÷N = P——R,或者M = N * P + R !则gcd(M,N) = gcd(N,R)
证明:设A = gcd(M,N),B = gcd(N,R)。
∵A是 M , N 的最大公因数;
∴M能被A整除,N能被A整除!
∴由公理1得,P* N也能被A整除;
由公理2得,M - P*N也能被A整除!
∵R=M - P*N;
∴R也被A整除;
∴A为R与N的一个公因数(不一定是最大的!);
∴A<=B;
同理可得:
∵B是 R , N 的最大公因数;
∴R能被B整除,N能被B整除!
∴由公理1得,P* N也能被B整除;
由公理2得,R + P*N也能被B整除!
∵M=R + P*N;
∴M也被B整除;
∴B为M与N的一个公因数(不一定是最大的!);
∴B<=A;
∴A = B!
证毕!