数论基础

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 糖

posted @ 2025-05-31 20:08  Network_Error  阅读(13)  评论(1)    收藏  举报