当前位置:文档之家› 扩展欧几里德算法计算乘法逆元

扩展欧几里德算法计算乘法逆元

扩展欧几里德算法计算乘法逆元
一.欧几里德算法
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。

其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b)
欧几里德算法就是根据这个原理来做的,其算法用C++语言描述为:
void swap(int & a, int & b) {
int c = a
a = b;
b = c;
}
int gcd(int a,int b){
if(0 == a ){
return b;
}
if( 0 == b){
return a;
}
if(a > b){
swap(a,b);
}
int c;
for(c = a % b ; c > 0 ; c = a % b){
a = b;
b = c;
}
return b;
}
二.扩展欧几里德算法乘法逆元
模P乘法逆元
对于整数a、p,如果存在整数b,满足ab mod p =1,则说,b是a的模p乘法逆元。

定理:a存在模p的乘法逆元的充要条件是gcd(a,p) = 1
三.扩展欧几里德算法如下:
#include <iostream.h>
int gcd(int a, int b , int &ar,int &br){
int x1,x2,x3;
int y1,y2,y3;
int t1,t2,t3;
int k;
if(0 == a){
//有一个数为0,就不存在乘法逆元
ar = 0;
br = 0;
return b;
}
if(0 == b) {
ar = 0;
br = 0 ;
return a;
}
x1 = 1;
x2 = 0;
x3 = a;
y1 = 0;
y2 = 1;
y3 = b;
for(t3 = x3 % y3 ; t3 != 0 ; t3 = x3 % y3){ k = x3/y3;
t2 = x2-k*y2;
t1 = x1-k*y1;
x1 = y1;
x1 = y2;
x3 = y3;
y1 = t1;
y2 = t2;
y3 = t3;
}
if( y3 == 1){
//有乘法逆元
ar = y2;
br = x1;
return 1;
}else{
//公约数不为1,无乘法逆元
ar = 0;
br = 0;
return y3;
}
}
int main(){
int a,b;
int ar,br;
int r;
cin>>a ;
cin>> b ;
r = gcd(a,b,ar,br);
cout<<"\n最大公约数:"<<r<<endl; cout<<"\n乘法逆元:"<<ar<<endl; cout<<"\n乘法逆元:"<<br<<endl; return 0;
}
四.程序分析
本程序只是很简单描述了一般情况下的扩展欧几里德算法乘法逆元,当给出的两个数如果最大公因数不为一时,则无乘法逆元,将他们的逆元都设置为0,当给出的数只要有一个为零,则没有乘法逆元。

五.序运行环境
本程序采用用C++语言编写,编译,链接,运行都是在MinGW Developer Studio 平台下进行的。

六.程序运行结果如下:。

相关主题