学习原根 by OI-wiki
根据 OI-wiki 的讲解,加以自己的理解和简化。偏重于算法竞赛而不是数学竞赛。
前置知识:
费马小定理:, 为质数。
欧拉定理:,m 为任意正整数。
拉格朗日定理: 为质数, 整系数次多项式在模 意义下至多有 个不同解。(即多项式 , 的 的取值至多有 个。)
定义一个东西,称作阶。
阶:满足 的最小正整数 ,即为 模 的阶,记作 。由欧拉定理可知,任意 都存在 使得满足这个方程,所以 一定存在且 。
-
性质 : 模 两两不同余。
证明:若 ,则 (等式两边同时除以 )。
显然 ,根据阶的定义,与阶的最小性矛盾。
-
性质 :若 ,则 。
证明:
考虑把 分解为 的倍数+ 模 得到的余数的形式,然后反证。
还有一堆性质,但我要学的是原根,故跳过。
原根:严谨定义:设 。若 ,且 ,则称 为模 意义下的原根。一般的用途,对于质数 ,其原根为 (可以证明一定存在), 的值互不相同。这一点在 NTT 里是关键所在,如果以后有机会我会写多项式相关的博客。
如何求原根?
一个结论:任意质数都有原根。
第二个结论:若 有原根,其最小原根不多于 级别。
可以考虑暴力枚举每一个数直到找到原根。判别式为原根的定义式。
判断数 是否为原根,先判断 是否成立,如果成立,然后根据阶的性质二,枚举 的因数是否成立,若因数全为否,则 为原根。
更简洁地,枚举 除以其中一个质因数,一共质因数个数多个数,这些数是否成立等价于所有因数是否成立。
在 取值多但数值小时可以用线性筛,如果 只有一个,但是很大,考虑用根号算法算出 的值。
以后贴一份求阶的线性筛代码。
本文来自博客园,作者:0htoAi,转载请注明原文链接:https://www.cnblogs.com/0htoAi/p/16811415.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步