阶和原根

  整数的:给定\(a\),求使得\(a^x \equiv 1 \pmod p\)成立的最小的正整数\(x\),这个\(x\)称为\(a\)\(p\)下的阶,记作\(\text{ord}_pa\),显然要满足\((a,p)=1\)。由欧拉定理易知它肯定存在,且能得到\(\text{ord}_pa \mid \varphi(p)\)

  阶的性质:

  1、\(\text{ord}_pa \mid \varphi(p)\)

  2、\(a\)\(a^2\)\(a^3\dotsb a^{\text{ord}_pa}\)在模\(p\)意义下互不相等。显然如果相等会违背阶的定义。

  3、\(a^r \equiv a^{r'} \pmod p \Leftrightarrow r \equiv r' \pmod{\text{ord}_pa}\)。同样很显然。

  4、\(\text{ord}_ma^k=\frac{\text{ord}_ma}{(\text{ord}_ma,k)}\)。证明用一下裴蜀定理即可。

  5、\(\text{ord}_m(ab) = \text{ord}_ma \times \text{ord}_mb \Leftrightarrow (\text{ord}_ma, \text{ord}_mb) = 1\)。用整除和阶的性质证一证即可。这表明阶是积性函数

  如何求\(\text{ord}_pa\)?枚举\(\varphi(p)\)的质因子试除判断即可。

std::vector<int> fac; // 存储分解的质因子
void getfac(int N) {
	fac.clear();
	rep(i, 1, p[0]) if (N > 1 && check[N]) {
		if (N % p[i]) break;
		fac.push_back(p[i]);
		while (!(N % p[i])) N /= p[i];
	}
	if (N > 1) fac.push_back(N);
}

int ord(int n) { // 前提(n,P)=1
	int r = phi[P]; getfac(r); // 分解质因子
	rep0(i, fac.size()) while (!(r % fac[i]) && qpow(n, r/fac[i]) == 1) r /= fac[i]; // 不断试除
	return r; // 答案
}

原根

  原根:若\(\text{ord}_pa=\varphi(p)\)时,则称\(a\)\(p\)的原根。

  有原根的数为\(1\)\(2\)\(4\)\(t\)\(2t\)\(t^k\)\(2t^k\),其中\(t\)为奇素数,\(k \in \Z_+\)

  由此我们可以看出:原根\(g\)\(t\)次方在模\(p\)意义下会遍历所有\(\varphi(p)\)个与\(p\)互质的数。

  如果在模数\(p\)下有原根,则原根的个数为\(\varphi(\varphi(p))\)

  \(Proof\)

\[我们找一个任意的原根g,这个g的任意次方构成p的缩系,大小为\mid \varphi(p) \mid \]

\[且根据阶的定义,会得到\{g,g^2,g^3,\dotsb g^{\varphi(p)}\},两两不同 \]

\[因为有g^{\varphi(p)}\equiv 1,所以g^x \equiv g^{x \bmod \varphi(p)},构成一个环 \]

\[我们考虑其中哪些元素是原根 \]

\[设原根为g',易知其指数\leq \varphi(p)时,会取遍缩系中元素 \]

\[因为g'在缩系中,所以g'可以表示成g^k,其中1\leq k \leq \varphi(p) \]

\[g'是原根当且仅当g^k,g^{2k},\dotsb,g^{k\varphi(p)}两两不同 \]

\[等价于k,2k,\dotsb,k\varphi(p)在模\varphi(p)意义下两两不同 \]

\[命题的成立必须满足(k,\varphi(p))=1 \]

\[可以理解成从环上起点开始每次走k步走回到起点的最小次数为\varphi(p) \]

\[也就是解kx \equiv 0 \pmod{\varphi(p)},得到最小正数解x=\frac{\varphi(p)}{(\varphi(p),k)} \]

\[而使得x=\varphi(p),当且仅当(\varphi(p),k)=1 \]

\[这样的k有\varphi(\varphi(p))个,即证原根个数只有\varphi(\varphi(p))个 \]

  通过这个还可以证在缩系中,如果\(d \mid \varphi(p)\),则恰有\(\varphi(d)\)个数的阶为\(d\),这里不证了(同上)。

  判断\(a\)是否为原根?用定义。

  如何求原根?原根比较多,且相对分布均匀,所以直接暴力找。

posted @ 2020-04-30 15:50  AC-Evil  阅读(953)  评论(0编辑  收藏  举报