欧几里德算法
用来求两个数的最大公约数的算法。具体如下
int gcd(int a,int b){
if(b == 0) return a;
return gcd(b,a%b);
}
扩展欧几里德算法(求解gcd(a,b)=ax+by )
分析:
ax1+by1=gcd(a,b)
=gcd(b,a%b)=bx2+a%by2
=bx2+(a-(a/b)*b)y2
=bx2+ay2-(a/b)*by2
=b(x2-(a/b)*y2)+ay2
待定系数:x1=y2
y1=x2-(a/b)*y2
说明:a/b是取整除法
代码:
int ext_gcd(int a,int b,int& x,int& y){
int t,ret;
if (!b){
x=1,y=0;
return a;
}
ret=ext_gcd(b,a%b,x,y);
t=x,x=y,y=t-a/b*y;
return ret;
}