通过求逆元的几种方式复习基础数论

逆元

ax=1(modp),那么称 ax 的逆元,显然 x 也是 a 的逆元。
两边同时除以 a 得到 x=1a(modp),可以写成 x=a1(modp),这么看来,乘法逆元就是取模意义下的倒数啊。
p 为质数,0 没有逆元,1 的逆元是 1p1 的逆元是 p1。其他都是一对一对的逆元,证明可见「裴蜀定理」。
为啥 p1=1p1(modp) 呢?直观解释是负负得正 1=11,另一种解释是 1=p22p+1=(p1)2(modp)

暴力求解

ax=1(modp) 是个线性同余方程。解 x 必然 [0,p1],所以直接暴力寻找可能的 x
单次复杂度 O(p)

费马小定理

前置条件:p 为质数。

求解 x 就是计算 a1
根据费马小定理,若 p 为质数,则 ap1=1(modp),将等式两边同时乘 a1 就可以得到 ap2=a1,快速幂求解。
单次复杂度 O(logp)

欧拉定理

费马小定理可以看作欧拉定理的特殊情况。
根据欧拉定理,若 gcd(a,p)=1,则 aφ(p)=1(modp),将等式两边同时乘 a1 就可以得到 aφ(p)1=a1
单次复杂度由 φ 的求解方法确定,从 O(p)O(logp) 均有可能。

拓展欧几里得

ax=1(modp) 可以转化为 ax+pk=1,其中 a,p 已知,需要求一组 x,k 使得 x[0,p1]
通过裴蜀定理可得存在一组 x,k 使得 ax+pk=gcd(a,p)。所以若 gcd(a,p)=1,那么 ax+pk=1 必然有解。根据解的周期性可知必然存在一个解使得 x[0,p1]。所以逆元存在的充分条件是 gcd(a,p)=1
求解 ax+pk=1 可以采用拓展欧几里得的方法求解。

前缀积

(nm)=n!m!(nm)!,类似的,1a=(a1)!a!
通过前缀积预处理出 1!,2!(a1)!,a!,求出 a! 的逆元 1a!,再一路循环回去 1i=i+1(i+1)! 就可以求出所有阶乘和阶乘的逆元。而且这个方法对于求 1i=lri,1lr<p 也是在常数时间内完成,
求出 [1,n] 中所有逆元的复杂度是 O(n+logp)

线性求逆元

p=0(modp)pa×a+pmoda=0(modp)papmoda+1a=0(modp)1a=papmoda(modp)

发现要求出 1a 必须得求出 1pmoda,可以使用数组递推下去也可以直接递归求解。
求出 [1,n] 中所有逆元的复杂度是 O(n)
若递归求解,已知时间复杂度上界为 O(n13),下界为 Ω(lnnlnlnn)。有人猜想其复杂度为 O(log2n)。不过在 int 范围内可以近似看作单 log 倒是真的。

模数 p 998244353 109+7 109+9
n=106 的递归次数 30 31 29
n=107 的递归次数 35 39 35
n=108 的递归次数 40 45 42

线性筛

ta,那么 1a=1t×1at
借助线性筛筛出 [1,n] 的所有质数以及他们的逆元。在线性筛时,每个数 i 只会被自己的最小质因子 mpf(i) 筛到,所以计算 1mpf(i)×1impf(i) 就行了。
若求出 [1,n] 中所有逆元,线性筛的复杂度为 O(n),只有 [1,n] 中的质数需要计算逆元,质数个数约为 nlnn,每个的计算复杂度为 logp,所以总复杂度为 O(n+nlogplnn),近似于线性。

posted @   蒟酱  阅读(131)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示