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