根据 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\) 的值。

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

学习原根 by OI-wiki的更多相关文章

  1. 【学习笔记】OI玄学道—代码坑点

    [学习笔记]\(OI\) 玄学道-代码坑点 [目录] [逻辑运算符的短路运算] [\(cmath\)里的贝塞尔函数] 一:[逻辑运算符的短路运算] [运算规则] && 和 || 属于逻 ...

  2. 【学习笔记】OI模板整理

    CSP2019前夕整理一下模板,顺便供之后使用 0. 非算法内容 0.1. 读入优化 描述: 使用getchar()实现的读入优化. 代码: inline int read() { int x=0; ...

  3. SPOJLCS Longest Common Substring

    题意 A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is th ...

  4. SPOJ LCS Longest Common Substring 和 LG3804 【模板】后缀自动机

    Longest Common Substring 给两个串A和B,求这两个串的最长公共子串. no more than 250000 分析 参照OI wiki. 给定两个字符串 S 和 T ,求出最长 ...

  5. 「懒惰的美德」我用 python 写了个自动生成给文档生成索引的脚本

    我用 python 写了一个自动生成索引的脚本 简介:为了刷算法题,建了一个 GitHub仓库:PiperLiu / ACMOI_Journey,记录自己的刷题轨迹,并总结一下方法.心得.想到一个需求 ...

  6. OI学习之路上的宝藏网站/App分享

    OI学习之路上的宝藏网站/App分享 想要变强吗少年?这里有各种我平时收集的网站/App,它们可以帮助你更好地学习算法或者找到解题思路.废话不多说,快来打开新世界的大门罢~ 知识学习 觉得各种知识晦涩 ...

  7. 【算法学习笔记】Meissel-Lehmer 算法 (亚线性时间找出素数个数)

    「Meissel-Lehmer 算法」是一种能在亚线性时间复杂度内求出 \(1\sim n\) 内质数个数的一种算法. 在看素数相关论文时发现了这个算法,论文链接:Here. 算法的细节来自 OI w ...

  8. 【算法学习笔记】动态规划与数据结构的结合,在树上做DP

    前置芝士:Here 本文是基于 OI wiki 上的文章加以修改完成,感谢社区的转载支持和其他方面的支持 树形 DP,即在树上进行的 DP.由于树固有的递归性质,树形 DP 一般都是递归进行的. 基础 ...

  9. 动态规划 Dynamic Programming 学习笔记

    文章以 CC-BY-SA 方式共享,此说明高于本站内其他说明. 本文尚未完工,但内容足够丰富,故提前发布. 内容包含大量 \(\LaTeX\) 公式,渲染可能需要一些时间,请耐心等待渲染(约 5s). ...

  10. CCPC比赛与算法学习的个人分享

    大赛简介 中国大学生程序设计竞赛(China Collegiate Programming Contest,简称CCPC)是工业和信息化部教育与考试中心主办的 "强国杯"技术技能大 ...

随机推荐

  1. 手机号码归属地的自动查询.py(亲测有效)

    import requests url = "http://m.ip138.com/sj.asp?mobile=" kv = {'user-agent':'Mozilla/5.0' ...

  2. mac tip---->开发的tip

    delete webstorm Besides we delete the Webstorm App, We also need to delete related config or log dir ...

  3. mongodb安装及操作

    1.回顾 node服务器的写法 服务器 前后端分离 前后端不分离 express express生成器 ejs模版语法:变量.条件判断.循环渲染.引入 2.mongodb介绍 MongoDB 是一个基 ...

  4. pcm音频的录制、播放及转换

    操作系统 :Windows10_x64 pcm格式为原始音频数据,有时候会遇到需要录制.播放及转换的情况,这里记录下. 一.录制pcm音频 这里演示下使用Audacity进行pcm音频录音的过程. A ...

  5. 在Kubernetes(k8s)中部署 jenkins

    在Kubernetes(k8s)中部署 jenkins YAML配置文件 由于jenkins需要持久化存储,通过nfs动态供给pvc存储卷. 可以参考我之前的文档:https://cloud.tenc ...

  6. ​KubeSphere离线无网络环境部署

    KubeSphere离线无网络环境部署 KubeSphere 是 GitHub 上的一个开源项目,是成千上万名社区用户的聚集地.很多用户都在使用 KubeSphere 运行工作负载.对于在 Linux ...

  7. Unity学习笔记02 —— C#语法

    C#语法 控制台 Console Console.WriteLine(); Console.ReadLine(); 随机数 Random Random random = new Random(); r ...

  8. Python常见面试题016. 请实现如下功能|谈谈你对闭包的理解

    016. 请实现如下功能|谈谈你对闭包的理解 摘自<流畅的python> 第七章 函数装饰器和闭包 实现一个函数(可以不是函数)avg,计算不断增加的系列值的平均值,效果如下 def av ...

  9. 【谷粒商城】(二)SpringCloudAlibaba分布式组件

    微服务 分布式组件 注册中心:每一个微服务上线都应该注册到注册中心.这样做的好处在于方便微服务之间的相互调用,比如订单服务想要调用商品服务,就可以通过注册中心查看有哪几台主机的商品服务进行了注册,然后 ...

  10. 在void 中使用return的意思

    在定义的void函数里如果想要提前终止函数 格式为 return; 如果 在有返回值的函数中 格式为: return+值(0 -1 ......) 但如果在void 函数中写return 0 ; 则会 ...