原根

定义:设\(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\)的一个原根

posted @ 2018-10-07 13:28  天之道,利而不害  阅读(736)  评论(0编辑  收藏  举报