乘法逆元
2023-04-18 12:27:32 时间
摘要:
为什么引入乘法逆元?
乘法逆元的定义
将除法转换为乘法,就可以用分配律将大数拆成小数再取模
问:如何求乘法逆元x呢?
方法:费马小定理,扩展欧几里得,线性递推等
乘法逆元
费马小定理
证明
费马小定理
举例
代码实现
#include <iostream>
typedef long long ll;
//快速幂取模
ll fast_pow(ll a, ll b, ll p){
//a^b%p
ll ans = 1;
while(b){
if(b & 1){
//若b是奇数(b%2 == 1),则ans单独乘a,b-=1变成偶数
ans = (ans * a) % p;
}
a = (a * a) % p;
b >>= 1;//(b/=2)b减半
}
return ans;
}
//费马小定理求逆元 x = a^(p-2) % p;(p必须是质数)
ll get_inv(ll a, ll p){
return fast_pow(a, p-2, p);
}
扩展欧几里得
欧几里得
扩展欧几里得
举例
代码实现
#include <iostream>
void exgcd(const int a, const int b, int &g, int &x, int &y){
if(b == 0){ g = a; x = 1; y = 0;}
else {
exgcd(b, a%b, g, y, x);
y -= x * (a/b);
}
}
int get_inv(const int a, int p){
int g, x, y;
exgcd(a, p, g, x, y);
return (x%p + p) % p;
}
线性求逆元
推导
代码实现
int inv[MAXN];
inv [1] = 1;
for(int i = 2; i <= n; i++){
inv[i] = -(p / i) * inv[p % i];
inv[i] = (inv[i] % p + p) % p;
}
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击