欧几里得算法求解最大公因数(gcd)正确性的证明

欧几里得算法求解最大公因数(gcd)正确性的证明

欧几里得算法是求解最大公因数(gcd)的简单且高效的算法。它的求解方法是以下的一个递归式:

gcd(a,b)={ab=0gcd(b,amodb)b0

(注意:上式规定 a>b,以方便讨论。由于 gcd(a,b)=gcd(b,a),这样规定也不会使这个式子失去一般性。如果想计算诸如 gcd(12,18) 之类的值,只要用上式计算 gcd(18,12) 即可。)

举个例子:gcd(18,12)=gcd(12,6)=gcd(6,0)=6

我们可以先分析一下这个递归式:第一种情况,当 b=0 时,有 gcd(a,0)=a,这是很显然的。因为任何数都是 0 的因数,又因为 a 是它本身最大的因数。我们不妨把这个情况当作“基本情况”,而第二个式子就是要把非一般的情况,转化为我们所知的、容易计算的基本情况。而这篇文章,主要就是证明第二种情况的式子为什么成立,即证明 gcd(a,b)=gcd(b,amodb)

要证明这个式子正确,我们先证明一个命题:设 ab 的公因数所构成的集合为 Abamodb 的公因数构成的集合为 B,则 A=B。换句话说,就是要证明所有 ab 的公因数,都是 bamodb 的公因数(即 AB);反过来,所有 bamodb 的公因数,也都是 ab 的公因数(即 BA)。证明了这个命题之后,既然 AB 相等,那么它们中最大的那个元素当然也就相等了。而 AB 中的最大元素,不就分别是 gcd(a,b)gcd(b,amodb) 吗!

虽然我们把原先要证明的命题扩大了:原本只需证明 ab最大公因数,等于 bamodb最大公因数;现在要证明 ab所有公因数,等于 bamodb所有公因数。但是由于去掉了“最大”的特殊条件,要证明起来反而更容易。

具体怎么证明呢?

gab 的一个公因数,且 a=ag , b=bg,要证明的就是 g|(amodb) (注:“|” 符号表示整除,x|y 就表示 xy 的因数)。从 mod 运算的定义出发,若 a=kb+r,其中 k 是满足 kba 的最大正整数,则 amodb=r=akb

a=ag , b=bg 代入,就得到 akb=agkbg=g(akb),所以显然 g|(amodb) 。上命题得证。用几个具体的数验证一下,设 a=18. b=12,则 amodb6,A=1,2,3,6,B=1,2,3,6,确实 A=B

综上,欧几里得算法的正确性证毕。

posted @   DengStar  阅读(111)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示