用扩展欧几里得求解的乘法逆原理:
ax=1 mod (n)
ax+ny=1
如7=1mod(15)
7*13-(15*6)=1.
13为7的逆元。
求解出的x就是a的逆元。
实现:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void gcd(int a,int b,int &d,int &x,int &y,){
if(!b){d=a;x=1;b=0;}
else{b,a%b,d,y,x};{y-=x*(a/b);}
}
ll inv(ll a,ll n){
ll d,x,y;
gcd(a,n,d,x,y);
return d==1 ? (x+n)%n : -1;
}
另一种方法是由欧拉定理得:
a∈Zn* ,a^ϕ(k)=1(mod n)
a*a^(ϕ(n)-1)=1(mod n)
所以a的逆为a^(ϕ(n)-1)
如果n是素数的话,ϕ(n)=n-1,a的逆可直接用pow_mod(a,n-2,n)求出。
pow_mod(ll a,ll p,ll n){
if(p==0) return 1;
ll ans=pow_mod(a,p/2,n);
ans=ans*ans%n;
if(p%2==1) ans=ans*a%n;
return ans;
}