exgcd詳解


1.exgcd是什么?

exgcd大名擴展歐幾里得算法,用來求形如 \(\gcd(a,b) = ax + by\) 的方程的通解。


2.推導

引理:存在 \(x,y\in \mathbb Z\) 使得 \(\gcd(a,b) = ax + by\)(裴蜀定理,請自行百度

\(b=0\) 時,\(\gcd(a,b)=a\),此時 \(x_1=1\)\(y_1=0\)

\(b\not=0\) 時,

由題,\(ax+by=\gcd(a,b)=\gcd(b,a\bmod b)=bx_2+(a\bmod b)y_2 ①\)

又因 \(a\bmod b=a-\lfloor \dfrac{a}{b}\rfloor b\)

\(ax+by=bx_2+(a-a\lfloor \dfrac{a}{b}\rfloor b)y_2\)

\(ax+by=bx_2+ay_2-\lfloor \dfrac{a}{b} \rfloor by_2\)

\(ax+by=ay_2+bx_2-b\lfloor \dfrac{a}{b} \rfloor y_2\)

\(ax+by=ay_2+b(x_2-\lfloor \dfrac{a}{b} \rfloor y_2) ②\)

\(②\) 式對比 \(①\) 式,得出:

方程 \(\gcd(a,b) = ax + by\) 的通解為 \(x=y_2\)\(y=x_2-\lfloor \dfrac{a}{b} \rfloor y_2\)

//公式是我一個字一個字手敲的,要敲斷了……


3.代碼實現

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


免責聲明!

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



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