Some 困难的数论
1.离散对数
就是在模 \(p\) 意义下求出 \(\log_ab\)。等价于求出方程 \(a^x \equiv b \pmod m\) 的解。其中的 \(x\) 就是 \(\log_ab\)。
当 \(a \perp p\) 时,BSGS 算法可以求解出上面那个方程的解。具体的计算过程如下:
我们设块长 \(M\),并且 \(x = AM - B\),那么 \(a^{AM} \equiv ba^{B} \pmod m\)。那么我们可以枚举所有可能的取值然后用一个哈希表或者 map 判断是否相等即可。时间复杂度为 \(O(\max(A,B))\)。我们知道 \(0 \le B < M,0 \le A \le \lceil \frac{p-1}{M} \rceil\),那么很明显当 \(M\) 取到 \(\lceil \sqrt p \rceil\) 时,复杂度最小,为 \(\mathrm O(\sqrt p)\)。
但是如果没有 \(a \perp p\),我们就需要使用 exBSGS 算法。
此时我们令 \(d = \gcd(a,p)\),然后方程两边同时除以 \(d\),那么方程变为 \(\dfrac{a}{d}a ^ {x - 1} \equiv \dfrac{b} {d}\pmod{\dfrac{p}{d}}\)。
此时我们注意到 \(\dfrac{a}{d} \perp \dfrac{p}{d}\),那么前面的数存在在后面的数的意义下的逆元,那么就有 \(a^{x-1} \equiv \dfrac{b}{d} \times (\dfrac{a}{d})^-1 \pmod{\dfrac{p}{d}}\)。如果 \(a\) 和 \(\dfrac{p}{\gcd(a,p)}\) 不互质,那么我们就重复上面的操作使得 \(\dfrac{p}{\gcd(a,p)}\) 和 \(a\) 互质后再用 BSGS 即可。
注意最后求出的解还需要加上操作次数。
2.阶
我们定义 \(\delta_p(a)\) 为最小满足同余方程 \(a^n \equiv 1\pmod p\) 的 \(n\),读作 \(a\) 模 \(m\) 的阶。
接下来是几个重要的性质。
\(\text{Lemma 1}\):\(a^1 \cdots \cdots a^{\delta_m(a)}\) 模 \(m\) 所得的余数互不相同。
\(\text{Proof 1}\):假若有两个数 \(i,j\) 满足 \(\delta_m(a)\) 使得 \(a^i \equiv a^j\pmod m\),那么必定有 \(a^{|i-j|}\equiv 1 \pmod m\)。这与阶的最小性矛盾,故原命题成立。
\(\text{Lemma 2}\):对于所有的 \(a^n \equiv 1 \pmod m\),必定有 \(n \mid \delta_m(a)\)。
\(\text{Proof 2}\):我们还是考虑反证法。我们设 \(n = \delta_m(a) \times q + r\),其中 \(0 < r < \delta_m(a)\)。那么 \(a^r \equiv a^r \times (a^{\delta_m(a)})^q \equiv a^n \equiv 1 \pmod m\),这与阶的最小性矛盾,那么原命题成立。
\(\text{Lemma 3}\):\(\delta_m(g^k) = \frac{\delta_m(g)}{\gcd(\delta_m(g),k)}\)。
\(\text{Proof 3}\):我们发现 \(g^{k\delta_m(g^k)} \equiv (g^k)^{\delta_m(g^k)} \equiv 1 \pmod m\)。那么就有 \(\delta_m(g) \mid k \times \delta_m(g^k)\),所以就有 \(\frac{\delta_m(g)}{\gcd(\delta_m(g),k)} \mid \delta_m(g^k)\)。同时我们知道 \((g^k)^{\frac{\delta_m(g^k)}{\gcd(\delta_m(g),k)}} \equiv (g^{\delta_m(g)})^{\frac{k}{\gcd(\delta_m(g),k)}}\),那么就有 \(\delta_m(g^k) \mid \frac{\delta_m(g)}{\gcd(\delta_m(g),k)}\)。那么原命题成立。
至于求法,我们可以世界使用 BSGS 来求出阶。
3.原根
注意是原根不是原神。
假如 \(\gcd(g,m) = 1\) 并且 \(\delta_m(g) = \varphi(m)\),那么我们称 \(g\) 为 \(m\) 的原根。
原根个数定理:假如 \(m\) 有原根,则 \(m\) 的原根个数为 \(\varphi(\varphi(m))\)。
若 \(m\) 有原根 \(g\),那么就有 \(\delta_m(g) = \frac{\delta_m{g}}{\gcd(\delta_m{g},k)} = \frac{\varphi(g)}{\gcd(\varphi(g),k)}\)。如果 \(\gcd(k,\varphi(m)) = 1\),那么 \(\delta_m{g^k}\) 也是 \(m\) 的原根。由于我们知道在 \(1\) 到 \(\varphi(m)\) 之间和 \(\varphi(m)\) 互质的数有 \(\varphi(\varphi(m))\) 个,那么原根的个数就是 \(\varphi(\varphi(m))\)。