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

1.8 KiB
Raw Blame History

一、基础知识1

a^x \equiv 1 \pmod{p}

这句话是数论中的一个概念,表示:

  1. ap 是整数,且 p 是一个正整数
  2. a^x 表示 ax 次方
  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 的质因数:代码通过遍历 2sqrt(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 函数用于高效计算模幂,确保算法的时间复杂度在可接受范围内。