BSGS
给定
a,b,p
,求
x
使得
只能求
有一个结论:如果有解则必然存在
x∈{0…p−1}
的解
设
q=⌈(√p)⌉,x=cq−d
acq−d≡b (mod p)
acq≡b×ad (mod p)
先枚举 d∈{1…q} ,把 b×admod p 塞进哈希表里
再枚举 c∈{1…q} ,查询 acq 是否在哈希表内
最后 cq−d 就是答案
扩展BSGS
能求
gcd(a,p)≠1
的情况。
设
s=gcd(a,p)
若
s∤b
则无解
设
a′=as,b′=bs,p′=ps
(a′s)x≡b′s (mod p′s)
a′ax−1≡b′ (mod p′)
这样每次 p 都会除以一个大于
最后会得到
dax−k≡b (mod p)
把计算出来的 x 加上
但是可能存在小于 k 的答案
直接枚举
一些其他的东西
sdchr大爷说可以直接按照普通BSGS的方法做,然后把我的随机数据过掉了,但被我hack了。
表面上看当
acq−d≡b (mod p)⇒acq≡bad (mod p)
acq−d≡b (mod p)⇍acq≡bad (mod p)
1式能推出2式,但2式不能推出1式(要两边同时除以 a <script type="math/tex" id="MathJax-Element-31">a</script>的逆元)
所以这是不对的