class Matrica3x3
{
     double[][] A = new double [3][3];
     int i,j;
     
Matrica3x3()
 {
 double B [][]={{1,0,0},{0,1,0},{0,0,1}};
 A=B;
 
}
Matrica3x3(Vektorius3D a,Vektorius3D b, Vektorius3D c){
  double B[][] = {{a.x,b.x,c.x},{a.y,b.y,c.y},{a.z,b.z,c.z}};
  A=B;

}

void nulink()
{

    double [][] B = {{0,0,0},{0,0,0},{0,0,0}};
     A=B;
    }


void spausdinkVisus(){


   for (int i=0; i<A.length; i++) {
  for (int j=0; j<A[i].length; j++) {
  System.out.print(" " + A[j][i]);
  }
  System.out.println("");
  }}
  
  void spausdinkVisus(double[][] a){

   for (int i=0; i<a.length; i++) {
  for (int j=0; j<a[i].length; j++) {
  System.out.print(" " + a[i][j]);
  }
  System.out.println("");
  }}


void transponuok(){
  double [][] B = {{A[0][0],A[1][0],A[2][0]},{A[0][1],A[1][1],A[2][1]},
  {A[0][2],A[1][2],A[2][2]}};
  A=B;
  }

void laipsnis(int n){
double a[][]= new double[3][3];
    for ( int r = 0; r < 3; r++){
       for ( int c = 0; c < 3; c++ ){
             a[r][c] = A[r][c];}}    


  for (int i=1;i<=n;i++){
    A=sudauginkMatricas(A,a);
    }
}

double determinantas(){
return A[0][0]*(A[1][1]*A[2][2]-A[1][2]*A[2][1])-A[0][1]*(A[1][0]*
A[2][2]-A[1][2]*A[2][0])+A[0][2]*(A[1][0]*A[2][1]-A[2][0]*A[1][1]);
}
void raskAtvirkstine(){


     double a[][]= new double[3][3];
     for ( int r = 0; r < 3; r++){
         for ( int c = 0; c < 3; c++ ){
             a[r][c] = A [ r ] [ c ];}}
     double nuline[][] = {{0,0,0},{0,0,0},{0,0,0}};        

     if (determinantas()==0) A=nuline;
     else{
     
     A[0][0] = (a[1][1]*a[2][2]-a[2][1]*a[1][2])/ determinantas();
     A[0][1] = -1*(a[1][0]*a[2][2]-a[2][0]*a[1][2])/ determinantas();
     A[0][2] = (a[1][0]*a[2][1]-a[2][0]*a[1][1])/ determinantas();     
     A[1][0] = -1*(a[0][1]*a[2][2]-a[2][1]*a[0][2])/ determinantas();
     A[1][1] = (a[0][0]*a[2][2]-a[2][0]*a[0][2])/ determinantas();    
     A[1][2] = -1*(a[0][0]*a[2][1]-a[2][0]*a[0][1])/ determinantas();    
     A[2][0] = (a[0][1]*a[1][2]-a[1][1]*a[0][2])/ determinantas();
     A[2][1] = -1*(a[0][0]*a[1][2]-a[1][0]*a[0][2])/ determinantas();    
     A[2][2] = (a[0][0]*a[1][1]-a[1][0]*a[0][1])/ determinantas();
     transponuok();}

}

void dauginkIsMatricos(Matrica3x3 kita){
 double a[][]= new double[3][3];
     for ( int r = 0; r < 3; r++){
         for ( int c = 0; c < 3; c++ ){
             a[r][c] = A [ r ] [ c ];}}
    
    A[0][0]= a[0][0]*kita.A[0][0]+a[0][1]*kita.A[1][0]+a[0][2]*kita.A[2][0];
    A[0][1]= a[0][0]*kita.A[0][1]+a[0][1]*kita.A[1][1]+a[0][2]*kita.A[2][1];
    A[0][2]= a[0][0]*kita.A[0][2]+a[0][1]*kita.A[1][2]+a[0][2]*kita.A[2][2];
    A[1][0]= a[1][0]*kita.A[0][0]+a[1][1]*kita.A[1][0]+a[1][2]*kita.A[2][0];
    A[1][1]= a[1][0]*kita.A[0][1]+a[1][1]*kita.A[1][1]+a[1][2]*kita.A[2][1];
    A[1][2]= a[1][0]*kita.A[0][2]+a[1][1]*kita.A[1][2]+a[1][2]*kita.A[2][2];
    A[2][0]= a[2][0]*kita.A[0][0]+a[2][1]*kita.A[1][0]+a[2][2]*kita.A[2][0];
    A[2][1]= a[2][0]*kita.A[0][1]+a[2][1]*kita.A[1][1]+a[2][2]*kita.A[2][1];
    A[2][2]= a[2][0]*kita.A[0][2]+a[2][1]*kita.A[1][2]+a[2][2]*kita.A[2][2];
}

static double[][] sudauginkMatricas(double a[][], double b[][]){

  double B[][]= new double[3][3];
  
  B[0][0]= a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0];
  B[0][1]= a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1];
  B[0][2]= a[0][0]*b[0][2]+a[0][1]*b[1][2]+a[0][2]*b[2][2];
  B[1][0]= a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0];
  B[1][1]= a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1];
  B[1][2]= a[1][0]*b[0][2]+a[1][1]*b[1][2]+a[1][2]*b[2][2];
  B[2][0]= a[2][0]*b[0][0]+a[2][1]*b[1][0]+a[2][2]*b[2][0];
  B[2][1]= a[2][0]*b[0][1]+a[2][1]*b[1][1]+a[2][2]*b[2][1];
  B[2][2]= a[2][0]*b[0][2]+a[2][1]*b[1][2]+a[2][2]*b[2][2];
  return B;


}

void pridekMatrica(Matrica3x3 kita){

    A[0][0] = A[0][0]+kita.A[0][0];
    A[0][1] = A[0][1]+kita.A[0][1];
    A[0][2] = A[0][2]+kita.A[0][2];
    A[1][0] = A[1][0]+kita.A[1][0];
    A[1][1] = A[1][1]+kita.A[1][1];
    A[1][2] = A[1][2]+kita.A[1][2];
    A[2][0] = A[2][0]+kita.A[2][0];
    A[2][1] = A[2][1]+kita.A[2][1];
    A[2][2] = A[2][2]+kita.A[2][2];
}

static double[][] sudekMatricas(Matrica3x3 kita1,Matrica3x3 kita){
    double B[][]= new double[3][3];

    B[0][0] = kita1.A[0][0]+kita.A[0][0];
    B[0][1] = kita1.A[0][1]+kita.A[0][1];
    B[0][2] = kita1.A[0][2]+kita.A[0][2];
    B[1][0] = kita1.A[1][0]+kita.A[1][0];
    B[1][1] = kita1.A[1][1]+kita.A[1][1];
    B[1][2] = kita1.A[1][2]+kita.A[1][2];
    B[2][0] = kita1.A[2][0]+kita.A[2][0];
    B[2][1] = kita1.A[2][1]+kita.A[2][1];
    B[2][2] = kita1.A[2][2]+kita.A[2][2];
    
    return B;
    
}
static double[][] atimkMatricas(double[][] a,double[][] b){
    double B[][]= new double[3][3];

    B[0][0] = a[0][0]-b[0][0];
    B[0][1] = a[0][1]-b[0][1];
    B[0][2] = a[0][2]-b[0][2];
    B[1][0] = a[1][0]-b[1][0];
    B[1][1] = a[1][1]-b[1][1];
    B[1][2] = a[1][2]-b[1][2];
    B[2][0] = a[2][0]-b[2][0];
    B[2][1] = a[2][1]-b[2][1];
    B[2][2] = a[2][2]-b[2][2];
    
    return B;
    
}


static double[][] namuDarbai(Matrica3x3 a,Matrica3x3 b){
return sudauginkMatricas(sudauginkMatricas(sudekMatricas(a,b),
sudekMatricas(a,b)),(sudauginkMatricas 
(atimkMatricas(a.A,b.A),atimkMatricas(a.A,b.A))));

}
}