'commit'
This commit is contained in:
Binary file not shown.
@@ -19,9 +19,9 @@ void solve() {
|
||||
int a, p;
|
||||
cin >> a >> p;
|
||||
int phi = p - 1;
|
||||
for (int i = 2; i * i <= phi; i++) {
|
||||
if (phi % i == 0) {
|
||||
if (qmi(a, i, p) == 1 || qmi(a, phi / i, p) == 1) {
|
||||
for (int k = 2; k * k <= phi; k++) {
|
||||
if (phi % k == 0) {
|
||||
if (qmi(a, k, p) == 1 || qmi(a, phi / k, p) == 1) {
|
||||
puts("No");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
### 一、基础知识
|
||||
### 一、基础知识1
|
||||
|
||||
|
||||
$$ a^x \equiv 1 \pmod{p} $$
|
||||
@@ -11,22 +11,14 @@ $$ a^x \equiv 1 \pmod{p} $$
|
||||
|
||||
换句话说,$ 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$算法)、数论和计算机科学中都有重要应用。
|
||||
|
||||
|
||||
### 二、本题求解
|
||||
|
||||
### 二、基础知识2
|
||||
|
||||
显然:$a^{xy}=(a^x) ^y$
|
||||
|
||||
|
||||
|
||||
$2^{6}={2^2}^3$
|
||||
比如:$2^{6}={2^2}^3$
|
||||
|
||||
假设 $a ^x ≡1\ (\ mod\ p)$,则有 $a^{xy} =(a ^x) ^y ≡1 ^y ≡1\ (mod\ p)$。
|
||||
> 上面这句话展示了模运算中指数运算的一个重要性质。让我们逐步理解:
|
||||
@@ -39,34 +31,20 @@ $a^{xy} = (a^x)^y$
|
||||
$(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$。
|
||||
### 三、 原根判断算法
|
||||
|
||||
### 三、 原根判断算法解析
|
||||
#### 1、原根定义
|
||||
在模 `p` 的情况下,`a` 是原根当且仅当 `a` 的阶数$k$等于 `p-1`。阶数是指最小的正整数 `k` 使得:
|
||||
$a^k \equiv 1 \mod p $
|
||||
|
||||
#### 原根的定义
|
||||
在模 `p` 的情况下,`a` 是原根当且仅当 `a` 的阶数等于 `p-1`。阶数是指最小的正整数 `k` 使得:
|
||||
\[ a^k \equiv 1 \mod p \]
|
||||
|
||||
#### 代码的核心思想
|
||||
#### 2、核心思想
|
||||
1. **分解 `p-1` 的质因数**:代码通过遍历 `2` 到 `sqrt(p-1)` 来找到 `p-1` 的所有质因数。
|
||||
2. **检查阶数**:对于每个质因数 `i`,检查是否:
|
||||
\[ a^i \equiv 1 \mod p \]
|
||||
2. **检查阶数**:对于每个质因数 `k`,检查是否:
|
||||
$a^k \equiv 1 \mod p $
|
||||
或
|
||||
\[ a^{(p-1)/i} \equiv 1 \mod p \]
|
||||
$a^{(p-1)/k} \equiv 1 \mod p$
|
||||
如果满足,说明 `a` 的阶数小于 `p-1`,因此 `a` 不是原根。
|
||||
|
||||
#### 为什么这个方法有效?
|
||||
- **阶数的性质**:如果 `a` 的阶数小于 `p-1`,那么它必须是 `p-1` 的某个真因数。因此,我们只需要检查 `p-1` 的所有质因数对应的幂次是否等于 1。
|
||||
#### 3、为什么这个方法有效?
|
||||
- **阶数的性质**:如果 `a` 的阶数$k$小于 `p-1`,那么$k$必须是 `p-1` 的真因数。因此,我们只需要检查 `p-1` 的所有质因数对应的幂次是否等于 1。
|
||||
- **快速幂**:`qmi` 函数用于高效计算模幂,确保算法的时间复杂度在可接受范围内。
|
||||
|
||||
Reference in New Issue
Block a user