初等数论--乘法逆元

news/2025/2/22 6:15:56/

1. 简介

乘法逆元,相同于在模除法做像倒数一样的操作。

比如:

对于模 5 : 4 5: \quad4 5:4的逆元是什么

1 4 ≡ v ( m o d 5 ) \frac{1}{4} \equiv v ( \bmod\ 5) 41v(mod 5)
也就是在模中除 4 4 4,相当于乘上一个什么样的数。
4 v ≡ 1 ( m o d 5 ) 4v \equiv 1 ( \bmod\ 5) 4v1(mod 5)

我们的目的是将模运算中要进行的除操作转换成乘。

根据裴蜀定理我们知道,只有当 gcd ⁡ ( 4 , 5 ) = 1 \gcd(4,5)=1 gcd(4,5)=1时,

v v v才可能有解,也就是有逆元。

因此我们可以用扩展欧几里得来求逆元。

下面的代码以luoguo p3811为例。

2. 扩展欧几里得求逆元

这里直接用扩展欧几里得就可以了,只要 gcd ⁡ ( a , m ) = 1 \gcd(a,m)=1 gcd(a,m)=1就可以了。

也就是对应着 x x x的值,不过 x x x的值有可能是负的,所以需要加上 m m m

#include <iostream>
#include <vector>int exgcd(int a, int b, int &x, int &y) {if (0 == b) {x = 1;y = 0;return a;}// int x_1;// int y_1;// int d = exgcd( b,a %b, x_1, y_1);// x = y_1;// y = x_1 - (a / b) * y_1;int d = exgcd( b, a % b, y, x);y -= (a / b) * x;return d;
}int main()
{int n;int p;std::cin >> n >> p;std::vector<int> mem(p, 0);int rev,y;for(int i = 1;i <= n;i++) {if ( i < p) {exgcd( i, p, rev, y);if (rev < 0)rev += p;mem[i] = rev;}std::cout << mem[i % p] << '\n';}return 0;
}

3. 费马小定理求乘法逆元

根据费马小定理我们有:

p i s p r i m e gcd ⁡ ( a , p ) = 1 ⇒ p ∣ a p − 1 − 1 ⇒ a p − 1 ≡ 1 ( m o d p ) p \ is \ prime\\ \gcd(a,p)=1 \Rightarrow\\ p \mid a^{p-1}-1 \Rightarrow a^{p-1} \equiv 1 (\ \bmod \ p) p is primegcd(a,p)=1pap11ap11( mod p)

因此此时有:
a p − 2 a ≡ 1 ( m o d p ) a^{p-2} a \equiv1 ( \ \bmod \ p) ap2a1( mod p)

a a a的乘法逆元此时为 a p − 2 a^{p-2} ap2

需要注意的是我们的模数需要是质数,才能用。

#include <cstdio>
#include <vector>using ll = long long;ll fpow(ll base, ll cnt, ll mod) {if (1 == base)return 1;ll tmp = base;ll ans = 1;while (cnt) {if (cnt & 1) ans  = (ans * tmp) % mod;tmp  = (tmp * tmp) % mod;cnt >>= 1;}return ans;
}int main()
{long long  n;long long p;scanf("%lld%lld", &n, &p);for (int i = 1;i <= n; i++) {printf("%lld\n", fpow(i, p - 2, p));}return 0;
}

4. 积性函数求乘法逆元

我们容易证明求乘法逆元是积性函数

a × i n v ( a ) ≡ 1 ( m o d p ) b × i n v ( v ) ≡ 1 ( m o d p ) a b × i n v ( b ) i n v ( a ) ≡ 1 ( m o d p ) i n v ( a b ) = i n v ( a ) i n v ( b ) a \times inv(a) \equiv 1 \ (\ \bmod\ p)\\ b \times inv(v) \equiv 1 \ (\ \bmod\ p)\\ ab \times inv(b) inv(a) \equiv 1 \ (\ \bmod\ p) \\ inv(ab) = inv(a) inv(b) a×inv(a)1 ( mod p)b×inv(v)1 ( mod p)ab×inv(b)inv(a)1 ( mod p)inv(ab)=inv(a)inv(b)

递推式
p = k i + r k i + r ≡ 0 ( m o d p ) − k i ≡ r ( m o d p ) ( p − k ) i ≡ r ( m o d p ) \begin{align*} p &=ki+r \\ ki+r &\equiv 0 \ ( \ \bmod\ p ) \\ -ki &\equiv r \ (\ \bmod\ p) \\ (p-k)i & \equiv r \ (\ \bmod \ p) \end{align*} pki+rki(pk)i=ki+r0 ( mod p)r ( mod p)r ( mod p)
两边同乘 i n v ( i r ) inv(ir) inv(ir)整理后可得
( p − k ) i × i n v ( i r ) ≡ r × i n v ( i r ) ( p − k ) i × i n v ( i ) i n v ( r ) ≡ r × i n v ( r ) i n v ( i ) i n v ( i ) ≡ ( p − k ) i n v ( r ) ⇔ i n v ( i ) ≡ ( p − ⌊ p / i ⌋ ) i n v ( r ) \begin{align*} (p-k)i \times inv(ir) &\equiv r \times inv(ir) \\ (p-k)i \times inv(i)inv(r) &\equiv r \times inv(r)inv(i) \\ inv(i) \equiv (p-k)inv(r) &\Leftrightarrow\\ inv(i) &\equiv(p - \lfloor p / i\rfloor) inv(r) \end{align*} (pk)i×inv(ir)(pk)i×inv(i)inv(r)inv(i)(pk)inv(r)inv(i)r×inv(ir)r×inv(r)inv(i)(pp/i⌋)inv(r)
于是代码

#include <cstdio>
#include <vector>long long inv[3000001];int main()
{long long  n;long long p;scanf("%lld%lld", &n, &p);inv[1] = 1;for ( int i = 1;i <= n; i++) {if ( i != 1) {inv[i] = (p - p / i) * inv[ p % i] % p;}printf("%lld\n", inv[i]);}return 0;
}

5. 参考

czc1999
let_life_stop


http://www.ppmy.cn/news/1574075.html

相关文章

基于ffmpeg+openGL ES实现的视频编辑工具-字幕添加(六)

在视频编辑领域,字幕的添加是一项极为重要的功能,它能够极大地丰富视频内容,提升观众的观看体验。当我们深入探究如何实现这一功能时,FreeType 开源库成为了强大助力。本文将详细阐述借助 FreeType 库生成字幕数据的过程,以及如何实现字幕的缩放、移动、旋转、颜色修改、对…

设计心得——接口

一、接口 在编程者的口中&#xff0c;经常可以听到接口这个说法或者说概念&#xff0c;那什么是接口呢&#xff1f;如果在一些编程语言中&#xff0c;有接口这种定义的话&#xff0c;就非常好理解&#xff0c;比如Java,go等。但在C和C中根本没有接口这个定义的话&#xff0c;什…

20250221 NLP

1.向量和嵌入 https://zhuanlan.zhihu.com/p/634237861 encoder的输入就是向量&#xff0c;提前嵌入为向量 二.多模态文本嵌入向量过程 1.文本预处理 文本tokenizer之前需要预处理吗&#xff1f; 是的&#xff0c;文本tokenizer之前通常需要对文本进行预处理。预处理步骤可…

工业机器人中用于3D碰撞检测的算法库有哪些

在工业机器人领域&#xff0c;3D碰撞检测是确保安全运行和路径规划的关键技术。以下是常用的算法库及其特点&#xff0c;分类整理供参考&#xff1a; 一、开源算法库 FCL (Flexible Collision Library) 特点&#xff1a;专为机器人设计&#xff0c;支持刚体、复杂几何模型&…

【智慧工地可视化大屏用哪些系统来制作?】

智慧工地可视化大屏用哪些系统来制作&#xff1f; 1、FineReport &#xff08;1&#xff09;现阶段是中国市场份额第一的智慧工地可视化大屏系统&#xff0c;也是一款完善的数据分析工具。 &#xff08;2&#xff09;内嵌丰富多彩数据图表&#xff0c;不用编码启用&#xff…

懒人美食帮(springboot论文源码调试讲解)

第4章 系统设计 4.1系统设计原则 系统详细设计也是很重要的一步&#xff0c;设计的质量高低也决定了程序最终的质量&#xff0c;所以首先要进行系统的合理化详细设计&#xff0c;然后还有读懂理解透彻这个程序的设计规划&#xff0c;这样编写代码的时候才不会出现错误&#xf…

亚信安全正式接入DeepSeek

亚信安全致力于“数据驱动、AI原生”战略&#xff0c;早在2024年5月&#xff0c;推出了“信立方”安全大模型、安全MaaS平台和一系列安全智能体&#xff0c;为网络安全运营、网络安全检测提供AI技术能力。自2024年12月DeepSeek-V3发布以来&#xff0c;亚信安全人工智能实验室利…

Ollama Docker 镜像部署

文章来源&#xff1a;Docker 部署文档 -- Ollama 中文文档|Ollama官方文档 仅 CPU docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama英伟达 GPU 安装 NVIDIA Container Toolkit。 使用 Apt 安装 配置存储库 curl -fsSL https://nvidia.g…