填坑。html
本文中涉及的概念较少,将不在给出相关概念。算法
参考资料:《算法竞赛进阶指南》 李煜东 著。工具
欧几里得算法之展转相除法是求解同余方程相关问题一种很是好用的工具。ui
网上讲这个的不少,讲的也都不错,这里再也不赘述。spa
代码htm
线性同余方程解法能够直接使用一次欧几里得算法解决。blog
(下文中引用内容皆来自 《算法竞赛进阶指南》 李煜东 著)get
线性同余方程
给定整数 \(a, b, m\),求线性同余方程 \(ax \equiv b (\bmod m)\) 的解 \(x\)。
原方程等价于 \(ax + my = b (y \in \mathbb Z)\)。根据裴蜀定理和推论,该线性同余方程组有解当且仅当 \(\gcd(a, m) | b\)。
求解时,先用欧几里得求出一组整数解 \(x_0, y_0\) 知足 \(ax_0 + my_0 = \gcd(a, m)\),而后 \(x = \frac{x_0b}{\gcd(a, m)}\) 就是原方程组的一个特解。方程的通解为 \(x_t = x + tm (t \in \mathbb Z)\)数学
中国剩余定理 (CRT)
对于线性同余方程组 \(x \equiv a_i (\bmod m_i), i \in \{1, 2, \cdots, n\}\),若 \(m_i\) 两两互质, 那么设 \(m = \prod_{i = 1}^{n} m_i, M_i = \frac{m}{m_i}, t_i\) 是线性同余方程 \(M_it_i \equiv 1(\bmod m_i)\) 的一个解, 那么方程组的解为 \(\sum_{i = 1}^na_iM_it_i\)。
证实略。
解法:使用 \(n\) 次欧几里得,求出 \(t_i\),获得答案。
其实主要用到的仍是 exCRT。
exCRT 能够在模数不知足两两互质的状况下获得线性同余方程组的解。
求解过程:
考虑使用数学概括法,如今假设已经求出了前 \(k - 1\) 个线性同余方程构成的方程组的解 \(x\)。设 \(m = \operatorname{lcm}\{m_i\}(i \in \{1, 2, \cdots, k - 1\})\), 则 \(x = tm (t \in \mathbb Z)\) 是前 \(k - 1\) 个线性同余方程的通解。
那么考虑第 \(k\) 个方程,找到一个整数 \(t\) 知足 \(x + tm \equiv a_k (\bmod m_k)\) 该方程等价于线性同余方程 \(mt \equiv a_k - x (\bmod m_k)\)。这是一个线性同余方程,可使用欧几里得算法解决。
求解形如 \(a^x \equiv m\) 的高次同余方程通常使用 BSGS 算法。
BSGS 的思想是,计 \(t = \sqrt{m}\),设 \(x = it - j\),则 \(a^x \equiv b (\bmod m)\) 转化为 \((a^t)^i \equiv ba^j(\bmod m)\)。因为 \(j > t\) 时原式等价于 \((i + 1)t - (j - t)\),所以 \(j \in [0, t)\),所以能够存下 \(j \in [0, t)\) 的时候分别的 \(ba^j \bmod m\) 的值。又因为 \(ij < m\) 所以 \(i \in [0, t]\)。计算出 \(i \in [0, t]\) 时分别的 \((a^t)^i \bmod m\) 的值,而后找到原先右式计算值中有没有与计算结果同余的。若是有,就更新一下最小答案。