逆元简录
(大部分摘录)
如果 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]);
}