关于 exgcd求逆元 我的理解
时间:2021-08-04
本文章向大家介绍关于 exgcd求逆元 我的理解,主要包括关于 exgcd求逆元 我的理解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
笔者蒟蒻一只,如有错误和不准确不严谨的地方望指正 orz
逆元
我们有时会在求概率等或答案为分数的题目中遇到求逆元的情况
模板->航电 hd-1576
遇到了求\(\bf{\frac{A}{B}}\)mod P 的问题
题目保证B和P互质
给出 n (A mod P 的值) 、B 、P
我们知道
\[(A+B) mod P = \big((A mod P)+(B mod P)\big)mod P
\]
\[(A-B) mod P = \big((A mod P)-(B mod P)\big)mod P
\]
\[(A\times B) mod P = \big((A mod P)\times (B mod P)\big)mod P
\]
但是
\[(A \div B) mod P \neq \big((AmodP)\div (BmodP)\big)mod P
\]
那该怎么办呢
我们可以想办法将它化成乘法形式 满足上面的第三个公式
学过倒数,我们想到了
\[(A \div B)mod P=(\frac{A}{B})mod P=(A\times B^{-1})mod P
\]
那么,由上述的关于乘方取余数的式子得到
\[(A\times B^{-1}) mod P = \big((A mod P)\times (B^{-1} mod P) \big)mod P
\]
由题目得 A mod P 的值为 n
之后题目就转化成了 求 \(\frac{1}{B}\)mod P 的值
问题又来了 \(\frac{1}{B}\) 的值该怎么求呢
它满足
\[(B\times B^{-1}) mod P=1
\]
所以定义 \(\frac{1}{B}\) 叫做B关于P的逆(B也是 \(\frac{1}{B}\) 关于P的逆元
可以表示为
\[B\equiv B^{-1}(mod\;P)
\]
继续进行式子的变形 上上一个式子等价于
\[B\times B^{-1}=1+k\times P\qquad k\ge0
\]
\[B\times B^{-1}-k\times P=1\qquad k\ge0
\]
到此就用到了扩展欧几里得 exgcd
\[扩展欧几里得:给予二整数 a 与 b, 必存在有整数 x 与 y 使得ax + by = gcd(a,b)
\]
这里使用exgcd就求出来 B 的逆元 了
接着返回题目中 用 B的逆元 乘 n 再对 P 取模就可了
扩展欧几里得 exgcd
\[ax+by=gcd(a,b)
\]
\[ax+by=gcd(b,a\,mod\,b)
\]
\[ax+by=bx_{0}+(a\,mod\,b)y_{0}
\]
\[ax+by=bx_{0}+(a-(\lfloor {\frac {a} {b}}\rfloor\times b)y_{0}
\]
\[ax+by=bx_{0}+ay_{0}-\lfloor {\frac {a} {b}}\rfloor\times by_{0}
\]
\[ax+by=ay_{0}+b(x_{0}-\lfloor {\frac {a} {b}}\rfloor\times y_{0})
\]
通过这一波转化就可以把公式递归下去了
code
exgcd:
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){x=1;y=0;return a;}
ll tx=x,ty=y;
ll g=exgcd(b,a%b,tx,ty);
ll t=x;
x=ty;
y=tx-(a/b)*ty;
}
求逆元 (求 n 关于 m 的逆元):
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1,y=0;
return a;
}
ll r = exgcd(b,a%b,x,y);
ll t = x;
x = y;
y = t - a/b*y;
return r;
}
ll inv(ll n,ll m){
ll x,y;
ll ans = exgcd(n,m,x,y);
if(ans == 1)
return (x%m+m)%m;
else
return -1;
}
hd-1576:
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1,y=0;
return a;
}
ll r = exgcd(b,a%b,x,y);
ll t = x;
x = y;
y = t - a/b*y;
return r;
}
ll inv(ll n,ll m){
ll x,y;
ll ans = exgcd(n,m,x,y);
if(ans == 1)
return (x%m+m)%m;
else
return -1;
}
int main(){
ll n,m;
ll t;
cin>>t;
while(t--){
cin>>n>>m;
ll ans = inv(m,9973);
cout<<(n*ans)%9973<<endl;
}
return 0;
}
原文地址:https://www.cnblogs.com/cookiecheetah/p/15098324.html
- FluorineFx应用中“页面长时间不动”导致无法连接的解决办法
- Mysql主从同步(1)-主从/主主环境部署梳理
- mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理
- 网站压力测试软件WebBench以及压测Jexus
- Gershon Dublon & Nan Zhao:用传感器网络感知世界
- 即日起珠海可用微信乘公交,腾讯乘车码助力智慧城市建设
- 利用mk-table-checksum监测Mysql主从数据一致性操作记录
- mysql主从同步(4)-Slave延迟状态监控
- 浏览器窗口尺寸改变时的图片自动重新定位
- Mongodb主从复制/ 副本集/分片集群介绍
- Paul-Adrien Menez:互联网与抵制食物浪费的故事
- DRBD详细解说及配置过程记录
- Servant:基于Web的IIS管理工具
- Web前端知识体系精简——CSS 篇
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法