证明我学(看)过原根

前言

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}\)

posted @ 2022-03-16 21:33  qwq_123  阅读(64)  评论(0编辑  收藏  举报