乘法逆元:
设ax≡1%b,则称x为a关于模b的乘法逆元。
Q:为什么要使用乘法逆元呢?
A:假设要求(a/b)%c,a非常大(求出a的过程超出整型范围)无法直接求出值,所以希望可以想但是除法没有对应的模算术,所以出现了乘法逆元。
证明:
设bx≡1%c,则b*x=p*c+1得x=(p*c+1)/b
把x带入(a*x)%c中,
变为 [a*(p*c+1)/b]%c
=[(a*(p*c)/b)%c+a/b]%c (因为[c*(a*p)/b]%c=0)
=(a/b)%c
乘法逆元的求法:(扩展欧几里德算法)
求解ax≡1%b
ax=by+1得ax-by=1,则a,b必然是互质的。如果不互质则无解。
参考白书:
void gcd(int a,int b,int& d,int& x,int& y)
{
if(b==0){d=a;x=1;y=0;}
else {gcd(b,a%b,d,y,x);y-=x*(a/b);}
}
int inv(int a,int n)
{
int d,x,y;
gcd(a,n,d,x,y);
return d==1?(x+n)%n:-1;
}//互质才能有正确的答案