离散对数/阶/原根/剩余/数论科技
都是离散同余的内容。
离散对数
若 a⊥p,且 ax≡b(modp),则 x 称作离散对数 logab。
BSGS 算法
对质数 p,给定 a,b 求解 x 需要用到 BSGS 算法。
事实上求解离散对数是数论中的经典难题,其难解性产生了非对称 RSA 加密算法。
BSGS 算法的复杂度是 Θ(p) 的。
考虑将这个 Θ(p) 规模的问题转化为求是否有两个 Θ(p) 规模的数据相等,这样我们就可以查表解决。
考虑设阈值 B=p,这样我们可以把 x 写成 uB−v(u≥1,v∈[1,p]) 的形式。
也即 auB≡avb,而 auB 与 avb 分别只有 Θ(p) 种,直接查表解决。
exBSGS
模数不一定为质数。
考虑能否沿用上述思路,这种情况下最大的坏处就是逆元不一定存在,所以上式的最后一步并不成立。
事实上取 B=2φ(p),先将所有 auB 正序加入表中,注意有重复值的话要保留前两个,再查表 avb 并检验 auB−v≡b(modp) 是否成立,检验可以使用 auB−v=a(u−1)BaB−v。
答案上界是 2φ(p),证明考虑反证法,如果存在答案 x>2φ(p),则根据扩展欧拉定理我们可以得到一个更小解 xmodφ(p)+φ(p)。
阶与原根
题外话:对于 m>1 的简化剩余系 Km 在乘法下封闭,满足结合律,存在逆元和单位元(是一个群),则我们可以从这个角度理解阶与原根(循环群的生成元)。
阶
最小的满足 ax≡1(modm) 的正整数 x 称为 a 模 m 的阶,记作 δm(a)。
理解这部分可能需要用到经典的一个结论:一个长为 n 的环每次跳 a 步则会产生 gcd(a,n) 个环,环长为 gcd(a,n)n。
阶就是一个环长,或者说步数,与之对应的是步长。
性质:
- 阶和字符串的最小正周期有异曲同工之妙,ax≡1(modm)⟺δm(a)∣x。
证明考虑反证法,若 δm(a)∤x,由于 ax≡aδm(a)≡1(modm),所以不用担心没有逆元的情况,可以在等式两边任意乘除,也就是在指数上任意加减,根据裴蜀定理 axmodδm(a)≡1(modp),而 xmodδm(a)∈(0,δm(a)),与阶的定义矛盾。
- δm(a) 存在当且仅当 a⊥m,这个是常识。
- δm(ak)=gcd(δm(a),k)δm(a)=klcm(δm(a),k),运用步长来理解,这也告诉我们 ∃k,xk≡y(modp)⟺δp(y)∣δp(x),求解前者我们通常会选择离散对数 Θ(p),而求解后者我们可以使用 Pollard-Rho 算法分解 φ(p) 的质因数然后试除法解决。
注意阶的环和置换环有一些区别,置换环上长度为 x 的环有 xn 个,而阶中只有一个这样的环,因为阶的指数是 x,2x,3x,⋯,没有 x+1,2x+1 这种结构,阶越大步长越小环越长,能表示的东西越多。
群的理解下置换环因为可以转,所以关心子群和所有陪集,而阶是有固定的原点 1 的,不含 1 的陪集不关心,所以我们只关心子
由上面最后一条,求 δm(a) 我们只需要对 φ(m) 分解质因数然后试除即可。
给定一个序列和质数 p,求有多少 (i,j) 满足 ∃k,aik≡aj(modp)。
p≤1013,n≤2×105。
应用上面的结论我们发现原数没用了,只需要求每个数的阶然后对阶统计即可,发现 d(φ(m))≤104,所以直接 Θ(d2) 暴力统计即可。
给定一个序列 a 和奇质数幂 pk,定义 x 能生成 y 当且仅当 ∃r,xr≡y(modpk),定义一个集合的权值是选出最少的集合中的数的个数,使得这个集合可以被生成,求所有子集的权值和。
n≤5000,pk≤108。
考虑枚举每个数,统计每个数的贡献。
假定生成关系是单向的,若是双向则钦定编号小的生成编号大的。
所以一个数产生贡献当且仅当集合中所有的数都无法生成它,设 c 个数可以生成它,则贡献为 2n−c。
若 a⊥p,则使用阶的结论判断是否整除即可。
若 a⊥p,则生成它的数 Θ(logV) 次幂以内必到达 0,暴力枚举所有 b⊥p 能否生成它即可。
原根
若 δm(g)=φ(m),则称 g 为 m 的原根。
性质:
- ∀p∈P,i∈[1,p),gimodp 两两不同。
这是它最有用的性质,这意味着在求解同余方程时我们可以把所有非零数都换成原根的幂次,从而进一步化简求解。
- 原根判定:求阶即可。
- 原根的存在性:m 存在原根当且仅当 m=2,4,2pk,4pk,其中 p 是奇质数。
- 若 m 存在原根,则 ∣{a∣δm(a)=l}∣={0,φ(l),l∤φ(m)l∣φ(m),这同样可以用子环长来理解,相当于要求有多少个步数使得最终得到的环长为 l,任取 δm(a)=l,则 ai(i⊥l) 取遍了所有 {a∣δm(a)=l}。
- 由上条,若 m 存在原根,则 m 的原根个数为 φ(φ(m))。
- 最小原根的数量级为 O(m41+ϵ),求出任意一个原根 g,则其他原根可表示为 gi(i⊥φ(m))。
原根与单位根基本等价,单位根有的性质原根基本都有,原根可以替代单位根来实现 NTT。
口胡题
给定 n 个操作和一个初始为 1 的变量 x,每个操作形如 x←ai 或 x←x⋅ai,求选出任意操作后任意排列后 xmodp 有多少种不同的取值,每个操作只能执行一次。
n≤106,p∈P∩[2,2×105]。
首先由于 p≤2×105,我们可以暴力找原根暴力求出原根的每个幂次对应的值,所以我们可以求出 ai=gbi。
接下来我们发现一定是先赋值再乘,乘法已经被我们转化成了加法,于是我们接下来跑一个背包 Θ(ωnq),但过不了。
考虑哈希 + 二分,因为这是一个循环串,所以找到一个 1 对应 0 那么一定有一个 0 对应 1。
二次剩余
对 p∤a,若存在 x2≡a(modp),则 a 是二次剩余,否则 a 是二次非剩余。
若 p∣a,则 a 什么也不是。
Legendre(勒让德)符号:
(pa)=⎩⎨⎧1,−1,0,p∤a,∃x≡a(modp)p∤a,∄x≡a(modp)p∣a
其意义为 mod p 意义下 x2≡a 的解的个数 − 1。
二次互反律:对不同奇素数 p,q,(qp)(pq)=(−1)2p−12q−1。
性质:
- 若奇素数 p 有原根 g,x=gk(k∈[1,p)),则 x 是二次剩余当且仅当 2∣k,证明就是反证法,若 x2≡gk(modp),则 kmodp−1 一定是偶数,则 k 一定是偶数。
从这一点可以看出,二次剩余和二次非剩余各占一半,数量都为 2p−1,就像实数中的正数和负数一样。
- Euler 判别准则:a2p−1≡(pa)(modp),可以判断一个数是否为二次剩余,从这一点中可以看出 p 固定时 (pa) 是完全积性函数。
T 组数据求解 x2≡a(modp) 的所有解,p 是奇质数。
T≤104,a<p≤109+9。
只需要找到其中一个 x,另一个即为 −x。
请出大名鼎鼎的 Cipolla 算法。
我们先叙述一遍算法流程:
- 找到正整数 b 使得 ω=b2−a 为二次非剩余。
- 扩域,令 i=ω,则 (b+i)p+1≡a(modp),则 (b+i)2p+1 为二次剩余。
是不是觉得莫名其妙的。
首先我们先论证为什么 (b+i)p+1≡a(modp),再说怎么找 b。
⟺⟺⟺⟺(b+i)p+1≡a(modp)(b+i)(b+i)p≡a(modp)(b+i)(bp+ip)≡a(modp)(b+i)(b+iω2p−1)≡a(modp)(b+i)(b−i)=b2−ω≡a(modp)
其中第二行到第三行在 Lucas 定理中有证明。
由于二次非剩余占了一半,可以猜出枚举 b 则 b2 的二次剩余性比较随机(不会证)。
所以直接暴力找即可,注意特判 a=0,此时找不到 b。