逆元的几种求法(扩展欧几里得,费马小定理或欧拉定理,特例,打表等)
乘法逆元
对于缩系中的元素,每个数a均有唯一的与之对应的乘法逆元x,使得ax≡1(mod n)
一个数有逆元的充分必要条件是gcd(a,n)=1,此时逆元唯一存在
逆元的含义:模n意义下,1个数a如果有逆元x,那么除以a相当于乘以x。
下面给出求逆元的几种方法:
1.扩展欧几里得
给定模数m,求a的逆相当于求解ax=1(mod m)
这个方程可以转化为ax-my=1
然后套用求二元一次方程的方法,用扩展欧几里得算法求得一组x0,y0和gcd
检查gcd是否为1
gcd不为1则说明逆元不存在
若为1,则调整x0到0~m-1的范围中即可
PS:这种算法效率较高,常数较小,时间复杂度为O(ln n)
typedef long long ll;
void extgcd(ll a,ll b,ll& d,ll& x,ll& y){if(!b){ d=a; x=1; y=0;}else{ extgcd(b,a%b,d,y,x); y-=x*(a/b); }
}
ll inverse(ll a,ll n){ll d,x,y;extgcd(a,n,d,x,y);return d==1?(x+n)%n:-1;
}
2.费马小定理
在模为素数p的情况下,有费马小定理
a^(p-1)=1(mod p)
那么a^(p-2)=a^-1(mod p)
也就是说a的逆元为a^(p-2)
而在模不为素数p的情况下,有欧拉定理
a^phi(m)=1(mod m) (a⊥m)
同理a^-1=a^(phi(m)-1)
因此逆元x便可以套用快速幂求得了x=a^(phi(m)-1)
但是似乎还有个问题?如何判断a是否有逆元呢?
检验逆元的性质,看求出的幂值x与a相乘是否为1即可
PS:这种算法复杂度为O(log2N)在几次测试中,常数似乎较上种方法大
当p比较大的时候需要用快速幂求解
typedef long long ll;
ll pow_mod(ll x, ll n, ll mod){ll res=1;while(n>0){if(n&1)res=res*x%mod;x=x*x%mod;n>>=1;}return res;
}
当模p不是素数的时候需要用到欧拉定理
时间复杂度O(n√)即求出单个欧拉函数的值
3.特殊情况
一:
当N是质数,a是(N+1)的约数时,a−1=N+1a
这点也很好理解。当N是质数,0 < a < N时,(a,N)=1,则a肯定存在逆元。
而解出的N+1a就满足N+1a⋅a≡1(modN),故它是a的逆元。
在CF 696C,N=1000000007时
求解就灰常方便了…
ans=a/bmodm=amod(mb)/b
公式证明:
PS:实际上a mod (bm)/b这种的对于所有的都适用,不区分互不互素,而费马小定理和扩展欧几里得算法求逆元是有局限性的,它们都会要求
与
互素,如果a与m不互素,那就没有逆元,这个时候需要a mod (bm)/b来搞(此时就不是逆元的概念了)。但是当a与m互素的时候,bm可能会很大,不适合套这个一般公式,所以大部分时候还是用逆元来搞
4.逆元打表
有时会遇到这样一种问题,在模质数p下,求1~n逆元 n< p(这里为奇质数)。可以O(n)求出所有逆元,有一个递推式如下
它的推导过程如下,设,那么
对上式两边同时除,进一步得到
再把和
替换掉,最终得到
初始化,这样就可以通过递推法求出1->n模奇素数
的所有逆元了。
另外有个结论模
的所有逆元值对应
中所有的数,比如
,那么
对应的逆元是
。
typedef long long ll;
const int N = 1e5 + 5;
int inv[N];void inverse(int n, int p) {inv[1] = 1;for (int i=2; i<=n; ++i) {inv[i] = (ll) (p - p / i) * inv[p%i] % p;}
}
例题可以参考http://blog.csdn.net/acdreamers/article/details/8220787
逆元的几种求法(扩展欧几里得,费马小定理或欧拉定理,特例,打表等)相关推荐
- 费马小定理、欧拉定理与扩展欧拉定理(含证明)
这里就以自己做好的PPT图片的形式给出了:
- 逆元+费马小定理+扩展欧几里得
逆元:(即是逆元素)逆元素是指一个可以取消另一给定元素运算的元素. 在一个代数系统(S,*)中,存在单位元素e,如果对S内的元素a存在a^-1 * a = e,则将 a^-1称为a 的左逆元. 同理若 ...
- 扩展欧几里得的几个定理以及证明
扩展欧几里得的三个定理: 定理一:如果d = gcd(a, b),则必能找到正的或负的整数k和l,使d = a*x+ b*y. 定理二:若gcd(a, b) = 1,则方程ax ≡ c (mod b) ...
- 关于逆元(费马小定理,exgcd)
1.逆元是个什么东西 首先这里有个式子: ((( ab\frac{a}{b}ba ))) modmodmod ppp,这个式子的答案怎么求呢?? A 直接求不行吗? Q别想了不能.我们发现一个分数 ...
- 初等数论--同余--欧拉函数、欧拉定理、费马小定理
初等数论--同余--欧拉函数.欧拉定理.费马小定理 概念 同余类,既约同余类 欧拉函数 完全剩余系,既约剩余系 关于完全剩余系.既约剩余系一些比较简单的定理 欧拉定理.费马小定理 博主是初学初等数论( ...
- 取模除法(逆元)(费马小定理)(线性求逆元)
文章目录 引言 逆元 费马小定理 内容 应用 证明 线性求逆元 thanks for reading! 引言 我们做题时经常会由于答案过大,被要求使答案对一个质数取模 我们都知道,加和乘对取模是没有影 ...
- 除法取模与逆元/费马小定理
对于正整数和,如果有,那么把这个同余方程中的最小正整数解叫做模的逆元. 逆元一般用扩展欧几里得算法来求得,如果为素数,那么还可以根据费马小定理得到逆元为.(都要求a和m互质) 推导过程如下(摘自Acd ...
- 【BZOJ】3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合+乘法逆元+欧拉定理/费马小定理)...
http://www.lydsy.com/JudgeOnline/problem.php?id=3398 以下牡牛为a,牝牛为b. 学完排列计数后试着来写这题,"至少"一词可以给我 ...
- hihocoder #1698 假期计划 (排列组合+费马小定理+乘法逆元)
Description 小Ho未来有一个为期N天的假期,他计划在假期中看A部电影,刷B道编程题.为了劳逸结合,他决定先拿出若干天看电影,再拿出若干天刷题,最后再留若干天看电影.(若干代指大于0) 每 ...
最新文章
- WifiP2pService工作流程
- 杭电ACM刷题(1):1002,A + B Problem II
- Python语言学习之双下划线那些事:python和双下划线使用方法之详细攻略
- dynamic programming for knapsack with repeated items algorithm demonstration
- spring 学习 requestMapping
- Php与mssql数据交互
- mysql 创建查询 删除_MYSQL数据库查询删除创建企业基本知识
- wine mac 中文 方块乱码 解决
- 戴尔t140服务器价格型号,戴尔_PowerEdge T140塔式服务器_企业服务器_网络存储服务器 | Dell 中国大陆...
- phpredis 报错 “Function Redis::setTimeout() is deprecated” 解决方法
- 趣学 C 语言(十二)—— 文件操作
- sql语句ding_SQL语句映射文件增删改查、参数、缓存
- iptables模块功能中文介绍
- LSTM神经网络算法
- 2019你会被裁员吗?
- PassGAN阅读笔记
- win7怎样更改计算机密码,win7系统电脑怎么设置开机密码
- 精讲精练之图像分割经典算法——分水岭算法
- 面向对象以及三大特性
- ros 发布信息频率_ROS:消息发布器和订阅器(c++)
热门文章
- 用PPT做多种类型的交互练习题
- 欢聚时代(YY)2018笔试总结(数据挖掘方向)
- Godot背包系统(三)
- 学会了 Vim 还有必要用 GitHub Atom 或者 Sublime Text 么?
- c++图形库 allegro 开发(一)
- 人生何求知己,淡谈我的人生囧途(初一)
- 用java编程的单片机_单片机可以用java编程或经过技术手段来可以用java编程吗?...
- 坚果投影仪显示服务器异常,坚果投影仪风扇故障的原因是什么?如何解决风扇故障问题...
- ShareX - 功能强大、免费开源的 Windows 截图录屏工具,支持 OCR 识别和滚动截图等多种功能
- KT1025A蓝牙芯片的录音MP3功能支持TF卡和U盘录音详细功能说明_完整_V1.1