Advertisement
Guest User

M.java

a guest
Apr 25th, 2015
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.29 KB | None | 0 0
  1. package curse;
  2.  
  3. import java.util.Arrays;
  4.  
  5. public class M {
  6.     int q = R.mod;//характеристика поля
  7.     static int n = 7; //размер матрицы
  8.     int[][] m = new int[n][n]; //элементы
  9.    
  10.     M(int[][] t){ //конструктор
  11.         for (int i = 0; i < n; i++)
  12.             for (int j = 0; j < n; j++){
  13.                 this.m[i][j] = (t[i][j])%q;
  14.             }
  15.     }
  16.    
  17.     @Override
  18.     public boolean equals(Object matr) {
  19.         return Arrays.deepEquals(this.m, ((M)matr).m);
  20.     }
  21.    
  22.     @Override
  23.     public int hashCode(){
  24.         return Arrays.deepHashCode(this.m);
  25.      }
  26.    
  27.     M plus(M sl){//сложить матрицу с другой
  28.         int[][] res = new int[n][n];
  29.         for (int i = 0; i < n; i++)
  30.             for (int j = 0; j < n; j++){
  31.                 res[i][j] = (m[i][j]+sl.rel(i,j))%q;
  32.             }
  33.         M result = new M(res);
  34.         return result;
  35.     }
  36.    
  37.     M mult(M mn){//умножить матрицу на другую
  38.         int[][] res = new int[n][n];
  39.         for (int i = 0; i < n; i++)
  40.             for (int j = 0; j < n; j++){
  41.                 res[i][j] = 0;
  42.                 for (int k = 0; k < n; k++) (res[i][j]) += (m[i][k]*mn.rel(k,j));
  43.                 res[i][j] = (res[i][j])%q;
  44.             }
  45.         M result = new M(res);
  46.         return result;
  47.     }
  48.    
  49.     M scal(int k){//умножить матрицу на число
  50.         int[][] res = new int[n][n];
  51.         for (int i = 0; i < n; i++)
  52.             for (int j = 0; j < n; j++){
  53.                 res[i][j] = (m[i][j]*k)%q;
  54.             }
  55.         M result = new M(res);
  56.         return result;
  57.     }
  58.    
  59.     M deg(int k){//возвести матрицу в степень
  60.         M self = new M(m); //дубликат матрицы
  61.         int[][] res = new int[n][n];
  62.         for (int i = 0; i < n; i++) res[i][i] = 1;
  63.         M result = new M(res); //единичная матрица
  64.         for (int i = 0; i < k; i++) {
  65.             result = result.mult(self); //накапливаем степень себя
  66.         }
  67.         return result;
  68.     }
  69.    
  70.     M exp(){//экспонента матрицы
  71.         M self = new M(m); //дубликат матрицы
  72.         int[][] res = new int[n][n];
  73.         for (int i = 0; i < n; i++) res[i][i] = 1;
  74.         M result = new M(res); //единичная матрица
  75.         int t = 1;
  76.         int f = 1;
  77.         while((self.deg(t)).zero()!=0){//пока степень не занулится
  78.             R c = new R(f);
  79.             result = result.plus((self.deg(t)).scal(c.r()));
  80.             t++;
  81.             f *= t;
  82.         }
  83.         return result;
  84.     }
  85.    
  86.     M rev(){
  87.         M self = new M(m); //дубликат матрицы
  88.         int[][] res = new int[n][n];
  89.         for (int i = 0; i < n; i++) res[i][i] = 1;
  90.         M result = new M(res); //единичная матрица
  91.         for (int i = 0; i < n; i++){ //идём по столбцам
  92.             int temp;
  93.             int j = 0;
  94.             while(self.m[j][i] == 0) j++;
  95.             for(int k = 0; k < n; k++){ // меняем строки местами, чтобы на нужном месте иметь полож. число
  96.                 temp = self.m[i][k];
  97.                 self.m[i][k] = self.m[j][k];
  98.                 self.m[j][k] = temp;
  99.                 temp = result.m[i][k];
  100.                 result.m[i][k] = result.m[j][k];
  101.                 result.m[j][k] = temp;
  102.             }
  103.             for(int k = 0; k < n; k++){ //делаем нужный коэффициент единичным
  104.                 R obr = new R(self.m[i][k]);
  105.                 self.m[i][k] = (self.m[i][k]*obr.r())%q;
  106.                 result.m[i][k] = (result.m[i][k]*obr.r())%q;
  107.             }
  108.             for(int k = 0; k < n; k++){//вычитаем из остальных строк данную с нужным коэффициентом
  109.                 if(k != i){
  110.                     for(int l = 0; l < n; l++){
  111.                         self.m[k][l] = (self.m[k][l] - self.m[k][i]*self.m[i][l])%q;
  112.                         result.m[k][l] = (result.m[k][l] - result.m[k][i]*result.m[i][l])%q;
  113.                     }
  114.                 }
  115.             }
  116.         }
  117.         return result;
  118.     }
  119.    
  120.     M Ad(M x){
  121.         M self = new M(m); //дубликат матрицы
  122.         int[][] res = new int[n][n];
  123.         for (int i = 0; i < n; i++)
  124.             for (int j = 0; j < n; j++){
  125.                 res[i][j] = 0;
  126.             }
  127.         return self.mult(x.mult(self.rev()));
  128.     }
  129.    
  130.     int rel(int i, int j){//вернуть ij-й элемент матрицы
  131.         return m[i][j];
  132.     }
  133.    
  134.     int zero(){//проверить, является ли матрица нулевой
  135.         int k = 0; //индикатор
  136.         for (int i = 0; i < n; i++)
  137.             for (int j = 0; j < n; j++){
  138.                 if(m[i][j] != 0) k++;
  139.             }
  140.         return k;
  141.     }
  142.    
  143.     void print(){//напечатать матрицу
  144.         for (int i = 0; i < n; i++){
  145.             for (int j = 0; j < n; j++){
  146.                 System.out.print(m[i][j] + " ");
  147.             }
  148.             System.out.print("\n");
  149.         }
  150.     }
  151.  
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement