浅谈一类含有系数的线性同余方程组的解法

浅谈一类含有系数的线性同余方程组的解法

\[\begin{cases} b_1x\equiv a_1\pmod{p_1}, \\ b_2x\equiv a_2\pmod{p_2}, \\ b_3x\equiv a_3\pmod{p_3}, \\ ... \\ b_nx\equiv a_n \pmod {p_n}, \end{cases} \]

对于这种带有系数的线性同余方程组,首先会想到 \(\texttt{EXCRT}\),但 \(\texttt{EXCRT}\) 并不带有系数。这不妨碍我们使用 \(\texttt{EXCRT}\) 合并线性同余方程的解的思想。

使用归纳法,设满足前 \(i-1\) 个方程的解为 \(x\),在模 \(p_1,p_2,p_3...p_{i-1}\) 意义下都为 \(0\) 且模 \(b_1,b_2...b_{i-1}\) 都为 \(0\) 的最小正整数为 \(M\)。那么对于第 \(i\) 个方程,我们需要求一个最小的正整数 \(k\),满足 \(b_i(x+M\times k)\equiv a_i\pmod{p_i}\)

可以对上式变形,得:

\[(b_iM)\times k\equiv a_i-b_ix\pmod {p_i} \]

发现该式只有一个变量 \(k\) ,经典的线性同余方程问题:

\[(b_iM)\times k-p_iy=a_i-b_ix \]

使用 \(\texttt{EXGCD}\) 求出一个正整数解 \(k\),满足前 \(i\) 个方程的解 \(x'=x+M\times k\)

现在只需要考虑 \(M\) 的值如何更新。因为按照数学归纳法,只要 \(M\) 的值对于 \(\forall i\) 都正确,就可以不断合并第 \(i\) 个方程与前 \(i-1\) 个方程的解。

由于 \(M\) 的值已经满足前 \(i-1\) 个方程的要求,我们只需要再给 \(M\) 乘上一个增量使它满足第 \(i\) 个方程的要求即可,记满足前 \(i\) 个方程的 \(M\)\(M’\),正确性显然。这里我们观察一下,\(k\) 增加 \(1\)\(x'\) 增加 \(b_iM\),我们需要得到的 \(M'\) 满足 \(M'\equiv0\pmod{b_i},M'\equiv0\pmod{p_i}\)。显然有 \(b_iM'=\texttt{lcm}(b_iM,p_i)\)\(M'=\frac{\texttt{lcm}(b_iM,p_i)}{b_i}=\frac{Mp_i}{\texttt{gcd}(b_iM,p_i)}=M\times\frac{p_i}{\texttt{gcd}(b_iM,p_i)}\)

可以得到乘上的增量为 \(\frac{p_i}{\texttt{gcd}(b_iM,p_i)}\) ,更新 \(M\) 的时间复杂度为 \(O(\log m)\),解线性同余方程的时间复杂度为 \(O(\log m)\)。总时间复杂度为 \(O(n \log m)\),其中 \(m\) 为值域上界。

最后,这里粗略说明一下 \(M\) 为何分别需在模 \(\{a_1,a_2...a_i,b_1,b_2...b_i\}\) 意义下为 \(0\)

对于第 \(i\) 个方程的解,\(\exist x',x'=x+M\times k\) 并且满足第 \(i\) 个方程的要求。对于满足前 \(i-1\) 方程的增量 \(M\),与不带系数时不同,必须满足对于 \(\forall j\leq i-1,b_i|M\)。并且还需要满足 \(\forall j\leq i-1,p_i|M\)

于是该问题在被归约成简单的线性同余方程问题后得解,为广义线性同余方程组的解法拓展了思路(雾。

虽然都是几十年前的学术界玩剩了的

posted @ 2020-09-06 11:24  tommymio  阅读(443)  评论(0)    收藏  举报