欧几里德算法计算GCD

  引言:
  在数论方面,有很多地方需要计算最大公约数(Greatest Common Dividor),GCD的计算法主要直接分解因式后提取最大公因式的因式分解法,还有普通使用的欧几里德算法。
   预备知识:
  整数除法:中学阶段,我们知道对于两个整数a,b,如果a=b*q+r,其中q,r是整数,并且的0<=r<q,  那么q又叫做商(q>=1),r叫做余数。
  如果r=0,我们称a能被b整除,记做b|a。定义整除运算 q=a/b;
  定义余除运算r=a%b;
 整数除法的性质:
 1.若 b|a => 则a>=b ;因为a=b*q,q>=1 那么a>=b;
 2.若 b|a ,a|c,则b|c;因为a=b*q,c=q * b,那么c=p *  q * a;
 3.0不能做除数    ;
 4.约数:若a|b,则a叫做b的约数
 5.公约数:若a|b,a|c,则a叫做b,c的公约数。

欧几里德计算最大公约数使用到的性质:gcd(a,b)=gcd(b,a%b);
(我们假设a>=b)
证明:设欧几里德算法计算GCD_第1张图片从这个假设中, 我们事可以看出这里写图片描述最终是会被这里写图片描述整除的。
因些,这里写图片描述整除这里写图片描述,然后,由倒数第二个式子,这里写图片描述这里写图片描述也会整除Rn,我们沿着这些式子向上用这里写图片描述

去除各个Ri,我们发现,这里写图片描述,都可以整除它们。
直到我们到达第一个式子这里写图片描述,我们依然发现, 这里写图片描述是会整除这个式子的第一项。
从这个我们可以确定: 这里写图片描述是每一个式子的因子,当然也就是会A、B的公因数。
现在, 我们来证明这里写图片描述是所有以上每个式子内部的各单项式的最大公因式(数)。
假设,存在一个公因式d,使得这里写图片描述,并且这里写图片描述,我们在刚刚使用过的那组式子(欧几里德算法计算GCD_第2张图片)中从上往下用d去除以每一个式子的单项式。对于这里写图片描述,因为d整除a和b,那么d当然也会整除这里写图片描述;然后,我们再看第二个式子,因为d整除b和这里写图片描述(刚刚论证),那么d整除这里写图片描述;利用这样的思路,我们从上往下对每个式子都这么处理;直到到了最后一个式子这里写图片描述
,同样的原因,d必然会整除这里写图片描述,由上面的性质得到这里写图片描述,同时这里写图片描述,因此这里写图片描述
由gcd(a,b)=gcd(b,a%b),及我们上面的证明过程,我们就可以写出计算gcd(a,b)的函数了。

int gcd(int a ,int b)
{
  if(a<b) return gcd(b,a);
  if(b==0) return a ;
  return gcd(b,a%b);
}

你可能感兴趣的:(数论,最大公约数,朴素欧几里德算法)