求解
$ ax≡b(modp) 考虑分块,令 x=A⌈p⌉−B $
其中 0≤B<⌈p⌉
那么
$ aA⌈p⌉−B≡b(modp) 也即 aA⌈p⌉≡b⋅aB(modp) $
其中 a⌈p⌉ 为常数,枚举 B 将 b⋅aB 插入hash map,再枚举 A 查询 aA⌈p⌉ 即可。
例题
值得一提的是,BSGS求出的x是最小的解。
二次/n次剩余
考虑
$ xa≡b(modp) $
设 g 为 p 的原根,则 ∃c:gc≡x(modp)
于是问题可以写为
$ gac≡b(modp) $
其中 ga 为常数,用BSGS求解 c 即可,复杂度 O(p)。
求所有解
在知道 x0≡gc(modp) 的情况下,我们想得到原问题的所有解。首先我们知道 gφ(p)≡1(modp),于是可以得到
∀ t∈Z, xa≡gc⋅a+t⋅φ(p)≡b(modp)
于是得到所有解为
∀ t∈Z,a∣t⋅φ(p), x≡gc+at⋅φ(p)(modp)
对于上面这个式子,显然有 gcd(a,φ(p))a∣t。因此我们设 t=gcd(a,φ(p))a⋅i,得到
∀ i∈Z,x≡gc+gcd(a,φ(p))φ(p)⋅i(modp)
这就是原问题的所有解。
Reference
https://oi-wiki.org/math/number-theory/bsgs/