求两个正整数的最大公约数的辗转相除法算理
求两个数的最大公约数辗转相除法

求两个数的最大公约数
——辗转相除法
已知两个数a和b,求他们的最大公约数。
解:若a>b,则用a除以b,得其余数t1;
再用b除以t1,得其余数t2;
再用t1除以t2,得其余数t3;
再用t2除以t3,得其余数t4;
…………
再用t n−1除以t n,得其余数t n+1;
最后t n除以t n+1,得其余数0;
按照上述运算,余数为0时停止,最后一个非零余数t n+1就是两个数的最大公约数。
若a<b,道理相同。
下面我们再来证明辗转相除法:
由上面的阐述我们可以得到,辗转相除法的证明可以转化为证明两个数的最大公约数等于这两个数中的较小者和两个数商的余数的最大公约数。
假设a>b,a除以b的商是t,余数是s,故只需证a和b的最大公约数等于b和s的最大公约数即可;
a=tb+s ①
设a和b的最大公约数是k,则a、b可以表示为:
a=km ②
b=kn ③
因k为最大公约数,故m和n互质
由①②③可得:
s=a-tb=km-ktn=k(m-tn) ④
所以k是b和s的一个公约数,接下来只需要证明n和m-tn互质,就可以证明k是b和s的最大公约数;
这里我们用反证法,假设n和m-tn存在最大公约数w(w>1),则n 和m-tn可表示为:
n=wA ⑤
m-tn=wB ⑥
A和B互质;
由⑤⑥可得:
m=wB+tn=wB+twA=w(B+tA)
n=wA
m和n存在公约数w,这和m、n互质矛盾,所以假设不成立,所以n和m-tn互质。
所以k也是b和s的最大公约数。
故a和b的最大公约数等于b和s的最大公约数,此方法得证。
《算法案例-辗转相除法与更相减损术》(一)

《算法案例-辗转相除法与更相减损术》(一)算法案例-辗转相除法与更相减损术算法,是指在确定性有限时间内,解决特定问题的一系列清晰指令。
辗转相除法和更相减损术,均为求解最大公约数问题的算法。
下面将分别介绍这两种算法的基本思想和实现方式。
一、辗转相除法辗转相除法,也叫欧几里得算法,是求两个正整数的最大公约数的一种方法。
其基本思想是:设两个正整数为 a 和 b (a > b),如果a%b = 0,则 b 即为两数的最大公约数;否则,a 和 b 的最大公约数就是 b 和 a%b 的最大公约数,即 gcd(a,b) = gcd(b,a%b)。
这一思想可以用代码实现:```int gcd(int a, int b){return b == 0 ? a : gcd(b, a % b);}```辗转相除法的优点在于其计算量比较小,并且只用到了简单的加减操作,适用于大数据处理的场景。
同时,其时间复杂度为 O(log a + log b),在实际使用中速度较快。
二、更相减损术更相减损术,也是用于求两个正整数的最大公约数的一种方法。
其基本思想是:设两个正整数为 a 和 b (a > b),则 a-b 可以得到一个差值,而这个差值与 b 的最大公约数,也是 a 和 b 的最大公约数。
但是,由于上面的操作导致了数字的不停减少,如果两个数字差距较大,会导致较长的计算时间且容易出现递归调用栈溢出。
因此,更相减损术需要进行优化。
这时,我们可以使用辗转相除法来缩小数字差距。
当 a 和 b 中有一个数大于等于另一个数的两倍时,我们可以使用辗转相除法把两个数尽可能的靠近,再进行更相减损术的操作。
更相减损术的代码实现如下:```int gcd(int a, int b){if (a == b) return a;if (a < b) return gcd(b, a);if ((a & 1) == 0 && (b & 1) == 0) return gcd(a >> 1, b >> 1) << 1;else if ((a & 1) == 0) return gcd(a >> 1, b);else if ((b & 1) == 0) return gcd(a, b >> 1);else return gcd(b, a - b);}```三、总结辗转相除法和更相减损术,都是基于整除法和减法的扩展,通过不停地迭代缩小数字大小,最终得到两个数字的最大公约数。
展转相除法

从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。
证毕。
编辑本段
算法
自然语言描述
辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的:
1. 若 r 是 a ÷ b 的余数,则
gcd(a,b) = gcd(b,r)
2. a 和其倍数之最大公因子为 a。
scanf("%u%u",&m,&n);
printf("%u与%u的最大公约数为:%u\n",m,n,gcd ( m,n ) );
return 0;
}
/* 功能:返回正整数m和n的最大公约数*/
unsigned gcd ( unsigned m,unsigned n )
else
return a;
}
C语言实现
/*题目:输入两个正整数,求其最大公约数。*/
#include <stdio.h>
unsigned gcd ( unsigned,unsigned ) ;
int main( void )
{
unsigned m,n;
printf("请输入两个正整数:");
辗转相除法最早出现在欧几里得的几何原本中(大约公元前300年),所以它是现在仍在使用的算法中最早出现的。这个算法原先只用来处理自然数,但在19世纪,辗转相除法被推广至其他类型的数,如高斯整数和一元多项式。自此,现代抽象代数概念如欧几里得整环开始出现。后来,辗转相除法又扩展至其他数学领域,如纽结理论和多元多项式。
辗转相除法求最大公约数和最小公倍数

辗转相除法求最大公约数和最小公倍数1: /*辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。
2: 例如,252和105的最大公约数是21(252 = 21 ×12;105 = 21 ×5);3: 因为252? 105 = 147,所以147和105的最大公约数也是21。
在这个过程中,较大的数缩4: 小了,所以继续进行同样的计算可以不断缩小这两个数直至其中一个变成零。
这时,所剩下的5: 还没有变成零的数就是两数的最大公约数。
6: */7: #includ e <stdio.h>8:9: int getGCD AndLC M(int a,int b){10: int max=a>b?a:b;//将较大的数赋给max11: int min=(max=a)?b:a;//将较小的数赋给min12: int temp;//暂时存储变量13: while(max!=0){14: temp=min%max;15: min=max;16: max=temp;17: }18: printf("最大公约数为%d\n",min);19: printf("最小公倍数为%d\n",a*b/min);20: }21:22: int main(){23: printf("输入两个数整数值\n");24: int a,b;25: scanf("%d",&a);26: scanf("%d",&b);27: getGCD AndLC M(a,b);28: return0;29: }C语言水仙花数算法打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。
求最大公约数辗转相除法

求最大公约数辗转相除法最大公约数是数学中一个重要的概念,又称最大公因数。
它是两个或多个整数中最大的能被这些整数整除的整数,它也是整除这些数的所有自然数中最大者。
最大公约数辗转相除法(Euclidean algorithm)是计算最大公约数最有效的方法之一。
本文将详细介绍最大公约数辗转相除法的原理和计算步骤。
一、原理最大公约数辗转相除法是古希腊数学家厄拉多塞(Euclid)发现的,是一种减法运算的数学方法,以此可以求出两个或多个整数的最大公约数。
该法的基本思想是:给定任意两个正整数a和b(a>b),求它们的最大公约数,先取倍数较大的数a和较小的数b做相减,即a-b,若差值d=a-b不等于零,则把a,b赋值为最初的a,d,再重复上述减法运算,直到减法运算的差值d=0,此时最大公约数即为a和b的最初除数。
二、步骤最大公约数辗转相除法的计算步骤如下:(1)确定a和b的值,其中a>b;(2)求a与b的差d=a-b;(3)将a,b赋值为a,d;(4)重复上述第二步和第三步的运算,直到d=0,此时最大公约数即为a和b的最初除数。
例:求最大公约数36和24,如下:(1)确定a和b的值,其中a>b:a=36,b=24(2)求a与b的差d=a-b:d=36-24=12(3)将a,b赋值为a,d:a=36,b=12(4)重复上述第二步和第三步的运算,直到d=0,此时最大公约数即为a和b的最初除数:d=36-12=24a=36,b=24d=36-24=12a=36,b=12d=36-12=24a=36,b=24d=36-24=12a=36,b=12d=36-12=24d=0最大公约数则为12.三、应用最大公约数辗转相除法在数学中有着广泛的应用,是有效求解问题的重要方法。
它不仅可以求解最大公约数,还可以求解最小公倍数、判断两数是否互素(即两数的最大公约数为1)、判断三数是否公倍数关系(即两数的最大公约数等于另一数)等。
c++辗转相除法求最大公约数和最小公倍数

c++辗转相除法求最大公约数和最小公倍数介绍:欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。
应用领域有数学和计算机两个方面。
计算公式gcd(a,b) =gcd(b,a mod b)。
算法简介:欧几里德算法是用来求两个正整数最大公约数的算法。
是由古希腊数学家欧几里德在其著作《TheElements》中最早描述了这种算法,所以被命名为欧几里德算法。
扩展欧几里德算法可用于RSA加密等领域。
假如需要求1997 和615 两个正整数的最大公约数,用欧几里德算法,是这样进行的:1997 / 615 = 3 (余152)615 / 152 = 4(余7)152 / 7 = 21(余5)7 / 5 = 1 (余2)5 / 2 = 2 (余1)2 / 1 = 2 (余0)至此,最大公约数为1 以除数和余数反复做除法运算,当余数为0 时,取当前算式除数为最大公约数,所以就得出了1997 和615的最大公约数1。
cpp代码实现#include<iostream>using namespace std;int GCD(int a, int b){int c;while (b > 0){c = a % b;a = b;b = c;}return a;}int LCM(int a,int b){int c;c = a * b / GCD(a, b);return c;}int main(){int x, y;cin >> x >> y;cout << "x和y的最大公约数为:" << GCD(x, y) << endl;cout << "x和y的最小公倍数为:" << LCM(x, y) << endl;return 0;}。
用辗转相除法求最大公约数

辗除法辗除法(zhǎnchúfǎ)——辗转相除法,又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。
它是已知最古老的算法,其可追溯至3000年前。
它首次出现于欧几里德的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。
它并不需要把二数作质因子分解。
证明:设两数为a、b(b<a),求它们最大公约数(a、b)的步骤如下:用b除a,得a=bq......r 1(0≤r)。
若r1=0,则(a,b)=b;若r1≠0,则再用r1除b,得b=r1q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r2除r1,……如此下去,直到能整除为止。
其最后一个非零余数即为(a,b)。
[编辑] 算法辗转相除法是利用以下性质来确定两个正整数a 和 b 的最大公因子的:1. 若r 是 a ÷ b 的余数, 则gcd(a,b) = gcd(b,r)2. a 和其倍数之最大公因子为a。
另一种写法是:1. a ÷ b,令r为所得余数(0≤r<b)若r = 0,算法结束;b 即为答案。
2. 互换:置a←b,b←r,并返回第一步。
[编辑] 虚拟码这个算法可以用递归写成如下:functiongcd(a, b) {if b<>0returngcd(b, a mod b);elsereturn a;}或纯使用循环:functiongcd(a, b) {define r as integer;while b ≠ 0 {r := a mod b;a := b;b := r;}return a;}pascal代码(递归)求两数的最大公约数functiongcd(a,b:integer):integer;beginif b=0 then gcd:=aelsegcd:=gcd (b,a mod b);end ;其中“a mod b”是指取a ÷ b 的余数。
利用递归求两个数的最大公约数(利用辗转相除法)

利用递归求两个数的最大公约数(利用辗转相除法)最大公约数,也叫做最大公因数,是指两个或多个整数共有的约数中最大的一个。
求两个数的最大公约数可以使用递归方法,特别是采用辗转相除法。
所谓辗转相除法,是指通过不断地用较小的数去除较大的数,然后再用除数去除余数,直到最后余数为0为止。
最后一个不为0的除数即为最大公约数。
下面我们就来看一个具体的例子,以便更好地理解递归求解最大公约数的方法。
假设我们要求解的两个数是36和48。
首先,我们使用48去除36,得到余数为12。
然后,将36作为新的被除数,余数12作为新的除数,再进行一次相除操作。
我们用36去除12,得到余数0。
此时,我们得到的不为0的除数12就是最大公约数。
我们可以使用递归方法来实现这个过程。
首先,设定递归函数gcd(a, b)表示求解a和b的最大公约数。
如果b等于0,那么gcd(a, b)就等于a;如果b不等于0,那么gcd(a, b)等于gcd(b, a%b)。
这样,我们就可以利用递归不断地缩小问题规模,直到规模最小为止。
接下来,我们将上述方法转化为函数的形式,方便我们进行编程实现。
```pythondef gcd(a, b):if b == 0:return aelse:return gcd(b, a % b)```在调用这个函数时,我们只需要传入要求解的两个数即可。
```pythonresult = gcd(36, 48)print("36和48的最大公约数为:" + str(result))```通过以上步骤,我们成功地求解出了36和48的最大公约数,即12。
这个方法不仅仅适用于36和48,对于任意两个正整数,我们都可以采用相同的方法求解它们的最大公约数。
在实际应用中,求解最大公约数经常用于简化分数、约分、化简等操作。
比如,在算术题中,我们需要将一个分数化简为最简形式,就需要求解其分子和分母的最大公约数,然后将分子和分母都除以这个最大公约数,得到最简形式的分数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
求两个正整数的最大公约数的辗转相除法算理
如何求两个正整数的最大公约数?这是高中数学必修三算法一章中的内容。
用算法求解此问题时,教材中介绍了一种古老而有效的算法——辗转相除法。
对于辗转相除法以及同节中的更相减损术的算法易理解,但其中的算理,不少学生甚至老师都有一些疑惑,为了解决这个疑问,笔者进行了思考。
一、被除数与除数的公约数集与除数与余数的公约数集相等吗
“用辗转相除法求 8151 与 6105 的最大公约数,我们可以考虑用两数中较大的数除以较小的数,求得商和余数:
8251=6105×1+2146
由此可得,6105 与 2146 的公约数也是 8251 与 6105 的公约数,反过来 8251 与 6105 的公约数也是 6105 与 2146 的公约数,所以它们的最大的公约数相等。
”
从以上例子中不难看出,运用了“被除数与除数的公约数集与除数与余数的公约数集相等”这一结论。
下面对这一结论予以证明。
设 a=b×q+r,其中 a 为被除数,b 为除数,q 为商,r 为余数.
①设 a、b 的公约数集为 A,则,a=mq1,b=mq2
mq1= mq2q+r
r=m(q1-q2q)
故m是r的约数,所以a、b的公约数一定是b、r的公约数。
②设 n 为 b、r 的公约数集 B,n ∈ B,n 为 b、r 的公约数,则 b=nq1, r=nq2, a= nq1q+nq2
a=n(q1q+ q2)
故n是a的约数,所以b、r的公约数一定是a、b的公约数。
由①②知 A=B,所以被除数与除数的公约数集与除数与余数的公约数集相等。
二、辗转相除法与更相减损术两种方法之间有联系吗
“用更相减损术求 98 与 63 最大公约数。
解:由于 63 不是偶数,把 98 和 63 以大数减小数,并辗转相减,如图示:
所以,98 和 63 的最大公约数等于 7。
”
将上图变化为下图:
对比较辗转相除法,不难发现,更相减损术与辗转相除法算理一致,只不过更相减损术求解过程中的各式的商总是“1”这个定值。
参考文献:
[1] 普通高中课程标准实验教科书·数学 3( 必修 ).北京:人民教育出版社,2007.。