当前位置: 首页 > news >正文

浅谈 BSGS(Baby-Step Giant-Step 大步小步)算法

BSGS(Baby-Step Giant-Step)算法是 Shank 发明的一个用于在 O(p)\mathcal O(\sqrt p)O(p) 时间复杂度内计算离散对数的算法,要求模数为质数。扩展 BSGS 不需要模数为质数。

何为离散对数?普通的对数 log⁡ab=c\log_ab=clogab=c 相当于求一个 ccc 满足 ac=ba^c=bac=b。而离散对数就是如题目所说,给定 p,b,np,b,np,b,n,求 bl≡n(modp)b^l\equiv n\pmod pbln(modp)

首先显然如果 lll 存在则必然存在 l<pl<pl<p,因为 bp−1≡1(modp)b^{p-1}\equiv 1\pmod pbp11(modp),如果你还不知道费马小定理请离开,你现在不应该看这篇文章。

考虑一个显然的暴力做法:依次检查。虽然是暴力,但是我们不至于傻到每求一个 blb^lbl 都跑一次快速幂1,显然是可以递推的。

BSGS 则利用了幂运算的性质 ab×ac=ab+ca^b\times a^c=a^{b+c}ab×ac=ab+c(在模意义下显然也成立),使用类似分块的做法,做到了根号级别的时间复杂度。

首先我们暴力求出当 l≤pl\le \sqrt{p}lp 时的所有余数,如果有 nnn 则可以直接返回答案。否则,我们可以相应地求出 p<l≤2p\sqrt{p}<l\le 2\sqrt{p}p<l2p 时的答案,然后判断。以此类推。

看上去并没有什么作用,但是实际上,如果 bl+p≡n(modp)b^{l+\sqrt{p}}\equiv n\pmod pbl+pn(modp),那么 bl≡n×(bp)−1(modp)b^{l}\equiv n\times(b^{\sqrt{p}})^{-1}\pmod pbln×(bp)1(modp)。同时 b−pb^{-\sqrt p}bp 也是一个常数可以预处理,我们就可以利用我们求的所有当 l≤pl\le \sqrt plp 时的余数快速判断了(把 l≤pl\le \sqrt plp 的所有余数存到一个 set 或者哈希表 unordered_set 或者其它奇奇怪怪的数据结构中)。

进一步地,如果 bl+kp≡n(modp)b^{l+k\sqrt p}\equiv n\pmod pbl+kpn(modp),则 bl≡n×(b−p)k(modp)b^l\equiv n\times (b^{-\sqrt p})^k\pmod pbln×(bp)k(modp)。所以我们就得到了总时间复杂度为 O(n)\mathcal O(\sqrt n)O(n) 的计算离散对数的做法。

我们上面都假设 p\sqrt pp 是整数,实际上不可能是,但是我们取 p\sqrt pp 在正确性上并没有什么实际意义,只是为了保证时间复杂度,所以取 ⌊p⌋\lfloor \sqrt p \rfloorp⌈p⌉\lceil \sqrt p \rceilp 也行。

注意本题不仅仅要判断存在性,还要输出解。所以我们不能只保存余数,还要保存下标。

附上丑陋的代码。

#include <cstdio>
#include <unordered_map>using namespace std;unordered_map<int, int> um;long long qpow(int x, int y, int p)
{if(y == 0) return 1;if(y == 1) return x;long long r = qpow(x, y >> 1, p);r = r * r % p;if(y & 1) r = r * x % p;return r;
}int main()
{int p, b, n;scanf("%d%d%d", &p, &b, &n);int sqrtp = 0;long long mul = 1;// 0 ~ sqrtpfor(int i=0;1ll*i*i<=p;i++){sqrtp = i;if(!um.count(mul = (i == 0 ? 1 : mul * b % p))) um[mul] = i;if(mul == n){printf("%d\n", i);return 0;}}sqrtp++; mul = mul * b % p;long long invmul = qpow(mul, p - 2, p), mulll = 1;// i*sqrtp ~ (i+1)*sqrtp-1for(int i=1;1ll*sqrtp*i<=p;i++){if(um.count((mulll = mulll * invmul % p) * n % p)){printf("%d\n", um[mulll * n % p] + sqrtp * i);return 0;}}printf("no solution\n");return 0;
}

record。


  1. 倒是有一种底数确定的 O(n)\mathcal O(\sqrt n)O(n) 预处理,Θ(1)\Theta(1)Θ(1) 查询的光速幂算法。核心思想和 BSGS 十分相似——预处理出 1≤i≤p1\le i\le \sqrt p1ipaia^iaiai×⌊p⌋a^{i\times \lfloor \sqrt p\rfloor}ai×p,然后用这两个凑出答案。用这个的话也不会劣化我们的暴力时间复杂度,毕竟是常数时间查询的。 ↩︎

http://www.dtcms.com/a/550899.html

相关文章:

  • 大石网站建设做ppt找图片在哪个网站好
  • 在线简历制作网站免费做网站赚钱难
  • 【数字逻辑】24小时数字钟实战!74HC161搭24/60进制计数器+Multisim仿真
  • 架构师论文《论分布式缓存的设计与实现》
  • 网站建设模板51戴尔网站建设
  • jsp电影网站开发教程阿里云中英文网站建设
  • 网站开发开票税率北京谁会做网站开发
  • 台州网站制作建设宁波seo关键词优化设计
  • wordpress设置网站关键字wordpress口腔
  • 做网站要多少回扣郑州正岩建设集团网站
  • 番禺区建站服务商柳州论坛网站建设
  • Rust 派生宏 (Derive Macro) 的动力、机制与哲学
  • 怎么做购物网站的购物车wordpress one page
  • 制作网站团队服务器如何建设多个网站
  • Microchip MPLAB AI助手体验
  • 做问卷的网站好烟台网站建设seo
  • wordpress仿模板完整的网站优化放啊
  • gbase8s的定时任务的使用方式基础版-创建简单的定时任务
  • 8款主流软件项目管理工具横向测评
  • 江西求做网站网站企业有哪些
  • 手机app与手机网站的区别wordpress设置内容标题
  • 手机网站的推广现代企业信息管理系统
  • 核货宝S2B2C系统核心优势:赋能B端,服务C端,驱动增长
  • Java 黑马程序员学习笔记(进阶篇22)
  • 网页制作用哪个软件宁波seo的公司联系方式
  • 如何理解不同行业AI决策系统的功能差异?
  • 长沙英文网站建设公司郑州大型网站公司
  • 建设部网站村镇建设口碑营销的产品
  • 网站建设网站模版广东省建设工程交易中心
  • 深圳网站建设培训班本科自考有哪些科目