学习原根 by OI-wiki

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

前置知识:

费马小定理:ap11(modp)p 为质数。

欧拉定理:aφ(m)1(modm),m 为任意正整数。

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

定义一个东西,称作

阶:满足 an1(modm) 的最小正整数 n,即为 am 的阶,记作 δm(a)。由欧拉定理可知,任意 m 都存在 φ(m) 使得满足这个方程,所以 n 一定存在且 nφ(m)

  • 性质 1a1,a2,...,aδm(a)m 两两不同余。
    证明

    aiaj(modm),i<jδma,则 aji1(modm)(等式两边同时除以 aj)。

    显然 ji<δm(a),根据阶的定义,与阶的最小性矛盾。

  • 性质 2:若 an1(modm),则 δm(a)|n
    证明
    考虑把 n 分解为 δm(a) 的倍数+nδm(a) 得到的余数的形式,然后反证。

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

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

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

判断数 x 是否为原根,先判断 xφ(m)1(modm) 是否成立,如果成立,然后根据阶的性质二,枚举 φ(m) 的因数是否成立,若因数全为否,则 x 为原根。

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

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

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

posted @   0htoAi  阅读(174)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起