乘法逆元=学习笔记

news/2025/3/20 12:11:33/文章来源:https://www.cnblogs.com/panda-lyl/p/18782804

前言

在讲 中国剩余定理 的时候,没有系统性的讲一遍乘法逆元,所以有了这一期专栏。

定义

如果有一个线性同余方程 \(ax\equiv1\pmod{p}\),则称 \(x\)\(a\equiv p\) 的乘法逆元。记作 \(a^{-1}\)

但是,只有当 \(\gcd(a,p)=1\) 时,乘法逆元才存在。

求乘法逆元

费马小定理

如果 \(\gcd(a,p)=1\),那么 \(a^{p-1}\equiv1\pmod{p}\)

经过计算,得:\(a\times a^{p-2} \equiv 1 \pmod p\)

所以,在 \(\gcd(a,p)=1\) 时,\(a^{p-2}\) 就是 \(a\) 的乘法逆元。

这个情况在 C++ 可以用快速幂进行求解。

扩展欧几里得(exgcd)

exgcd 用来求 \(ax+by = \gcd(a,b)\) 的解。

在求解过程中我们需要分类讨论。

\(b=0\) 时,化简得 \(ax = \gcd(a,0)\),因为 \(\gcd(a,0)=a\),所以 \(ax = a\),解得 \(x=1\)

此时,\(y\) 有无数组解,我们不妨设 \(y=0\)

\(b \ne 0\) 时,\(\gcd(a,b) = \gcd(b, a \bmod b)\)(欧几里得算法)

于是 \(ax+by=\gcd(b, a \bmod b)\)

此时可以看做 \(a\) 对应 \(b\)\(b\) 对应 \(a \bmod b\),不是相等

所以左边等于 \(bx+(a \bmod b) y\)

假设有一组解

\(\begin{cases}x = x_0 \\y = y_0 \\ \end{cases}\)

使得原方程组成立。

又因为 \(a \bmod b = a - \left \lfloor \frac{a}{b} \right \rfloor b\)

所以左边等于

\[\begin{aligned} bx_0+(a - \left \lfloor \frac{a}{b} \right \rfloor b)y_0 \\ =bx_0+ay_0-\left \lfloor \frac{a}{b} \right \rfloor by_0 \\ =ay_0+b(x_0-\left \lfloor \frac{a}{b} \right \rfloor y_0) \end{aligned}\]

所以 \(ax_0+by_0 = ay_0+b(x_0-\left \lfloor \frac{a}{b} \right \rfloor y_0)\)

所以

\(\begin{cases}x_0 = y_0 \\y_0 = x_0-\left \lfloor \frac{a}{b} \right \rfloor y_0 \\ \end{cases}\)

这就是推导过程,在 C++ 中,我们可以采用递归的思想进行求解。

\(x\) 就是我们要求的乘法逆元,而 \(ax \equiv 1 \pmod p\),可以看做 \(ax \bmod p = 1\),令 \(p = by\),则 \(ax + by = \gcd(a,p)\),又因为乘法逆元存在的条件为 \(\gcd(a,p)=1\),所以 \(ax+by=1\)。此时,用 exgcd 求 \(x\)

void exgcd(ll a, ll b, ll &x, ll &y) {if (!b) { // b=0 的情况x = 1, y = 0;return ;}exgcd(b, a % b, y, x); // 注意这里 y 和 x 交换一下y = y - (a / b) * y; // 这里的第二个 y 可以看做 x
}

注意,\(x\) 可能最终是负数,所以算出来最后要先模 \(p\),再加 \(p\),再模 \(p\)

x = (x % p + p) % p;

递推法求乘法逆元

这一点非常的重要!

应用:求 \(1 \sim n\) 的所有乘法逆元。

时间复杂度:\(O(n)\)

首先,我们要知道 \(1^{-1} \equiv 1 \pmod p\),因为:显然,在 \(p\) 下,\(1\)\(1\) 的乘法逆元。

其次,对于递归情况 \(i^{-1}\),我们设 \(k=\left \lfloor \frac{p}{i} \right \rfloor, j = p \bmod i\),则有 \(p = ki + j\)

所以,在模 \(p\) 意义下,\(ki+j \equiv 0 \pmod p\)

此时,左右两边同时乘以 \(i^{-1} \times j^{-1}\),得:

\[ki \times i^{-1} \times j^{-1} + j \times i^{-1} \times j^{-1} \equiv 0 \pmod p \]

\[kj^{-1}+i^{-1} \equiv 0 \pmod p \]

\[i^-1 \equiv -kj^{-1} \pmod p \]

再带入 \(j = p \bmod i, k = \left \lfloor \frac{p}{i} \right \rfloor\),得:

\[i^{-1} \equiv -\left \lfloor \frac{p}{i} \right \rfloor (p \bmod i)^{-1} \pmod p \]

注意, \(p \bmod i < i\),又因为在递推的过程中,我们已经求出了所有小于 \(i\) 的在模 \(p\) 意义下的乘法逆元,可表示为 \(q^{-1}, q<i\)

所以就有递推式:

\(inv[i] \equiv \begin{cases}1 \,\,\,\,\,\,\,(i=1) \\-\left \lfloor \frac{p}{i} \right \rfloor inv[p \bmod i] \,\,\,\,\,\,\, (i \ne 1, i > 1)\\ \end{cases} \pmod p\)

这也可以用 C++ 的代码来表示:

for (int i = 1; i <= n; i++) {if (i == 1) inv[i] = 1;else inv[i] = (long long)(p - p / i) * inv[p % i] % p;// p - p / i 避免出现负数 
}

结束语

到这里就结束啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901962.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“人工智能+”智赋千行百业!

今年,DeepSeek在AI赛道一骑绝尘 以“火炎焱燚”之势迅速延伸 开启中国AI黄金时代 如今,中国的AI故事正在书写新篇 中国的科技强国之路也正越走越宽在DeepSeek引领的人工智能热潮中 作为云服务国家队 天翼云“息壤”智算平台率先完成 国产算力与DeepSeek-R1/V3 系列大模型的深…

使用Kettle将sqlserver库表结构和数据导入到oracle

一、官网下载kettle的压缩包pdi-ce-9.4.0.0-343.zip ,下载jtds-1.3.1.jar和ojdbc8-19.3.0.0.jar 将jar放入\data-integration\lib 目录下二、将zip解压后,是一个data-integration文件夹,找到spoon.bat 双击运行,即可打开kettle工具三、打开以后,右键点击转换,新建一个转换…

Windows 11 24H2 中文版、英文版 (x64、ARM64) 下载 (2025 年 3 月更新)

Windows 11 24H2 中文版、英文版 (x64、ARM64) 下载 (2025 年 3 月更新)Windows 11 24H2 中文版、英文版 (x64、ARM64) 下载 (2025 年 3 月更新) Windows 11, version 24H2 Enterprise Arm64 x64 (updated Mar 2025) 请访问原文链接:https://sysin.org/blog/windows-11/ 查看最…

作业三

问题 内容这个作业属于哪个课程 课程链接这个作业要求在哪里 作业要求这个作业的目标 实现一个自动生成小学四则运算题目的命令行程序姓名 学号何松 3123004786洪徐博 3123004747PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)Planning 计划 Esti…

VMware Live Site Recovery 9.0.2.2 发布 - 数据中心灾难恢复 (DR)

VMware Live Site Recovery 9.0.2.2 发布 - 数据中心灾难恢复 (DR)VMware Live Site Recovery 9.0.2.2 发布 - 数据中心灾难恢复 (DR) Site Recovery Manager 9.0 Update 2 请访问原文链接:https://sysin.org/blog/vmware-live-site-recovery-9/ 查看最新版。原创作品,转载请…

可视化图解算法: 两个链表的第一个公共节点

对于链表的相关操作,我们总结了一套【可视化+图解】方法,依据此方法来解决链表相关问题,链表操作变得易于理解,写出来的代码可读性高也不容易出错。1. 题目 描述 输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,…

Windows 10 on ARM, version 22H2 ARM64 中文版、英文版下载 (2025 年 3 月更新)

Windows 10 on ARM, version 22H2 ARM64 中文版、英文版下载 (2025 年 3 月更新)Windows 10 on ARM, version 22H2 ARM64 中文版、英文版下载 (2025 年 3 月更新) Windows 10 on ARM, version 22H2 ARM64 (updated Mar 2025) 请访问原文链接:https://sysin.org/blog/windows-1…

河南郑州亚克力代加工厂家资源-代加工-外协加工-委外加工-激光代加工-河南郑州亚克力切割雕刻代加工-芯晨微纳(河南)

在河南省寻找亚克力代加工厂家,可以通过以下渠道和注意事项进行筛选: 一、推荐查找渠道**B2B平台 -百度搜索“河南郑州亚克力代加工厂家”、“激光代加工”、“亚克力加工”等关键词阿里巴巴:搜索“河南亚克力加工”“亚克力定制”等关键词,筛选河南本地厂家(如郑州、洛阳…

PureBasic 6.20 (macOS, Linux, Windows) - 现代的 BASIC 编程语言及 IDE

PureBasic 6.20 (macOS, Linux, Windows) - 现代的 BASIC 编程语言及 IDEPureBasic 6.20 (macOS, Linux, Windows) - 现代的 BASIC 编程语言及 IDE PureBasic is a modern BASIC programming language. 请访问原文链接:https://sysin.org/blog/purebasic/ 查看最新版。原创作品…

GIMP 3.0.0 (Linux, macOS, Windows) 正式版发布 - 免费开源图像编辑器

GIMP 3.0.0 (Linux, macOS, Windows) 正式版发布 - 免费开源图像编辑器GIMP 3.0.0 (Linux, macOS, Windows) 正式版发布 - 免费开源图像编辑器 GNU Image Manipulation Program (GIMP) 请访问原文链接:https://sysin.org/blog/gimp/ 查看最新版。原创作品,转载请保留出处。 作…

WinSCP主机名

连接Wifi的情况下,Ubuntu命令行输入"ifconfig",如图即为主机名当我在使用网线时,打开虚拟机显示的ifconfig却是这样:此时连接WinSCP是行不通的因此只能拔掉网线,在WiFi情况下,重启虚拟机,命令行如下: sudo shutdown -r now 然后再重新接入WinSCP即可。 只要在…

从0到1制作智慧医院,全流程解读

在科技飞速发展的今天,智慧医院已成为医疗行业变革的重要方向。想象一下,患者走进医院,无需繁琐的排队挂号,通过智能导诊系统就能快速找到就诊科室;医生借助大数据和人工智能,能更精准地诊断病情、制定治疗方案;医院管理者通过实时的数据监控,优化资源调配,提升运营效…