BSGS算法
视频证明过程疑似有误。
BSGS算法用于解决特殊的离散对数问题。通俗的讲,BSGS算法可以解出如下关于x的同余方程的最小非负整数解:
a
x
≡
b
(
m
o
d
m
)
(
a
⊥
m
)
a^x\equiv b\pmod m\;\;\;(a\perp m)
ax≡b(modm)(a⊥m)
BSGS算法的过程是:
设
s
=
⌈
m
⌉
,
x
=
q
s
−
r
(
0
≤
r
<
s
)
s=\lceil\sqrt m\rceil,x=qs-r(0\leq r<s)
s=⌈m⌉,x=qs−r(0≤r<s),则有:
a
q
s
⋅
a
−
r
≡
b
a^{qs}\cdot a^{-r}\equiv b
aqs⋅a−r≡b
a
q
s
≡
b
⋅
a
r
a^{qs}\equiv b\cdot a^r
aqs≡b⋅ar
(
a
s
)
q
≡
b
⋅
a
r
(a^s)^q\equiv b\cdot a^r
(as)q≡b⋅ar
然后,我们顺序预处理出 b ⋅ a r m o d m b\cdot a^r\mod m b⋅armodm,把 p a i r < b ⋅ a r m o d m , r > pair<b\cdot a^r\mod m,r> pair<b⋅armodm,r>放到哈希表内,注意要求最小解,因此 r r r越大越好,相同的key值,应该后来把先来的替换。
然后我们顺序枚举 q q q,计算 ( a s ) q m o d m (a^s)^q\mod m (as)qmodm,检查哈希表内有没有相同的值。如果有就是答案。(因为答案要最小化,因此第一个枚举到的就是答案)
找不到答案,就输出无解。
BSGS事实上是分块,时间复杂度O( n \sqrt n n)
证明一下:
由于
a
⊥
m
a\perp m
a⊥m,由欧拉定理可知:
a
x
≡
a
x
m
o
d
φ
(
m
)
⋅
∏
a
φ
(
m
)
≡
a
x
m
o
d
φ
(
m
)
(
m
o
d
m
)
a^x\equiv a^{x\;mod\;\varphi(m)} \cdot \prod a^{\varphi(m)}\equiv a^{x\;mod\;\varphi(m)} \pmod m
ax≡axmodφ(m)⋅∏aφ(m)≡axmodφ(m)(modm)
假设有解,在 x ∈ [ 0 , φ ( m ) ] x\in[0,\varphi(m)] x∈[0,φ(m)]范围内必有一个答案,BSGS算法相当于枚举了 [ 0 , m ] [0,m] [0,m]的范围(由于上取整,甚至有可能还大),必然有一组解。
否则无解。
后记
于是皆大欢喜。