原根

原根是数论中的一个概念,设m是正整数,a是整数,若a模m的阶等于phi(m),则称a为模m的一个原根。

存在条件

自然数n有原根的充要条件是:

n = 2, 4, p^s, 2*p^s  (p>=3, s>=1)

原根个数

若模n有原根,则n一定恰好有phi(phi(n))个不同余的原根(mod n)。

设g为一个原根,则1, g, g^2, …, g^(phi(n)-1)恰好组成模n的一个简化剩余系。

原根求法

假设g是n的一个原根,那么将phi(n)分解质因数,得到不同的质因子p[i],必有g^(phi(n)/p[i]) mod n不等于1。

特别的,如果n是质数,那么phi(n)=n-1,对应的有g^((n-1)/p[i]) mod n恒不等于1。

求原根没什么好的办法,由于原根一般不大,直接暴力枚举验证上述条件是否成立即可。

例题:51nod1135 给出质数p(3<=p<=1e9),求p最小的原根。

#include <bits/stdc++.h>
using namespace std;
int n, p[10], np;
void fact(int x) {
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) {
            p[np++] = i;
            while (x % i == 0)
                x /= i;
        }
    }
    if (x > 1) p[np++] = x;
}
int powmod(int a, int b, int c) {
    long long r = 1, t = a;
    while (b) {
        if (b & 1) r = r * t % c;
        t = t * t % c;
        b /= 2;
    }
    return r;
}
bool chk(int g) {
    for (int i = 0; i < np; i++)
        if (powmod(g, (n-1)/p[i], n) == 1)
            return false;
    return true;
}
int main() {
    cin >> n;
    fact(n-1);
    for (int g = 2; g < n; g++) {
        if (chk(g)) {
            cout << g << endl;
            return 0;
        }
    }
    return 0;
}
Table of Contents