浅谈BSGS和exBSGS

本人学艺不精,如有错误,敬请指出……


BSGS

概念

B S G S BSGS BSGS是用来解决离散对数问题的。

什么是离散对数问题呢?

在一个可计算的有限循环群中求对数的问题。

B S G S BSGS BSGS解决的是以下问题:
已知 a 、 b 、 c , 且 a 与 p 互质,且 a x ≡ b   ( m o d   p ) , 求 x 的一个值。 已知a、b、c,且a与p互质,且a^x\equiv b\ (mod\ p),求x的一个值。 已知abc,ap互质,且axb (mod p),x的一个值。

做法

在看到上面这个问题的时候,我们可以先枚举 x x x

根据欧拉定理,我们知道 a ϕ ( p ) ≡ 1   ( m o d   p ) a^{\phi(p)}\equiv 1 \ (mod\ p) aϕ(p)1 (mod p)

所以这个的时间复杂度是 O ( ϕ ( p ) ) O(\phi(p)) O(ϕ(p)),有因为 ϕ ( p ) < p \phi(p)<p ϕ(p)<p,所以可以在 O ( p ) O(p) O(p)内求出 x x x

但是如果 p p p很大,这个方法就不太好用了。

所以就有了 B S G S BSGS BSGS


首先,我们先令
m = ⌈ p   ⌉ , r = x   m o d   m m=\lceil\sqrt p\ \rceil,r=x\ mod\ m m=p  ,r=x mod m


x = k ⋅ m + r x=k\cdot m+r x=km+r
其中 0 ≤ k < m , 0 ≤ r < m 0\leq k<m,0\leq r<m 0k<m,0r<m,因为如果 k ≥ m k\geq m km的话, k ⋅ m ≥ m 2 ≥ p k\cdot m\geq m^2 \geq p kmm2p,而 r r r是模出来的,所以 r < m r<m r<m

所以
a k ⋅ m + r ≡ b   ( m o d   p ) a^{k\cdot m+r}\equiv b\ (mod\ p) akm+rb (mod p)
因为 a a a p p p互质,则
a k ⋅ m ≡ b ⋅ a − r   ( m o d   q ) a^{k\cdot m}\equiv b\cdot a^{-r}\ (mod\ q) akmbar (mod q)

此时,我们就可以来枚举 r r r,和 k k k了。

如果有相等那么答案就是 k ⋅ m + r k\cdot m+r km+r

因为 0 ≤ k < m , 0 ≤ r < m 0\leq k<m,0\leq r<m 0k<m,0r<m,所以时间复杂度是 O ( q   ) O(\sqrt q\ ) O(q  )

你以为这就完了吗?

因为 a − r a^{-r} ar需要用逆元来做,我们就想想如何把逆元消掉。

其实 x = k ⋅ m + r x=k\cdot m+r x=km+r也可以写成 x = k ⋅ m − r x=k\cdot m-r x=kmr,这时候 0 ≤ k ≤ m , 0 ≤ r < m 0\leq k\leq m,0\leq r<m 0km,0r<m,则
a k ⋅ m ≡ b ⋅ a r   ( m o d   q ) a^{k\cdot m}\equiv b\cdot a^{r} \ (mod\ q) akmbar (mod q)
这时候就可以先枚举 r r r,然后用 m a p map map来把每个值存下来,在枚举 k k k看下有没有出现过。

code

map <LL,int> q;
LL BSGS() {
    q.clear();
    LL m=ceil(sqrt(p)),s=b,t=1;
    for(int i=1;i<=m;i++)
        s=s*a%p,t=t*a%p,q[s]=i;
    s=1;
    for(LL i=1;i<=m;i++) {
        s=s*t%p;
        if(q[s])
            return i*m-q[s];
    }
    return -1;
}

拓展BSGS

概念

我们刚开始时假设了 a a a p p p互质,然后可以用 B S G S BSGS BSGS做,如果不互质的话就需要用 e x B S G S exBSGS exBSGS来做。

做法

对于
a x ≡ b   ( m o d   p ) a^x\equiv b \ (mod\ p) axb (mod p)
我们可以把它变形为
a x + k ⋅ p = b a^x+k\cdot p=b ax+kp=b
我们设 g = g c d ( a , p ) g=gcd(a,p) g=gcd(a,p),这是如果 g ∤ b g\nmid b gb,则次方程无解。(例外: b = 1 b=1 b=1时, x = 0 x=0 x=0

此时
a x − 1 ⋅ a g + k ⋅ p g = b g a^{x-1}\cdot\dfrac ag+k\cdot\dfrac pg=\dfrac bg ax1ga+kgp=gb
这时我们设 a 1 = a g , b 1 = b g , p 1 = p g a_1=\frac ag,b_1=\frac bg,p_1=\frac pg a1=ga,b1=gb,p1=gp,所以就有
a x − 1 ⋅ a 1 + k ⋅ p 1 = b 1 a^{x-1}\cdot a_1+k\cdot p_1=b_1 ax1a1+kp1=b1
如果仍然不互质,那么就继续如此,于是可以转换为
a x − c n t ≡ b 1 ⋅ a 1 − 1   ( m o d   p 1 ) a^{x-cnt}\equiv b_1\cdot a_1^{-1}\ (mod\ p_1) axcntb1a11 (mod p1)
此时 c n t cnt cnt表示做的次数。

接下来就可以用 B S G S BSGS BSGS做了。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值