欧几里德算法的证明

在学习算法的过程中,与欧几里德算法来了一次邂逅,于是又去学习了一下。。。
欧几里德算法又称辗转相除法,用于计算两个数的最大公约数。
定理:

设a=qb+r,其中a,b,q,r都是正整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b, a(modb))

在网上看到的证明方法大多是这样:

a可以表示成a = kb + r(a,b,k,r皆为正整数),则r = a mod b
假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。
而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,等式左边可知m为整数,因此d|r
因此d也是(b,a mod b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。

不过对于这个证明过程的最后两句结论有个疑问:
“因此d也是(b,a mod b)的公约数”这句没什么问题,但是同样也可以得到“d也是(a,a mod b)的公约数”。
而这个结论“因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等”就完全不知道是怎么得出的。。。

后面和老师沟通了一下,其实这个证明过程是有问题的。
“因此d也是(b,a mod b)的公约数”这个结论并不能得出“因此(a,b)和(b,a mod b)的公约数是一样的”。只能得出“如果d是(a,b)的公约数,那么也d是(b,a mod b)的公约数”的结论,如果d是(a,b)的最大公约数,但d不一定是(b,a mod b)的最大公约数。所以并不能证明“(a,b)和(b,a mod b)的公约数是一样的”。

完整的证明过程应该是这样:

aa=kb+rabkra>b
r=amodb
da,b便d=(a,b)
d|a,d|babd
r=akb
d
r/d=a/dkb/d
d|a,d|bd|r
drda,b,rd=(a,b,r)
A(a,b)B(b,r)R(a,r)
AB,AR

(a,b)(b,r)
(a,b)(b,r)(a,r)

d(b,r)d|b,d|r a=kb+rd,
a/d=(kb+r)/d=kb/d+r/d d|b,d|r d|a
d=(b,r),a=kb+rdad=(a,b,r)
(b,r)(a,b)(a,r) BABR A=B
(a,b)(b,r)
             gcd(a,b)=gcd(b,r)

可见必须要满足两个条件才能得到(a,b)的公约数与(b,r)的公约数是相同的结论。
条件一:

假设d=(a,b),那么在a=qb+r的情况下,有 d=(b,r)
AB

条件二:

假设d=(b,r),那么在a=qb+r的情况下,有 d=(a,b)
BA

而网上的那个方法只是证明了条件一,所以并不能得出最后的结论。

在证明条件一的时候,也得到了 d=a,b,AR
那么是否能得到 A=R 成立呢?

同样,我们也需要证明条件二是否成立,

d=a,ra=qb+rd=a,b ”是否成立。

假设 d=a,r,d|a,d|r
a=qb+r 等式两边同时除以d,得到
a/d=(qb+r)/d=qb/d+r/d
d|a,d|rd|qbd|b
d=a,ra=qb+rd|qd=a,b
显然这个没什么意义。。。

其实 A=R 是不成立的,大家可以试试证明一下,这里就不证明了。

另外还有另一种证明方法:

第一步:令c=gcd(a,b),则设a=mc,b=nc
第二步:可知r =a-kb=mc-knc=(m-kn)c
第三步:根据第二步结果可知c也是r的因数
第四步:可以断定m-kn与n互素【否则,可设m-kn=xd,n=yd,(d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,故a与b最大公约数≥cd,而非c,与前面结论矛盾】
从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r),得证

—– 有的人活着,他已经死了,有的人死了,也不让人好好活,比如欧几里德、徐志摩。。。

你可能感兴趣的:(数据结构与算法)