目录
前言
今天再看算法图解,在看到快速排序时,感觉这种排序方法非常巧妙,得知这种算法来源于欧几里得算法(又名辗转相除法),于是又复习一下欧几里得算法。如果直接想看详细证明的话可以忽略前面的话直接跳转到我的证明(详解)
欧几里得算法
欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。
计算公式:
gcd(a,b) = gcd(b,a mod b)
证明
网上的一般证明
网上一般证明:
a可以表示成a = kb + r(a,b,k,r皆为正整数,且r b),则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)和(a,b,r)的公约数相同,其最大公约数也必然相等,得证。
但是,但是看到这里的时候觉得很别扭,怎么就出来了公约数相等了呢?上述只是证明了对于任意一个属于(a,b)公约数的d同时也是(a,a mod b) b)的公约数,并不能说明两个的公约数集合相等。这么说吧,我们要证明集合A和集合B相等,必须证明对于集合A中的任意一个数,在集合B中都有一个与它相等的数,同时对于集合B中的任意一个数,在集合A中都有一个数与它相等。
而上述的证明过程只证明了对于集合A((a,b)公约数集合)中的任意一个数,在集合B((a,a mod b)公约数集合)中都有一个数与它相等。并没有下一步,也就是说它逻辑上是不能推断出(a,b)和(a,a mod b)公约数相同的,抱着这个疑惑,继续找资料,有一个大佬的解答很符合我的胃口。
一位大佬的证明
大佬的证明:
a可以表示成a=kb+r(a,b,k,r皆为正整数;且a>b)
则r=a mod b
假设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
假设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 ,B R综上,A=B
由此得证,(a,b)的公约数与(b,r)的公约数相同,当然它们的最大公约数也必定相同。即
gcd(a,b)=gcd(b,r)
我的证明(详解)
我们在高中时学过假如要证明集合A=B那么,我们首先要证明A B,接着证明B A,然后我们才能说集合A=B
换到欧几里得算法:
gcd(a,b) = gcd(b,a mod b)
欧几里得算法的意思是a,b两个整数的最大公约数等于b与a整除b的余数的最大公约数。
我们证明它是正确的一个思路是:证明它们的公约数集合是相等的,只要公约数集合相等,那它们的最大公约数也必然相等
为了方便理解,我们令(a,b)的公约数集合为A,(b,r)的公约数集为B。
也就是说第一步我们证明集合A B,第二部证明集合B A,第三步,得证。
第一步,证明集合A B,再明白点就是:对于任意属于集合A的元素,在B中都有一个元素与它相等。
a可以表示为a=kb+r(k是一个大于0的整数,r是a整除b的余数)
也可以表示为r=a-kb (1)
在集合A中任取一个数d。//集合A是(a,b)公约数的集合,集合B是(b,r)公约数的集合,任取一个(a,b)的公约数
那么(1)式全部除以d就变成
r/d=a/d-kb/d
因为d是(a,b)的公约数,所以a/d,b/d,kb/d是一个整数,也就是说r/d也是一个整数,因为一个大整数减去一个小整数,还是一个整数。
由此我们可以得知r也整除d
由此我们得知d是(b,r)的公约数,也就是说d属于B.
由此我们得知对于任意一个属于A的元素d,也必定属于B,也就是说A B.
第二步,证明集合B A,也就是说:对于任意属于集合B的元素,在A中都有一个元素与它相等。
a可以表示为a=kb+r(k是一个大于0的整数,r是a整除b的余数) (2)
在集合B中任取一个数f。//集合A是(a,b)公约数的集合,集合B是(b,r)公约数的集合,任取一个(b,r)的公约数
那么(2)式全部除以f就变成
a/f=kb/f+r/f
因为f是(b,r)的公约数,所以kb/f,r/f是一个整数,也就是说a/f也是一个整数,因为一个整数加上一个整数,还是一个整数。
由此我们可以得知a也整除f
由此我们得知f是(a,b)的公约数,也就是说f属于A.
由此我们得知对于任意一个属于B的元素f,也必定属于A,也就是说B A.
第三步,结论
因为A B,并且合B A,所以我们说集合A=B.
因为(a,b)的公约数集合A和(b,r)的公约数集合B相等,所以我们说他们的最大公约数也必然相等,也就是说:
gcd(a,b)=gcd(b,r)