### 一、基础知识1 $$ a^x \equiv 1 \pmod{p} $$ 这句话是数论中的一个概念,表示: 1. $ a $ 和 $ p $ 是整数,且 $ p $ 是一个正整数 2. $ a^x $ 表示 $ a $ 的 $ x $ 次方 3. 当 $ a^x $ 除以 $ p $ 时,余数为 1 换句话说,$ a^x - 1 $ 能被 $ p $ 整除。 ### 二、基础知识2 显然:$a^{xy}=(a^x) ^y$ 比如:$2^{6}={2^2}^3$ 假设 $a ^x ≡1\ (\ mod\ p)$,则有 $a^{xy} =(a ^x) ^y ≡1 ^y ≡1\ (mod\ p)$。 > 上面这句话展示了模运算中指数运算的一个重要性质。让我们逐步理解: 已知条件:$a^x ≡ 1\ (\text{mod}\ p)$ 这意味着$a^x$除以$p$的余数是1 或者说$a^x - 1$能被$p$整除 推导过程: $a^{xy} = (a^x)^y$ 由于$a^x ≡ 1\ (\text{mod}\ p)$,我们可以将其代入 $(a^x)^y ≡ 1^y\ (\text{mod}\ p)$ 而$1^y = 1$,所以最终得到$a^{xy} ≡ 1\ (\text{mod}\ p)$ ### 三、 原根判断算法 #### 1、原根定义 在模 `p` 的情况下,`a` 是原根当且仅当 `a` 的阶数$k$等于 `p-1`。阶数是指最小的正整数 `k` 使得: $a^k \equiv 1 \mod p $ #### 2、核心思想 1. **分解 `p-1` 的质因数**:代码通过遍历 `2` 到 `sqrt(p-1)` 来找到 `p-1` 的所有质因数。 2. **检查阶数**:对于每个质因数 `k`,检查是否: $a^k \equiv 1 \mod p $ 或 $a^{(p-1)/k} \equiv 1 \mod p$ 如果满足,说明 `a` 的阶数小于 `p-1`,因此 `a` 不是原根。 #### 3、为什么这个方法有效? - **阶数的性质**:如果 `a` 的阶数$k$小于 `p-1`,那么$k$必须是 `p-1` 的真因数。因此,我们只需要检查 `p-1` 的所有质因数对应的幂次是否等于 1。 - **快速幂**:`qmi` 函数用于高效计算模幂,确保算法的时间复杂度在可接受范围内。