#include #include #include #include #define N 5using namespace std;int exgcd(int A,int &x,int B,int &y){ int x1,y1,x0,y0; x0=1;y0=0; x1=0;y1=1; int r=(A%B+B)%B; int q=(A-r)/B; x=0;y=1; while(r) { x=x0-q*x1; y=y0-q*y1; x0=x1; y0=y1; x1=x;y1=y; A=B;B=r;r=A%B; q=(A-r)/B; } return B;}int modq(int a,int n,int x,int y){int b=1; int d=exgcd(a,x,n,y); if(b%d==0) { x=(x%(n/d)+n/d)%(n/d); if(!x)x++; return x; } else printf("Not Exist\n");}//计算矩阵的行列式 int getA(int A[N][N],int n){ if(n==1) return A[0][0]; int num=0; int temp[N][N]={ 0.0}; int i,j,k; for(i=0;i =i) temp[j][k]=A[j+1][k+1]; else temp[j][k]=A[j+1][k]; } } int t=getA(temp,n-1); if(i%2==0) num+=A[0][i]*t; else num-=A[0][i]*t; } return num%26;}//求矩阵的伴随矩阵 void getAstart(int A[N][N],int n,int newA[N][N]) { if(n==1) { newA[0][0]=1; return; } int i,j,k,t; int temp[N][N]; for(i=0;i =i)?k+1:k][(t>=j)? t+1:t]; } } newA[j][i]=(getA(temp,n-1)); if((i+j)%2==1) newA[j][i]=-newA[j][i]; newA[j][i]=newA[j][i]%26; if(newA[j][i]<0) newA[j][i]=(newA[j][i]+26)%26; } }}//求矩阵的逆void getInverse(int A[N][N],int n,int I[N][N]){ int t[N][N]={ 0.0}; int flag=getA(A,n); int x,y; int e=modq(flag,26,x,y); if(e==0) return; else { getAstart(A,n,t); for(int i=0;i m) { int s=m; m=n;n=s; } r=m%n; while(r!=0) { m=n; n=r; r=m%n; if(r==0) { return n; } } }}bool IsInverse(int A[N][N],int n)//判断矩阵是否可作为密钥 { int t=getA(A,n); if(gcd(t,26)==1) return true; else return false;}vector change1(string s) //将明文密文转化为字母表中的次序,A为0,依次类推 { vector v; for(int i=0;i ='A'&&s[i]<='Z') v.push_back(s[i]-'A'); if(s[i]>='a'&&s[i]<='z') v.push_back(s[i]-'a');}return v; } string change2(vector v)//将字母的次序转化为小写字母 { string s=""; for(int i=0;i
v)//将字母的次序转化为大写字母 { string s=""; for(int i=0;i
mingnum; mingnum=change1(s); int rows=length/N; int lines=N; int mingmatrix[rows][lines]={ 0.0}; for(int i=0;i