扩展欧几里得【数论

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为最小正值

你可能感兴趣的:(数论)