逆元

逆元(inverse element)是在取模意义下,不能直接除以一个数,而要乘以它的逆元;a*b ≡\equiv≡ 1 (mod p) , 那么a和b互为模p意义下的逆元,比如要计算(x/a)%p,可以写成x*b%p

方法一

费马小定理

若P为素数,则 ap−1{a^{p-1}}ap−1 ≡\equiv≡ 1 (mod p) 【费马小定理】
即:ap−2{a^{p-2}}ap−2 *a ≡\equiv≡ 1 (mod p)
所以ap−2{a^{p-2}}ap−2就是a在模p意义下的逆元

const LL mod = 1e9+7;
//快速幂
LL fastPow(LL a,LL b){LL ans=1;while(b){if(b&1)ans=(ans*a)%mod;a=(a*a)%mod;b>>=1;}return ans;
}
//求x的逆元
LL inv(LL x){return fastPow(x,mod-2);
}

欧拉定理

若a和p互素(P不一定是素数),则aϕ(p){a^{\phi{(p)}}}aϕ(p) ≡\equiv≡ 1 (mod p)
即 aϕ(p)−1∗a{a^{\phi{(p)}-1}}*aaϕ(p)−1∗a ≡\equiv≡ 1 (mod p)
所以aϕ(p)−1{a^{\phi{(p)}-1}}aϕ(p)−1 就是a在模p意义下的逆元

联系

ϕ(p){\phi{(p)}}ϕ(p)称为欧拉函数,表示小于等于P且与P互素的个数,显然若p为素数,则ϕ(p)=p−1{\phi{(p)}}=p-1ϕ(p)=p−1

const LL mod = 1e9+7;
//求欧拉函数
long long phi(long long x)
{long long res = x;for(long long i=2;i*i<=x;i++){if(x%i==0){res = res/i*(i-1);//res -= res/i;while(x%i==0)x/=i;}}if(x>1)res =res/x*(x-1);//res -= res/x;return res;
}
//快速幂
LL fastPow(LL a,LL b){LL ans=1;while(b){if(b&1)ans=(ans*a)%mod;a=(a*a)%mod;b>>=1;}return ans;
}
//求x的逆元
LL inv(LL x){return fastPow(x,phi(mod)-1);
}

方法二

扩展欧几里得算法

a*b ≡\equiv≡ 1 (mod p)
a * b+k * p = 1
a就是要求的逆元

LL exgcd(LL a,LL b,LL &x,LL &y)//扩展欧几里得算法
{if(b==0){x=1,y=0;return a;}LL ret=exgcd(b,a%b,y,x);y-=a/b*x;return ret;
}
LL getInv(LL a,LL mod)//求a在mod下的逆元,不存在逆元返回-1
{LL x,y;LL d=exgcd(a,mod,x,y);return d==1?(x%mod+mod)%mod:-1;
}

方法三:递推求逆元

P是模数,i是待求的逆元,我们求的是i−1{i^{-1}}i−1在mod P意义下的值
p=k*i+r,若(r<i),则有k=p/i,r=p%i
k * i+r ≡\equiv≡ 1 (mod p)
两边同时除以i*r, k∗r−1+i−1≡0(modP){k*r^{-1}+i^{-1} \equiv 0 (mod P) }k∗r−1+i−1≡0(modP)
移项得:i−1≡−k∗r−1(modP){i^{-1} \equiv -k*r^{-1} (mod P) }i−1≡−k∗r−1(modP)
即:i−1≡−p/i{i^{-1} \equiv -p/i}i−1≡−p/i * inv[i % mod p]
边界条件是 inv[1]=1

LL inv[mod+5];
void getInv(LL mod)
{inv[1]=1;for(int i=2;i<mod;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}

乘法逆元总结 3种基本方法相关推荐

  1. 乘法逆元的三种求解方法

    目录 乘法逆元小结 逆元的定义 求解逆元的方法 1. 快速幂 测试代码 2.拓展欧几里得 测试代码 3.线性算法 例题 AC代码 乘法逆元小结 参考自:点击此处 乘法逆元,一般用于求(a / b)(m ...

  2. c语言for循环打印九九乘法口诀的三种简单方法

    c语言for循环打印九九乘法口诀的三种简单方法 由于在学习c语言,今天在复习巩固知识,练习代码的时候,简单的总结了三种for循环打印九九乘法口诀的方法,加深了自己的理解.代码注释和简单的思路已经注释在 ...

  3. 求乘法逆元的几种方法

    (数学渣,下面的文字可能有误,欢迎指教) 乘法逆元的定义貌似是基于群给出的,比较简单地理解,可以说是倒数的概念的推广.记a的关于模p的逆元为a^-1,则a^-1满足aa^-1≡ 1(mod p) 加减 ...

  4. java求乘法逆元的代码_求乘法逆元的几种方法

    (数学渣,下面的文字可能有误,欢迎指教) 乘法逆元的定义貌似是基于群给出的,比较简单地理解,可以说是倒数的概念的推广.记a的关于模p的逆元为a^-1,则a^-1满足aa^-1≡ 1(mod p) 加减 ...

  5. 乘法逆元的几种计算方法

    乘法逆元是数论中重要的内容,也是 ACM 中常用到的数论算法之一.所以,如何高效的求出乘法逆元是一个值得研究的问题. 这里我们只讨论当模数为素数的情况,因为如果模数不为素数,则不一定每个数都有逆元. ...

  6. 计蒜客 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B coin(求乘法逆元)

    Bob has a not even coin, every time he tosses the coin, the probability that the coin's front face u ...

  7. 乘法逆元3种方法总结[最全]

    建议大家可以先去看看这篇博文 (https://www.cnblogs.com/dupengcheng/p/5487362.html) 乘法逆元:ax≡1 (mod p) 这个等式用中文描述就是 a乘 ...

  8. 乘法逆元通俗易懂的理解方法

    最近,发现数论真的很重要,基本上一套题必出一个数论的题.故接下来,要好好的看一看数论了. 乘法逆元我觉得其本质:就是数论里的倒数. 由上图你会发现:其取模的运算不满足除法的分配律,那么如何求除法的模运 ...

  9. 金字塔型php的9x9乘法口诀表,python中打印金字塔和九九乘法表的几种方法

    # 打印九九乘法表 for i in range(1,10): for j in range(1,i+1): # x=i*j # print(i,'*',j,'=',x,end=' ') print( ...

最新文章

  1. ios开发学习-手势交互(Gesture)效果源码分享
  2. c语言函数与编译预处理教学视频,C语言课程第6章 函数及编译预处理.ppt
  3. AI:2020年6月21日北京智源大会演讲分享之20:00-21:00邱锡鹏教授《如何学习深度学习》
  4. [Java基础] Properties类的基本操作和介绍
  5. java数据库编程——Insert and Retrieve Images from MySql Table Using Java
  6. mac brew install nginx遇到的坑
  7. python 八数码_python 处理八数码 双向BFS 拼图游戏 | 学步园
  8. ICMPv6报文详解
  9. Jquery ajax异步请求样板
  10. linux dstat rpm,dstat监控工具介绍
  11. xeon e5-2400 系列处理器能做四路服务器吗?,至强处理器E5-2400系列双路云服务器推出...
  12. Origin数据设置为日期/时间的方法
  13. python用于财务数据分析_财务数据分析进阶之路
  14. Java Swing写简单计算器以及拓展贷款计算器(等额本息和等额本金计算可以单独拿出来用)
  15. PPT保存pps演示文档时,在另一个电脑中字体显示不正常!(已解决)
  16. Unity 摄像头实时扫描二维码
  17. 如何打开VoLTE,ViLTE,VoWifi Feature
  18. 【TS】<T> 泛型
  19. Linux tar命令一个有用的参数--strip-component
  20. html中可以打钩的小方块,Word文档怎么实现在小方块里打钩? | 我爱分享网

热门文章

  1. React-Native系列Android——Native与Javascript通信原理(一)
  2. 《Python 数据分析》笔记——pandas
  3. Check for Palindromes(算法)
  4. BAT笔试试题常见试题总结含答案(持续更新。。。)
  5. Codeforces Round #321 (Div. 2) Kefa and Company 二分
  6. 什么是进程控制块,他有什么用?
  7. Microsoft SQL Server 2008技术内幕:T-SQL查询---------查询优化
  8. iOS内存暴增问题追查与使用陷阱
  9. C#Windows 服务制作安装删除. 用户注销后,程序继续运行 (转载)
  10. 类的加载顺序和静态代码块和匿名代码块的区别