乘法逆元
定义:
对于A,P两个整数,若存在x,使A*x=1 (mod P),则称x为A模P的乘法逆元。
解法:
对于给出A,P,我们要求x使Ax=1(mod P),即求出一组x,y,使满足方程Ax+P*y=1
用扩展欧几里得算法求解即可(求出x有可能为负数,注意题意是否允许这种情况)。
(1)当A,P互质,x有唯一解,否则x无解。
(2)逆元函数是完全积性函数。
证明:
定理(1):
充分性:当gcd(A,P)=1,根据裴蜀定理,有一组x,y,满足Ax+Py=gcd(A,P),
即Ax+Py=1
必要性:当x为A,P的乘法逆元,即Ax=1(mod P),则存在一组x,y,使Ax+P*y=1
由上同理可得,gcd(A,P) | 1,则必有gcd(A,P)=1
当A,P不互质,根据裴蜀定理,A,P的线性组合中最小的值为gcd(A,P),但由于gcd(A,P)>1,所以不存在Ax+Py=1
定理(2)
设Rem(a)为x模P的逆元
则 aRem(a)=1(mod P)
bRem(b)=1(mod P)
两式相乘,得:
(ab)Rem(a)Rem(b)=1(mod P)
即
Rem(ab)=Rem(a)Rem(b) (ab 与 P互质)
应用:
既然是乘法逆元,它主要就是为了把除法转换为乘法。
当我们要求(A/B) mod P=? ,我们可以求出B模P的逆元x,即Bx=1 (mod P)
两式相乘,得Ax=?(mod P)
这样,除法就被变为了乘法。
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll a,b,x,y;
void EX_gcd(ll a,ll b,ll &x,ll &y)
{
if (b==0)
{
x=1;y=0;
}
else
{
EX_gcd(b,a%b,y,x);
y-=(a/b)*x;
}
}
int main()
{
scanf("%d%d",&a,&b);
EX_gcd(a,b,x,y);
while (x<0) x+=b;
printf("%d\n",x);
return 0;
}
其他求法:
对于P为质数的特殊情况,根据费马小定理,有 A^(P-1)= 1(mod P)
所以A在mod P下的逆就是 A^(P-2) mod P

浙公网安备 33010602011771号