一、中国剩余定理
问题
求解线性同余方程组:
⎧⎪
⎪
⎪⎨⎪
⎪
⎪⎩x≡a1(modm1)x≡a2(modm2)…x≡an(modmn)
- 弱化版(保证mi两两互质)
可以证明此时一定有解,且可以构造出一个解x0,那么通解显然为x≡x0(modlcmni=1mi)。
在模数两两互质的情况下容易构造出x0,设Mi=n∏i=1mimi,MiM−1i≡1(modmi),则x0=n∑i=1aiMiM−1i
实现时,先把模数都乘起来,枚举1~n,求出每个Mi在mi下的逆元(用exgcd),同时按照式子一边累加,一边对所有模数的乘积(在模数两两互质时,所有模数的乘积即为所有模数的lcm)取模即可。
需要注意,所有模数的乘积可能很大,因此在求aiMiM−1i时可能要使用龟速乘。
复杂度O(nlogw)(不论是否使用龟速乘)
- 拓展中国剩余定理(不保证mi两两互质)
因为模数不再保证互质,因此Mi和mi不一定互质,就无法求得Mi的逆元,所以我们换一种思路:考虑合并两个形如x≡a1(modm1),x≡a2(modm2)的式子。
那么有x=a1+k1m1=a2−k2m2,即k1m1+k2m2=a2−a1,若gcd(m1,m2)/|(a2−a1),则方程一定无解,否则,可以用exgcd求出一组(k1,k2),那么合并后的方程即为x=a1+k1m1(modlcm(m1,m2))
实现时,枚举2~n,同时维护一个a1,m1,把当前枚举的ai,mi作为推到中的a2,m2即可。与弱化版相同需要注意是否需要使用龟速乘。复杂度同样为O(nlogw)(不论是否使用龟速乘)
二、欧拉定理
定理:
an≡⎧⎪⎨⎪⎩anmodϕ(m)(a⊥m)an(a⊥/m,n<ϕ(m))anmodϕ(m)+ϕ(m)(a⊥/m,n≥ϕ(m))(modm)
证明:
证明了解即可,其中a,m互质的情况用m的简化剩余系乘上a很容易证明,至于第三行的式子证明较为复杂,可以看这里
适用范围:
每个式子的适用范围一定要注意,a,m互质时,三个式子都成立;否则,当a<ϕ(m)时,只有第二行成立,当a≥ϕ(m)时,只有第三行成立。(特别容易忽略)
其他结论:
这里有个重要的结论,对一个数m不断进行操作m=ϕ(m),显然m会不断变小直到1,那么最多进行多少次操作,m一定降为1呢?答案是O(logm)次。
证明考虑分析m是否存在质因子2,若存在,则m至少减小到一半(考虑欧拉函数的公式);若不存在,进行一次操作后m一定含有质因子2(考虑欧拉函数的公式)。证毕。
三、BSGS(先只考虑求最小解)
用于求解离散对数问题:
ax≡b(modm)
- 弱化版:a⊥m
由欧拉定理,可知ax≡axmodϕ(m)(modm),因此只需检验x∈[0,ϕ(m)−1]的范围即可。
但是实现中,检验[0,ϕ(m)−1]与[0,m]的复杂度基本相同,因此,为了方便,往往直接把检验范围拓展到[0,m]
做法考虑对检验范围(假设是[0,m])分块,设n=⌊√m⌋,
四、 Lucas
对于质数p,设n=∑i=0aipi,m=∑i=0bipi,那么有:
(nm)=∏i=0(aibi)
证明考虑构造一个关于x的n次多项式(1+x)n,容易发现其m次项系数即为(nm)
也就是要求[xm](1+x)n(modp)
先证明一个引理:
(1+x)pk≡1+xpk(modp)
先用二项式定理把p次方展开
(1+x)pk≡(p∑i=0(pi)xi)pk−1≡(p∑i=0p!i!(p−i)!xi)pk−1≡(1+xp)pk−1≡(1+xpk)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】