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)的最小非负整数解。可能无解。

       a与c互质,根据欧拉定理有aφ(c)≡1(mod c),如果有解就一定在0 到φ(c)-1内,否则无解,根据这样的定理即使这样,直接从小到大枚举x会超时。
       Baby step giant step算法步骤和要点如下:
  1. 把0到c-1按m= (上取整)分块
  2. 把a0,a1,...,ammod c的值存到hash表中(或者存起来排好序)
  3. 如果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的值只有一个
  4. 接着在hash表中(或有序数组中二分)找出最小的j使得aj mod c=v,如果找到则答案为i*m+j否则无解。

          

  三、复杂度

        时间复杂度为O(clogc),对于求极大数时耗费时间相比暴力更少。

四、问题

  

 五、模板

  

六、例题

1.可爱的质数

题目链接:[TJOI2007] 可爱的质数/【模板】BSGS - 洛谷

解题思路:直接套用上面模板即可。

  

 

  2.计算器
     题目链接:[SDOI2011]计算器 - 洛谷
   

  

 

 3.随机数生成

       题目链接:[SDOI2013] 随机数生成器 - 洛谷

   

  

 

 

 


参考: 1.百度百科

           2.https://baike.baidu.com/reference/53148168/3de8c0gTIgD9YBuJj-csy_oeuGCS96OdoTwu6ohNO3Jt-5vxthW8R-2UiDDNuEFX98K9KVl4x9bQZ9-NqSe1vJdWvtEF4SyTVQ

           3.https://blog.csdn.net/qq_58207591/article/details/123954286

         

 

posted @   ddfy198811  阅读(96)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示