Baby-Step-Giant-Step及扩展算法
引入
来看这样一个数论问题:给定一个质数p,以及正整数a,b,求满足同余方程 ax ≡ b(mod p) 的最小非负整数x,无满足的x则输出-1。
如果只是简单的枚举x,那么要想得出结论,由于循环节最大为p-1,就需要枚举0~p-1去验证答案,当 p 的数量级达到109 时,这种枚举显然不能满足算法时间复杂度的需求了。
因此就需要用到接下来要介绍的 BSGS 算法。
一、定义
求一种特殊同余方程,Ax≡B(mod C)的最小整数解,其中A、C互质的一种算法。
二、原理
给定a,b,c,a与c互质,求解ax≡b(mod c)的最小非负整数解。可能无解。
-
把0到c-1按m= (上取整)分块
-
把a0,a1,...,ammod c的值存到hash表中(或者存起来排好序)
-
如果x有解,x一定可以表示成i*m+j(0≤i,j≤m-1),从小到大枚举i,ai*m+j=(am)i*aj,(am)i的值易求,(am)i*aj≡b(mod c)中aj mod c的值v可以用扩展欧几里得来求,也可以根据欧拉定理得v=aφ(c)-i*m*b mod c,因为a与c互质,v的值只有一个
-
接着在hash表中(或有序数组中二分)找出最小的j使得aj mod c=v,如果找到则答案为i*m+j否则无解。
三、复杂度
时间复杂度为O(clogc),对于求极大数时耗费时间相比暴力更少。
四、问题
五、模板
六、例题
1.可爱的质数
题目链接:[TJOI2007] 可爱的质数/【模板】BSGS - 洛谷
解题思路:直接套用上面模板即可。
2.计算器
题目链接:[SDOI2011]计算器 - 洛谷
3.随机数生成器
参考: 1.百度百科
2.https://baike.baidu.com/reference/53148168/3de8c0gTIgD9YBuJj-csy_oeuGCS96OdoTwu6ohNO3Jt-5vxthW8R-2UiDDNuEFX98K9KVl4x9bQZ9-NqSe1vJdWvtEF4SyTVQ
3.https://blog.csdn.net/qq_58207591/article/details/123954286
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具