欧几里得 辗转相除法
- 格式:doc
- 大小:34.00 KB
- 文档页数:4
高等代数辗转相除法
高等代数辗转相除法是一种解决多项式问题的基本方法,也称为欧几里得算法或辗转相除法,其基本思想是将两个多项式进行除法运算,不断用余数作为被除数进行下一次除法运算,直到余数为0为止。
其本质是在寻找多项式的最大公因子,可以用于求解多项式的因式分解、求解方程组等问题。
辗转相除法的具体步骤如下:
1. 将两个多项式按照同一变量的次数从高到低排列,保证次数最高的项在最前面。
2. 用较小的多项式去除较大的多项式,得到商和余数。
3. 将余数和除数交换位置,重复以上步骤,直到余数为0为止。
4. 此时被除数即为最大公因子。
辗转相除法的优点在于简单易懂,而且可以适用于任何多项式,但是其缺点是效率较低,在大规模计算时不太实用。
因此,在实际应用中,需要结合其他方法来解决问题。
- 1 -。
欧⼏⾥得算法及其证明在数学中,辗转相除法,⼜称欧⼏⾥得算法,是求最⼤公约数的算法。
辗转相除法市⼀中递归算法,每⼀步计算的输出值就是下⼀步计算时的输⼊的值。
设k表⽰步骤数(从 0 开始计数),算法计算过程如下。
每⼀步的输⼊都是前两次计算的⾮负余数r k−1和r k−2。
因为每⼀步计算出的余数都在不断减⼩,所以,r k−1<r k−2。
在第k步中,算法计算出满⾜已下等式的商q k和余数r k:r k−2=q k r k−1+r k其中 0≤r k<r k−1。
也就是r k−2要不断减去r k−1直到⽐r k−1⼩。
为求简明,以下只说明如何求两个⾮负整数a和b的最⼤公约数(负数的情况是简单的)。
在第⼀步计算时 (k=0),设r−2和r−1分别等于a和b,第⼆步(k=1) 时计算r−1(即b)和r0(第⼀步计算产⽣的余数)相除产⽣的商和余数,以此类推。
整个算法可以⽤如下等式表⽰:a=q0b+r0b=q1r0+r1r0=q2r1+r2r1=q3r2+r3⋯如果有a<b,算法的第⼀步实际上会把两个数字交换,因为这时a除以b所得的商会等于 0,余数r0则等于a。
然后,算法的第⼆步便是把b除以a,再计算所得之商和余数。
所以,对于k≥0 总有r k≤r k−1,即运算的每⼀步中得出的余数⼀定⼩于上⼀步计算的余数。
由于每⼀步的余数都在减⼩并且不为负数,必然存在第N步是r N等于 0 使算法终⽌,r N−1就是a和b的最⼤公约数。
其中N不可能⽆穷⼤,因为在r0和 0之间只有有限个⾃然数。
正确性的证明:辗转相除法的正确性可以分成两步来证明。
在第⼀步,证明算法的最终结果r N−1同时整除a和b。
因为它是⼀个公约数,所以必然⼩于或等于最⼤公约数g。
在第⼆步,证明g能整除r N−1。
所以g⼀定⼩于或等于r N−1。
两个不等式只在r N−1=g时同时成⽴。
具体证明如下。
证明r N−1同时整除a和b:余数r N=0,r N−1∣r N−2:r N−2=q N r N−1因为r N−1∣r N−2,所以r N−1∣r N−3:r N−3=q N−1r N−2+r N−1同理可证r N−1可以整除所有之前步骤的余数,包括a和b,即r N−1是a和b的公约数,r N−1≤g。
辗转相除法百科
辗转相除法,也称为欧几里得算法,是一种用于计算两个非负整数最大公约数的方法。
它的计算公式为gcd(a,b) = gcd(b,a mod b),即两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。
这个算法在数学和计算机领域都有广泛的应用,并且可以使用多种编程语言实现。
此外,辗转相除法还可以用于多项式中,通过多次利用带余除法计算两个多项式的最大公因式。
对于多项式f(x)和g(x),如果存在一个多项式q(x)和r(x),使得f(x)=q(x)g(x)+r(x),那么f(x)和g(x)与g(x)和r(x)有相同的公因式。
以上内容仅供参考,建议查阅专业的数学书籍获取更全面和准确的信息。
欧⼏⾥得(扩展)算法欧⼏⾥得算法欧⼏⾥得算法⼜称辗转相除法,是指⽤于计算两个⾮负整数a,b的最⼤公约数。
应⽤领域有数学和计算机两个⽅⾯。
计算公式gcd(a,b) = gcd(b,a modb)。
证明记a|d表⽰a可以整除d(d为a的倍数)设d为a和b的公约数,即d|a,d|b。
a modb = a-kb,显然d也为a mod b 的和b的公约数。
设d为a mod b和b的公约数,即d|b,d|(a mod b)则有d|(a-kb),因为ad−kbd和bd为整数,所以ad必为整数,即d也为a和b的公约数。
综上,(a,b)与(b,a mod b)有相同的公约数,故其最⼤公约数也相等。
C++实现int gcd(int a,int b){return b==0?a:gcd(b,a%b);//其实b⽐a⼤时也是对的}扩展欧⼏⾥得算法扩展欧⼏⾥得算法是欧⼏⾥得算法(⼜叫辗转相除法)的扩展。
除了计算a、b两个整数的最⼤公约数,此算法还能找到整数x、y(其中⼀个很可能是负数)。
通常谈到最⼤公因⼦时, 我们都会提到⼀个⾮常基本的事实: 给予⼆整数 a 与 b, 必存在有整数 x 与 y 使得ax + by = gcd(a,b)。
有两个数a,b,对它们进⾏辗转相除法,可得它们的最⼤公约数——这是众所周知的。
然后,收集辗转相除法中产⽣的式⼦,倒回去,可以得到ax+by=gcd(a,b)的整数解。
证明我们先假设ax+by=gcd(a,b)①存在整数解,令r=a%b,根据假设我们⼜可以得到个式⼦:bx′+ry′=gcd(b,r)=gcd(a,b)存在整数解,将r=a−⌊ab⌋b带⼊并整理得:b(x′−⌊ab⌋y′)+ay′=gcd(a,b)②我们发现①②具有相同的形式,即①式的解可以从②式中获得:x=y′,y=x′−⌊ab⌋y′这就是说只要我们找到②式的解,就能得到①式(上⼀层)的解。
根据相同的形式,从②式的原式我们⼜可以得到rx′′+r′y′′=gcd(r,r′)=gcd(a,b),r′=b%r...根据欧⼏⾥得,这个过程会有⼀个尽头:dx+0y=gcd(a,b),其中d=gcd(a,b),为使等式成⽴,我们可以令x=1,y=0(当然也可以为其他值)这就找到了⼀组可⾏解,在⼀层层倒退回去,就能得到原始⽅程的⼀组整数解。
怎么求两个数的最大公约数方法1:辗转相除法(欧几里得算法)欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。
其计算原理依赖于下面的定理:定理:gcd(a,b) = gcd(b,a mod b)证明:a可以表示成a = kb + r,则r = a mod b假设d是a,b的一个公约数,则有d|a, d|b,而r = a - kb,因此d|r因此d是(b,a mod b)的公约数假设d 是(b,a mod b)的公约数,则d | b , d |r ,但是a = kb +r因此d也是(a,b)的公约数因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证方法2:更相减损术更相减损法:更相减损术,出自于中国古代的《九章算术》,也是一种求最大公约数的算法。
①先判断两个数的大小,如果两数相等,则这个数本身就是就是它的最大公约数。
②如果不相等,则用大数减去小数,然后用这个较小数与它们相减的结果相比较,如果相等,则这个差就是它们的最大公约数,而如果不相等,则继续执行②操作。
方法3:Stein算法(结合辗转相除法和更相减损法的优势以及移位运算)众所周知,移位运算的性能非常快。
对于给定的正整数a和b,不难得到如下的结论。
其中gcb(a,b)的意思是求a,b的最大公约数的函数当a和b均为偶数,gcb(a,b) = 2gcb(a/2, b/2) = 2gcb(a>>1, b>>1) 当a为偶数,b为奇数,gcb(a,b) = gcb(a/2, b) = gcb(a>>1, b) 当a为奇数,b为偶数,gcb(a,b) = gcb(a, b/2) = gcb(a, b>>1) 当a和b均为奇数,利用更相减损术运算一次,gcb(a,b) = gcb(b, a-b),此时a-b的结果必然是偶数,又可以继续进行移位运算。
辗转相除法一、引言1.1 任务描述辗转相除法(Euclidean algorithm),也称作欧几里得算法,是一种用于求最大公约数(Greatest Common Divisor, GCD)的算法。
该算法是基于数论中的定理:两个整数的最大公约数等于其中较小数和两数相除的余数的最大公约数。
1.2 算法思想辗转相除法的核心思想是通过反复取余数的操作,将复杂的整数相除问题转化为简单的求余数问题,直到余数为0。
具体执行过程为:将被除数除以除数,得到商和余数,将除数与余数交换,再用新的除数去除以新的余数,以此类推,直到得到余数为0为止。
最后一个非零余数即为最大公约数。
二、辗转相除法详解2.1 原始辗转相除法原始的辗转相除法可以通过递归或循环来实现。
以下是基于循环的实现方法:int gcd(int a, int b) {while (b != 0) {int temp = b;b = a % b;a = temp;}return a;}2.2 改进辗转相除法为了进一步优化辗转相除法的效率,可以采用更巧妙的方式来计算最大公约数。
一种改进的方法是使用移位运算来替代乘、除和取模运算:int gcd(int a, int b) {if (a < b) {return gcd(b, a);}if (b == 0) {return a;}if ((a & 1) == 0 && (b & 1) == 0) {return gcd(a >> 1, b >> 1) << 1;} else if ((a & 1) == 0 && (b & 1) != 0) {return gcd(a >> 1, b);} else if ((a & 1) != 0 && (b & 1) == 0) {return gcd(a, b >> 1);} else {return gcd(b, a - b);}}三、辗转相除法应用辗转相除法不仅仅可以用于求解最大公约数,还可以应用于其他问题中,例如:3.1 求解最小公倍数最小公倍数(Least Common Multiple, LCM)可以通过最大公约数和两个数的乘积来计算得到。
求最大公约数的方法辗转相除法证明
辗转相除法,又称为欧几里得算法,是一种用于求两个整数的最大公约数(GCD)的经典算法。
这个算法基于一个简单但重要的原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。
证明辗转相除法的原理,我们可以按照以下步骤进行:
第一步,假设我们有两个正整数a和b,其中a > b。
根据整数的性质,我们知道a可以表示为b的倍数加上余数,即a = bq + r,其中0 ≤ r < b。
第二步,我们考虑a和b的最大公约数。
由于a = bq + r,a的任何公约数都必须是b 和r的公约数。
因此,a和b的公约数集合是b和r的公约数集合的子集。
第三步,反过来,考虑b和r的最大公约数。
由于r = a - bq,r的任何公约数也必须是a和b的公约数。
因此,b和r的公约数集合是a和b的公约数集合的子集。
第四步,结合第二步和第三步,我们可以得出a和b的公约数集合与b和r的公约数集合是相同的。
因此,a和b的最大公约数等于b和r的最大公约数。
第五步,根据第四步的结论,我们可以反复应用辗转相除法的原理,直到余数为0。
此时,非零的除数就是a和b的最大公约数。
因此,我们证明了辗转相除法可以正确地求出两个整数的最大公约数。
这个算法不仅简单有效,而且在实际应用中具有广泛的用途,包括密码学、计算机科学等领域。
辗转相除法求最大约数辗转相除法求最大约数什么是辗转相除法?辗转相除法,又称欧几里得算法,是求两个正整数的最大公约数的一种方法。
它基于如下原理:两个整数的最大公约数等于其中较小的那个数和两数的差的最大公约数。
例如,252和105的最大公约数是21(252=21×12,105=21×5),因为252−105×2=42,而42和105的最大公约数是21。
这个过程可以继续下去,因为42−21×2=0,所以42和105的最大公约数就是21。
如何使用辗转相除法求最大约数?首先需要明确一个概念:余数。
在进行辗转相除法时,在每一次操作中都会产生一个余数。
余数是指在进行除法运算时未被整除部分所剩下来的部分。
步骤:1.将两个正整数a,b中较大的那个赋给a, 较小的那个赋给b;2.用a除以b,得到余数r;3.如果r等于0,则b就是两个正整数的最大公约数;否则执行第4步;4.将b赋值给a, 将r赋值给b, 重新执行第2步。
重复执行第2步和第4步,直到余数r等于0为止。
此时,b就是两个正整数a和b的最大公约数。
举例:求出24和60的最大公约数。
1.将60赋给a, 24赋给b;2.用60除以24,得到余数12;3.因为12不等于0,所以执行第4步;4.将b的值24赋给a, 将r的值12赋值给b, 重新执行第2步;5.用24除以12,得到余数0;6.因为余数等于0,所以此时的b(即12)就是24和60的最大公约数。
总结:辗转相除法是一种简单而有效的求最大公约数的方法。
它不需要使用复杂的算法或者数据结构,只需要进行简单的除法运算即可。
同时,辗转相除法也可以扩展到求多个正整数的最大公约数,只需要依次对每两个正整数进行求解即可。
辗转相除找公约数的原理
辗转相除法,也称欧几里得算法,是一种求最大公约数的算法。
该算法基于如下定理:
定理:两个整数a,b(a>b)的最大公约数等于b和a%b(余数)的最大公约数。
例如,求48和18的最大公约数,可以按照下面的步骤进行:
48÷18=2·12
18÷12=1·6
12÷6 =2·0
因为最后的余数为0,所以6是48和18的最大公约数。
可以看到,在每一步中,我们都是将较大的数除以较小的数,并得到一个余数,然后将较小的数和余数作为新的两个数继续进行相同的操作,直到余数为0为止。
最终得到的较小的数就是原来两个数的最大公约数。
这个算法的原理可以用数学归纳法证明。
具体可以参考相关的数学教材和理论知
识。
3个数辗转相除法
辗相除法(也称为欧几里得算法)是一种用于求解最大公约数(Greatest Common Divisor,简称GCD)的算法。
下面是使用辗转相除法求解3个数的最大公约数的步骤:
1. 选择任意两个数进行辗转相除,求得它们的最大公约数。
2. 将上一步得到的最大公约数与第三个数进行辗转相除,求得它们的最大公约数。
3. 重复进行上述步骤,直到最后一个数与前面的最大公约数相除得到的结果为1,则前面的最大公约数即为所求的3个数的最大公约数。
例如,假设要求解3个数5、10和15的最大公约数:
1. 10和5的最大公约数为5。
2. 15和5的最大公约数为5。
3. 因为5和1的最大公约数为1,所以5即为所求的3个数的最大公约数。
因此,3个数5、10和15的最大公约数为5。
需要注意的是,辗转相除法适用于任意多个数的最大公约数的求解。
欧几里得数据结构-概述说明以及解释1.引言1.1 概述概述在计算机科学中,数据结构是一种逻辑组织和存储数据的方式。
它旨在提高数据操作的效率和性能,并帮助我们解决各种计算问题。
欧几里得数据结构是一种常见且重要的数据结构之一,它基于欧几里得算法的原理,用于解决一系列数学问题。
欧几里得算法,也被称为辗转相除法,是古希腊数学家欧几里得在其著作《几何原本》中首次提出的一种求最大公约数的算法。
该算法基于如下定理:对于任意两个正整数a和b,它们的最大公约数等于其中较小数b与它们的差ab的最大公约数。
欧几里得算法的应用非常广泛,除了求最大公约数,还可以解决一些与整数相关的问题。
在欧几里得算法的基础上,欧几里得数据结构应运而生。
它提供了一种有效的数据结构来存储和处理与欧几里得算法相关的数据。
欧几里得数据结构通常由一棵树来表示,每个节点都保存着两个整数a和b,代表欧几里得算法中的两个数。
通过递归构建这棵树,我们可以快速地求得两个数的最大公约数。
欧几里得数据结构的应用十分广泛。
它可以用于解决一些数学问题,例如判断两个数是否互质、求解线性不定方程等。
此外,在密码学领域,欧几里得数据结构也被广泛应用于RSA加密算法、扩展欧几里得算法等。
通过合理地利用欧几里得数据结构,我们可以在计算中高效地处理大规模数据,提高算法的执行效率。
本文将详细介绍欧几里得数据结构的原理和应用。
首先,我们将介绍欧几里得算法的基本思想以及它如何被转化成数据结构。
接着,我们将深入探讨欧几里得数据结构在解决数学问题中的应用场景,并通过具体案例加以说明。
最后,我们将总结欧几里得数据结构的重要性,并展望其在未来的发展前景。
希望本文能够为读者进一步理解和应用欧几里得数据结构提供一定的参考和指导。
1.2 文章结构本文主要围绕欧几里得数据结构展开,旨在介绍欧几里得数据结构的概念、原理及其在实际应用中的重要性。
为了使读者更好地理解和掌握这一数据结构,本文分为引言、正文和结论三个部分。
辗转相除法求公约数
辗转相除法是一种求两个数的最大公约数的方法,也称为欧几里得算法。
这种方法的基本思想是,用较大的数去除较小的数,再用余数去除除数,如此反复,直到余数为零为止。
最后的除数就是这两个数的最大公约数。
例如,求出48和60的最大公约数。
首先用60除以48,得到商1余12,然后用48除以12,得到商4余0。
因为余数为0,所以48和60的最大公约数就是12。
辗转相除法的原理是基于以下定理:对于任意两个正整数a和b,设r是a除以b的余数,那么a和b的最大公约数等于b和r的最大公约数。
这个定理可以用数学归纳法来证明。
辗转相除法的优点是简单易行,计算速度快。
但是,它的缺点是不够精确,有时会得到错误的结果。
例如,当两个数的差很小,或者其中一个数是另一个数的倍数时,辗转相除法可能会得到错误的结果。
为了避免这种情况,可以使用更精确的方法来求最大公约数,例如质因数分解法或欧拉算法。
质因数分解法是将两个数分别分解成质因数的乘积,然后找出它们的公共质因数,最后将这些质因数相乘即可得到最大公约数。
欧拉算法是一种基于欧拉函数的算法,它可以在较短的时间内求出两个数的最大公约数。
辗转相除法是一种简单易行的求最大公约数的方法,但是在某些情况下可能会得到错误的结果。
为了得到更精确的结果,可以使用其他方法来求最大公约数。
欧几里得算法的时间复杂度
欧几里得算法,也称为辗转相除法,是一个用于求两个数最大公约数的算法。
这个算
法最初由古希腊数学家欧几里得所发明,因此得名为欧几里得算法。
欧几里得算法的时间
复杂度非常低,只有O(logn)。
欧几里得算法的基本原理是用较小数除较大数,再用得到的余数(第一余数)去除较
小数。
依此类推,直到某一次余数是0为止。
此时,最后一个被用作除数的非零余数就是
最大公约数。
例如,假设我们要求24和60的最大公约数。
我们首先用60除24,得到商2和余数
12(60=2×24+12)。
然后我们用24除12,得到商2和余数0(24=2×12+0)。
因为余数
为0,所以12就是24和60的最大公约数。
欧几里得算法的时间复杂度可以通过递归来解释。
假设我们要求a和b的最大公约数,且a>b。
我们可以把a除以b得到余数r,即a=bq+r。
那么,a和b的最大公约数等于b和r的最大公约数。
因此,我们可以把问题转化为求b和r的最大公约数,递归调用算法。
每次递归调用都能使得被除数减小至原来的一半,因此运行时间是O(logn)。
欧几里得算法的优点在于它很容易实现,可以使用递归或迭代算法,而且它的时间复
杂度非常低。
因此,在计算机程序设计中,欧几里得算法常常用于求最大公约数或相关问
题的解决。
说说辗转相除法
注:本文首发于微信公众号“每天3道奥数题”,这是一个数学博士创办的免费奥数公众号,每天更新奥数题,专注于教家长辅导奥数。
辗转相除法又叫欧几里得除法,主要用于求两个数的最大公因数或两个多项式的最大公因式。
辗转相除的过程主要用到带余除法,所谓带余除法,就是当正整数a>=b时,总可以找到正整数m和自然数d,满足:
a=m*b+d,(其中0<=d<b)
上述除法的过程就叫a对b做带余除法,其中d就是a除以b的余数。
要求两个正整数a>=b的最大公因数,辗转相除法的过程就是:
(1)a对b做带余除法,得到余数d;
(2)如果d=0,则b就是a、b的最大公因数。
如果d>0,就b对d做带余除法。
(3)不断重复第(2)步,直到余数为0。
倒数第二步得到的余数就是a和b的最大公因数。
下面举例说明:
例:求1422和3792的最大公因数。
第一步:3792=2*1422+948;
第二步:1422=1*948+474;
第三步:948=474*2+0。
所以,最大公因数是474。
对于多项式,也可以类似的求最大公因式,只是一开始比较的是多项式的次数。
欧几里得算法的递归式欧几里得算法,又称辗转相除法,是求两个正整数最大公约数的算法。
其基本思想是通过不断求两个数的余数,将较大数不断替换成余数,直到余数为0时,较小数即为最大公约数。
欧几里得算法的递归式可以表示为:gcd(a,b) = gcd(b, a mod b),其中a、b为正整数,gcd(a,b)表示a、b的最大公约数,a mod b表示a除以b的余数。
该递归式的证明可以通过反证法得到:设d=gcd(a,b),则a和b都是d的倍数,即a=md,b=nd,其中m和n为正整数。
根据辗转相除法,有gcd(a,b) = gcd(b, a mod b),代入a和b的表达式,可得gcd(a,b) = gcd(nd, md mod nd)。
由于md mod nd等价于m(mod n)d,而m和n都是正整数,因此md mod nd必定小于nd,因此gcd(nd, md mod nd) = gcd(nd, md mod nd) = gcd(nd,m(mod n)d) < gcd(a,b),与d=gcd(a,b)矛盾。
因此假设不成立,即gcd(a,b) = gcd(b, a mod b)成立。
欧几里得算法的时间复杂度为O(log(min(a,b))),证明可以通过数学归纳法得到。
假设a>b,设k=log(min(a,b)),则有a mod b < b/2,因此执行一次辗转相除后,a至少减少一半,即a<=a/2。
因此,当k=1时,a和b都至少减少了一半,因此辗转相除的次数不超过2log(min(a,b))。
设k>1时结论成立,当k=log(min(a,b))时,则可以将b替换为a mod b,此时a<b,因此执行一次辗转相除后,a至少减少一半,且b<=a/2,因此辗转相除的次数不超过2log(min(a,b))。
证毕。
欧几里得算法的递归式
欧几里得算法,又称辗转相除法,是一种求最大公约数的算法。
其核心思想是:用较小数除较大数,再用余数去除除数,如此反复,直到余数为零时,除数即为最大公约数。
欧几里得算法的递归式为:gcd(a,b)=gcd(b,a mod b),其中gcd 表示最大公约数,a和b为待求的两个数。
递归式的解释如下:首先,用b去除a,得到a除以b的余数r,即a mod b。
那么,b和r的最大公约数,也就是gcd(b,a mod b),就是原问题gcd(a,b)的解。
这个过程可以用递归来实现。
递归式的优点是简洁清晰,容易理解和实现。
但是,需要注意的是,递归会占用大量的内存空间,容易导致栈溢出。
因此,在实践中,需要注意递归的深度和边界条件的判断,以避免出现问题。
- 1 -。
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。
其计算原理依赖于下面的定理:定理:gcd(a,b) = gcd(b,a mod b)证明:a可以表示成a = kb + r,则r = a mod b假设d是a,b的一个公约数,则有d|a, d|b,而r = a - kb,因此d|r因此d是(b,a mod b)的公约数假设d 是(b,a mod b)的公约数,则d | b , d |r ,但是a = kb +r因此d也是(a,b)的公约数因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证[编辑本段]欧几里得算法原理Lemma 1.3.1 若a, b 且 a = bh + r, 其中h, r , 则gcd(a, b) = gcd(b, r).证明. 假设d1 = gcd(a, b) 且d2 = gcd(b, r). 我们证明d1| d2 且d2| d 1, 因而可利用Proposition 1.1.3(2) 以及d1, d2 皆为正数得证d1 = d2.因d1| a 且d1| b 利用Corollary 1.1.2 我们知d1| a - bh = r. 因为d1| b, d1| r 且d2 = gcd(b, r) 故由Proposition 1.2.5 知d1| d2. 另一方面, 因为d2| b 且d2| r 故d2| bh + r = a. 因此可得d2| d1.Lemma 1.3.1 告诉我们当 a > b > 0 时, 要求a, b 的最大公因数我们可以先将 a 除以 b 所得馀数若为r, 则a, b 的最大公因数等於 b 和r 的最大公因数. 因为0r < b < a, 所以当然把计算简化了. 接著我们就来看看辗转相除法. 由於gcd(a, b) = gcd(- a, b) 所以我们只要考虑a, b 都是正整数的情况.Theorem 1.3.2 (The Euclidean Algorithm) 假设a, b 且 a > b. 由除法原理我们知存在h0, r0 使得a = bh0 + r0, 其中0r0 < b.若r0 > 0, 则存在h1, r1 使得b = r0h1 + r1, 其中0r1 < r0.若r1 > 0, 则存在h2, r2 使得r0 = r1h2 + r2, 其中0r2 < r1.如此继续下去直到rn = 0 为止. 若n = 0 (即r0 = 0), 则gcd(a, b) = b.若n1, 则gcd(a, b) = rn - 1.证明. 首先注意若r0 0, 由於r0 > r1 > r2 > ... 是严格递减的, 因为r0 和0 之间最多仅能插入r0 - 1 个正整数, 所以我们知道一定会有nr0 使得rn = 0.若r0 = 0, 即 a = bh0, 故知 b 为 a 之因数, 得证 b 为a, b 的最大公因数. 若r0 > 0, 则由Lemma 1.3.1 知gcd(a, b) = gcd(b, r0) = gcd(r0, r1) = ... = gcd(rn - 1, rn) = gcd(rn - 1, 0) = rn - 1.现在我们来看用辗转相除法求最大公因数的例子Example 1.3.3 我们求 a = 481 和 b = 221 的最大公因数. 首先由除法原理得481 = 2 . 221 + 39, 知r0 = 39. 因此再考虑 b = 221 除以r0 = 39 得221 = 5 . 39 + 26, 知r1 = 26. 再以r0 = 39 除以r1 = 26 得39 = 1 . 2 6 + 13, 知r2 = 13. 最后因为r2 = 13 整除r1 = 26 知r3 = 0, 故由Theore m 1.3.2 知gcd(481, 221) = r2 = 13.在利用辗转相除法求最大公因数时, 大家不必真的求到rn = 0. 例如在上例中可看出r0 = 39 和r1 = 26 的最大公因数是13, 利用Lemma 1.3.1 马上得知gcd(a, b) = 13.在上一节Corollary 1.2.5 告诉我们若gcd(a, b) = d, 则存在m, n 使得 d = ma + nb. 当时我们没有提到如何找到此m, n. 现在我们利用辗转相除法来介绍一个找到m, n 的方法. 我们沿用Theorem 1.3.2 的符号. 首先看r0 = 0 的情形, 此时 d = gcd(a, b) = b 所以若令m = 0, n = 1, 则我们有 d = b = ma + nb. 当r0 0 但r1 = 0 时, 我们知 d = gcd(a, b) = r0. 故利用 a = bh0 + r0 知, 若令m = 1, n = - h0, 则 d = r0 = ma + nb. 同理若r0 0, r1 0 但r 2 = 0, 则知 d = gcd(a, b) = r1. 故利用 a = bh0 + r0 以及 b = r0h1 + r1知r1 = b - r0h1 = b - (a - bh0)h1 = - h1a + (1 + h0h1)b.因此若令m = - h1 且n = 1 + h0h1, 则 d = r1 = ma + nb. 依照此法, 当r0, r1 和r2 皆不为0 时, 由於 d = gcd(a, b) = rn - 1 故由rn - 3 = rn - 2hn - 1 + rn - 1 知 d = rn - 3 - hn - 1rn - 2. 利用前面推导方式我们知存在m1, m2, n1, n2 使得rn - 3 = m1a + n1b 且rn - 2 = m2a + n2b 故代入得d = (m1a + n1b) - hn - 1(m2a + n2b) = (m1 - hn - 1m2)a + (n1 - hn - 1n2)b.因此若令m = m1 - hn - 1m2 且n = n1 - hn - 1n2, 则 d = ma + nb.上面的说明看似好像当r0 0 时对每一个i {0, 1,..., n - 2} 要先将ri 写成r i = mia + nib, 最后才可将 d = rn - 1 写成ma + nb 的形式. 其实这只是论证时的方便, 在实际操作时我们其实是将每个ri 写成mi'ri - 2 + ni'ri - 1 的形式慢慢逆推回 d = ma + nb. 请看以下的例子.Example 1.3.4 我们试著利用Example 1.3.3 所得结果找到m, n 使得13 = gcd(481, 221) = 481m + 221n. 首先我们有13 = r2 = 39 - 26 = r0 - r1. 而r1 = 221 - 5 . 39 = b - 5r0, 故得13 = r0 - (b - 5r0) = 6r0 - b. 再由r 0 = 481 - 2 . 221 = a - 2b, 得知13 = 6(a - 2b) - b = 6a - 13b. 故得m = 6 且n = - 13 会满足13 = 481m + 221n.要注意这里找到的m, n 并不会是唯一满足 d = ma + nb 的一组解. 虽然上面的推演过程好像会只有一组解, 不过只能说是用上面的方法会得到一组解, 并不能担保可找到所有的解. 比方说若令m' = m + b, n' = n - a, 则m'a + n'b = (m + b)a + (n - a)b = ma + nb = d. 所以m', n' 也会是另一组解. 所以以后当要探讨唯一性时, 若没有充分的理由千万不能说由前面的推导过程看出是唯一的就断言是唯一. 一般的作法是假设你有两组解, 再利用这两组解所共同满足的式子找到两者之间的关系. 我们看看以下的作法.Proposition 1.3.5 假设a, b 且 d = gcd(a, b). 若x = m0, y = n0 是 d = ax + by 的一组整数解, 则对任意t , x = m0 + bt/d, y = n0 - at/d 皆为 d = ax + by 的一组整数解, 而且 d = ax + by 的所有整数解必为x = m0 + bt/d, y = n0 - at/d 其中t 这样的形式.证明. 假设x = m, y = n 是 d = ax + by 的一组解. 由於已假设x = m 0, y = n0 也是一组解, 故得am + bn = am0 + bn0. 也就是说a(m - m0) = b(n0 - n). 由于 d = gcd(a, b), 我们可以假设 a = a'd, b = b'd 其中a', b' 且gcd(a', b') = 1 (参见Corollary 1.2.3). 因此得a'(m - m0) = b'(n0 - n). 利用b'| a'(m - m0), gcd(a', b') = 1 以及Proposition 1.2.7(1) 得b'| m - m0. 也就是说存在t 使得m - m0 = b't. 故知m = m0 + b't = m0 + bt/d. 将m = m0 + bt/d 代回am + bn = am0 + bn0 可得n = n0 - at/d, 因此得证 d = a x + by 的整数解都是x = m0 + bt/d, y = n0 - at/d 其中t 这样的形式. 最后我们仅要确认对任意t , x = m0 + bt/d, y = n0 - at/d 皆为 d = ax + by 的一组整数解. 然而将x = m0 + bt/d, y = n0 - at/d 代入ax + by 得a(m0 +bt/d )+ b(n0 - at/d )= am0 + bn0 = d, 故得证本定理.利用Proposition 1.3.5 我们就可利用Example 1.3.4 找到13 = 481x + 2 21y 的一组整数解x = 6, y = - 13 得到x = 6 + 17t, y = - 13 - 37t 其中t 是13 = 481x + 221y 所有的整数解.[编辑本段]欧几里得算法设计辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的:1. 若r 是 a ÷b 的余数, 则gcd(a,b) = gcd(b,r)2. a 和其倍数之最大公因子为a。
欧几里得辗转相除法, 又称欧几里德算法(Euclidean algorithm),是求两个正整数之最大公因子的算法。
它是已知最古老的算法之一, 最早可追溯至公元前300年。
它首次出现于欧几里德的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。
它并不需要把二数作质因子分解。
编辑摘要
目录[隐藏]
1 概念
2 算法
3 伪代码
4 任意实数对的辗转相除法
5 多个数的辗转相除法
6 辗转相除法的步数估计——拉梅定理
辗转相除法- 概念
辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求两个正整数之最大公因子的算法。
它是已知最古老的算法之一, 最早可追溯至公元前300年。
它首次出现于欧几里德的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。
它并不需要把二数作质因子分解。
我们用符号gcd(a,b)表示自然数a和b的最大公因数,在不引起误会的情况下(比如在涉及到解析几何的区间时,因为区间的表示与之一样),也简写为(a,b)。
辗转相除法- 算法
辗转相除法的实现,是基于下面的性质:
1:(a,b)=(a,ka+b),其中a、b、k都为自然数
就是说,两个数的最大公约数,将其中一个数加到另一个数上,得到的新数组,其公约数不变,比如(4,6)=(4+6,6)=(4,6+2×4)=2。
这里有一个比较简单的证明方法来说明这个性质:如果p是a和ka+b的公约数,p整除a,也能整除ka+b。
那么就必定要整除b,所以p又是a 和b的公约数,从而证明他们的最大公约数也是相等的。
还有另外一个性质也是很必要:
2:(0,a)=a
由这两个性质得到的,就是更相减损术:
(78,14)=(64,14)=(50,14)=(36,14)=(22,14)=(8,14)=(8,6)=(2,6)=(2,4)=(2,2)=(0,2)=2
基本上思路就是大数减去小数,一直减到能算出来为止。
不过在平时的计算过程中,往往不必计算到最后一步,比如在上面的过程中,到了(8,6),就已经能够看出其结果。
我们可以看到,在上面的过程中,由(78,14)到(8,14)完全可以一步到位,因为(78,14)=(14×5+8,14)=(8,14),由此就诞生出我们的辗转相除法。
用辗转相除法求(a,b).设r0=b,r1=a,反复运用除法算式,得到一系列整数qi,ri和下面的方程:
r0=q1r1+r2,r2<r1 (r2,r1)
r1=q2r2+r3,r3<r2 (r3,r2)
r2=q3r3+r4,r4<r3 (r4,r3)
………………
rn-3=qn-2rn-2+rn-1,rn-1<rn-2 (rn-1,rn-2)
rn-2=qn-1rn-1+rn,rn-2<rn-1 (rn-1,rn)
rn-1=qnrn。
(rn,0)
相当于每一步都运用原理①把数字进行缩小,上面右边就是每一步对应的缩小结果,可以看出,最后的余数rn就是a和b的公约数。
我们以一个题为例说明基本过程。
例题:求(326,78)
326=4×78+14 (78,14)
78=5×14+8 (14,8)
14=1×8+6 (6,8)
8=1×6+2 (6,2)
6=3×2 (0,2)
所以(326,78)=2。
这和我们用更相减损术算出来的结果是一样的。
辗转相除法- 伪代码
这个算法可以用递归写成如下:
function gcd(a, b)
if b = 0
return a
else
return gcd(b, a mod b)
或纯使用循环:
function gcd(a, b) {
define r as integer;
while b ≠0 {
r := a mod b;
a := b;
b := r;
}
return a;
}
其中“a mod b”是指取 a ÷ b 的余数。
例如,123456 和7890 的最大公因子是6, 这可由下列步骤看出:
a b a mod b
123456 7890 5106
7890 5106 2784
5106 2784 2322
2784 2322 462
2322 462 12
462 12 6
12 6 0
辗转相除法的运算速度为O(n²),其中n为输入数值的位数。
辗转相除法- 任意实数对的辗转相除法
只要可计算余数都可用辗转相除法来求最大公因子。
这包括多项式、复整数及所有欧几里德定义域(Euclidean domain)。
辗转相除法不仅仅是针对于自然数对。
对于任意的两个实数n和m,只有当n/m为有理数的时候,n和m才有公因数,比如说π和2,这两个数就不会有公因数,有人可能第一反应说是1,不过很遗憾,1根本就不是π的因数,因为π除以1不是整数。
我们先看其中的一种情况,那就是两个分数(也就是两个无理数)之间的公因数求法
1:两个有理数公因数的求法
A:设这两个数为n为m,将他们化成同分母的数,n=g/p,m=h/p,这里的p可以是任意的整数,并不要求一定是最小公分母,比如0.1和1/3,你可以将他们化成1/30,10/30,也可以化成2/60,20/60,这不影响他们的最大公因数。
B:求分子的最大公约数,即求出k=(g,h)
C:k/p就是n和m的最大公因数。
例题:求(1/3,2/7)
(1/3,2/7)=(7/21,6/21)=(7,6)/21=1/21
我们还可以这样来求:
(1/3,2/7)=(14/42,12/42)=(14,12)/42=2/42=1/21
2:n和m是无理数,但是n/m是有理数的最大公因数求法。
我们不妨设n/m=p/q,令n=ap,m=aq。
求出p和q的最大公因数,即求出k=(p,q),那么ak 就是n和m的最大公因数。
例题:求(π,1/3π).
因为π/(1/3π)=3/1,π=3×1/3π,1/3π=1×1/3π,而(1,3)=1,故(π,1/3π)=1/3π。
3:当n/m是无理数时,(n,m)不存在。
实际上上面说了一大通,归根到底就一个东西:当需要求(n,m)时,你就想方设法从n和m 提取公因式,就包括把分母和无理式都统统提出来,直到只剩下整数对,然后求出这个整数对的公约数即可,也就是下面的式子。
(an,am)=a(n,m)。
其中a为任意实数,甚至可以是多项式。
辗转相除法- 多个数的辗转相除法
我们可以如法炮制多个数的辗转相除法。
利用的原理就是:(a,b,c,d,……)=(a,b+a,c+a,d+a,……),我们先炮制前面的更相减损术,举例说明方法如下:例题:求(4,18,22,16)
取最小的数4,其他的每一个数都与之相减,结果与4组成新的一组数,那么新数组与原数组的最大公因数相等,当出现零以后,排开零对剩下的数进行相同的处理。
即:
(4,18,22,16)=(4,14+4,18+4,12+4)=(4,14,18,12)
=(4,10,14,8)=(4,6,10,4)=(4,2,6,0)=(0,2,2,4)=(0,2,0,2)=(0,0,2,0)=2
所以(4,18,22,16)的最大公因数为2.
同样的道理,在实际操作中,大可不必进行到最后一步,只需要进行到某一步就已经可以看出答案,比如在上面的过程中,到了(4,2,6,0)我想就应该可以看出其值为2了吧!
相应的,我们也可以炮制多个数的辗转相除法:
第一步,取最小的数a,然后用剩下的数除以a,得到的余数和a组成新数组,然后对新数组进行同样的动作;当出现零的时候,排除零,对其余的数进行相同的动作。
直到最后只剩下一个非零数,这个数就是原数组的最大公约数。
例题2:求(120,168,328,624,320)
(120,168,328,624,320)
=(120,48,88,24,80) (因为168除以120余48,328除以120余88,……)
=(24,0,0,16,8)
=(0,0,8,0,0)
=8
辗转相除法- 辗转相除法的步数估计——拉梅定理
拉梅定理:
设b≥a都是正整数,d(a)是a的十进制表示式中数字的个数,若n为辗转相除法计算最大公因数(a,b)的步数,则:
n≤5d(a)
比如在计算(326,78)中,由于d(78)=2,用拉梅定理至多需要10步,但是实际上只需要5步。
由此看来,拉梅定理的估计还是有些粗糙的。