[学习笔记]省选算法·数论·BSGS算法

本文通过ZJ神犇与xyz32768的对话引入了BSGS算法,这是一种解决模指数问题的高效方法。文章介绍了算法的基本流程,包括建立哈希表、寻找满足条件的指数,并探讨了当模数不是质数时如何扩展BSGS算法。最后,提供了相关资源链接以供深入学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、开头

(浙江省神犇协会)
神犇1号:ZJOI 2018的题大家都AK了吗?
全体神犇:AK了!
神犇1号:7号神犇,你认识那个弱弱的xyz32768吗?
神犇7号:是的,我认识!我现在就去D他!
(X省Y市)
神犇7号:告诉你,ZJ的神犇协会从此有一个规矩:第1天,协会派我,也就是7号神犇来D人,第2天,协会就派49号神犇来D人,第3天,就派343号神犇来D人,以此类推。我们这里的神犇人数为 109+6 10 9 + 6 ,所以,如果是第 n n 天,
就派7nmod(109+7)号神犇来D人。
我们这里最巨的神犇是 168812736 168812736 号,就考考你:最少在第几天,这号神犇会来D你?
xyz32768:难道,一个一个枚举 n n
神犇7号:如果想不出来的话,我马上去叫168812736号神犇出来!
xyz32768:我还真的不会什么高端的数论算法。
神犇7号:168812736号神犇,在浙江吗?我又D了一个弱鸡!
神犇168812736号:切,BSGS这么水的算法,我们协会里每一个人都会,就你不会,辣鸡!
xyz32768:BSGS?北上广深?拔山盖世?
神犇7号&神犇168812736号:哈,菜!

二、引入

开头中ZJ神犇7号提出的问题就是一个经典模型:
给定A,B,C C C 是质数),求满足

AxB(modC)

的最小正整数 x x
如果暴力求解的话,复杂度是O(C)的,不足以通过神犇7号给出的 109+7 10 9 + 7 的模数。而BSGS算法可以实现 O(C) O ( C ) 的复杂度。
BSGS(Baby Step Giant Step),即先小步后大步。
根据费马小定理,有 AC11(modC) A C − 1 ≡ 1 ( mod C ) 。所以, Ax A x 的值满足周期性变化,且存在一个周期为 x[1,C) x ∈ [ 1 , C )

三、预备知识

  • 哈希表
  • 逆元

四、算法流程

(1)先取 S=C S = ⌈ C ⌉
(2)把 A A A2 A3 A 3 A4 A 4 ,…, AS A S C C 的值存入哈希表。
(3)按顺序i 0 0 S1,考虑是否存在 j j 使得Ai×S+jB(modC)
上式中 1jS 1 ≤ j ≤ S 。把 Ai×S+j A i × S + j 拆解成 Ai×S×Aj A i × S × A j
将式子移项:

AjB×(Ai×S)1(modC) A j ≡ B × ( A i × S ) − 1 ( mod C )

其中 1 − 1 是乘法逆元。
这时候可以先算出 B×(Ai×S)1modC B × ( A i × S ) − 1 mod C 的值,
然后在哈希表中查询是否有这个值,如果存在合法的,最小的 j j
则答案x=i×S+j

五、扩展BSGS算法

如果 C C 不是质数,那么Ai×S可能不存在逆元。
这时候就需要转化,使得逆元存在。
蒟蒻xyz32768不会,只好放网址了:
http://blog.youkuaiyun.com/zzkksunboy/article/details/73162229

六、模板

int BSGS() {
    int i, x = 1; for (i = 1; i <= S; ++i) {
        x = 1ll * x * A % C; if (!ha[x]) ha[x] = i;
    }
    int dalao = qpow(x, C - 2, C), tmp = B;
    for (i = 0; i < S; ++i) {
        if (ha[tmp]) {
            int res = i * S + ha[tmp]; ha.clear(); return res;
        } 
        tmp = 1ll * tmp * dalao % C;
    }
    ha.clear(); return -1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值