exgcd学习笔记

1.exgcd

exgcd:用于求解形如 \(ax+by=\gcd(a,b)\) 的不定方程(必定有解)

解法:考虑方程

\[\begin{cases}ax+by=\gcd(a,b)\\bx'+(a \bmod b)y=\gcd(b,a \bmod b)\end{cases} \]

考虑化简

\[\begin{cases}ax+by=\gcd(a,b)\\bx'+(a-\left\lfloor\dfrac{a}{b}\right\rfloor\times b)y=\gcd(b,a \bmod b)\end{cases} \]

将系数化为a,b

\[\begin{cases}ax+by=\gcd(a,b)\\ay'+b(x'-\left\lfloor\dfrac{a}{b}\right\rfloor\times y)=\gcd(b,a \bmod b)\end{cases} \]

由欧几里得定理有

\[\gcd(a,b)=gcd(b,a\bmod b) \]

所以有

\[\begin{cases}x=y'\\y=x'-\left\lfloor\dfrac{a}{b}\right\rfloor\times y'\end{cases} \]

递归即可

退出条件:b=0
此时有

\[ax=a \]

\[x=1 \]

y可取任意值(取0即可)

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

2.exgcd应用

1.解同余方程

\[ax\equiv c\pmod{b} \]

方程相当于

\[ax+by=c \]

判定无解:
由于 \(ax+by=\gcd(a,b)\) 一定有解
所以方程满足 \(\gcd(a,b)\mid c\) 有解
否则无解

设方程 \(ax+by=\gcd(a,b)\) 的解为 \(x_0,y_0\) (可用exgcd求出), \(d=\dfrac{c}{\gcd(a,b)}\)
\(ax+by=c\) 的一组特解为 \(\begin{cases}x^*=d\times x_0\\y^*=d\times y_0\end{cases}\)

方程 \(ax\equiv c\pmod{b}\) 的所有解:共 \(\gcd(a,b)\) 个 为 \(x^*+\dfrac{c}{\gcd(a,b)}\times k(k\in[0,\gcd(a,b)-1])\)
证明我不会

2.求逆元(洛谷P1082)

\[ax\equiv 1\pmod{b} \]

逆元存在条件为: \(\gcd(a,b)=1\)

显然此时 \(x\)\(a\)\(\bmod b\) 意义下逆元

直接用exgcd求解方程 \(ax+by=1\)即可

posted @ 2023-09-25 15:57  xiang_xiang  阅读(28)  评论(0)    收藏  举报