数论基础之原根
May 16, 2016 • 🍻 03min 39s read
🔖 math数论原根
什么是原根
¶原根的定义
对于正整数
,如果正整数 满足 且 两两模 不同余,则称 为 的一个原根。由于
。所以, 构成 的一个既约剩余系。原根的阶
如果正整数
和 互质,且 为使得 成立的最小正整数,则称 为 模 的阶,记做 .所以,原根的定义也可以描述为:
是模 的一个原根的充要条件为 .
如何求原根
¶【性质1】:
由定义可知,
;不妨设 ,其中 .
因为 ,所以有 .
由于 ;所以,必有 .
故 .
算法原理
¶枚举
通过【性质 1】,我们可以简单地通过检查所有的
综上,对于每个数
程序实现
¶primitive.root.cpp
12345678910111213141516171819202122232425262728293031void calcFactor(int N, vector<int>& fac) { int sm = ceil(sqrt(1.0 * N)); for (int i = 2; i <= sm; ++i) { if (N%i == 0) { fac.push_back(i); while (N%i == 0) N /= i; } } if (N > 1) fac.push_back(N);}
int calcPrimitiveRoot(int N) { vector<int> fac;
// phi(N) 返回 N 的欧拉函数值,实现略 int PHI_N = phi(N); calcFactor(PHI_N, fac);
for (int i = 0; i < fac.size(); ++i) fac[i] = PHI_N / fac[i]; for (int g = 2; ; ++g) { bool flag = true; for (int i = 0; i < fac.size(); ++i) { // powerMod 返回 $g^{fac[i]} \mod N$,实现略 if (powerMod(g, fac[i], N) == 1) { flag = false; break; } } if (flag) return g; } }
小记
¶哪些数有原根
有原根的充要条件是 。其中, 为奇素数, 为任意正整数。