先上参考资料
https://www.bilibili.com/video/av35557954
https://blog.csdn.net/AAMahone/article/details/79320635
首先要明确,乘法逆元是什么
对于ax mod p = 1
这时,x就是a 在mod p乘法群的乘法逆元
那只介绍一种求逆元的方法。
就是通过拓展欧几里得算法,得到ax + py = gcd(a,p)
因为a属于模p乘法群,所以a<p,所以a与p互素,则有gcd(a,p)=1
即 ax + py = 1
有了这个,我们就可以两边求mod p
即有 ax = 1(mod p),即此时的x就是乘法逆元。
#include<iostream>
using namespace std;
int exgcd(int a,int b,int &x,int &y){
if(b==0)
{ //最里面ax+0=a的情况,注意此时a经过多次递归已经不是刚开始的啊
x=1;
y=0;
return a;
}
//要先调用ngcd来进到最里层确定x,y的值,从逐步到外层计算出x,y
int ngcd = exgcd(b,a%b,x,y);
//根据相关理论有如下的逆公式 x==y1,y==x1-a/b*y1
int temp = x;
x = y;
y = temp - a/b*y;
return ngcd;
}
int inverse(int a, int p){
int x,y,gcd;
gcd = exgcd(a,p,x,y);
if(gcd==1){
x=(x%p+p)%p;//保证x为正数;
return x;
} else{
cout<<"a,p不互质";
return 0;
}
}
int main(){
//实际上是求ax + py = gcd(a,p) = 1 /a,p互质
int a,p;
cout<<"请输入 a p"<<endl;
cin>>a>>p;
cout<<"a mod p的乘法逆元是"<<inverse(a,p);
return 0;
}
python
def ext_gcd(a, b):
if b == 0:
x1 = 1
y1 = 0
x = x1
y = y1
r = a
return r, x, y
else:
r, x1, y1 = ext_gcd(b, a % b)
x = y1
y = x1 - a / b * y1
return r, x, y
版权声明:本文为weixin_43399037原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。