Baby-step giant-step

转自:http://qinz.maybe.im/?p=50398

不知道为什么这算法会有这么诡异的名字,比“舞蹈链”(Dancing link)还诡异。但话说回来,这算法确实是我数论学习上的Baby-step giant-step,另外发现自己似乎很久没写月志了,就写篇纪念下吧~(其实算是Wikipedia上这篇文章的简单翻译-_-b)


定理的条件:m为质数  

众所周知,a^b \equiv c \pmod m,其中m为质数,式中已知a、b、m求c很方便,用快速模取幕可以在O(\log_2 m)的时间复杂度求出来。但如果已知a、c、m求b就不是那么容易求了,简单地枚举需要O(m)的时间,但在竞赛中这时间复杂度基本不可能通过。而Baby-step giant-step算法利用b=in+j \,,n=\lceil \sqrt{m} \rceil \,,0 \leq i < m \,,0 \leq j < ma^b \equiv c \pmod m转化为c(a^{-n})^i \equiv a^j \pmod m,利用Hash(或者二分查找)很强势地使时间复杂度降到了O(\sqrt m),这种时间复杂度下对于m<2^{32}的数据范围来说是绰绰有余的。下面就来介绍下这种神奇又简单的算法(如果m是个合数的话还有一种更快的算法叫Pohlig-Hellman algorithm,大致思路是把合数分解再用中国剩余定理合并起来,本文不作讨论):

  1. 令n=ceil(\sqrt m)
  2. for j=0 to n-1
      计算出每一对(j,a^j)保存在Hash表里
  3. 计算出am满足a^{-n} \equiv am \pmod m
  4. t=c
  5. for i=0 to n-1
      检查t是否在Hash表里,如果在就返回i*n+j,如果不在t=t*am
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值