This commit is contained in:
HuangHai
2025-08-30 18:35:01 +08:00
commit 1f397eca87
6258 changed files with 1487241 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
### 一、基础知识
$$ a^x \equiv 1 \pmod{p} $$
这句话是数论中的一个概念,表示:
1. $ a $ 和 $ p $ 是整数,且 $ p $ 是一个正整数
2. $ a^x $ 表示 $ a $ 的 $ x $ 次方
3. 当 $ a^x $ 除以 $ p $ 时,余数为 1
换句话说,$ a^x - 1 $ 能被 $ p $ 整除。
在数论中,这个表达式经常出现在以下场景中:
1. **阶($Order$)**:当 $ a $ 和 $ p $ 互质时,满足这个等式的最小正整数 $ x $ 称为 $ a $ 模 $ p $ 的阶。
2. **费马小定理**:当 $ p $ 是质数且 $ a $ 不被 $ p $ 整除时,有 $ a^{p-1} \equiv 1 \pmod{p} $
3. **原根**:如果 $ a $ 的阶等于 $ p-1 $,则 $ a $ 称为模 $ p $ 的一个原根
这个表达式在密码学(如$RSA$算法)、数论和计算机科学中都有重要应用。
### 二、本题求解
显然:$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)$
**理解**
这个性质表明,如果一个数的某次方模$p$等于1,那么它的任意倍数次方模$p$也等于1
这在数论和密码学中非常有用,特别是在研究循环群和原根时
例如,在$RSA$加密算法中,这个性质被用来证明解密过程的正确性
> **举例说明**:
假设$a = 2$, $p = 7$
$2^3 = 8 ≡ 1\ (\text{mod}\ 7)$
那么$2^{3×2} = 2^6 = 64 ≡ 1\ (\text{mod}\ 7)$
$2^{3×3} = 2^9 = 512 ≡ 1\ (\text{mod}\ 7)$
这个例子验证了上述结论的正确性
因此,原命题是正确的,它展示了模运算中指数运算的一个重要性质。
>
所以我们可以 $O(\sqrt{p})$ 分解 $p−1$ 的质因数,然后检查 $p−1$ 的每一个因数 $f$ 是否满足 $a^f ≡1(mod\ p)$,如果有任意一个因数满足上述条件,直接输出 $No$。如果所有因数均不满足,输出 $Yes$。
### 三、 原根判断算法解析
#### 原根的定义
在模 `p` 的情况下,`a` 是原根当且仅当 `a` 的阶数等于 `p-1`。阶数是指最小的正整数 `k` 使得:
\[ a^k \equiv 1 \mod p \]
#### 代码的核心思想
1. **分解 `p-1` 的质因数**:代码通过遍历 `2` 到 `sqrt(p-1)` 来找到 `p-1` 的所有质因数。
2. **检查阶数**:对于每个质因数 `i`,检查是否:
\[ a^i \equiv 1 \mod p \]
或
\[ a^{(p-1)/i} \equiv 1 \mod p \]
如果满足,说明 `a` 的阶数小于 `p-1`,因此 `a` 不是原根。
#### 为什么这个方法有效?
- **阶数的性质**:如果 `a` 的阶数小于 `p-1`,那么它必须是 `p-1` 的某个真因数。因此,我们只需要检查 `p-1` 的所有质因数对应的幂次是否等于 1。
- **快速幂**:`qmi` 函数用于高效计算模幂,确保算法的时间复杂度在可接受范围内。