Baby Step Giant Step 初步

Baby Step Giant Step(BSGS) 低于线性时间复杂度的离散对数算法 转载请注明 目录 1.离散对数问题 2.BSGS介绍 3.必要的理论知识 3.1费马小定理 3.2第一个引理 3.3同余式有解的充要条件 3.4第二个引理 4.BSGS算法的具体内容 4.1 满足(a,c) = 1 4.1.1解的形式和通解 4.1.2具体内容 4.2不满足(a,c) = 1 4.2.1变形 4.2.2如法炮制 ... 阅读详情

引入

对于 a , b , m ∈ N , gcd ⁡ ( a , m ) = 1 a,b,m\in\N,\gcd(a,m)=1 a,b,m∈N,gcd(a,m)=1 求解指数同余方程
a x ≡ b ( m o d m ) a^x\equiv b\pmod m ax≡b(modm)
的最小正数解。


BSGS (Baby step Giant step)

我们考虑余数是存在循环节的,也就是说某个数   m o d   m \bmod m modm 只有 [ 0 , m − 1 ] [0,m-1] [0,m−1] 个取值,于是我们尝试寻找 a x   m o d   m a^x\bmod m axmodm 的循环节。
由欧拉定理可知 a φ ( m ) ≡ 1 ( m o d m ) a^{\varphi(m)}\equiv 1\pmod m aφ(m)≡1(modm) ,因此有 a x   m o d   m a^x\bmod m axmodm 的取值只有 φ ( m ) \varphi(m) φ(m) 种,一旦 x x x 大于 φ ( m ) \varphi(m) φ(m),那么就会与之前的值重复,答案不是最优。这个想法也可以从欧拉定理的推论 a b   m o d   φ ( m ) ≡ a b ( m o d m ) a^{b\bmod \varphi(m)}\equiv a^b\pmod m abmodφ(m)≡ab(modm) 得到,万变不离其宗。
于是有暴力思想,枚举 [ 1 , φ ( m ) ] [1,\varphi(m)] [1,φ(m)] 的数作为 x x x 的值,暴力判断是否满足方程。但是当 m ≥ 1 0 8 m\ge 10^8 m≥108 且为质数时, φ ( m ) = m − 1 ≥ 1 0 8 \varphi(m)=m-1\ge 10^8 φ(m)=m−1≥108 ,该思路任然会超时。

于是我们就引入了“优化暴力”的 B a b y   s t e p   G i a n t   s t e p Baby~step~Giant~step Baby step Giant step 算法,简称 B S G S \mathbf{BSGS} BSGS

考虑 gcd ⁡ ( a , m ) = 1 \gcd(a,m)=1 gcd(a,m)=1,因此我们可以对同余式进行整除运算(裴蜀定理可得吧,这里就不赘述了),即可以将 x x x 表示为 x = i ⋅ t − j x=i\cdot t-j x=i⋅t−j,我们设 t = ⌈ m ⌉ t=\left\lceil\sqrt m\right\rceil t=⌈m ​⌉。
于是原方程变为
a i ⋅ t − j ≡ b ( m o d m )   a i ⋅ t a j ≡ b ( m o d m )   a i ⋅ t ≡ b ⋅ a j ( m o d m )   ( a t ) i ≡ b ⋅ a j ( m o d m ) a^{i\cdot t-j}\equiv b\pmod m\\ ~\\ \dfrac{a^{i\cdot t}}{a^j}\equiv b\pmod m\\ ~\\ a^{i\cdot t}\equiv b\cdot a^j\pmod m\\ ~\\ (a^t)^i\equiv b\cdot a^j\pmod m ai⋅t−j≡b(modm) ajai⋅t​≡b(modm) ai⋅t≡b⋅aj(modm) (at)i≡b⋅aj(modm)

此时我们将原方程的 x x x 分块来枚举,就可以均摊复杂度。
我们先枚举方程右边的 j j j ,然后将 j j j 取值,按照右边的余数对应存进一个 h a s h hash hash 表里(说是这么说,但是我还是常用 m a p map map 或 u n o r d e r e d unordered unordered_ m a p map map ),然后同理枚举方程左边的 i i i ,查找是否有 j j j 与 i i i 方程两边余数匹配,即同余(这时候就用上先前的 h a s h hash hash 表来查找),若匹配则直接得到答案 x = i ⋅ t − j x=i\cdot t-j x=i⋅t−j。

当 i , j i,j i,j 取 [ 1 , t ] [1,t] [1,t] 的值时,我们可以得到所有 x ∈ [ 1 , m − 1 ] x\in[1,m-1] x∈[1,m−1] 的解,显然符合先前所得的答案范围 [ 1 , φ ( m ) ] [1,\varphi(m)] [1,φ(m)] 。
但是这个算法是可以通过的,时间为 Θ ( m ) \Theta(\sqrt m) Θ(m ​) 。
此算法与原先纯暴力最大的不同,就是我们将枚举进行了分块,将枚举范围分为了两部分,各为 m \sqrt m m ​,这种思想有点像折半搜索(砍两瓣,分开搜索),将暴力复杂度拆开了。

这就是 B S G S \mathbf{BSGS} BSGS ,也就是一种优化了的暴力算法。

回忆一下思路,其实也很清晰,就是把答案分成两部分分别枚举然后对应查找,于是代码也很好实现。

int BSGS(int a,int b,long long p)
{
   map<int,int> vis;
   int t=sqrt(p)+1,mi=1;
   for(int i=1;i<=t;i++)
   {
       if(i!=0) mi=(__int128)(mi*a)%p;
       vis[(__int128)(b*mi)%p]=i;
   }
   a=mi;
   if(!a) return (b%p==0)?1:-1; //特判,若a能被模数整除,那么当且仅当b也能被模数整除的情况下存在最小正数解 1,否则无解
   mi=1;
   for(int i=1;i<=t;i++)
   {
     map<int,int>::iterator it;
     if(i!=0) mi=(__int128)(mi*a)%p;  //暴力求余
     it=vis.find(mi);  //查找对应
     if(it!=vis.end())
       if((__int128)i*t-(it->second)>=0) return (__int128)(i*t-(it->second));
   }
   return -1;
}

总结

回过头来, B S G S \mathbf{BSGS} BSGS 真的不难理解,其实只要思路正确,暴力都能成为好算法。

奉上例题:

P4884
P2485
P4861
P4454
P3306

STM32L051低功耗模式下LPUART的使用 STM32L0系列低功耗UART配置代码清单及注释,大家可参考学习使用。 阅读详情

相关推荐

扣子(coze)实战|手把手教你搭建AI换装自动化工作流

摘要:本文介绍了使用Coze平台搭建AI换装工作流的详细教程。工作流包含模特图片上传、服装替换、任务提交和智能轮询等模块,通过change_model插件实现异步换装处理,并内置30秒循环查询机制。该工具支持自定义API密钥对接不同AI服务商,目前已上线共享空间并提供会员服务(59.8元/年)和VIP课程(499元/年),包含100+智能体和实战案例资源。完整体验地址见文中链接。

yueyehuguang的博客 1843

Baby-Step Giant-Step & Homomorphic DFT

文章 [Shoup95] 研究并实现了 BSGS factoring method,用于将单变元多项式分解为不可约因子。其中使用了 CRT 和 FFT 来表示多项式(比 GHS12 的 Doube-CRT 更早) ,并且实现了多项式的快速乘法、除法、逆元、平方、GCD 等等运算。多项式分解可以分为三步,主要步骤集中在 step 2,[Shoup95] 观察到事实:对于任意的非负整数 a,b∈Z+a,b \in \mathbb Z^+a,b∈Z+,多项式 ha,b(x)=xpa−xpb∈GF(p)[

weixin_44885334的博客 1487

告别ROS1思维:在ROS2 Humble上,用Python搞定MoveIt2机械臂控制的完整流程

本文详细介绍了在ROS2 Humble环境下使用Python控制MoveIt2机械臂的完整流程。从环境配置、架构变革到实战操作,涵盖URDF适配、Action接口编程及性能优化技巧,帮助开发者高效迁移ROS1项目至ROS2平台,实现工业级机械臂控制。

weixin_30352645的博客 449

每日小结2 baby-step_giant_step

维基百科:baby-step_giant_step名字已经暗示了算法的精髓。感觉和桶计数很像。就是把小单位合并。用大单位和小单位一起精确查找。和杭州网络赛的中值滤波很像呀。an==b(mod c)  给定你n的范围。可能很大。但是由数论的知识知道n简单论述一下啊:{an},n~1,2,3... 可以看成a的生成群。其实也不是严格的。严格的a必须与c互质才行。因为不互质的话,a是没有逆元的。再次对上句话进行证明。(ps:为啥我老是证明呢。因为我刚学。很多东西都不能像加减乘除那样一眼看出来。还有可能是反应慢吧。

coder notebook 909

MTK平台TP驱动设备树与GPIO配置实战解析

本文详细解析了MTK平台TP驱动开发中的设备树与GPIO配置实战。通过DCT工具配置GPIO引脚,结合设备树节点定义触摸参数,并分享驱动移植、编译调试技巧及常见问题解决方案,帮助开发者快速掌握MTK触摸驱动开发核心。

ice55的博客 234

保姆级教程:用STM32CubeMX HAL库搞定ESP8266连接,附串口printf调试全流程

本文提供了一份详细的STM32CubeMX HAL库教程,指导开发者如何实现ESP8266无线模块的连接与调试。从开发环境搭建、串口配置到AT指令通信解析,涵盖了物联网开发中的关键步骤和常见问题解决方案,帮助开发者快速掌握STM32与ESP8266的集成技术。

weixin_28273593的博客 504

POJ 2417 Discrete Logging (baby_step,giant_step算法)

转载请注明出处,谢谢 http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents           by---cxlove 题目:http://poj.org/problem?id=2417 高次同余方程。   BL == N (mod P) 求解最小的L。由于数据范围很大,暴力不行 这里用到baby_step,giant_step算法。意

窝不是爱酱,喵~~~~ 6719

医疗影像分析实战:肺炎X光片分类与分割

医疗影像分析实战:肺炎X光片分类与分割 ,人工智能,计算机视觉,大模型,AI,在医疗领域,医疗影像分析技术凭借其高效、精准的特点,成为疾病诊断与治疗的重要辅助手段。肺炎作为一种常见的呼吸道疾病,严重威胁人类健康,通过 X 光片对肺炎进行诊断是临床常用方法。利用计算机技术实现肺炎 X 光片的自动分类与分割,不仅能减轻医生的工作负担,还能提高诊断的准确性和效率。本文将深入讲解肺炎 X 光片分类与分割的实战过程,结合大量代码示例和关键概念解析,帮助读者掌握相关技术。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 3万+

离散对数学习:baby_step_giant_step与ex_baby_step_giant_step算法

对于问题 b ^ x == N % mod 的问题,知道b,N,mod,求最小指数 x; 思路: 令x = i * m + j,m为ceil(sqrt(double(mod))); 那么的话等式为 b ^ j == N * b ^ ( - m * i) % mod,要求x,那么就是把满足这个方程的 i , j 求出来,i,j的范围为m = ceil(sqrt(double(mod)))

Everything can be done! 869

Unity实战篇 | 教你怎样将Unity的启动Logo 设置成 自己制作的 帧动画

上一篇文章我们讲了怎样在不购买专业版的情况下自定义Unity的启动Logo。 那本篇文章就来介绍一下,怎样在去除默认Logo的前提下制作自己的启动动画!

努力前行,总会成为自己心中的那道光 6万+

学习STM32的DS18B20温度传感器

该函数首先复位传感器,然后发送跳过ROM命令和转换命令,并等待转换完成。接下来,它再次复位传感器,发送跳过ROM命令和读取温度命令。最后,它读取温度值的最低字节和最高字节,并将其组合成16位温度值。传感器的VCC引脚连接到STM32的3.3V电源,GND引脚连接到GND,而数据引脚连接到任何一个IO引脚。需要注意的是,示例代码中使用了一个简单的延时函数来等待转换完成。实际上,您可能需要使用定时器或其他更精确的延时方法来实现更准确的延时。下面是一个示例代码,演示如何读取DS18B20传感器的温度值。

m0_75244442的博客 1182

pku3243(baby_step, giant_step算法)

<br />http://162.105.81.212/JudgeOnline/problem?id=3243<br />题意:给定XY mod Z = K已知X, Z, K 求最小的Y值,这题和pku2417差不多,都是用这个算法的,但是我差了很多资料,理解还不是很好啊,今天看了AC大牛的解题报告,学习了他的写法,,膜拜下~~~上面写的很清楚,但是俺菜还是不够理解啊~<br />http://hi.baidu.com/aekdycoin/blog/item/b317ca18bb24334942a9ad55

弓虽子 1754

SAP CPI 如何代理第三方接口?

代理接口是指在系统 A 和系统 B 之间引入一个中间层(如 SAP CPI),由中间层负责接收来自系统 A 的请求,进行必要的处理或转换,然后将请求转发给系统 B。由于 OData 服务通常使用 JSON 格式的数据,而某些内部系统可能需要 XML 格式,因此我们添加一个 JSON 到 XML 的转换器,以确保数据格式的兼容性。为了确保返回的数据格式符合内部系统的要求,添加一个 XML 到 JSON 的转换器,将 OData 服务的响应从 XML 转换为 JSON。在集成包中,添加一个新的集成流,命名为。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1748

Baby-step Giant-step and its extension

from wikipedia In group theory, a branch of mathematics, the baby-step giant-step is a meet-in-the-middle algorithm for computing the discrete logarithm or order of an element in a finite abelian group due to Daniel Shanks. The discrete log problem is of

Layomiiety的博客 452

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Baby-Step Giant-Step算法

求解上式,0<=x<n的解,其中n是素数和n不是素数都可以。 求解思路: 令x=k*t+i(t是常数,代表的是大步,i也是常数,代表的是小步),式子变为: 化简后得到: 将(,i)存入表中,然后枚举k,在表中查找即可。 时间复杂度为O(n+p/n),如果取n=sqrt(p)的时候,时间复杂度为O(sqrt(p)) POJ2417Discrete Lo...

zdyyzdyy123的博客 472

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Baby-step giant-step算法

写在前面:   学习笔记,方便复习,学习资料来自网络,注明出处 我们都在努力奔跑,我们都是追梦人 结论   Ingroup theory, a branch of mathematics, thebaby-step giant-stepis ameet-in-the-middlealgorithmfor computing thediscr...

413

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Baby_Step_Giant_Step

Baby_Step_Giant_Step //求解的是a^x = b(mod c)的最小x解 struct node { int num; int val; } baby[maxn]; bool cmp(node a, node b) { if (a.val != b.val) return a.val < b.val; return a.num < b.num

acm2016 482

【数学】Baby Step,Giant Step

给定整数 a,b,pa,b,pa,b,p 且 a,pa,pa,p 互质,请求出高次同余方程 ax≡b(modp)a^x\equiv b\pmod pax≡b(modp) 的非负整数解. 首先, a0≡1(modp)a^0\equiv 1\pmod pa0≡1(modp) 又由欧拉定理知 aφ(p)≡1(modp)a^{\varphi(p)}\equiv 1\pmod paφ(p)≡1(modp) 所以出现了周期. 所以 xxx 在区间 [0,φ(p))[0,\varphi(p))[0,φ(p)) 中一定有,

mango09の世界 268

poj2417(Discrete Logging)-Baby Step Giant Step

题目链接:Discrete Logging 题意: ,给你P(P为素数),B,N,让你求满足条件的最小的L,无解输出 no solution. 思路: ,求满足条件的最小x,若p为素数,可用Baby Step Giant Step算法 令m = sqrt(n), 则,先预处理出,存入haxi(hash)表里, ,,枚举i,看a^j是否在hash表中,如果找到了,就输

Coder__Yang的博客 418

高次同余方程(Baby-Step Giant-Step)

Discrete LogarithmProblem  网页链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=121425#problem/D 传送门:nefu 题目描述: 题目大意: 模板题,a^x=b(mod p) p为素数和不是素数都可以 代码实现: #include #include #

而濡木染 812

hdu——2815(数论之Baby Step Giant Step解决离散对数问题)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2815 可借鉴地址:http://blog.youkuaiyun.com/acm_cxlove/article/details/7832197 小结:可以说的上是个模板题。 #include #include #include #include #include #include using na

luoshenzhisi 1318

POJ-2417 Baby-Step Giant-Step

Description Given a prime P, 2 <= P < 2 ^ 31, an integer B, 2 <= B < P, and an integer N, 1 <= N < P, compute the discrete logarithm of N, base B, modulo P. That is, find an integer ...

刷题记录 282

poj2417(Baby-Step Giant-Step)

题目链接:http://poj.org/problem?id=2417 题意:求满足给出 P, N, B, 求满足条件 BL == N (mod P) 的最小 L, 若不存在则输出 no solution. 思路:Baby-Step Giant-Step 算法 设 L = kt − m,其中 t = ⌊sqrt(L)⌋, 0 <= m < t.那么 B^L = N (...

weixin_30352191的博客 192

POJ 2417 Discrete Logging (Baby Step Giant Step算法)

题目:LINK

Napoleon 972

P2485 [SDOI2011] 费马小定理 + Baby Step, Giant Step

题意 传送门 P2485 [SDOI2011]计算器 题解 ppp 为质数,若 y,py,py,p 不互质,那么有 p∣yp|yp∣y,特判此类情况。之后讨论 y,py,py,p 互质的情况。 考虑任务一,计算 yzmod  py^z\mod pyzmodp,快速幂求解即可。 考虑任务二,计算满足 xy≡zmod  pxy\equiv z\mod pxy≡zmodp 的最小非负整数 xxx。由于 y,py,py,p 互质,则 yyy 存在模 ppp 意义下的逆元,根据费马小定理,y−1=yp−2mod  p

neweryyy的博客 121

Baby-step Giant-step 算法详解

离散对数问题是现代密码学的基石之一,它可以描述为:给定素数 p、生成元 g 和 y,求整数 x 使得 g^x≡y(modp)这个问题被认为是计算困难的,但当群的阶较小时,我们可以用算法高效求解。Baby-step Giant-step是求解离散对数的经典算法,在CTF中经常出现。掌握它不仅能解决基础题,还能理解更复杂的攻击如Pohlig-Hellman和Pollard's ρ算法。j%7D。

wangzihan6726的博客 209
上一篇: 整除分块入门
下一篇: SP2901 GEOPROB - One Geometry Problem 题解
.SAI.
博客等级 码龄5年 835粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值