首页 > 其他分享 >原根学习笔记+BSGS复习笔记

原根学习笔记+BSGS复习笔记

时间:2025-01-17 11:46:35浏览次数:1  
标签:原根 int bmod 笔记 算法 varphi BSGS equiv

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


\(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\)。
注:王元先生似乎的确没有证明非质数的情况,但是其他人证了,所以可以直接用,没有问题。

标签:原根,int,bmod,笔记,算法,varphi,BSGS,equiv
From: https://www.cnblogs.com/chang-an-22-lyh/p/18676603/yuan_gen_and_bsgs-zj

相关文章

  • Java初学者笔记-01、封装继承多态
    封装:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。通过封装,可以将类的信息隐藏在类内部,只暴露对外的接口(如setter和getter方法),从而提高代码的安全性和可维护性。继承:继承是从已有的类中派生出新的类的过程。新的类(子类)能够吸收已有类(父类)的数据属性和行为,并且可以......
  • 云计算2024/12/23 笔记
    ★在静态路由的选路原则中,一律选择最短路径。1. 路由环路:在网络的路由转发过程中,数据包不断地在一系列路由器之间循环转发,始终无法到达其真正的目的网络的一种异常情况。简单来说,就是数据包陷入了一个“死循环”,不停地在部分路由器构成的闭合路径中打转。2.解决路由环......
  • 2025/1/13 笔记 动态路由
    一.动态路由1.动态路由的优势可以基于拓扑的变化而进行实时更新2.动态路由的缺点①占用额外的链路资源②安全风险③选路错误的风险 3.动态路由的分类(1)基于AS进行的分类AS:自治系统标准编号:0-65535【1-64511公有区域64512-65535私有区域】 AS之内运行的IGP路由协......
  • 2025/1/14 笔记 OSPF开放式最短路径优先协议
    一.距离矢量型协议:运行距离矢量路由协议的路由器周期性的泛洪自己的路由表。通过路由的交互,每台路由器都从相邻的路由器学习到路由,并且加载于自己的路由表中;但是对于网络中的所有路由器而言,路由器并不清楚网络的结构,只能简单的知道要去往某个地方方向在哪里,距离是多远。这既是......
  • 高等数学学习笔记 ☞ 不定积分的积分法
    1. 第一换元积分法1.基础概念:形如的过程,称为第一换元积分法。2.核心思想:通过对被积函数的观察(把被积函数的形式与积分表的积分公式进行比较),把外部的部分项拿到的内部(求原函数),           然后进行拼凑,把拼凑的部分看成一个整体,最后利用积分表......
  • 高等数学学习笔记 ☞ 不定积分与积分公式
    1. 不定积分的定义1.原函数与导函数的定义:  若函数可导,且,则称函数是函数的一个原函数,函数是函数的导函数。备注:①:若函数是连续的,则函数一定存在原函数,反之不对。②:因为,所以说函数是函数的一个原函数。③:根据定义,假设的原函数分别为,,则有,,    根据,可得(为......
  • 《CPython Internals》阅读笔记:p177-p220
    《CPythonInternals》学习第11天,p177-p220总结,总计44页。一、技术总结1.memoryallocationinC(1)staticmemeoryallocationMemoryrequirementsarecalculatedatcompiletimeandallocatedbytheexecutablewhenitstarts.(2)automaticmemeoryallocation......
  • juju的MarkDown学习笔记
    juju的MarkDown学习笔记Part1:标题一个井号+空格为一级标题两个井号+空格为二级标题n个井号+空格为n级标题(最多6级)Part2:字体加粗:前后各有两个星号斜体:前后各有一个星号斜体又加粗:前后各有三个星号删除:前后各有两个波浪号Part3:引用一个向右的箭头,就可以表示引用了......
  • 学习进度笔记⑩
    Tensorflow线性回归源代码:importtensorflowastfimportnumpyasnpimportmatplotlib.pyplotaspltimportosos.environ["CUDA_VISIBLE_DEVICES"]="0"#设置训练参数,learning_rate=0.01,training_epochs=1000,display_step=50learning_rate=0.01training_epo......
  • 学习进度笔记⑨
    tensorflow基本操作(类似numpy)源代码importtensorflowastfimportosos.environ["CUDA_VISIBLE_DEVICES"]="0"#构造计算图,创建两个常量节点a,b,值分别为2,3a=tf.constant(2)b=tf.constant(3)#创建一个Session会话对象,调用run方法,运行计算图。withtf.Session()assess:......