辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。
其原理如下:
设两数为a、b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a (mod b) 为a除以b以后的余数,k为a除以b的商,即a÷b=k.......r。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。
第一步:令c=gcd(a,b),则设a=mc,b=nc
第二步:根据前提可知r =a-kb=mc-knc=(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)dc,b=nc=ycd,故a与b最大公约数成为cd,而非c,与前面结论矛盾】
从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。
证毕。
以上步骤的操作是建立在刚开始时r!=0的基础之上的。即m与n亦互质。
按照其规则,C语言实现如下:
int GCD(int a,int b){return b==0?a:GCD(b,a%b);}
扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。
下面是一个使用C语言的实现:
intexGcd(int a,int b,int &x,int &y){
if(b==0) //当b==0时,得到解
{
x=1y=0
return a
}
intr=exGcd(b,a%b,x,y)//递归调用自身,求解
intt=xx=yy=t-a/b*y
return r
}
就是把上一轮有余数的除法计算中,除数变为下一轮计算的被除数,
余数变为下一轮计算的除数,
一直这样计算下去,
直到最后一次计算余数为零,
在最后一轮计算中的被除数,即为所求的最大公约数。
举例:
105和85的最大公约数
第一轮计算
105÷85=1...20
第二轮计算
85÷20=4...5
第三轮计算
20÷5=4
第三轮没有余数,
因此
105和85的最大公约数就是第三轮计算的被除数
5.
至于C语言编程,下边是我自己写的G函数(思想就是辗转相除法求最大公约数)
int
G(int
x,int
y)
{
int
t
while(y!=0)
{
t=x%y
x=y
y=t
}
return
x
}