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