学习原根 by OI-wiki

根据 OI-wiki 的讲解,加以自己的理解和简化。偏重于算法竞赛而不是数学竞赛。

前置知识:

费马小定理:\(a^{p-1} \equiv 1(\mod p)\)\(p\) 为质数。

欧拉定理:\(a^{\varphi(m)}\equiv 1(\mod m)\),m 为任意正整数。

拉格朗日定理:\(p\) 为质数,\(n\) 整系数次多项式在模 \(p\) 意义下至多有 \(n\) 个不同解。(即多项式 \(f(x)\)\(f(x)\equiv 0(\mod p)\)\(x\) 的取值至多有 \(n\) 个。)

定义一个东西,称作

阶:满足 \(a^n \equiv 1(\mod m)\) 的最小正整数 \(n\),即为 \(a\)\(m\) 的阶,记作 \(\delta_m(a)\)。由欧拉定理可知,任意 \(m\) 都存在 \(\varphi(m)\) 使得满足这个方程,所以 \(n\) 一定存在且 \(n \leq \varphi(m)\)

  • 性质 \(1\)\(a^1,a^2,...,a^{\delta_m(a)}\)\(m\) 两两不同余。
    证明

    \(a^i \equiv a^j(\mod m),i < j \leq \delta_m{a}\),则 \(a^{j-i}\equiv 1(\mod m)\)(等式两边同时除以 \(a^j\))。

    显然 \(j-i<\delta_m(a)\),根据阶的定义,与阶的最小性矛盾。

  • 性质 \(2\):若 \(a^n \equiv 1(\mod m)\),则 \(\delta_m(a) | n\)
    证明
    考虑把 \(n\) 分解为 \(\delta_m(a)\) 的倍数+\(n\)\(\delta_m(a)\) 得到的余数的形式,然后反证。

还有一堆性质,但我要学的是原根,故跳过。

原根:严谨定义:设 \(m\in \N^*,a\in \Z\)。若 \(\gcd(a,m)=1\),且 \(\delta_m(a)=\varphi(m)\),则称 \(a\) 为模 \(m\) 意义下的原根。一般的用途,对于质数 \(p\),其原根为 \(g\)(可以证明一定存在),\(g^i \mod p,0 \leq i \leq p\) 的值互不相同。这一点在 NTT 里是关键所在,如果以后有机会我会写多项式相关的博客。

如何求原根?
一个结论:任意质数都有原根。
第二个结论:若 \(m\) 有原根,其最小原根不多于 \(m^{0.25}\) 级别。
可以考虑暴力枚举每一个数直到找到原根。判别式为原根的定义式。

判断数 \(x\) 是否为原根,先判断 \(x^{\varphi(m)}\equiv 1(\mod m)\) 是否成立,如果成立,然后根据阶的性质二,枚举 \(\varphi(m)\) 的因数是否成立,若因数全为否,则 \(x\) 为原根。

更简洁地,枚举 \(\varphi(m)\) 除以其中一个质因数,一共质因数个数多个数,这些数是否成立等价于所有因数是否成立。

\(\varphi\)\(m\) 取值多但数值小时可以用线性筛,如果 \(m\) 只有一个,但是很大,考虑用根号算法算出 \(\varphi\) 的值。

以后贴一份求阶的线性筛代码。

posted @ 2022-10-20 21:42  0htoAi  阅读(148)  评论(0编辑  收藏  举报