前言
辗转相除法用起来很简单,但是其原理却自己想不明白。于是乎看了几篇有关辗转相除法原理的分析,在这里自己写下自己的理解。
解释
欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。
即:两个数相除,若能除尽,则较小的那个数为最大公约数;若除不尽,则用余数替代掉较大的那个数,继续两个数相除、取余,直到能够除尽,此时较小的数即为最大公约数。
原理分析
首先设我们要求的两数分别为a、b(默认a>b),用gcd(a,b)表示a,b的最大公约数。
r = a (mod b) 即 r 为a除以b的余数(remainder),
设q为a除以b的商(quotient),即 a÷b=q…r。
辗转相除法就是要证明 a和b的最大公约数 和 b和r的最大公约数 相同;
即gcd(a,b)=gcd(b,r)。
前提:
a÷b=q…r。(a>b)
第一步:令c=gcd(a,b),即c为a和b的最大公约数,设
a=Ac,b=Bc
第二步:结合前提可知,余数r满足
r =a-qb
=Ac-qBc
=(A-qB)c
根据第二步结果可知:c也是r的约数 ,即c既是a,b的最大公约数,也是r和b的公约数。如果我们能够证明c不仅是公约数,更是最大公约数,那么就能够证明辗转相除法gcd(a,b)=gcd(b,r)。
第三步:
已知:
r = (A-qB)c
b = Bc
现在r和b分别各有两个约数:(A-qB)和c 以及 B和c,
c已经是公约数了,那如果我们能够证明(A-qB)与B互质的,就说明这两个因子中不再能够展开出其他公约数出来,那么r和b的最大公约数就是c。
第四步:证明(A-qB)与B互质(反证法)
我们假设(A-qB)与 B 存在公约数 d (d>1)
A-qB=xd ①
B=yd ②
由①式可得:A = qB+xd;
将 A 代回 a = Ac:
a = (qB+xd)c ,
再将 B= yd 代回:
a = (qyd+xd)c
a = (qy+x)dc
b = ydc
此时,a和b的最大公约数为dc,与我们最开始假定c为最大公约数的条件相矛盾,说明d不存在,
(A-qB)与 B 互质得证
(A-qB)与 B 互质 ,那么c也是r和b的最大公约数,gcd(a,b)=gcd(b,r) 得证。
代码
int a,b;
scanf("%d,%d",&a,&b);
//保证a为较大的那个数
if(a<b){
int c=a;
a = b;
b = c;
}
//核心代码
while((a%b)!=0){
int r = a%b;
a = b;
b = r;
}
结语
求最大公约数有很多个方法,更多方法可参考这里.
其中辗转相除法和更相减损法的原理比较类似,对更相减损法的原理分析可参考这里
如果这篇文章对你有帮助,请给我点个赞吧~
本文详细介绍了辗转相除法(欧几里得算法)求最大公约数的原理,并通过数学推理证明了gcd(a,b)=gcd(b,r)。还提供了算法的代码实现。"
106032278,9249736,遍历目录:使用File对象获取并打印子目录与文件,"['Java', '文件操作', '目录结构', '编程实践']
&spm=1001.2101.3001.5002&articleId=120380081&d=1&t=3&u=d1a01375759a4178a2c3419b421611d5)
9174

被折叠的 条评论
为什么被折叠?



