密码学中矩阵相关计算

  1 /**
  2  *矩阵计算类
3 */
4 class Matrix{
5
6 /*
7 * 根据字符串解析密钥矩阵
8 * param key 密钥
9 * param rank 密钥矩阵的阶
10 * return 返回密钥矩阵
11 */
12 public static int[][] getKeyMatrix(String key,int rank){
13 key=key.trim();
14 String[] akey=key.split(" ");
15 int key_len=akey.length;
16 int[][] pk=new int[rank][rank]; //密钥矩阵
17
18 for(int i=0;i<key_len;i++){
19 String num=akey[i];
20 int row=i/rank,col=i%rank;
21 pk[row][col]=num.charAt(0)-'0'; //初始化第一位
22 for(int j=1;j<num.length();j++){
23 pk[row][col]=pk[row][col]*10+num.charAt(j)-'0';
24 }
25 }
26 return pk;
27 }
28
29 /* 矩阵a、b相乘,返回矩阵c */
30 public static int[][] Multi(int[][] a,int[][] b){
31 int row=a.length,
32 col=b[0].length,
33 rank=b.length;
34 int[][] c=new int[row][col];
35
36 for(int i=0;i<row;i++){
37 for(int j=0;j<col;j++){
38 c[i][j]=0;
39 for(int k=0;k<rank;k++){
40 c[i][j]+=a[i][k]*b[k][j];
41 }
42 c[i][j]%=modular;
43 }
44 }
45 return c;
46 }
47
48 /*
49 * 计算行列式的值
50 * param n 矩阵的阶
51 * param N 矩阵
52 */
53 public static int Det(int n,int[][] matrix) {
54 if (n == 1) {
55 return matrix[0][0];
56 }
57 int[][] matrix2 = new int[n - 1][n - 1];
58 int result = 0;
59 for (int i = 0; i < n; i++) { // 去除第0行第i列
60 for (int j = 0; j < n-1; j++) {
61 for (int p = 0; p < i; p++) { // 上移一行
62 matrix2[j][p] = matrix[j + 1][p];
63 }
64 for (int q = i + 1; q < n; q++) { //右下往左上移
65 matrix2[j][q - 1] = matrix[j + 1][q];
66 }
67 }
68 result = result + (int) Math.pow(-1, i + 1) * matrix[0][i]
69 * Det(n - 1, matrix2);
70 }
71 return result;
72 }
73
74 /*转置矩阵*/
75 public static int[][] tranMatrix(int n,int[][] matrix){
76 for(int i=0;i<n;i++)
77 for(int j=i+1;j<n;j++){
78 int tmp=matrix[i][j];
79 matrix[i][j]=matrix[j][i];
80 matrix[j][i]=tmp;
81 }
82 return matrix;
83 }
84
85 /*代数余子式*/
86 public static int getAdjunct(int n,int[][] matrix,int r,int c){
87 int[][] matrix2 = new int[n - 1][n - 1];
88 int result=0;
89 for(int i=0;i<r;i++){ //上半部分
90 for(int j=0;j<c;j++) {
91 matrix2[i][j]=matrix[i][j];
92 }
93 for(int j=c;j<n-1;j++){
94 matrix2[i][j]=matrix[i][j+1];
95 }
96 }
97 for (int i = r; i < n-1; i++) { //下半部分
98 for (int p = 0; p < c; p++) {
99 matrix2[i][p] = matrix[i + 1][p];
100 }
101 for (int q = c + 1; q < n; q++) {
102 matrix2[i][q - 1] = matrix[i + 1][q];
103 }
104 }
105 result=Det(n-1, matrix2); //对matrix2求n-1阶行列式
106 if((r+c)%2==1) result=-result;
107 return result;
108 }
109
110 /*
111 * 矩阵的逆
112 *
113 */
114 public static int[][] ReverseMatrix(int n,int[][] matrix){
115 int[][] matrix2=new int[n][n];
116 for(int i=0;i<n;i++)
117 for(int j=0;j<n;j++)
118 matrix2[i][j]=matrix[i][j];
119
120 int det=Det(n, matrix);
121 NumberTheory.extended_gcd(det, modular);
122 int inverse=NumberTheory.x; //乘法逆元
123 while(inverse<0)
124 inverse+=26;
125 for (int i = 0; i < n; i++) {
126 for (int j = 0; j < n; j++) {
127 matrix2[i][j]=(inverse*getAdjunct(n, matrix, j, i))%modular;
128 while(matrix2[i][j]<0){
129 matrix2[i][j]+=modular;
130 }
131 }
132 }
133 return matrix2;
134 }
135 private static int modular=26;
136 }
137
138 class NumberTheory {
139 public static int extended_gcd(int a, int b) {
140 int ret, tmp;
141 if (b == 0) {
142 x = 1;
143 y = 0;
144 return a;
145 }
146 ret = extended_gcd(b, a % b);
147 tmp = x;
148 x = y;
149 y = tmp - a / b * y;
150 return ret;
151 }
152 public static int x,y;
153 public final static int modular=26;
154 }

没有用泛型,不过都测试过了~  

涉及到数论中的内容请参考:扩展的欧几里得&中国剩余定理

PS:网络外风景独好,远离电脑,^_^愚人节快乐!

原文地址:https://www.cnblogs.com/Seiyagoo/p/2427733.html