本人学艺不精,如有错误,敬请指出……
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的一个值。
已知a、b、c,且a与p互质,且ax≡b (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=k⋅m+r
其中
0
≤
k
<
m
,
0
≤
r
<
m
0\leq k<m,0\leq r<m
0≤k<m,0≤r<m,因为如果
k
≥
m
k\geq m
k≥m的话,
k
⋅
m
≥
m
2
≥
p
k\cdot m\geq m^2 \geq p
k⋅m≥m2≥p,而
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)
ak⋅m+r≡b (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)
ak⋅m≡b⋅a−r (mod q)
此时,我们就可以来枚举 r r r,和 k k k了。
如果有相等那么答案就是 k ⋅ m + r k\cdot m+r k⋅m+r。
因为 0 ≤ k < m , 0 ≤ r < m 0\leq k<m,0\leq r<m 0≤k<m,0≤r<m,所以时间复杂度是 O ( q ) O(\sqrt q\ ) O(q )。
你以为这就完了吗?
因为 a − r a^{-r} a−r需要用逆元来做,我们就想想如何把逆元消掉。
其实
x
=
k
⋅
m
+
r
x=k\cdot m+r
x=k⋅m+r也可以写成
x
=
k
⋅
m
−
r
x=k\cdot m-r
x=k⋅m−r,这时候
0
≤
k
≤
m
,
0
≤
r
<
m
0\leq k\leq m,0\leq r<m
0≤k≤m,0≤r<m,则
a
k
⋅
m
≡
b
⋅
a
r
(
m
o
d
q
)
a^{k\cdot m}\equiv b\cdot a^{r} \ (mod\ q)
ak⋅m≡b⋅ar (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)
ax≡b (mod p)
我们可以把它变形为
a
x
+
k
⋅
p
=
b
a^x+k\cdot p=b
ax+k⋅p=b
我们设
g
=
g
c
d
(
a
,
p
)
g=gcd(a,p)
g=gcd(a,p),这是如果
g
∤
b
g\nmid b
g∤b,则次方程无解。(例外:
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
ax−1⋅ga+k⋅gp=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
ax−1⋅a1+k⋅p1=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)
ax−cnt≡b1⋅a1−1 (mod p1)
此时
c
n
t
cnt
cnt表示做的次数。
接下来就可以用 B S G S BSGS BSGS做了。