最新要闻
- 前沿资讯!2023年了 游戏还在背锅
- 第一款8K显示器发售6年:居然没人接班了
- 天天快资讯:丈夫称老家有别墅 女子回村直呼上当:网友调侃诚不欺我 真纯天然
- 被中国游客狠狠抛弃:韩国人口连续三年减少 女多男少拉不动内需
- 环球播报:便宜了2.5元 2023年春节档电影票价格7年来首次下降:你愿意去看吗?
- 合资家轿之王!新款日产轩逸e-POWER曝光:百公里仅需4升油
- 今热点:一箭14星成功升空 卫星首图回传:路面汽车清晰可见
- 皮俑是什么做成的?皮俑为什么救吴邪?
- 擅长画虎的画家是?擅长画虎的十大画家
- 神奇宝贝的观看顺序是什么?神奇宝贝的大结局是什么?
- 用上半固态电池!赛力斯发布海外新车型SERES 5:订单超2万
- 国产骄傲!中国年度十大畅销新能源车型:外资仅有特斯拉上榜
- 每日播报!游客滑雪失控致女生被撞倒后抽搐 医生:危险数极高、常见骨折
- 拿老款忽悠当新款卖 女车主退车被日系4S店老板辱骂
- 风调雨顺的意思是什么?风调雨顺的下联是什么?
- 小年为什么分南方和北方?小年为什么吃麻糖?
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
算法学习笔记(10): BSGS算法及其扩展算法
BSGS算法及其扩展算法
BSGS算法
所谓 Baby Step, Giant Step
算法,也就是暴力算法的优化
(资料图)
用于求出已知 \(a, b, p\), 且 \(p\) 为质数 时 \(a^x \equiv b \pmod p\) 的一个最小正整数解 \(x\)
下文中 \(a \perp p\) 指的是 \(a, p\) 互质
有两种情况:
\(a, p\) 不互质,又由于 \(p\) 是质数,意味着 \(a\) 是 \(p\) 的倍数,所以 \(b\) 如果不为 \(0\) ,那么一定无解
两者互质……即 \(a \perp p\) :
考虑到 \(a \perp p\) 意味着 \(a\) 在 \(p\) 的完全剩余系中,也就是说 \(f(x) = a^x \pmod p\) 是一个周期为 || (……就是 \(a\) 在模 \(p\) 意义下的生成子群的大小) 的周期函数
实际上我们不会算出其周期的具体大小,我们只需要利用 || 恒 \(\le p\) 就行了
那么我们只需要枚举 \(x \in [0, p)\) 依次验证就可以求解了
但是暴力枚举没有那么优秀,对于出题人的数据可能过不了
所以我们就可以采用把毒瘤出题人吊起来打的方法BSGS算法进行优化
BSGS算法采用分块的思想 (分块?块大小就 \(\sqrt p\) 不就就行了吗,有什么好疑惑的?
假设块大小为 \(t\)
先参入 \(t\) 改写一下式子 \(a^x \equiv b \pmod p\)
得到 \(a^{it-j} \equiv b \pmod p\)
由于 \(a \perp p\) ,上述式子等价于 \(a^{it} \equiv (a^t)^i \equiv b a^j \pmod p\)
那么我们先预处理右式,枚举 \(j \in [0, t)\) 把 \(ba^j \mod p\) 插入到一个Hash表中
也就是说 \(HashMap: \quad ba^j\ mod\ p \Rightarrow j\)
那么枚举 \(i \in [0, \lceil \frac pt \rceil]\) 计算出 \(a^{it} \mod p\) ,查找是否有对应的 \(j\),更新答案即可
时间复杂度为 \(O(t + \lceil \frac pt \rceil)\)
为了进一步优化时间复杂度,已知均值不等式 \(a + b \ge 2\sqrt{ab}\),当且仅当 \(a=b\) 时等号成立,所以我们令 \(t = \lceil \sqrt p \rceil\),那么时间复杂度就简化为了 \(O(\sqrt p)\)
常数为 \(2\) 可能还需要带一个 \(log\) ? QwQ
参考代码如下:仅供参考
templatedata BSGS(data a, data b, data p) { b %= p; static std::map hash; hash.clear(); data t = std::ceil(std::sqrt(p)), v(1), j(0); for (; j < t; ++j) { // 此时 v = a^j % p hash[v * b % p] = j; v = v * a % p; } // 把 a 预处理成 a^t, 这样 (a^t)^i 就可以更快的算出了 a = qpow(a, t, p), v = 1; // 如果此时 a 已经为 0 了,由于 t < p, p为质数所以 p|a (a为p的倍数) // 那么此时,如果 b 不为 0 则一定无解 if (a == 0) return b == 0 ? 1 : -1; for (data s(0); s <= t; ++s) { // 此时 v = (a^t)^s j = hash.find(v) == hash.end() ? -1 : hash[v]; if (~j && s * t >= j) return s * t - j; v = v * a % p; } return -1;}
扩展BSGS算法 (exBSGS)
其实问题一摸一样,只是 \(p\) 不为质数了,也就是说其中 \(a, p\) 不一定互质
那么我们需要想办法使之变得互质,然后通过普通的 BSGS
算法求解
具体的,令 \(d_1 = gcd(a, p)\),如果 \(d_1 \nmid b\) 则原方程无解
这个我们可以将同余式转换:\(s a^x + tp = b\)
左式再转化为 \(d_1 (s a^{x-1} \frac a{d_1} + t \frac p {d_1}) = b\)
也就是说,如果 \(d_1 \nmid b\) ,那么一定无整数解
那么上述式子就可以转化为 \(sa^{x-1} \frac a{d_1} + t \frac p {d_1} = \frac b {d_1}\)
再换成同余式子,就变为了 \(\frac a {d_1}\cdot a^{x-1} \equiv \frac b {d_1} \pmod {\frac p {d_1}}\)
如果此时 \(a\) 与 \(\frac p {d_1}\) 任然不互质,那么继续上述转化,令\(d_2 = gcd(a, \frac p {d_1})\)
则 \(\frac a {d_1 d_2} \cdot a^{x-2} \equiv \frac b {d_1 d_2} \pmod {\frac p {d_1 d_2}}\)
同理不断处理,直到 \(a \perp \frac p {d_1 d_2 \dots d_k}\)
我们记 \(D = \prod_{i = 1}^k d_i\)
那么最终的方程就是 \(\frac {a^k} {D} \cdot a^{x-k} \equiv \frac bD \pmod {\frac pD}\)
这样,我们把 \(\frac {a^k}D\) 通过逆元丢到方程右边,就成为了一个普通的 BSGS
问题了
注意一个细节,不排除解小于等于 \(k\) 的情况,所以在消去 \(d_i\) 的时候还要判断一下 \(a^i \equiv b \pmod p\) 是否可行
还有一些细节问题我会放在代码之后解释
参考代码:仅供参考
// inv(i) i \equiv 1 mod p// i * inv(i) + kp = 1 (kown i, p, 1)templateT inv(T i, T p) { T iv, k; exgcd(i, p, &iv, &k); iv %= p; // 注意点4 return iv < 0 ? iv + p : iv;}data exBSGS(data a, data b, data p) { // 注意点 1 b %= p; // 注意点 2 if (b == 1 || p == 1) return 0; data d, ak(1), k(0); while ((d = gcd(a, p)) != 1) { if (b % d) return -1; ++k, p /= d, b /= d; ak = a / d * ak % p; // 注意点 3 if (ak == b) return k; } // 注意点 4 b = b * inv(ak, p) % p; data res = BSGS(a, b, p); // 注意点 5 if (~res) return res + k; return -1;}
注意点1:为什么需要一次
b %= p
考虑这样一组数据
a = 10, b = 110, p = 100
其实这个地方也可以加一句
a %= p
,可以减少部分运算,也不会影响正确性,反正都是乘法,模意义下人人平等
注意点2:这里的特判是什么意思
如果p为1,相当于同余式恒成立,所以直接返回最小答案即可
如果b为1,考虑到 \(\forall a \ne 0, a^0 = 1\),所以直接返回最小答案即可
注意点3:这就是上文中答案小于 \(k\) 情况的特判
注意点4:
由于是在模 \(\frac pD\) 意义下,所以需要通过逆元的方式调整
但是考虑到两者不知道是否互质,所以通过扩展欧几里得算法就行了
扩展欧几里得算法可以参考:算法学习笔记(1): 欧几里得算法及其扩展
注意点5:
由于我们在求 \(D\) 的时候消耗了 \(k\) 个\(a\),所以需要加上 \(k\) 才是正确答案
算法学习笔记(10): BSGS算法及其扩展算法
前沿资讯!2023年了 游戏还在背锅
第一款8K显示器发售6年:居然没人接班了
天天快资讯:丈夫称老家有别墅 女子回村直呼上当:网友调侃诚不欺我 真纯天然
被中国游客狠狠抛弃:韩国人口连续三年减少 女多男少拉不动内需
环球播报:便宜了2.5元 2023年春节档电影票价格7年来首次下降:你愿意去看吗?
合资家轿之王!新款日产轩逸e-POWER曝光:百公里仅需4升油
今热点:一箭14星成功升空 卫星首图回传:路面汽车清晰可见
AtCoder Beginner Contest 285 解题报告
新一代云原生日志架构 - Loggie的设计与实践
皮俑是什么做成的?皮俑为什么救吴邪?
擅长画虎的画家是?擅长画虎的十大画家
神奇宝贝的观看顺序是什么?神奇宝贝的大结局是什么?
用上半固态电池!赛力斯发布海外新车型SERES 5:订单超2万
国产骄傲!中国年度十大畅销新能源车型:外资仅有特斯拉上榜
每日播报!游客滑雪失控致女生被撞倒后抽搐 医生:危险数极高、常见骨折
拿老款忽悠当新款卖 女车主退车被日系4S店老板辱骂
风调雨顺的意思是什么?风调雨顺的下联是什么?
小年为什么分南方和北方?小年为什么吃麻糖?
液晶显示器故障怎么解决?液晶显示器故障维修大全
qq空间打不开是什么原因?qq空间打不开怎么办?
cf怎么鬼跳没声音?cf鬼跳教程按键手法
土豆网怎么下载?土豆网怎么没有了?
环球热讯:1.PyQt5【窗口组件】小部件-QWidgt
阿里云邮箱怎么注册?阿里云邮箱怎么发送邮件?
女粉丝入手小米13 曾是十年资深果粉:被小米和雷军打动
当前滚动:二手车商要“气晕”!美国已有特斯拉新车价格低于二手车
低调的江西 盛产新能源富豪
2023央视春晚主持人阵容公布:首次迎来双90后
每日头条!衡山雾凇火了 多名游客滑冰下山很危险 景区调整开放时间
Ansible 学习笔记 - 批量巡检站点 URL 状态
世界观速讯丨node和npm如何升级版本
世界信息:把车变成船 比亚迪真会玩
天天报道:《中国奇谭》值得这么夸吗?
【世界播资讯】首搭麒麟电池 全球MPV续航最长!极氪009开启交付
三星Galaxy S23系列售价泄露:12GB+1TB版本超1万元
行驶1900多米!祝融号已在火星留下近4000个“中”字
C#代码整洁之道读后总结与感想
【快播报】私家车与油罐车高速并排堵路 货车司机看不下去 主动让路
环球消息!男子开车时被激光笔照射 瞬间眼前一片黑!专家称可能会永久损伤
世界观点:小编要失业了 美国科技媒体CNET用AI写文章:读者完全没发现
天天快看点丨马斯克回应车主维权:涨价也没人给我补差价 就这吧
视焦点讯!太傲慢!微信更新内容仅“九个字” 网友:怕大家知道更新了什么吗?
全球速看:油车也有续航焦虑 高速服务区爆满:排队一小时 加油限量100元
消息!小米上架抗原试剂盒:19.9元5个 现货供应
《三体》电视剧开播 广受好评 网友:没看过原著的也被深深吸引
世界最新:2023春节档预售票房破亿:《流浪地球2》排片率第一 吴京/刘德华主演
世界今日报丨Recyclerview列表视频自动播放方案
观天下!QSAN A Quantum-probability based Signed Attention Network for Explainable Fa
剧版《三体》高热开播:收视率蹿升至第一、破腾讯视频记录
尼泊尔客机坠毁:机上72人不幸全部遇难
AMD显卡的尴尬!一个月了 两大品牌仍然没有RX 7900
世界新动态:中国首次全尺寸超导航行试验成功!时速50公里、冲击1000公里
全球信息:AJAX使用记录
环球热头条丨糖醋排骨里竟然藏着"量子点"!它咋这么厉害?
天天观天下!2个大厂 100亿级 超大流量 红包 架构方案
世界视点!CodeQL练习1
实时:day02-Spring基本介绍02
【天天速看料】Redis——数据类型
每日焦点!小朋友把山东的雪带回福建:半路化了 崩溃大哭
天天日报丨尼泊尔客机坠毁遇难人数升至68人:没有中国公民
环球快资讯:golang 为图片加水印
mysql--时间
环球焦点!王思聪打人后行政拘留为什么能暂缓执行?罗翔科普
天天观速讯丨AMD悄悄公布31个CPU漏洞:4个极危险、Zen4高枕无忧
今日热文:Nginx面试题(史上最全 + 持续更新)
当前快讯:Atcoder Regular Contest ARC 153 A B C D 题解
焦点关注:PhotoEnhancer人工智能一键修复老照片,老照片修复,图像去噪
男子花32万买比亚迪海豹 内心崩溃:汽配城都没这么难看
焦点要闻:节能版酷睿i9-13900T现身:35W战平12900K
观天下!腾讯开出48人惩治名单 马化腾曾称内部贪腐“触目惊心”
Phi的反函数
【环球热闻】110度高烧不退!AMD RX 7900 XTX退换货率高达11%
为啥北方二十三过小年 南方却是二十四?和康熙乾隆有关
观察:无广告一年免费用!通信UOS家庭版22.0开始推送
111111
男子买898元零食P图付款 被抓现行:实际支付了1分钱
天天通讯!基于传奇车型AE86!丰田推出两款新能源概念改装车
CF构造题1600-1800(2)
女子骑电动车载两人闯红灯被撞 被判全责 网友:这才是公正
苹果回应iPhone车祸监测误报频发:正收集相关反馈
《新·福音战士剧场版:终》国内海报抄袭!竹也文化官方布道歉声明
Python开发的常用组件
每日观察!推荐一本正在看的书
环球今热点:几十年数学难题被谷歌研究员意外突破 当年差点被导师赶出门
B站2022百大UP主出炉:手工耿入选 走向世界的手工匠人
天天亮点!稳居春节档票房前三:《流浪地球2》官方揭秘太空电梯创作思路
世界讯息:12月新能源销量排名出炉:比亚迪吉利长安强攻 特斯拉扛不住了?
【全球独家】读编程与类型系统笔记08_面向对象变成的元素
观速讯丨长征第462发!我国成功发射一箭14星:“共享”火箭了解下
国内《新·福音战士剧场版:终》限定海报被指抄袭 官方正在联系画师确认
无法恢复!微软杀软Defender误删开始菜单/任务栏捷方式
天天观点:排量830cc 马自达转子发动机正式回归!首车发布
天天亮点!雨雪降温重心转移至南方 大范围雨雪天气明日结束
天天短讯!一步一步实现若依框架--2.3防止重复提交 repeat_submit
焦点快播:2022一年 特斯拉车主为地球节省20亿美元油费
每日消息!全球首现!四川一地发现新物种:长得特别好看
每日动态!《三体》剧版今日CCTV8、腾讯视频全网首播:会员提前看三集
天天观点:使用ActiveMQ Artemis进行重连
环球热议:千万别在有WiFi的房间里摆这种姿势