线性同余方程求最小解
形如\(ax\equiv c\ (mod\ b)\)的方程叫为线性同余方程.
对于\(ax\equiv c\ (mod\ b)\),我们可以得出\(ax+by=c\),又根据裴蜀定理,\(x,y\)有整数解的充要条件为\(gcd(a,b)|c\),即\(c\)一定是\(gcd(a,b)\)的倍数,我们可以根据\(ax+by=gcd(a,b)\)求出\(x_0\)和\(y_0\)作为一组特解,即:\(ax_0+by_0=c\),此时对两边同时除以\(gcd(a,b)\),然后再乘\(c\),此时的\(x=\frac{c}{gcd(a,b)}x_0\)就是线性同余方程的一个解.
接下来,我们要求通解,假设原方程有两个解\(x_i,y_i\)和\(x_j,y_j\),则有:
\(ax_i+by_i=c\)
\(ax_j+by_j=c\)
那么我们联立得到:
\(a*x_i+b*y_i=a*x_j+b*y_j\)
\(a(x_i-x_j)=b(y_j-y_i)\)
然后我们在左右两边同时除以\(d=gcd(a,b)\):
\(\frac{a}{d}*(x_i-x_j)=\frac{b}{d}(y_j-y_i)\)
我们知道当\(a\)和\(b\)都同时除以它们的\(gcd(a,b)\)后,\(a\)和\(b\)一定是互质的.
那么根据等式关系,我们可以得出结论并同时假设:\(\frac{b}{d}\)一定是\(x_i-x_j\)的倍数.那么因为\(\frac{b}{d}\)是\(x_i-x_j\)的倍数,所以\(y_i-y_j\)一定是\(-\frac{a}{d}\)的倍数.
那么我们就推出了对于任意两个解\(x\)的值之差,一定是\(\frac{b}{a}\)的倍数,同理于\(y\).
所以我们就得出了通解:
\(x=x_0+\frac{b}{gcd(a,b)}*t\)
\(y=y_0-\frac{a}{gcd(a,b)}*t\)
注意,上面两个通解公式只能选择其中一个,另一个需要在原方程中推出.
这儿的\(x_0\)和\(y_0\)就是我们前面用\(exgcd\)求出的一个特解,但是题目往往要我们找最小的解,对于我们可以假设:
\(x_0=x_{min}+\frac{b}{gcd(a,b)}*t\)
别想那么多,就根据数学上的整除余数可以很容易得到:
\(x_{min}=x_0\ mod\ \frac{b}{gcd(a,b)}\)
这就是我们要求的最小整数解,如果要求是正数的话:\(x_{min}=(x_0+\frac{b}{gcd(a,b)})\ mod\ \frac{b}{gcd(a,b)}\)
本人菜鸡,如有纰漏,欢迎指正 😃)