Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package curse;
- import java.util.Arrays;
- public class M {
- int q = R.mod;//характеристика поля
- static int n = 7; //размер матрицы
- int[][] m = new int[n][n]; //элементы
- M(int[][] t){ //конструктор
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++){
- this.m[i][j] = (t[i][j])%q;
- }
- }
- @Override
- public boolean equals(Object matr) {
- return Arrays.deepEquals(this.m, ((M)matr).m);
- }
- @Override
- public int hashCode(){
- return Arrays.deepHashCode(this.m);
- }
- M plus(M sl){//сложить матрицу с другой
- int[][] res = new int[n][n];
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++){
- res[i][j] = (m[i][j]+sl.rel(i,j))%q;
- }
- M result = new M(res);
- return result;
- }
- M mult(M mn){//умножить матрицу на другую
- int[][] res = new int[n][n];
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++){
- res[i][j] = 0;
- for (int k = 0; k < n; k++) (res[i][j]) += (m[i][k]*mn.rel(k,j));
- res[i][j] = (res[i][j])%q;
- }
- M result = new M(res);
- return result;
- }
- M scal(int k){//умножить матрицу на число
- int[][] res = new int[n][n];
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++){
- res[i][j] = (m[i][j]*k)%q;
- }
- M result = new M(res);
- return result;
- }
- M deg(int k){//возвести матрицу в степень
- M self = new M(m); //дубликат матрицы
- int[][] res = new int[n][n];
- for (int i = 0; i < n; i++) res[i][i] = 1;
- M result = new M(res); //единичная матрица
- for (int i = 0; i < k; i++) {
- result = result.mult(self); //накапливаем степень себя
- }
- return result;
- }
- M exp(){//экспонента матрицы
- M self = new M(m); //дубликат матрицы
- int[][] res = new int[n][n];
- for (int i = 0; i < n; i++) res[i][i] = 1;
- M result = new M(res); //единичная матрица
- int t = 1;
- int f = 1;
- while((self.deg(t)).zero()!=0){//пока степень не занулится
- R c = new R(f);
- result = result.plus((self.deg(t)).scal(c.r()));
- t++;
- f *= t;
- }
- return result;
- }
- M rev(){
- M self = new M(m); //дубликат матрицы
- int[][] res = new int[n][n];
- for (int i = 0; i < n; i++) res[i][i] = 1;
- M result = new M(res); //единичная матрица
- for (int i = 0; i < n; i++){ //идём по столбцам
- int temp;
- int j = 0;
- while(self.m[j][i] == 0) j++;
- for(int k = 0; k < n; k++){ // меняем строки местами, чтобы на нужном месте иметь полож. число
- temp = self.m[i][k];
- self.m[i][k] = self.m[j][k];
- self.m[j][k] = temp;
- temp = result.m[i][k];
- result.m[i][k] = result.m[j][k];
- result.m[j][k] = temp;
- }
- for(int k = 0; k < n; k++){ //делаем нужный коэффициент единичным
- R obr = new R(self.m[i][k]);
- self.m[i][k] = (self.m[i][k]*obr.r())%q;
- result.m[i][k] = (result.m[i][k]*obr.r())%q;
- }
- for(int k = 0; k < n; k++){//вычитаем из остальных строк данную с нужным коэффициентом
- if(k != i){
- for(int l = 0; l < n; l++){
- self.m[k][l] = (self.m[k][l] - self.m[k][i]*self.m[i][l])%q;
- result.m[k][l] = (result.m[k][l] - result.m[k][i]*result.m[i][l])%q;
- }
- }
- }
- }
- return result;
- }
- M Ad(M x){
- M self = new M(m); //дубликат матрицы
- int[][] res = new int[n][n];
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++){
- res[i][j] = 0;
- }
- return self.mult(x.mult(self.rev()));
- }
- int rel(int i, int j){//вернуть ij-й элемент матрицы
- return m[i][j];
- }
- int zero(){//проверить, является ли матрица нулевой
- int k = 0; //индикатор
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++){
- if(m[i][j] != 0) k++;
- }
- return k;
- }
- void print(){//напечатать матрицу
- for (int i = 0; i < n; i++){
- for (int j = 0; j < n; j++){
- System.out.print(m[i][j] + " ");
- }
- System.out.print("\n");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement