阶
定义:设(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}}
e 1 mod(m),i = 1,2,·····,k
]
则(g)是(m)的一个原根