阶
定义:设\(m > 1\),且\((a,m) = 1\),使得\(a^r \equiv 1 mod(m)\)成立的最小的\(r\),称为\(a\)对模\(m\)的阶,记为\(\delta_m(a)\)。
定理:若\(m > 1\),且\((a ,m) = 1\),\(a^n \equiv 1 mod(m)\),则\(\delta_m(a)|n\)。
原根
定义:设\(m\)是正整数,\(a\)是整数,若\(\delta_m(a) = \varphi(m)\),则称\(a\)为模\(m\)的一个原根
定理:如果模\(m\)有原根,那么它一共有\(\varphi(\varphi(m))\)个原根
定理:若\(g\)是\(m\)的一个原根,则\(g,g^2,……,g^{\varphi(m)}\)各数对\(m\)取模的非负最小剩余就是小于\(m\)且与\(m\)互质的\(\varphi(m)\)个数的一个排列
原根存在条件
当\(m = 2,4,2P^n,P^n\),这里的\(P\)是奇素数(除2以外的素数),\(n\)是正整数
求原根的方法
从2开始枚举,然后暴力判断\(g^{P - 1} \equiv 1 mod(P)\)是否只有在指数为\(P - 1\)的时候成立。
bool check(int g) {
int tp = 1;
for (int i = 1; i < P - 1; ++i) {
tp = 1ll * tp * g % P;
if (tp == 1) return 0;
}
return false;
}
void get() {
int g = 2;
for (int i = 2; ; ++i) if (check(i)) {
g = i;
break;
}
}
模素数求原根的方法
首先求\(\varphi(m)\)的素幂分解式:
\[ \varphi(m) = p_1^{e_1}*p_2^{e_2}*p_3^{e_3}*·····*p_k^{e_k} \]
然后枚举\(g\),若恒满足
\[ g^{\frac{\varphi(m)}{p_i}} \ne 1 mod(m),i = 1,2,·····,k \]
则\(g\)是\(m\)的一个原根