扩展欧几里得算法
裴蜀定理
对任何整数 \(a\),\(b\) 关于未知数 \(x\) 和 \(y\) 的线性不定方程(称为裴蜀等式):\(ax+by=c\)
方程有整数解(当且仅当 \(c\) 是 \(gcd(a,b)\) 的倍数),裴蜀等式有解时必然有无穷多个解
即 \(ax+by=c\) 有解的充要条件为 \(gcd(a,b)|c\)
原方程的解即为\(ax+by=gcd(a,b)\)的解乘上\(\frac{c}{gcd(a,b)}\)
扩欧解出的\(x\)为\(ax+by=gcd(a,b)\),中的\(x\),若要求\(ax+by=c\)中的\(x\),两边还要乘上\(\frac{c}{gcd(a,b)}\)
推论:\(a\),\(b\) 互素等价于 \(ax+by=1\) 有解
计算其中整数 \(x\) 和整数 \(y\) 的计算方法被称为扩展欧几里得算法
\(code :\)
int exgcd(int a,int b)
{
if(!b)
{
x=1,y=0;//x,y设为全局变量
return a;//若为void,此处直接return
}
int ans=exgcd(b,a%b),tmp=x;
x=y,y=tmp-a/b*y;
return ans;//得到的为gcd(a,b)
}
由欧几里得算法,得
代入,整理得
边界情况分析,\(ax^\prime+by^\prime=gcd(a,b)\),当 \(b=0\) 时,\(a\) 为 \(gcd(a,b)\),当且仅当 \(x^\prime=1\)时等式成立,\(y^\prime\) 可以为任意值,为方便起见,设\(y^\prime=0\)
根据上边的式子,即可推出多组解
通解为\(x=x_0+kb,\ y=y_0-ka\ (k∈Z)\)
同余方程
线性同余方程:
其等价于\(ax-b\)是\(m\)的倍数,不妨设为\(-y\)倍,其就改写为
根据裴蜀定理得,线性同余方程有解当且仅当\(gcd(a,m)|b\)
有解时,先求出\(ax_0+my_0=gcd(a,m)\),的一组解,\(x_0\),\(y_0\),原线性同余方程的一个解即为\(x=bx_0/gcd(a,m)\)
方程的通解就是所有模 \(m/gcd(a,m)\)与\(x\)同余的整数