逆元简录

(大部分摘录
如果 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*k\equiv0 \pmod p\)
由于\(a\neq 0,所以 k\equiv 0\pmod p ,即 a'\equiv a''\),与假设矛盾,所以 a 只能有一个逆元。

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

求法

  • (单个)求法一:枚举法
    枚举 kk ,检查是否满足 \(a*k\equiv1 \pmod p\)
  • (单个) 费马小定理:
    \(当 p 为素数时, a^{p-1}\equiv1\pmod p。\)
    \(那么 a*a^{p-2}\equiv1\pmod 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\n");
    inc(i,2,n)
        inv[i]=(p-p/i*inv[p%i]%p),printf("%d\n",inv[i]);
}
posted @ 2019-07-26 20:31  凉如水  阅读(110)  评论(0编辑  收藏  举报