[Java] 密码学中矩阵相关计算(矩阵计算类) →→→→→进入此内容的聊天室

来自 , 2021-03-26, 写在 Java, 查看 135 次.
URL http://www.code666.cn/view/192fc044
  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.  }

回复 "密码学中矩阵相关计算(矩阵计算类)"

这儿你可以回复上面这条便签

captcha