零 乘法逆元
对于缩系中的元素,每个数a均有唯一的与之对应的乘法逆元x,使得 ax≡1(mod n) 。
一个数有逆元的充分必要条件是 gcd(a,n)=1 ,此时逆元唯一存在。
逆元的含义:模 n 意义下,1个数 a 如果有逆元 x ,那么除以 a 相当于乘以 x 。
一 扩展欧几里得求逆元
将方程 ax=1(mod m) 转化为 ax+my=1 ,套用求二元一次方程的方法,用扩展欧几里得算法求得一组 x0,y0 和 gcd。当 gcd=1 时逆元存在,调整 x0 在 [0,m-1] 的范围内即可。时间复杂度为O(ln n)。
1 typedef long long ll; 2 void extgcd(ll a,ll b,ll& d,ll& x,ll& y){ 3 if(!b){ d=a; x=1; y=0;} 4 else{ extgcd(b,a%b,d,y,x); y-=x*(a/b); } 5 } 6 ll inverse(ll a,ll n){ 7 ll d,x,y; 8 extgcd(a,n,d,x,y); 9 return d==1?(x+n)%n:-1; 10 }
二 费马小定理求逆元