放大啦资源网 http://www.fangdala.com
当前位置首页 > 百科资料> 正文

辗转相除法

2023-03-10 08:03:00 暂无评论 百科资料

辗转相除法, 又名欧几里德晚供害片题材到算法(Euclidean algorithm)来自,是求两个正整数之最大公约数的算法。它是已知最古到浓假犯拉家息随完老的算法, 其可追溯至公元前300年前

它的具体做法是:用较大360百科数除以较小数,再用出现的海席联乱轻余数(第一余数)去除除数,再用出现的余数(第二余数剧究话)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。 

另一种求两数的最大公约数的方法是更相减损法。

  • 中文名 辗转相除法
  • 外文名 Euclidean algorithm
  • 别称 欧几里德算法
  • 用途 求最大公约数
  • 出现书目 《几何原本》

使用

  设两数为a、b(a>b),求a与b最大公约数(a,b)   来自注:()为最大公约数的符号   的步骤如下晚岁或引上科压作:用a除以b,r1为余数:即a÷b=q.....r1(0≤r1)。若稳均度存r1=0,则(a坐声,b)=b;若r1≠0,则再用b除以r1,r2为余数:即b÷r1=q.......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r1除以r2,如此下去,直到能整除为止。其最后一个为被除数的余数的除数即为(a, b)。

  例如:a=25,b=15,a%b=10,360百科b%10=5,10%5=0,最后一个为被除数余数的除数就是5,5就是所求最大公约数。

原理证明

  设两数为a、b(a>b),用gcd(a,b)表示a,b的最大公约数,r=a (mod b) 为a除以b的余数,k为a除以b的商,即a÷b=kr。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。

  第一步:令c=gcd(a,b),则设a=mc,b=nc

 件经同然境策李转波调么 第二步:根据前提可知r =a-kb=mc-kn在节袁则亮这c=(m-kn)c

  第三尽参感支去安步:根据第二步结果可知c也是r的因数

  第四步:可以断定m-kn与n互质(假设m-kn=xd,n艺丰革或活哥着=yd (d>1),则线m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)cd松边顾,b=nc=ycd,段首杂则a与b的一个公约数cd>c,故c稳坏丝煤若修伯缩非a与b的最大公约数,与前面结论矛盾),因此c也是b与r的最大公约数。

  从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。

  证毕。

  以上步骤的操作是建立在刚开始时r≠0的基础之上的。即m与n亦互质。

相关

  《九章算术》第一篇《方田》记载了类似此法的来自求两正整数最大公约数及最360百科简分数的方法:“约分术曰:'可半者半之,不可半者,副置分母子之数,以少减多,更相减损,求其等也。以等数约之'”意为,两个数完作至想势中皆可以对半就化为都对半的数,不能对半的数,把分母和分子的数字另外放在旁边,用较大的数减去较小的数,交替减去小的数,求画任载收坚又玉普到它们相等为止。用这相味运精盟以到等的数约分 分数。

  辗转相除法即是针对两数相差较大的情况而做的改善,将过程中减法灵活的改变为除法,减小计算量,但实际上两个方法的本质是相同的,都是为了在数字位数较多时以最简方法求出最大公约数,因此也见组游军料被我国古代科学家推广用于求最小公倍数。

程序算法

 这供石流我你每异 自然语言描述

  用辗转相除法措吗矿效本确定两个正整数 a 和 b(a≥b) 的最大公因数gcd(a,b):

  当a mod b=0 时gc普斤们纸究笔的费身盐d(a,b)=b,否则

  g定旧么斤年散队介光甚cd(a,b) = gcd(b,a mod b)

  递归或循环植细兴紧丰独住运算得出结果

  伪代码

  这个算法可以用递归写成如下:

  gcd 简易函数

  c语言辗征来复绿伯置如础少战转相除代码:

  C++语言实现

  int gcd(int a, int b)

  {

  if(b==0) re呼据明之怕turn a;

  return gcd(b,a%b)侵错续吗好节前司过法;

  }

  C语言实现

  int gcd(int a,int 革手望毫补b)

  {

  return a%b?g获越盾鱼胡cd(b,a%b):b;

己因送约古  }

  C#语言实现

  Basic实现

  Pascal实山围死巴器构死投封也镇

  Common Lisp实现

  Java 实现

  Python实现

  

  数据举例

  普良或握布块破化其中"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 为输入数值的位数。

  辗转相除法处理大数时非常高效,它需要的步骤不会超过较小数的位数(十进制下)的五倍。加百利·拉梅(GabrielLamé)于1844年证明了这点,开创了计算复杂性理论。

应用

  求不定方程的一组整数解方法

  [注:以下出现的qi,ri括号中的是下标,gcd(a,b)为a,b的最大公约数]

  辗转相除法可以求出特定条件的不定方程的一组整数解。

  设不定方程为ax+by=c,其中a,b,c为整数,且 gcd(a,b) | c

  a,b辗转相除的算式为

  b=q1 a+r2

  a=q2 r2+r3

  r2=q3 r3+r4

  ...

  rn-2=qn-1rn-1+rn

  rn-1=qnrn

  其中rn=gcd(a,b),不妨令b=r0,a=r1,rn+1=0

  第i个算式为

  ri-1= qi×ri+ ri+1

  所以ri+1= ri-1 - qi×r(i)(1)

  用公式(1)可以得到rn=gcd(a,b)关于a,b的线性组合sa+tb=gcd(a,b)

  所以不定方程a×x+b×y=c的一组特解为x=s×c/gcd(a,b) y=t×c/gcd(a,b)

  举例说明

  例如不定方程为326x+78y=4,求出一组整数解x,y

  求(326,78)的算式为:

  326=4*78+14

  14=326-4*78

  78=5*14+8

  8=78-5*14

  14=1*8+6

  6=14-1*8

  8=1*6+2

  2=8-1*6

  6=3*2

  所以

  2=8-6=8-(14-8)

  =2*8-14=2*(78-5*14)-14

  =2*78-11*14=2*78-11*(326-4*78)

  =46*78-11*326

  即2=(-11)*326+46*78

  所以4=(-22)*326+92*78

  所以x = - 22, y = 92是不定方程326x+78y=4的一组解。

相关原理

  两个整数的最大公约数是能够同时整除它们的最大的正整数。

  辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。

  例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);

  因为252 ÷105 = 242,所以(105,42)是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至余数变为零。这时的除数就是所求的两个数的最大公约数。由辗转相除法也可以推出,两数的最大公约数可以用两数的整数倍相加来表示,如21 = 5 × 105 + (−2) × 252。这个重要的等式叫做贝祖等式(又称"裴蜀定理")。

猜你喜欢