【学习笔记】同余
CRT
求满足关于 \(x\) 的方程组 \(\begin{cases}x\equiv a_1~(\bmod~m_1)\\x\equiv a_2~(\bmod ~m_2)\\...\\x\equiv a_n~(\bmod~m_n)\end{cases}\) 的最小非负解,其中 \(m_i\) 两两互质。
令 \(M=\prod\limits_{i=1}^n m_i\),\(M_i=\dfrac{M}{m_i}\)。用扩欧求出 \(t_i\) 满足 \(M_it_i\equiv1(\bmod~m_i)\),答案为 \(\sum\limits_{i=1}^nM_it_ia_i\)。
证明:
对于第 \(i\) 个方程,因为 \(M_it_i\equiv1(\bmod~m_i)\),所以 \(M_it_ia_i\equiv a_i(\bmod~m_i)\)。显然 \(m_i\mid M_j~(i\neq j)\),所以 \(ans-M_it_ia_i\equiv\sum\limits_{j=1}^nM_jt_ja_j(i\neq j)\equiv0~(\bmod~m_i)\)。所以 \(ans\equiv a_i~(\bmod~m_i)\)(把两个式子加起来)。
exCRT
求满足关于 \(x\) 的方程组 \(\begin{cases}x\equiv a_1~(\bmod~m_1)\\x\equiv a_2~(\bmod ~m_2)\\...\\x\equiv a_n~(\bmod~m_n)\end{cases}\) 的最小非负解,其中 \(m_i\) 不一定两两互质,方程组不一定有解。
假设我们已经求出前 \(i-1\) 个方程的解 \(ans\),现需求 \(ans'\) 满足前 \(i\) 个方程。令 \(M=\operatorname{lcm}(m_j)(j<i)\)。
如果把 \(ans\) 加上 \(M\),显然它仍然满足前 \(i-1\) 个方程组。那么就考虑一直加 \(M\) 直到满足第 \(i\) 个方程,即求出一个数 \(t\) 满足 \(ans+tM\equiv a_i~(\bmod~m_i)\),我们要的 \(ans'\) 就等于 \(ans+tM\)。
至于如何求 \(t\),首先把式子转换为 \(tM\equiv a_i-ans~(\bmod~m_i)\)。由扩欧基础知识可以知道它有解仅当 \(\gcd(M,m_i)\mid a_i-ans\),若此方程无解则整个方程组无解。
若有解,就可以用扩欧求出 \(t'M\equiv\gcd(M,m_i)~(\bmod~m_i)\)。两边同时乘上 \(\dfrac{a_i-ans}{\gcd(M,m_i)}\) 就得到了原式的解 \(t=t'\times\dfrac{a_i-ans}{\gcd(M,m_i)}\)。
于是就得到了前 \(i\) 个方程的解,同时更新一下 \(M\)。
BSGS
求满足 \(a^b\equiv c~(\bmod~p)\) 的最小自然数 \(b\),\(a,p\) 互质。
令 \(m=\sqrt p\)。由欧拉定理可知 \(a^x\equiv a^{x\bmod~p}~(\bmod~p)\),所以方程若有解,则解一定小于 \(p\)。
那么就可以把 \(a^b\equiv c~(\bmod~p)\) 表示成 \(a^{km-l}~(k,l\le m)\), 所以 \(a^{km}~\equiv c\times a^l~(\bmod~p)\)。开一个 map,把所有 \(a^{km}\) 插入。然后枚举 \(l\) 看看是否有满足的 \(k\) 即可。第一个找到的不一定是答案,要对所有可能的答案取最小值。
当然也可以把所有 \(c\times a^l~(l<m)\) 插入 map,从小到大枚举所有 \(k\) 在 map 中找是否有满足的 \(l\),第一个找到的就是答案。但要判一下是不是非负数。
exBSGS
求满足 \(a^b\equiv c~(\bmod~p)\) 的自然数 \(b\),\(a,p\) 不一定互质。
令 \(g=\gcd(a,p)\)。如果 \(g\mid c\),原式可变成 \(\dfrac{a}{g}\times a^{b-1}\equiv \dfrac{c}{g}~(\bmod \dfrac{p}{g})\)。用 \(A,C,P\) 记录下这三个数,就是 \(Aa^{b-1}\equiv C~(\bmod~P)\)。
这样一直做下去直到 \(a\) 与 \(P\) 互质(记录一下执行次数 \(k\)),可以得到 \(Aa^{b-k}\equiv C~(\bmod~P)\)。可以用 BSGS 求得 \(b-k\),加上 \(k\) 就是答案。如果 BSGS 求得无解,说明原式也无解。
如果在任意时刻 \(g\nmid c\),方程 \(Ax\equiv C~(\bmod~p)\) 一定无解,\(Aa^b\equiv C~(\bmod~p)\) 也一定无解。
如果在任意时刻 \(A=C\),当前方程最小自然数解为 \(0\),直接输出当前执行次数即可。