exgcd详解
本文写于 2020.2.4,并于 2021.12.16 重构推导部分。
1.exgcd是什么?
exgcd大名扩展欧几里得算法,用来求形如 \(ax + by =\gcd(a,b)\)(\(a,b\) 为常数)的方程的一组整数解。
2.推导
当 \(b=0\) 时,\(\gcd(a,b)=a\),此时 \(x=1\), \(y=0\)
当 \(b\not=0\) 时,考虑到 \(\gcd(a,b)=\gcd(b,a\bmod b)\),所以我们可以先递归去求 \(bx+(a\bmod b)y=\gcd(b,a\bmod b)\) 的解 \(\begin{cases}x=x_0\\y =y_0\end{cases}\),然后再往回带:
\[\begin{align*}ax+by&= \gcd(a,b)\\ &= \gcd(b,a\bmod b)\\ &=bx_0+(a\bmod b)y_0\end{align*}
\]
因为 \(a\bmod b=a-\lfloor \dfrac{a}{b}\rfloor b\),所以:
\[\begin{align*}ax+by&=bx_0+(a-\lfloor \dfrac{a}{b}\rfloor b)y_0\\&=bx_0+ay_0-\lfloor \dfrac{a}{b} \rfloor by_0\\
&=ay_0+b(x_0-\lfloor \dfrac{a}{b} \rfloor y_0)\end{align*}\]
即方程 \(\gcd(a,b) = ax + by\) 的一个解为 \(x=y_0,\;y=x_0-\lfloor \dfrac{a}{b} \rfloor y_0\)
//公式是我一个字一个字手敲的,要敲断了……
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;
}