51 lines
1.8 KiB
Markdown
51 lines
1.8 KiB
Markdown
### 一、基础知识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` 函数用于高效计算模幂,确保算法的时间复杂度在可接受范围内。
|