阶 和 原根
阶
若 \(b\) 为满足 \(a^b\equiv 1\pmod p\) 的最小值,则 \(b\) 为 \(a\) 模 \(p\) 的阶,记为 \(\text{ord}_p(a)\) 或 \(\delta_p(a)\),阶一定存在
性质 1
\([a^i\bmod p\mid 1\le i\le\delta_p(a)]\) 两两不同
性质 2
若 \(a^n\equiv 1\pmod p\),则 \(\delta_p(a)\mid p\)
推论
若 \(a^x\equiv a^y\pmod p\),则 \(x\equiv y\pmod{\delta_p(a)}\)
性质 3
若 \(p\in \Bbb N^+,\,a,b\in\Bbb Z,\,a\bot p,\,b\bot p\),则 \(\delta_p(ab)=\delta_p(a)\delta_p(b)\iff \delta_p(a)\bot\delta_p(b)\)
性质 4
若 \(k\in\Bbb N,p\in\Bbb N^+,a\in\Bbb Z,a\bot p\),则 \(\delta_p(a^k)=\frac{\delta_p(a)}{\gcd(\delta_p(a),k)}\)
原根定义
若 \(a\bot p\),且 \(\delta_p(a)=\varphi(p)\),则 \(a\) 为模 \(p\) 意义下的原根
原根判定定理
若 \(a\bot p\),则 \(a\) 为模 \(p\) 意义下的原根当且仅当 \(\forall q\mid \varphi(p),q\in\mathbb P,(a^{\frac{\varphi(p)}q}\not\equiv 1\pmod p)\)
原根存在定理
\(p\) 存在原根当且仅当 \(p\in\{2,4,q^k,2q^k\}\;(q\in\mathbb P,q\ne 2,k\in\Bbb N^+)\)
原根个数
若 \(p\) 有原根,则其原根数量为 \(\varphi(\varphi(p))\)
最小原根的范围估计
素数 \(p\) 的最小原根 \(g_p=O(p^{0.25+\varepsilon})\),且 \(g_p=\Omega(\log p)\)
找出所有原根
先判断是否存在,再暴力找到最小的原根 \(g_p\),然后暴力枚举 \(k\),若 \(\varphi(p)\bot k\),则 \(g_p^k\) 为原根
模板题:P6091 【模板】原根
int fpw(int a, int b, int M){int ret = 1;for (; b; b >>= 1, a = 1ll * a * a % M)if (b & 1)ret = 1ll * ret * a % M;return ret;}
int phi(int a){
int ret = a;
for (int i = 2; i * i <= a; ++i)
if (a % i == 0){while (a % i == 0)a /= i;ret = ret / i * (i - 1); }
if (a > 1)ret = ret / a * (a - 1);return ret;
}
void sol(vector<int> &ret, int n){//ret 保存了 n 的所有原根
if (n == 2){ret = {1};return ;}
int ph = phi(n), t = ph;
vector<int> P;
for (int i = 2; i * i <= ph; ++i)
if (ph % i == 0){
P.emplace_back(t / i);
while (ph % i == 0)ph /= i;
}
if (ph > 1)P.emplace_back(t / ph);
int G = 0;
for (int g = 1; g < n; ++g){
if (__gcd(g, n) != 1)continue;
bool fl = 1;
for (int p : P)
if (fpw(g, p, n) == 1){fl = 0;break;}
if (fl){G = g;break;}
}
if (G)
for (int i = 1, T = 1; i < t; ++i){
T = 1ll * T * G % n;
if (__gcd(i, t) == 1)ret.emplace_back(T);
}
sort(ret.begin(), ret.end());
}
例:[ABC212G] Power Pair
给定 \(p\),求 \(\sum_{x=0}^{p-1}\sum_{y=0}^{p-1}[\exists n\in\Bbb N,x^n\equiv y\pmod p]\) 取模,\(p\le10^{12},p\in\mathbb P\)
若 \(x=0\),则 \(y=0\);反之若 \(y=0\),则 \(x=0\)
因此答案为 \(1+\sum_{x=1}^{p-1}\sum_{y=1}^{p-1}[\exists n\in\Bbb N,x^n\equiv y\pmod p]\)
令 \(p\) 的某一原根为 \(g\),则 \(x\) 可以表示为 \(g^a\),\(y\) 可以表示为 \(g^b\)(其中 \(1\le a,b\le p-1\)),则 \(x^n\equiv y\pmod p\iff na\equiv b\pmod{(p-1)}\)
根据裴蜀定理,\([\exists n\in\Bbb N,na\equiv b\pmod{(p-1)}]=[\gcd(p-1,a)\mid b]\)
因此答案为:
直接计算即可
时间复杂度为 \(O(n^{\varepsilon}\sqrt n)=O(n^{0.5+\varepsilon})\)
参考
- \(\text{12.11 math1.pdf \; \;by Tx\_Lcy}\)

浙公网安备 33010602011771号