定义
乘法逆元的定义:若存在正整数a,b,p, 满足ab = 1(mod p), 则称a 是b 的乘法逆元, 或称b 是a 的乘法逆元。b ≡ a-1 (mod p),a ≡ b-1 (mod p)
比如说, 在模7 意义下,3 的乘法逆元是5, 也可以说模7 意义下5的乘法逆元是3。模13意义下5的逆元是8……
存在性
看起来和同余方程很相似(其实下面真的可以用exgcd求的!),在同余方程中
ab ≡ 1(mod p)
若a 与p 互质, 则一定存在一个正整数解b, 满足b < p,若a 与p 不互质, 则一定不存在正整数解b.
所以逆元要求a与p互质
求法
求逆元有三种求法,
1、扩展欧几里得
可以用扩展欧几里得求,那么是怎么个求法呢?
扩展欧几里得是用来求这样的一组解的:ax+by = gcd(a,b),求x和y,(求出x后自然知道了y,所以算是求一个x)。
逆元呢是求这样的一个解:ax ≡ 1 (mod b),(为了方便理解,改了一下变量名),求x,貌似并没有一点点相似处,那么我们变一下,
ax+by = gcd(a,b),变成 ax+by = c;
ax ≡ 1 (mod b),变成 ax-by = 1;如果将y看成负的,ax+by = 1;
完全一样嘛,所以直接套用扩展欧几里得求就好了。
代码
1 #include<cstdio> 2 3 int exgcd(int a,int b,int &x,int &y) 4 { 5 if (b==0) 6 { 7 x = 1; 8 y = 0; 9 return a; 10 } 11 int r = exgcd(b,a%b,x,y); 12 int tmp = x; 13 x = y; 14 y = tmp-a/b*y; 15 return r; 16 } 17 18 int main() 19 { 20 //gcd(a,p)==1 21 int a,p,r,x,y; 22 while (scanf("%d%d",&a,&p)!=EOF) 23 { 24 r = exgcd(a,p,x,y); 25 printf("%d",(x%p+p)%p); 26 } 27 return 0; 28 }