逆元的求法

Posted 努力努力再努力x

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逆元的求法相关的知识,希望对你有一定的参考价值。

乘法逆元

对于缩系中的元素,每个数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的范围中即可

 1 ll extgcd(ll a, ll b, ll& x, ll& y)
 2 //求解ax+by=gcd(a, b)
 3 //返回值为gcd(a, b)
 4 {
 5     ll d = a;
 6     if(b)
 7     {
 8         d = extgcd(b, a % b, y, x);
 9         y -= (a / b) * x;
10     }
11     else x = 1, y = 0;
12     return d;
13 }
14 ll mod_inverse(ll a, ll m)
15 //求解a关于模上m的逆元
16 //返回-1表示逆元不存在
17 {
18     ll x, y;
19     ll d = extgcd(a, m, x, y);
20     return d == 1 ? (m + x % m) % m : -1;
21 }

 

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比较大的时候需要用快速幂求解

还有逆元打表和特殊情况等坐到了题目再来整理

https://blog.csdn.net/guhaiteng/article/details/52123385

以上是关于逆元的求法的主要内容,如果未能解决你的问题,请参考以下文章

乘法逆元简单说说乘法逆元的求法

逆元的求法

总结四种逆元的求法

乘法逆元的求法(5种)

HDU 1576 -- A/B (总结乘法逆元的几种求法)

POJ 2478 欧拉函数(欧拉筛法) HDU 1576 逆元求法