乘法逆元

定义:

对于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)
b
Rem(b)=1(mod P)
两式相乘,得:
(ab)Rem(a)Rem(b)=1(mod P)

Rem(a
b)=Rem(a)Rem(b) (ab 与 P互质)


应用:

既然是乘法逆元,它主要就是为了把除法转换为乘法。

当我们要求(A/B) mod P=? ,我们可以求出B模P的逆元x,即Bx=1 (mod P)
两式相乘,得A
x=?(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

posted @ 2016-01-30 20:47  Krew  阅读(280)  评论(0)    收藏  举报