擴展歐幾里德算法、證明及其應用


一、擴展歐幾里德算法:

已知a, b求解一組x,y,使它們滿足等式: ax+by = gcd(a, b) =d(解一定存在,根據數論中的相關定理)。

擴展歐幾里德常用在求解模線性方程及方程組中。

 

證明:

ax+by=gcd(a,b);

1. (1) a = 0,ax+by = gcd(a,b) = gcd(0,b) = b,

此時x = 0(此時x的值是任意的),y = 1;

    (2)b = 0, ax + by = gcd(a,b) = gcd(a,0) = a,

此時x = 1,y = 0(此時y的值是任意的);

2.a和b都不為0時

ax1 + by1 = gcd(a, b)

由歐幾里德定理:gcd(a,b) = gcd(b, a%b)得

ax1 + by1 = gcd(a,b) = gcd(b, a%b) 即:

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

a % b = a - a/b*b;

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

                =bx2 + ay2 - a/b*b*y2;

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

所以:x1 = y2, y1 = x2 - a/b*y2

擴展歐幾里德算法代碼:

void gcd(int a, int b, int &x, int &y)
{
    if(b == 0)
    {
        x = 1;
        y = 0;
        r = a;//r為a、b的最大公約數
        return ;
    }
    gcd(b, a%b, x, y);
    int t = x;
    x = y;
    y = t - a / b * y;
}

 二、歐幾里德算法的應用

1.求方程ax + by = c的一種解

擴展歐幾里德算法求得的x1,y1只是ax + by = gcd(a,b)中x和y的一個解

如果讓求ax + by = c的一個解

ax1* z+ by1 * z = c * z;

使c * z = gcd(a,b),則z = c / gcd(a,b);

所以x = x1 * z = x1 * c / gcd(a,b), y = y1 * z = y1 * c / gcd(a,b);

x、y的解集為:

x = x1 + b / gcd(a,b) * t

y = y1 - a / gcd(a,b) * t;

(t 為任意值)

反證:

將x、y代入原式ax + by = gcd(a,b)中得:

a(x1 + b / gcd(a, b) * t) + b(y1 - a / gcd(a,b) * t) = gcd(a,b)

化簡后得:

ax1 + by1 = gcd(a,b)

所以可得解集正確

 

2.ax≡b (mod n)的最小解,(ax % n ≡ b 相當與 ax + ny = b)

一般情況下,ax+by=1;得 x為a mod b 的逆元,y為 b mod a的逆元
若ax=1 mod f 則稱a關於模f的乘法逆元為x。也可表示為ax≡1(mod f)。
當a與f互素時,a關於模f的乘法逆元有唯一解。如果不互素,則無解。如果f為素數,則從1到f-1的任意數都與f互素,即在1到f-1之間都恰好有一個關於模f的乘法逆元。

根據擴展歐幾里德算法可求得ax + ny = b的一組解

x = b/gcd(a,n) * x1

要求其最小整數解,可根據同解x = x1 + n/gcd(a,n) * t;

s = n / gcd(a,n)

x%s得到最一個值x1,x1可能為負數,此時x%s還需要+s

加上s后可能就不是最小值了,所以還需要在對s取余

所以最小解最終為 x = (x % s + s) % s

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM