歐幾里得&擴展歐幾里得算法

#樸素的歐幾里得算法大家應該知道
gcd(a,b)gcd(a,b)表示a,b的最大公約數
樸素的歐幾里得算法其實就是所謂的輾轉相除法

  • 輾轉相除法
    gcd(a,b)=gcd(b,agcd(a,b)=gcd(b,a modmod b)b)
    證明如下:
    r=a設r=a modmod bb =aabb=a-\lfloor\frac{a}{b}\rfloor*b,p=gcd(a,b)p=gcd(a,b);
    a=xp,b=ypa=xp,b=yp
    代入可得r=xpxpypypr=xp-\lfloor\frac{xp}{yp}\rfloor*yp
    提公因式得r=p(xxpypy)r=p(x-\lfloor\frac{xp}{yp}\rfloor*y)
    所以prp|r
    a,bra,b的最大公約數也是r的約數
    p=gcd(b,r)p`=gcd(b,r)
    b=xp,r=ypb=x`p`,r=y`p`
    a=r+abba=r+\lfloor\frac{a}{b}\rfloor*b
    代入得a=yp+abxpa=y`p`+\lfloor\frac{a}{b}\rfloor*x`p`
    提公因式a=p(y+abx)a=p`(y`+\lfloor\frac{a}{b}\rfloor*x`)
    所以pap`|a
    得出結論:a,b與b,a mod b的公約數相同,所以最大公約數也相同
    得證;

Code:

int gcd(int a,int b) 
{
    if(!b) return a; 
    else return gcd(b,a%b);
}

擴展歐幾里得算法

擴展歐幾里得算法就是在樸素的歐幾里得算法上求一組未知數(x,y)的解,滿足貝祖定理:ax+by=gcd(a,b)ax+by=gcd(a,b)

  • 公式的推導
    當且僅當a>ba>b
    b=0b=0x=1,y=0x=1,y=0
    a>b>0a>b>0
    ax1+by1=gcd(a,b);bx2+(aax1+by1=gcd(a,b);bx2+(a modmod b)y2=gcd(b,ab)y2=gcd(b,a modmod b)b)
    由樸素歐幾里得算法得:gcd(a,b)=gcd(b,agcd(a,b)=gcd(b,a modmod b)b)
    所以ax1+by1=bx2+(aax1+by1=bx2+(a modmod b)y2b)y2
    ax1+by1=bx2+(aabb)y2ax1+by1=bx2+(a-\lfloor\frac{a}{b}\rfloor*b)y2
    化簡得:ax1+by1=bx2+ay2abby2ax1+by1=bx2+ay2-\lfloor\frac{a}{b}\rfloor*b*y2
    由貝祖等式得x1=y2y1=x2abb.\\x1=y2\\ {y1=x2-\lfloor\frac{a}{b}\rfloor*b} .

Code:

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 z=x;
    x=y;y=z-a/b*y;
    return r;
}

擴展歐幾里得應用

①解不定方程
②解線性同餘方程
③求模的逆元

1.解形如ax+by=c的不定方程

用擴展歐幾里得算法求出解ax+by=gcd(a,b)ax`+by`=gcd(a,b)
再分別乘上cgcd(a,b)\frac{c}{gcd(a,b)}
cc modmod gcd(a,b)0gcd(a,b)\neq0時無解

2.解形如axb(modax\equiv b(mod m)m)的線性同餘方程

axmy=bax-my=b
ax+m(y)=bax+m(-y)=b
得出:
ax+my=bax+my=b
同上解除即可。

3.求ax1(modax\equiv1(mod m)m)

由上式子可得x1a(modx\equiv \frac{1}{a} (mod m)m)
所以 x是a的逆元
同②得:ax+my=1ax+my=1
解出x即可.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章