首页 > 其他分享 >乘法逆元学习笔记

乘法逆元学习笔记

时间:2025-01-11 19:56:55浏览次数:1  
标签:lfloor gcd pmod bmod 笔记 逆元 乘法

前言

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

定义

如果有一个线性同余方程 \(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 避免出现负数 
}

结束语

到这里就结束啦!

标签:lfloor,gcd,pmod,bmod,笔记,逆元,乘法
From: https://www.cnblogs.com/panda-lyl/p/18666143

相关文章

  • YOLOv10-1.1部分代码阅读笔记-ops.py
    ops.pyultralytics\utils\ops.py目录ops.py1.所需的库和模块2.classProfile(contextlib.ContextDecorator): 3.defsegment2box(segment,width=640,height=640): 4.defscale_boxes(img1_shape,boxes,img0_shape,ratio_pad=None,padding=True,xywh=False): ......
  • 全栈开发之小程序 网快速笔记,复习springboot 假期复习一套课程
    第六章登陆与注册 本章主要内容如下登陆注册相关<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper......
  • [笔记] 使用 Jenkins 和 Nginx 实现前端项目的持续集成与部署 (CICD) : 从 GitLab 拉
    在现代软件开发中,持续集成与持续部署(CI/CD)已经成为提高开发效率、保证代码质量的重要手段。对于前端项目来说,如何快速、稳定地将代码从开发环境推送到生产环境,是一个关键问题。本文将详细介绍如何使用Jenkins和Nginx实现前端项目的CI/CD流程,确保每次代码提交都能自动......
  • LGP1600 天天爱跑步 笔记
    原题链接:传送门题意简述给定一棵\(N\)个结点的树。有\(M\)个玩家从第\(0\)时刻开始从\(s_i\)出发,以每秒一条边的速度沿着树上的简单路径向\(t_i\)跑去。对于每个结点\(j\)都有一个观察员,会选择在\(w_j\)时刻观察其结点上所有玩家。问每个观察员分别能观察到多少玩......
  • 学习进度笔记④
    Windows系统安装部署Shapely教程 1、进入网址下载选择下图中的这个:2、然后在终端输入下载命令pipinstallShapely-1.8.2-cp310-cp310-win_amd64.whl......
  • 学习进度笔记⑤
    Zlib安装部署教程 1、进入网址,下载相应压缩包网址在此:传送解压压缩包;2、打开终端,进入解压的文件夹的路径nmake-fwin32/Makefile.msc接下来的步骤可以参考这个链接:传送门重定向目标完成:......
  • Vulnhub-Red靶机笔记
    Red靶机笔记概述这台靶机主要练习了文件包含漏洞的利用过程,以及hashcat利用规则生成字典来爆破ssh,利用进程监听修改root自执行程序来拿到root权限的shell靶机地址:https://www.vulnhub.com/entry/red-1,753/一、nmap扫描1、端口扫描sudonmap-sT--min-rate10000-p--opo......
  • 集合框架笔记
    一、接口及实现类:Collection接口:子接口-----:1List接口:存储有序的,可重复的数据实现类:ArrayList(主要实现类)、LinkedList、Vector2Set接口:存储无序的、不可重复的数据(类似于集合)实现类:HashSet(主要实现类)、LinkedHashSet、TreeSetMap接口:key-value对--->键值对实......
  • STLG_02_28_SQL Server学习笔记总结
        从24年前与那本绿色封面的王珊老师的《数据库概论》初次接触,到如今女儿已步入大学殿堂,岁月如梭,光阴荏苒,青葱岁月,转瞬即逝。在云盘的尘封角落,翻寻出2002年开始那一份份青涩的MSSQLServer笔记,彼时的我们,身处一个尚未被互联网广泛覆盖的年代,缺乏名师的点拨与系统的......
  • OpenCL入门笔记
    1、概述1.1、OpenCL标准OpenCL(OpenComputingLanguage)是一个开放标准的并行编程框架,它允许开发者在异构系统上利用各种计算设备(例如CPU、GPU、FPGA等)来加速任务,目前已被广泛应用于视频处理、医学成像、机器学习等领域。OpenCL最初由苹果公司提出,并在与AMD、IBM、Intel、NVID......