求逆元的几种方法

逆元在数论中是一个重要的概念,主要是用于在模意义下的除法运算.

,则称b在模p意义下是a的逆元.

逆元在p是质数的情况下主要有三种求法:

1.费马小定理求逆元

因为费马小定理的标准格式是,在p是质数的情况下,.

所以a^(p-2)就是a的逆元,直接一个快速幂就可以了.

若p不是质数,我们就可以用欧拉定理推.

关于欧拉定理和费马小定理.

2.扩欧求逆元

我们可以设x=a的逆元,则我们可以这样推导公式:


那么这就是一个标准的扩欧式子了.

关于扩展欧几里得.

3.线性推逆元

要是要让我们直接筛出1~n的逆元,虽然费马小定理和扩欧的时间复杂度都不错,是O(nlog(p))的.

但是我们还有一种直接O(n)计算的算法.


然后就可以线性推了,三行代码如下:

f[1]=1;
for (int i=2;i<=n;i++)
  f[i]=(p-p/i)*f[p%i]%p;

猜你喜欢

转载自blog.csdn.net/hzk_cpp/article/details/81009456