《数论》欧几里得及扩展欧几里得(应用:求解不定方程、解模线性方程、求模的逆元)

欧几里得

1.含义:欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。

原理公式:gcd(a,b)=gcd(b,a mod b)

因此(a,b)(b,a mod b)的公约数是一样的,其最大公约数也必然相等.

2.实现:

int gcd(int a,int b)
{

    return b?gcd(b,a%b):a;

}

扩展欧几里得

1. 含义:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。

2.结果:得到(a,b)最大公约数d,同时得到一组 整数解x、y。

3.实现:

(递归)

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

(迭代)

int exgcd(int m,int n,int &x,int &y)
{
    int x1,y1,x0,y0;
    x0=1; y0=0;
    x1=0; y1=1;
    x=0; y=1;
    int r=m%n;
    int q=(m-r)/n;
    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;
}

4.应用

<1>求解不定方程

形如:ax+by=c      a、b、c已知,求一组 整数x、y使得方程成立。

解:由上述<实现>代码可得  最大公约数d=gcd(a,b)、一组x0、y0;(此x、y是方程ax+by=gcd(a,b)的解)

①方程ax+by=gcd(a,b) 的通解:x=x0+b/d*k;y=y0-a/d*k ; (k为任意常数,下同)

②方程ax+by=c的通解:x=x0*c/d+b/d*k ;  y=y0*c/d-a/d*k ;

另:判断是否有解的方法  :  c%d=0 则有解,否则反之。

<2>求解模线性方程

模线性方程 : ax≡b(mod m)

     其中a,b和m是已知的(m>0),要求解出满足上式的对模m的x值。满足同余方程的x可能有多个,也可能一个都没有,上述模线性方程也称为一次同余方程。

    解:模线性方程ax≡b(mod m)的步骤如下:

(1)求 d=gcd(a,m)

(2)若d%b!=0,则ax≡b(mod m)无解;否则有解(且有d个解)

(3)求x0,y0,是a*x0+m*y0=d;

(4)由于d是b的因数,将a*x0+m*y0=d改写,得a(x0*(b/d))+m*(y0*(b/d))=b, 

         于是ax+my=b的一个特解为 x=x0*(b/d),y=y0*(b/d);

(5)x0*(b/d)是ax≡(mod m)的一个特解,由此的ax≡b(mod m)的所有解

       (共d个)为:x= (x0*(b/d)+ i*(m/d) ) (mod m),    i=0,1,2,3,4.……d-1

<3>用欧几里德算法求模的逆元:

       同余方程ax≡b (mod n),如果 gcd(a,n)== 1,则方程只有唯一解。

      在这种情况下,如果 b== 1,同余方程就是 ax=1 (mod n ),gcd(a,n)= 1。

      这时称求出的 x 为 a 的对模 n 乘法的逆元。

      对于同余方程 ax= 1(mod n ), gcd(a,n)= 1 的求解就是求解方程

      ax+ ny= 1,x, y 为整数。这个可用扩展欧几里德算法求出,原同余方程的唯一解就是用扩展欧几里德算法得出的 x 。

猜你喜欢

转载自blog.csdn.net/Vici__/article/details/79996542