逆元简录

(大部分摘录
如果 a,p不互质的话 a是没有逆元的
1.存在唯一性
对于 a 来说,它只会有一个,且一定有一个逆元。
这是为什么呢?
我们先假设 a 有两个不相等逆元: a'和 a'',
那么一定有:

(qquad qquad qquad qquad qquad qquad quad a*a'equiv a*a''equiv1)

不妨设(a'<a''且 a''-a'=k),那么
(qquad qquad qquad qquad qquad qquad ; a*(a''-k)equiv a*a'' pmod p)
(qquad qquad qquad qquad qquad qquad ;a∗a''−a∗k≡a∗a''pmod p)
(qquad qquad qquad qquad qquad qquad qquad a*kequiv0 pmod p)
由于(a eq 0,所以 kequiv 0pmod p ,即 a'equiv a''),与假设矛盾,所以 a 只能有一个逆元。

  • 完全积性函数:
    两个数的逆元的积等于这两个数积的逆元
  • (a*b^{-1}equiv a/b pmod p)

求法

  • (单个)求法一:枚举法
    枚举 kk ,检查是否满足 (a*kequiv1 pmod p)
  • (单个) 费马小定理:
    (当 p 为素数时, a^{p-1}equiv1pmod p。)
    (那么 a*a^{p-2}equiv1pmod p .)
    (x=a^{p-2})
  • (单个)求法三:扩展欧几里得
  • (批量)求法四:欧拉筛
  • (批量)求法五:线性递推

模板->线性递推(题解有一篇证得好)

#include<bits/stdc++.h>
#define re return
#define inc(i,l,r) for(int i=l;i<=r;++i)
typedef long long ll;
template<typename T>inline void rd(T&x)
{
    char c;bool f=0;
    while((c=getchar())<'0'||c>'9')if(c=='-')f=1;
    x=c^48;
    while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);
    if(f)x=-x;
}
using namespace std;
ll n,p,inv[3000006];
int main()
{
    rd(n),rd(p);
    inv[1]=1;
    printf("1
");
    inc(i,2,n)
        inv[i]=(p-p/i*inv[p%i]%p),printf("%d
",inv[i]);
}
原文地址:https://www.cnblogs.com/lsyyy/p/11252709.html