在学习算法的过程中,与欧几里德算法来了一次邂逅,于是又去学习了一下。。。
欧几里德算法又称辗转相除法,用于计算两个数的最大公约数。
定理:
设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)的公约数是一样的”。
完整的证明过程应该是这样:
a可以表示成a=kb+r(a,b,k,r皆为正整数;且a>b)
则r=amodb
假设d是a,b的一个公约数,为了方便,我们记d=(a,b)
则d|a,d|b,即a和b都可以被d整除 。
而 r=a−kb
两边同时除以d得到
r/d=a/d−kb/d
因为d|a,d|b,显然可以得到d|r
所以d是r的一个约数,因此d是(a,b,r)的公约数,即d=(a,b,r)
设A是(a,b)的公约数集,B是(b,r)的公约数集,R是(a,r)的公约数集
那么可以得到A⊆B,A⊆R
可见现在并不能得到(a,b)和(b,r)的公约数相同
只能说(a,b)的公约数是(b,r)公约数的一部分,同时也是(a,r)公约数的一部分
假设d′是(b,r)的公约数,则d′|b,d′|r; a=kb+r,等式两边都除以d′,可得
a/d′=(kb+r)/d′=kb/d′+r/d′ 因为d′|b,d′|r; 显然d′|a
所以如果d′=(b,r),那么在a=kb+r的情况下,d′也是a的约数,d′=(a,b,r)
因此(b,r)的约数集是(a,b)的约数集的一部分,也是(a,r)约数集的一部分 所以B⊆A,B⊆R 综上,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)
即证明A⊆B
条件二:
假设d=(b,r),那么在a=qb+r的情况下,有 d=(a,b)
即证明B⊆A
而网上的那个方法只是证明了条件一,所以并不能得出最后的结论。
在证明条件一的时候,也得到了 d=(a,b),A⊆R
那么是否能得到 A=R 成立呢?
同样,我们也需要证明条件二是否成立,
即
“ 假设d=(a,r),那么在a=qb+r的情况下,有d=(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|r,所以我们能得到d|qb成立,但是并不能得到d|b成立
因此,假设d=(a,r),那么在a=qb+r,且d|q时,才有d=(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),得证
—– 有的人活着,他已经死了,有的人死了,也不让人好好活,比如欧几里德、徐志摩。。。