【科技】原根的快速判断方法以及对1求离散对数的另一种想法
鉴于实际需要,本文中所选的模数$p$总是一个平凡质数,并且如果没有特殊说明总是在模$p$意义下进行运算,并用$\varphi$表示$\varphi (p) = p - 1$。
原根的定义:
基于$p$是质数,我们可以很简单的把它的定义想成,如果一个数$a \in [0, p - 1]$是原根的充要条件是对于$x \in [0, p - 2]$,$a^{x}$互不相同。
但根据定义讲,判断一个数$a$是否是$p$的原根是$O(p)$的,不够优秀。
原根的快速判定方法:
首先给出结论,数$a$是$p$的原根当且仅当对于$\varphi$的任意一个质因子$d$,都没有$a^{\frac{\varphi}{d}} \equiv 1(mod \; p)$。
接下来给出其证明:
如果$a$是原根,那显然不存在任何一个$x \in [0, \varphi - 1]$使得$a^{x} \equiv 1$。
现在我们主要要证明对于所有非原根的$a$都有一个$\varphi$的质因子$d$,使得$a^{\frac{\varphi}{d}} \equiv 1$成立。
引理1:如果$a$不是原根,那一定存在一个$x \in [0, \varphi - 1]$,使得$a^{x} \equiv 1$。
- 这个命题其实可以有另一种说法,就是在出现上述的这样一个$x$之前,不会有有一个值重复被$a$的幂次表示。$a$的幂次的值在模$p$意义下应当是一个环,由于逆元是唯一的,显然不存在两个不同的数他们乘上$a$变成同一个数。所以$a$的幂次中第一个重复出现的数一定是$1$。
于是我们只需证明对于某一个$a$,如果存在$x \in [1, \varphi - 1]$,使得$a^{x} \equiv 1$,那一定有一个$\varphi$的质因子$d$,使得$a^{\frac{\varphi}{d}} \equiv 1$成立。
引理2:如果有$a^{i} \equiv 1, a^{j} \equiv 1, 0 \leq j \leq i$,则有$a^{(i, j)} \equiv 1$成立。
- 这个看起来不那么显然,如果把上述结论改成“有$a^{i - j} \equiv 1$成立”看起来就很对了。这恰好满足了辗转相减的特性。
由于$a^{\varphi} \equiv 1$,并设$g = (x, \varphi)$,得$a^{g} \equiv 1$,因为$x < \varphi$,所以$g < \varphi$,$g$与$\varphi$之间差了至少一个$\varphi$的质因子$d$,我们可以让$g$乘上某些数变成$\frac{\varphi}{d}$,而$1$的幂次总是$1$。于是就得证了。
综上所述,我们判断一个数$a$是否是原根,只需枚举$\varphi$所有的质因子$d$,看是否有$a^{\frac{\varphi}{d}} \equiv 1$,若有则$a$不是原根。其复杂度为$O(log^2p)$。
对$1$求离散对数的另一种想法:
对于某一个平凡的数$a$,要求最小的正整数$x$满足$a^{x} \equiv 1$。
这是一个Simple的问题,因为对于一个平凡的情况,我们已经有十分优秀的$Bsgs$做法,并且它不局限于对$1$求离散对数,但今天我想说的并不是这个。事实上,一个合法的解$x$一定是$\varphi$的一个因子。
如果延续我们之前判断原根的思路,那这个问题是十分容易解决的。如果有$a^{x} \equiv 1$存在,同样设$g = (x, \varphi)$,有$a^{g} \equiv 1$成立,$g$显然是$\varphi$的一个因子,当$x$是极小的,就要有$x = g$。
但使用这个方法的局限性很明显,它只能对$1$求离散对数,因为我们在这之中利用了$1$的特殊性质。而且这个方法的复杂度并没有太显著的优势,如果$\varphi$的因子数量很多的话,最劣是$O(\sqrt[3]{p}logp)$,但如果已知模数并且其因子个数并不多的话,这不失为一个简洁有效的做法。