证明我学(看)过原根
前言
RT
直接复制一波结论,也不管什么证明了,希望之后自己还可以翻到这些文字。
定义
个人理解,非严谨定义。
阶:满足 \(a^n\equiv 1\pmod m\) 的最小正整数 \(n\) 就是 \(a\) 在模 \(m\) 下的阶。
\(m\) 为正整数,若存在一个整数 \(a\in [1,m]\)。使 \(a\) 在模 \(m\) 下的阶等于 \(\varphi(m)\) 那么 \(a\) 就是模 \(m\) 的原根。
什么数有原根
当且仅当 \(m=2,4,p^a,2p^a(a\in \mathbb{N}^+)\) 时,\(m\) 才有原根。
怎么求
- 最小原根
若 \(m\) 有原根,其最小原根是不多于 \(m^{0,25}\) 级别的,所以我们是可以暴力枚举的。
- 判断 \(a\) 是否是 \(m\) 的原根。
首先要判断 \(a^{\varphi(m)}\equiv 1\),然后需要判断对于 \(\varphi(m)\) 的每个素因数 \(p\) ,都有 \(a^{\frac{\varphi(m)}{p}}\not\equiv 1 \pmod m\)。
那么提前拆分一下 \(\varphi(m)\) 的因数再扫一遍判断就行。
代码:
int pd(int x){
if(ksm(x,phi,n)^1)return 0;
for(int i=1;i<=cnt;++i)
if(ksm(x,a[i],n)==1)return 0;
return 1;
}
- 其他原根的求法。
若 \(m\) 存在原根,那么其原根个数为 \(\varphi(\varphi(m))\) 。
求出最小原根 \(g\) 之后,其余的原根就是 \(\{g^i|\gcd(i,\varphi(m))=1\}\) 。
怎么用
一般会用在 \(m\) 是质数的情况下,\(m\) 不是质数应该也能用,毕竟原理是一样的。
若如 \(m\) 是质数,那么其原根 \(g\) 的阶恰好为 \(\varphi(m) = m - 1\),于是可知,\(g^0, g^1, ..., g^{m-1}\) 两两不同,所以把模 \(m\) 意义下的乘法转化成加法。
具体来说,我们可以记录一下每个 \(i\in[0,p-2],id[g^i]=i\) ,然后 \(a\times b=g^{id_a}\times g^{id_b}=g^{id_a+id_b}\) 。