欧几里德与扩展欧几里德算法

一、欧几里得算法

int gcd(int a,int b)
{
    if(b==0) return a;
    return gcd(b,a%b);
}

二、扩展欧几里得算法

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

可见,扩展欧几里德要求a,b,不能为负,所以当出现负数时我们通常采用

|a|(-x)+by=gcd(|a|,b)   x'=(-x); 

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

三、最小公倍数

int lcm(int a,int b)
{
    return a*b/gcd(a,b);
}

四、扩展欧几里德算法的应用

(1)求解不定方程组    ax+by=c

 第一步 : 求出gcd(a,b),如果 c%gcd(a,b) 为零 则说明方程组有解;否则方程无解

 第二步 : 用exgcd(a,b,x,y) 求出x,y,再用公式x=x*c/gcd(a,b) y=y*c/gcd(a,b) 解出 x,y 的值;

         int r=exgcd(a,b,x,y);
         if(c%r)
         cout<<"no answer"<<endl;
         else
         {
             x=x*c/r;
             y=y*c/r;
             cout<<x<<" "<<y<<endl;             
         }

变形题  求出x最小正值

  把 x 转化成最小正值公式  r=gcd(a,b) ; x=(x%(b/r)+(b/r)%(b/r);

  y 同理

 

(2)求解线性同余方程组

同余方程 ax≡b (mod n) (也就是 ax % n = b) 对于未知数 x 有解,当且仅当  b % (gcd(a,n))==0时 且方程有解时,方程有 gcd(a,n) 个解。

求解方程 ax≡b (mod n) 相当于求解方程 ax+ ny= b, (x, y为整数)

如何求解集之间间隔

设 间隔为 dx  则有公式 dx=n/r (其中 r=gcd(a,n))

 

(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 的求解就是求解方程

 

posted @ 2016-08-02 10:32  邻家那小孩儿  阅读(185)  评论(0编辑  收藏  举报