\r
大步小步算法英文名:**baby-step gaint-step (BSGS)**.\r
\r
-该算法可以在 $O(\sqrt{q})$用于求解\r
+该算法可以在 $O(\sqrt{q})$ 用于求解\r
\r
$$\r
a^x \equiv b \bmod p\r
$$\r
\r
-其中 $p$是个质数的方程的解 $x$满足 $0 \le x < p$.\r
+其中 $p$ 是个质数的方程的解 $x$ 满足 $0 \le x < p$ .\r
\r
\r
\r
\r
\r
\r
-我们已知的是 $a,b$,所以我们可以先算出等式右边的 $ba^B$的所有取值,枚举 $B$,用 hash/map 存下来,然后逐一计算 $a^{A\lceil \sqrt p \rceil}$,枚举 $A$,寻找是否有与之相等的 $ba^B$,从而我们可以得到所有的 $x$,$x=A \lceil \sqrt p \rceil - B$.\r
+我们已知的是 $a,b$,所以我们可以先算出等式右边的 $ba^B$ 的所有取值,枚举 $B$,用 hash/map 存下来,然后逐一计算 $a^{A\lceil \sqrt p \rceil}$,枚举 $A$,寻找是否有与之相等的 $ba^B$,从而我们可以得到所有的 $x$,$x=A \lceil \sqrt p \rceil - B$.\r
\r
\r
\r
-注意到 $A,B$均小于 $\lceil \sqrt p \rceil$,所以时间复杂度为 $O(\sqrt q)$,用 map 的话会多一个 $\log$.\r
+注意到 $A,B$ 均小于 $\lceil \sqrt p \rceil$,所以时间复杂度为 $O(\sqrt q)$,用 map 的话会多一个 $\log$.\r
\r
\r
\r
\r
求解\r
\r
-$$x^a \equiv b \bmod p $$\r
+$$ x^a \equiv b \bmod p $$\r
\r
-其中 $p$是个质数.\r
+其中 $p$ 是个质数.\r
\r
该模型可以通过一系列的转化为成**基础篇**中的模型,你可能需要一些关于 [原根](/math/primitive-root/) 的概念.\r
\r
-**原根的定义**为:对于任意数 $a$,满足 $(a,p)=1$,且 $t$为最小的**正整数**满足 $a^t \equiv 1 \bmod p$,则称 $t$是 $a$模 $p$意义下的次数,若 $t=\varphi(p)$,则称 $a$是 $p$的原根.\r
+**原根的定义**为:对于任意数 $a$,满足 $(a,p)=1$,且 $t$ 为最小的**正整数**满足 $a^t \equiv 1 \bmod p$,则称 $t$ 是 $a$ 模 $p$ 意义下的次数,若 $t=\varphi(p)$,则称 $a$ 是 $p$ 的原根.\r
\r
-首先根据**原根存在的条件**,对与所有的素数 $p>2$和正整数 $e$,当且仅当 $n=1,2,4,p^e,2p^e$时有原根,\r
+首先根据**原根存在的条件**,对与所有的素数 $p>2$ 和正整数 $e$,当且仅当 $n=1,2,4,p^e,2p^e$ 时有原根,\r
\r
-那么由于式子中的模数 $p$,那么一定存在一个 $g$满足 $g$是 $p$的原根,即对于任意的数 $x$在模 $p$意义下一定有且仅有一个数 $i$,满足 $x = g^i$,且 $0 \le x,i < p$.\r
+那么由于式子中的模数 $p$ ,那么一定存在一个 $g$ 满足 $g$ 是 $p$ 的原根,即对于任意的数 $x$ 在模 $p$ 意义下一定有且仅有一个数 $i$,满足 $x = g^i$,且 $0 \le x,i < p$.\r
\r
-所以我们令 $x=g^c$,$g$是 $p$的原根(我们一定可以找到这个 $g$和 $c$),则为求 $(g^c)^a \equiv b \bmod p$的关于 $c$的解集,稍加变换,则有 $(g^a)^c \equiv b \bmod p$,于是就转换成了我们熟知的 **BSGS** 的基本模型了,即可在 $O(\sqrt p)$解决.\r
+所以我们令 $x=g^c$,$g$ 是 $p$ 的原根(我们一定可以找到这个 $g$ 和 $c$),则为求 $(g^c)^a \equiv b \bmod p$ 的关于 $c$ 的解集,稍加变换,则有 $(g^a)^c \equiv b \bmod p$ ,于是就转换成了我们熟知的 **BSGS** 的基本模型了,即可在 $O(\sqrt p)$ 解决.\r
\r
-那么关键的问题就在于如何找到这个 $g$了?\r
+那么关键的问题就在于如何找到这个 $g$ 了?\r
\r
-关于对于存在原根的数 $p$有这样的**性质**:若 $t$是 $a$模 $p$的次数(这里蕴含了 $(a,p)=1$),那么对于任意的数 $d$,满足 $a^d \equiv 1 \bmod p$,则 $t \mid d$.\r
+关于对于存在原根的数 $p$ 有这样的**性质**:若 $t$ 是 $a$ 模 $p$ 的次数(这里蕴含了 $(a,p)=1$),那么对于任意的数 $d$,满足 $a^d \equiv 1 \bmod p$,则 $t \mid d$.\r
\r
**PROOF**\r
\r
\r
$\because a^d \equiv a^{xq+r} \equiv (a^t)^qa^r \equiv a^r \equiv 1$.\r
\r
-$\because 0 \le r < t$,$t$是 $a$模 $p$的次数,即 $t$是最小的**正整数**满足 $a^t \equiv 1$.\r
+$\because 0 \le r < t$,$t$ 是 $a$ 模 $p$ 的次数,即 $t$ 是最小的**正整数**满足 $a^t \equiv 1$.\r
\r
$\therefore r = 0$.\r
\r
\r
\r
\r
-由此当 $p$是质数的时候还有这样的推论:如果不存在小于 $p$且整除 $p-1$正整数 $t$, 满足 $a^t \equiv 1$,那么又根据**费马小定理**,有 $a^{p-1} \equiv 1$,所以 $p-1$是 $a$模 $p$的次数,即 $a$是 $p$的原根.\r
+由此当 $p$ 是质数的时候还有这样的推论:如果不存在小于 $p$ 且整除 $p-1$ 正整数 $t$, 满足 $a^t \equiv 1$,那么又根据**费马小定理**,有 $a^{p-1} \equiv 1$,所以 $p-1$ 是 $a$ 模 $p$ 的次数,即 $a$ 是 $p$ 的原根.\r
\r
\r
\r
-于是可以得到一种基于**原根分布**的算法来找原根,首先把 $p-1$的因数全部求出来,然后从 $2$到 $p-1$枚举,判断是否为原根,如果对于数 $g$,$\exists g^t \equiv 1 \bmod p$,$t$是 $p-1$的因数,则 $g$一定不是 $p$的原根.\r
+于是可以得到一种基于**原根分布**的算法来找原根,首先把 $p-1$ 的因数全部求出来,然后从 $2$ 到 $p-1$ 枚举,判断是否为原根,如果对于数 $g$,$\exists g^t \equiv 1 \bmod p$,$t$ 是 $p-1$ 的因数,则 $g$ 一定不是 $p$ 的原根.\r
\r
\r
\r
看上去复杂度好像很爆炸(可能确实是爆炸的,但一般情况下,最小的原根不会很大).\r
\r
-~~基于一个**假设**,原联系根是**均匀分布**的,我们**伪证明**一下总复杂度~~:原根数量定理:数 $p$要么没有原根,要么有 $\varphi(\varphi(p))$个原根.\r
+~~基于一个**假设**,原联系根是**均匀分布**的,我们**伪证明**一下总复杂度~~:原根数量定理:数 $p$ 要么没有原根,要么有 $\varphi(\varphi(p))$ 个原根.\r
\r
-由于 $p$是质数,所以 $p$有 $\varphi(p-1)$个原根,所以大概最小的原根为 $\frac{p}{\varphi(p-1)}=O(\log\log n)$,由于求每一个数时要枚举一遍 $p-1$所有的因数 $O(\sqrt p)$来判断其是否为原根,最后再算上 **BSGS** 的复杂度 $O(\sqrt{p})$,则复杂度约为 $O(\sqrt{p}\log \log n)$.\r
+由于 $p$ 是质数,所以 $p$ 有 $\varphi(p-1)$ 个原根,所以大概最小的原根为 $\frac{p}{\varphi(p-1)}=O(\log\log n)$,由于求每一个数时要枚举一遍 $p-1$ 所有的因数 $O(\sqrt p)$ 来判断其是否为原根,最后再算上 **BSGS** 的复杂度 $O(\sqrt{p})$,则复杂度约为 $O(\sqrt{p}\log \log n)$.\r
\r
\r
\r
[BZOJ-1319](http://www.lydsy.com/JudgeOnline/problem.php?id=1319) 是一道模板题,代码可以在 [Steaunk的博客](https://blog.csdn.net/Steaunk/article/details/78988376) 中看到.\r
\r
-\r
### 3.0 扩展篇\r
\r
上文提到的情况是 $c$ 为素数的情况,如果 $c$ 不是素数呢?\r