您的位置:首页 > 其它

扩展欧几里得【数论

2014-08-18 12:34 211 查看
m和n不全为零

一定存在gcd(m,n)==xm+ny

模板1

int exgcd(int m,int n,int &x,int &y)//返回gcd(m,n)
{
int x1,y1,x0,y0;
x0=1; y0=0;
x1=0; y1=1;
x=0; y=1;
int r=(m%n+n)%n;
int q=(m-r)/n;
x=0,y=1;
while(r)
{
x=x0-q*x1; y=y0-q*y1;
x0=x1; y0=y1;
x1=x; y1=y;
m=n; n=r; r=m%n;
q=(m-r)/n;
}
return n;
}
int main()
{
int x,y;
int m=6 ;
int n= 2;
int a =exgcd(6,2,x,y);
printf("6*%d + 2*%d = %d \n",x,y,a );
return 0;
}


6*0 + 2*1 = 2 

[Finished in 0.0s]

模板2

x y为全局变量,不需要初始化

ll exgcd(ll a, ll b)
{
if(b==0){
x=1,y=0;
return a;
}
ll d=exgcd(b,a%b);
ll t=x;
x=y;
y=t-(a/b)*y;
return d;
}


ax+by==gcd(a,b)

对于解一般不定式 ax+by==c  是上式的整数倍   

即仅当c%gcd(a,b)为0时  有整数解 x,y

x=x0*c/gcd(a,b);

y=y0*c/gcd(a,b);

题目经常求最小的正x值   有一个神奇的公式

x=x+b/gcd(a,b)*k

y=y-a/gcd(a,b)*k    (k为任意整数)

即对每组x,y值都有ax+by==c成立

所以求得x后,

令s=b/gcd(a,b);

x=x(x%s+s)%s;

x为最小正值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: