擴充套件歐幾里得(Extended Euclid)演算法求最大公約數和乘法逆元
阿新 • • 發佈:2019-01-31
密碼學課本里面使用到的一個十分簡單的演算法,老師佈置的作業,就寫了一下...程式碼挺腦殘的,只要知道演算法的步驟,很好實現。
程式碼:
#include<iostream> using namespace std; int a[3][3]; int count=0; bool ext_euc() { if(a[1][2]==0) return false; if(a[1][2]==1) return true; int q=a[0][2]/a[1][2]; for(int i=0;i<3;i++) a[2][i]=a[0][i]-q*a[1][i]; for(int i=0;i<3;i++) a[0][i]=a[1][i]; for(int i=0;i<3;i++) a[1][i]=a[2][i]; cout<<++count<<"\t"<<q<<"\t"; for(int i=0;i<2;i++) { for(int j=0;j<3;j++) cout<<a[i][j]<<"\t"; } cout<<endl; return ext_euc(); } int main() { a[0][0]=1; a[0][1]=0; a[1][0]=0; a[1][1]=1; cout<<"Input f and d:"<<endl; int f,d; cin>>f>>d; a[0][2]=f; a[1][2]=d; cout<<endl<<"Rount\tQ\tX1\tX2\tX3\tY1\tY2\tY3\t"<<endl; cout<<"——————————————————————————"<<endl; cout<<count<<"\t"<<"-\t"; for(int i=0;i<2;i++) { for(int j=0;j<3;j++) cout<<a[i][j]<<"\t"; } cout<<endl; bool flag=ext_euc(); cout<<endl<<"RESULT:"<<endl; if(!flag) { cout<<"No Inverse!!!"<<endl; cout<<"gac("<<f<<","<<d<<")="<<a[0][2]<<endl; return 0; } cout<<"Success!"<<endl; cout<<"gac("<<f<<","<<d<<")="<<a[1][2]<<endl; cout<<"inv("<<d<<")(mod"<<f<<")="<<a[1][1]<<endl; cout<<endl; }