乘法逆元详解【费马小定理+扩展欧几里得算法】

乘法逆元详解【费马小定理+扩展欧几里得算法】乘法逆元何为乘法逆元 对于两个数 a pa pa p 若 gcd a p 1gcd a p 1 gcd a p 1 则一定存在另一个数 bbb 使得 ab 1 modp ab 1 modp ab equiv1 modp 并称此时的 bbb 为 aaa 关于 111 模 ppp 的乘法逆元 我们记此时的 bbb 为 inv a inv a inv a 或 a 1a 1a 1 举个例子 5 3 1 mod1

乘法逆元

何为乘法逆元?

对于两个数 a , p a,p a,p gcd ⁡ ( a , p ) = 1 \gcd(a,p)=1 gcd(a,p)=1则一定存在另一个数 b b b,使得 a b ≡ 1 ( m o d    p ) ab\equiv1(\mod p) ab1(modp),并称此时的 b b b a a a关于 1 1 1 p p p的乘法逆元。我们记此时的 b b b i n v ( a ) inv(a) inv(a) a − 1 a^{-1} a1

举个例子: 5 × 3 ≡ 1 ( m o d    14 ) 5\times 3\equiv1(\mod 14) 5×31(mod14),我们称此时的 3 3 3 5 5 5关于 1 1 1 14 14 14的乘法逆元。

如何求乘法逆元?

方法一:费马小定理

费马小定理:当有两数 a , p a,p a,p满足 gcd ⁡ ( a , p ) = 1 \gcd(a,p)=1 gcd(a,p)=1 p p p是质数时,则有 a p ≡ a ( m o d    p ) a^{p}\equiv a(\mod p) apa(modp)

变一下形: a ⋅ a p − 2 ≡ 1 ( m o d    p ) a\cdot a^{p-2}\equiv1(\mod p) aap21(modp)。是不是和上面的乘法逆元的定义是相似的?

所以,我们可以使用快速幂求出 a p − 2 a^{p-2} ap2,即求出 a a a的逆元。

方法二:扩展欧几里得算法

由定义可知: a b ≡ 1 ( m o d    p ) ab\equiv 1(\mod p) ab1(modp),这个式子等价于已知 a , p a,p a,p求一个二元一次不定方程 a b = k p + 1 ab=kp+1 ab=kp+1,移一下项得: a b − k p = 1 ab-kp=1 abkp=1。这东西不是扩展欧几里得算法?

方法三:递推计算阶乘的逆元

当我们要计算一大串连续的阶乘的逆元时,采用费马小定理或扩展欧几里得算法就有可能超时,所以我们必须采用一个更快的算法。

f i = i ! f_i=i! fi=i!,则可得: i n v ( f i + 1 ) ≡ i n v ( f i ⋅ ( i + 1 ) ) ( m o d    p ) inv(f_{i+1})\equiv inv(f_i\cdot (i+1))(\mod p) inv(fi+1)inv(fi(i+1))(modp)

我们将 ( i + 1 ) (i+1) (i+1)乘过去,则有: i n v ( f i ) ≡ i n v ( f i + 1 ) ⋅ ( i + 1 ) ( m o d    p ) inv(f_{i})\equiv inv(f_{i+1})\cdot(i+1)(\mod p) inv(fi)inv(fi+1)(i+1)(modp)

自然我们就得出递推式。

方法四:递推计算连续的数的逆元

当我们要计算连续的数的逆元时,我们可以采用以下递推式: i n v ( i ) = ( p − ⌊ p i ⌋ ) × i n v ( p m o d    i ) m o d    p inv(i)=(p-\lfloor\frac{p}{i}\rfloor)\times inv(p\mod i)\mod p inv(i)=(pip)×inv(pmodi)modp

UPD@2019.10.9:补上这个式子的证明

证明:设 t = ⌊ p i ⌋ , k = p m o d    i t=\lfloor\frac{p}{i}\rfloor,k=p\mod i t=ip,k=pmodi,那么显然有 t × i + k ≡ 0 ( m o d    p ) t\times i+k\equiv 0(\mod p) t×i+k0(modp)

变形可得 − t × i ≡ k ( m o d    p ) -t\times i\equiv k(\mod p) t×ik(modp)

两边同时除以 i k ik ik得到 − t × 1 k ≡ 1 i ( m o d    p ) -t\times\frac{1}{k}\equiv\frac{1}{i}(\mod p) t×k1i1(modp)

i n v ( i ) ≡ − t × i n v ( k ) ( m o d    p ) inv(i)\equiv-t\times inv(k)(\mod p) inv(i)t×inv(k)(modp)

所以有 i n v ( i ) = ( p − ⌊ p i ⌋ ) × i n v ( p m o d    i ) m o d    p inv(i)=(p-\lfloor\frac{p}{i}\rfloor)\times inv(p\mod i)\mod p inv(i)=(pip)×inv(pmodi)modp

乘法逆元的作用?

我们由费马小定理可得: a ⋅ a p − 2 ≡ 1 ( m o d    p ) a\cdot a^{p-2}\equiv 1(\mod p) aap21(modp)

所以: a p − 2 ≡ a − 1 ≡ 1 a ( m o d    p ) a^{p-2}\equiv a^{-1}\equiv\frac{1}{a}(\mod p) ap2a1a1(modp)

我们又知道模运算的乘法结合律: b a ≡ b ⋅ a − 1 ≡ b ⋅ a p − 2 ( m o d    p ) \frac{b}{a}\equiv b\cdot a^{-1}\equiv b\cdot a^{p-2}(\mod p) abba1bap2(modp)

所以我们可以知道: a a a除以一个数模 p p p,等于 a a a乘这个数的乘法逆元模 p p p

编程实现

费马小定理:

long long PowMod(long long a,int b) { 
    long long ret=1; while(b) { 
    if(b&1)ret=ret*a%Mod; a=a*a%Mod; b>>=1; } return ret; } 

程序内调用PowMod(a,Mod-2)即可。

扩展欧几里得算法:

long long extend_gcd(long long a,long long b,long long &x,long long &y) { 
    if(a==0&&b==0) return -1ll; if(b==0) { 
    x=1ll; y=0ll; return a; } long long d=extend_gcd(b,a%b,y,x); y-=a/b*x; return d; } long long mod_reverse(long long a,long long n) { 
    long long x,y,d=extend_gcd(a,n,x,y); if(d==1) { 
    if(x%n<=0)return x%n+n; else return x%n; } else return -1ll; } 

递推计算阶乘的逆元:

f[0]=1; for(int i=1;i<=N;i++) f[i]=f[i-1]*i%Mod; inv[0]=1; inv[N]=PowMod(f[N],Mod-2); for(int i=N-1;i>0;i--) inv[i]=inv[i+1]*(i+1)%Mod; 

递推计算连续的数的逆元:

inv[1]=1; for(int i=2;i<=N;i++) inv[i]=(Mod-Mod/i)*inv[Mod%i]%Mod; 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228249.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午7:27
下一篇 2026年3月16日 下午7:28


相关推荐

  • 基于云平台的物联网架构和原理设计_物联网的架构

    基于云平台的物联网架构和原理设计_物联网的架构基于云平台的物联网架构和原理云的服务架构云计算是通过各种技术手段服务客户的一种方式,包括三层服务模式,即最底层的IaaS(基础设施即服务),中间层的PaaS(平台即服务),和顶层的SaaS(软件即服务)。IaaS:最底层,为客户提供基础设施资源,包括计算、存储、网络等,这是构建云平台和云应用的硬件支撑,同时它本身作为一种服务,面向使用者(如单纯的存储数据)和开发者(如使用服务器)。P…

    2025年12月16日
    5
  • OpenClaw 自动化测试实践与探索

    OpenClaw 自动化测试实践与探索

    2026年3月13日
    3
  • openclaw 安装及使用

    openclaw 安装及使用

    2026年3月13日
    3
  • c盘替换文件需要权限_windows安装命令

    c盘替换文件需要权限_windows安装命令大家都知道08权限的系统权限设置很严格,且在2003系统中常用到的溢出工具都失效。面对限制IP连接的情况我们及时拿到system权限有账号也上不去这种情况下只能弄shift后门或者放大镜了。但08权限在system权限也操作不了系统文件夹。先查通过whoami查看下登录帐号权限。通过下图我们看到是普通权限我用的到时MS12042这个大家都会用单独讲sysret.ex…

    2025年12月10日
    4
  • 异步FIFO理解[通俗易懂]

    一、异步FIFO与同步FIFO的区别 二、关键点及解决方法 三、深度的计算 四、整体结构图(style#1ifyouhavesawSNUGuserguide)SimulationandSynthesisTechniquesforAsynchronous的网盘链接链接:http://pan.baidu.com/s/1ntsqGjR密码:scf

    2022年4月13日
    42
  • JS Array ECMAScript5 Methods

    JavaScript的新版本(ECMAScript5)中,为数组新增了一些方法。这些方法包括:forEach(f[,o]):此方法类似于for/in循环,其作用是遍历整个数组并执行函数的某些

    2021年12月22日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号