原根学习笔记+BSGS复习笔记
学原根发现拔山盖世算法忘光了,干脆一块儿写了吧。
\(BSGS\) 算法
\(BSGS\) 算法,又名拔山盖世算法、北上广深算法。他解决的问题如下:
求解最小的可行的 \(k\),满足 \(a^k\equiv b(\bmod p)\),其中保证 \(\gcd(a,p)=1\)。
容易想到暴力枚举,时间复杂度 \(O(p)\),但是巨劣,考虑优化。
优化算法哪家强,出门右转找分块。我们尝试使用分块的思路优化。
开始推导公式:
\]
\]
\]
那我们考虑对 \(m\in[0,A)\) 进行暴力计算,用 \(map\) 或 \(unordered\_map\) 存储,然后暴力枚举 \(n\),寻找此时有没有值与他同余。
时间复杂度 \(O(A+\frac pA)\),当 \(A=\sqrt p\) 时,时间复杂度最小,为 \(O(\sqrt p)\)。
int bsgs(int a,int b,int p){
int kl=ceil(sqrt(p)),tmp=qpow(a,kl);
for(int i=0;i<kl;i++) mp[b]=i,b=b*a%p;
for(int i=1,c=1;i<=kl;i++)
if(mp[c=c*tmp%p]) return i*kl-mp[c];
return 0;
}
原根
定义:\(m\in \mathbb{N^*},g\in \mathbb{Z}\),若 \(\gcd(m,g)=1\) 且 \(\delta_m(g)=\varphi(m)\),我们称 \(g\) 为 \(m\) 的原根。
判定定理:\(g\) 为 \(m\) 原根,当且仅当 \(\forall p\in\{x|(x|\varphi(m),x\in prime)\},g^{\frac{\varphi(m)}{p}}\not\equiv1(\bmod m)\)。
对于一个有原根的数 \(m\),它的原根个数为 \(\varphi(\varphi(m))\)。
若\(g\) 为 \(m\) 原根,则有 \(\forall i,j\in[0,p),g^i\not\equiv g^j(\bmod m)\)。
一个数 \(m\) 有原根,当且仅当 \(m\in\{2,4,p^a,2p^a\}\)。
对于一个有原根的数,它的最小正原根大小为 \(O(p^{0.25+\epsilon})\),其中 \(\epsilon>0\)。
注:王元先生似乎的确没有证明非质数的情况,但是其他人证了,所以可以直接用,没有问题。
原根学习笔记+BSGS复习笔记的更多相关文章
- FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅲ
第三波,走起~~ FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅰ FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅱ 单位根反演 今天打多校时 1002 被卡科技了 ...
- JDBC学习笔记(3)——复习和练习
复习和练习 复习部分 一.获取数据库连接 1)方式一 // 获取数据库连接 @Test public void testGetConnection() throws Exception { // 1. ...
- Java基础复习笔记系列 九 网络编程
Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...
- 斜率优化DP复习笔记
前言 复习笔记2nd. Warning:鉴于摆渡车是普及组题目,本文的难度定位在普及+至省选-. 参照洛谷的题目难度评分(不过感觉部分有虚高,提高组建议全部掌握,普及组可以选择性阅读.) 引用部分(如 ...
- Python基础语法复习笔记(一):字符串
python基础复习笔记 个人主页:JoJo的数据分析历险记 个人介绍:小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生 如果文章对你有帮助,欢迎关注.点赞.收藏.订阅专栏 本专栏主要 ...
- canvas学习之API整理笔记(二)
前面我整理过一篇文章canvas学习之API整理笔记(一),从这篇文章我们已经可以基本了解到常用绘图的API.简单的变换和动画.而本篇文章的主要内容包括高级动画.像素操作.性能优化等知识点,讲解每个知 ...
- Java基础复习笔记系列 八 多线程编程
Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...
- Java基础复习笔记系列 七 IO操作
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
- Java基础复习笔记系列 五 常用类
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...
- Java基础复习笔记系列 四 数组
Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...
随机推荐
- HTML5 拖拽接口
1.首先,为了使元素可拖动,要先设置元素为可拖拽 方法:添加draggable属性,设置为 true 注意:链接和图像默认就支持拖拽,另外,如果一个元素中的文本被选中,那么这个元素和他的文本节点此时都 ...
- Linx操作Nginx命令
在 CentOS 上操作 Nginx 包括安装.启动.停止.重新加载配置等.以下是在 CentOS 上操作 Nginx 的常用命令: 安装 Nginx: sudo yum install nginx ...
- Java并发 —— 线程并发(一)
线程和进程 进程就是一个内存中运行的应用程序 线程是当前进程中的一个执行任务(控制单元),负责当前进程中程序的执行 区别与联系 根本区别:进程是操作系统资源分配的基本单位,线程是处理器任务调度和执行的 ...
- 《JavaScript 模式》读书笔记(7)— 设计模式2
这一篇我们主要来学习装饰者模式.策略模式以及外观模式.其中装饰者模式稍微复杂一点,大家认真阅读,要自己动手去实现一下哦. 四.装饰者模式 在装饰者模式中,可以在运行时动态添加附加功能到对象中.当处理静 ...
- docker compose的安装
1,安装docker ### CentOS8 默认是会读取centos.org的mirrorlist的,所以一般来说是不需要配置镜像的. # step 1: 安装必要的一些系统工具 sudo yum ...
- uniapp开发鸿蒙,是前端新出路吗?
相信不少前端从业者一听uniapp支持开发鸿蒙Next后非常振奋.猫林老师作为7年前端er也是非常激动,第一时间体验了下.在这里也给大家分享一下我的看法 对于前端开发者而言,几乎无需增加额外的学习成本 ...
- .NET 7 中的限流
.NET 中的限流 https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/ 这里我们要宣布的是集成为 .N ...
- 各版本jdk百度云下载,包括linux版和windows版
并不是越新的版本就一定越好,请先考虑jdk的版本是否跟你的开发环境有版本冲突问题. 2021-11-4更新 ps:从官网下载实在是太慢了!! 官网链接:https://www.oracle.com/j ...
- 常用bat代码
清除空文件夹 | 清理空文件夹 | 删除空文件夹 @echo off for /f "tokens=*" %%i in ('dir/s/b/ad^|sort /r') do rd ...
- Spring Cloud Sleuth in a Monolith Application
1. Overview In this article, we're introducing Spring Cloud Sleuth – a powerful tool for enhancing ...