数论基础
dalaoa
BSGS
需要保证 \((a,p)=1\)。
之前写的做法都是设 \(x=Bx'+y'\),但这样需要求一次 \(a^B\) 的逆元。
一种不需要求逆元的方法是设 \(x=Bx'-y'\)。
exBSGS
求解满足方程 \(a^x\equiv b\pmod p\) 的最小的非负整数 \(x\),时间复杂度 \(O(p^{0.5}+\log^2 p)\)。
如果 \((a,p)=1\),这种情况直接运行普通的 BSGS 求解。
设 \(g=(a,p),a=a'g,p=p'g\)。
若 \(g\nmid b\) 则一定无解。
否则设 \(b=b'g\)。
等式两边同时约去一个 \(g\),得到 \(a'(a^{x-1})\equiv b'\pmod {p'}\)。
特判 \(x=0\) 后递归解决,这样的递归只会发生 \(O(\log p)\) 轮。
exCRT
假设要合并两个方程
联立
① \(x\equiv b_1\pmod {a_1}\)
② \(x\equiv b_2\pmod {a_2}\)
即 \(x=k_1a_1+b_1=k_2a_2+b_2\)。
\(k_1a_1-k_2a_2=b_2-b_1\)。
新的 \(a=\lcm(a_1,a_2)\)。新的 \(b\) 使用 exgcd 求解即可。
exLucas
基于值域预处理的快速离散对数
给定素数 \(p\) 的一个原根 \(g\),\(q\) 次询问 \(n\) 求 \(\log_g n\)。
对于 \([1,\sqrt n]\) 以内的数预处理出离散对数,这一步复杂度为 \(O(\sqrt{p/log p})\)。
@dcytrl 糖