1. 程式人生 > >gcd&&exgcd&&斐蜀定理

gcd&&exgcd&&斐蜀定理

一段 har bsp target oid -a tps != amp

gcd就是求a和b最大公約數,一般方法就是遞推。不多說,上代碼。

一.叠代法

int gcd(int m, int n)  
{  
    while(m>0)  
    {  
        int c = n % m;  
        n = m;  
        m = c;  
    }  
    return n;  
} 

二.遞歸法

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

但exgcd是個什麽玩意???

百度了一下,百科這麽講的:

對於不完全為 0 的非負整數 a,b,gcd(a,b)表示 a,b 的最大公約數,必然

存在整數對 x,y ,使得 gcd(a,b)=ax+by。

好像很好理解的樣子,百度還給了個代碼

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

???什麽玩意???

於是我又找了一段證明:

證明:

         當 b=0 時,gcd(a,b)=a,此時 x=1 , y=0

         當 b!=0 時,

         設 ax1+by1=gcd(a,b)=gcd(b,a%b)=bx2+(a%b)y2

         又因 a%b=a-a/b*b

         則 ax1+by1=bx2+(a-a/b*b)y2

    ax1+by1=bx2+ay2-a/b*by2

    ax1+by1=ay2+bx2-b*a/b*y2

    ax1+by1=ay2+b(x2-a/b*y2)

    解得 x1=y2 , y1=x2-a/b*y2

    因為當 b=0 時存在 x , y 為最後一組解

    而每一組的解可根據後一組得到

    所以第一組的解 x , y 必然存在

    得證

void exgcd(int a,int b)
{
    if (b)
        {
            exgcd(b,a%b);
            int k=x;
            x=y;
            y=k-a/b*y;  //k就是上一組的x--   y1 = x2 - a/b*y2;
        }
    else y=(x=1)-1;
}

還有一個斐蜀定理。。。

若a,b是整數,且(a,b)=d,那麽對於任意的整數x,y,ax+by都一定是d的倍數,特別地,一定存在整數x,y,使ax+by=d成立。

它的一個重要推論是:a,b互質的充要條件是存在整數x,y使ax+by=1.

gcd&&exgcd&&斐蜀定理