辗转相除法求最大公约数原理分析(附代码实现)

本文详细介绍了辗转相除法(欧几里得算法)求最大公约数的原理,并通过数学推理证明了gcd(a,b)=gcd(b,r)。还提供了算法的代码实现。" 106032278,9249736,遍历目录:使用File对象获取并打印子目录与文件,"['Java', '文件操作', '目录结构', '编程实践']

辗转相除法求最大公约数原理分析(附代码实现)

前言

辗转相除法用起来很简单,但是其原理却自己想不明白。于是乎看了几篇有关辗转相除法原理的分析,在这里自己写下自己的理解。

解释

欧几里得算法又称辗转相除法,是指用于计算两个非负整数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的最大公约数,也是rb公约数。如果我们能够证明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;
	}

结语

求最大公约数有很多个方法,更多方法可参考这里.

其中辗转相除法和更相减损法的原理比较类似,对更相减损法的原理分析可参考这里


如果这篇文章对你有帮助,请给我点个赞吧~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值