定义

乘法逆元的定义:若存在正整数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 }
扩展欧几里得求逆元

相关文章:

猜你喜欢
  • 2022-12-23
  • 2021-11-18
相关资源
相似解决方案