Files
python/GESP/Level5/GESP202503/T2.md
HuangHai 51c15a5e24 'commit'
2025-09-21 14:27:06 +08:00

51 lines
1.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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