1.8 KiB
1.8 KiB
一、基础知识1
a^x \equiv 1 \pmod{p}
这句话是数论中的一个概念,表示:
a和p是整数,且p是一个正整数a^x表示a的x次方- 当
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、核心思想
- 分解
p-1的质因数:代码通过遍历2到sqrt(p-1)来找到p-1的所有质因数。 - 检查阶数:对于每个质因数
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函数用于高效计算模幂,确保算法的时间复杂度在可接受范围内。