学原根发现拔山盖世算法忘光了,干脆一块儿写了吧。


\(BSGS\) 算法

\(BSGS\) 算法,又名拔山盖世算法、北上广深算法。他解决的问题如下:

求解最小的可行的 \(k\),满足 \(a^k\equiv b(\bmod p)\),其中保证 \(\gcd(a,p)=1\)。

容易想到暴力枚举,时间复杂度 \(O(p)\),但是巨劣,考虑优化。

优化算法哪家强,出门右转找分块。我们尝试使用分块的思路优化。

开始推导公式:

\[a^k\equiv b(\bmod p)
\]
\[a^{nA-m}\equiv b(\bmod p)
\]
\[a^{nA}\equiv ba^m(\bmod 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复习笔记的更多相关文章

  1. FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅲ

    第三波,走起~~ FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅰ FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅱ 单位根反演 今天打多校时 1002 被卡科技了 ...

  2. JDBC学习笔记(3)——复习和练习

    复习和练习 复习部分 一.获取数据库连接 1)方式一 // 获取数据库连接 @Test public void testGetConnection() throws Exception { // 1. ...

  3. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  4. 斜率优化DP复习笔记

    前言 复习笔记2nd. Warning:鉴于摆渡车是普及组题目,本文的难度定位在普及+至省选-. 参照洛谷的题目难度评分(不过感觉部分有虚高,提高组建议全部掌握,普及组可以选择性阅读.) 引用部分(如 ...

  5. Python基础语法复习笔记(一):字符串

    python基础复习笔记 个人主页:JoJo的数据分析历险记 个人介绍:小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生 如果文章对你有帮助,欢迎关注.点赞.收藏.订阅专栏 本专栏主要 ...

  6. canvas学习之API整理笔记(二)

    前面我整理过一篇文章canvas学习之API整理笔记(一),从这篇文章我们已经可以基本了解到常用绘图的API.简单的变换和动画.而本篇文章的主要内容包括高级动画.像素操作.性能优化等知识点,讲解每个知 ...

  7. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  8. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  9. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

  10. Java基础复习笔记系列 四 数组

    Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...

随机推荐

  1. 自有Jar包生成Docker镜像

    前言 经常会有些自己写的一些SpringBoot小项目,为了实现一些小的功能/需求,但是部署的时候,不管是生成jar包,还是war包部署到tomcat中,都容易因为需要部署的环境(比如java版本.t ...

  2. Python开发一个Instant Messaging(IM)(即时通讯)聊天工具:从理论到实践

    一.引言 在现代社会中,即时通讯工具已经成为人们日常沟通的重要工具.开发一个IM聊天工具不仅能够提高我们的编程技能,还能让我们更好地理解即时通讯系统的原理.本文将详细介绍如何开发一个简单的IM聊天工具 ...

  3. Hive数据库【操作】+ 【分区】+【分桶】+【查询】+【运算】+【函数】

    目录 键值对信息 数据库表操作 内部表操作 外部表操作 分区表的操作 分桶表操作 数据查询 关系运算 数学运算 逻辑运算 数值计算 日期函数 键值对信息 添加数据库的描述信息(添加键值对信息) cre ...

  4. Docker Compose - 向远程主机部署服务

    问题描述 通常,我们本地编写 docker-compose.yml 文件,然后运行测试.但是,我们需要在 arm64 环境中进行测试,无法在本地直接运行测试. 我们希望可以在本地编写,然后本地使用 d ...

  5. K8S学习笔记之卸载K8S集群

    阅读目录 0x00 概述 0x01  操作 0x00 概述 有时候需要卸载已安装在本机的K8S服务和服务,本文卸载的K8S面向使用kubeadm或者二进制方法安装的,不涉及使用rpm包安装的集群: 主 ...

  6. 问题解决:curl: (7) Failed to connect to raw.githubusercontent.com port 443: 拒绝连接

    Ubuntu20.04下,安装Ros 指令curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key 报错:cur ...

  7. Spark内存调优

    一.概述Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优.本文旨 ...

  8. 解决容器Docker内部启动计划任务crontab不生效不执行的问题

    docker使用centos7镜像 首先编辑crond,注释#session    required   pam_loginuid.so: vi /etc/pam.d/crond 然后重启crond服 ...

  9. Qt编写物联网管理平台50-超强跨平台

    一.前言 跨平台的需求,除了是用户的需求外,也是为了适应日益增长的国产操作系统的发展的需要,当前国产操作系统发展的如火如荼,100%都是围绕linux系统展开,说的好听点就是站在巨人的肩膀上开发,不好 ...

  10. vue3 路由的使用

    添加一个router.js 配置文件 import { createRouter, createWebHistory } from 'vue-router' createRouter:用来创建 路由 ...