// inverte.sci

function I = inverte (A)
  getf("maior_pivo.sci");
  getf("troca_linhas.sci");
  
  [nlin, ncol] = size(A);
  n = nlin;
  
  I = eye (n, n);
  
  // mprintf ("%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", A, I);
  // mprintf ("\n");
  // escalonando de cima para baixo
  for i = 1:n do
    m = maior_pivo (A, i);
    A = troca_linhas (A, i, m);
    I = troca_linhas (I, i, m);
    for j = (i + 1):n do
      l = A(j,i) / A(i, i);
      A(j,:) = A(j,:) - l * A(i,:);
      I(j,:) = I(j,:) - l * I(i,:);
      // mprintf ("%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", A, I);
      // mprintf ("\n");
    end
  end
  
  // escalonando de baixo para cima
    for i = n:-1:1 do
    for j = (i - 1):-1:1 do
      l = A(j,i) / A(i, i);
      A(j,:) = A(j,:) - l * A(i,:);
      I(j,:) = I(j,:) - l * I(i,:);
      // mprintf ("%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", A, I);
      // mprintf ("\n");
    end
  end
  
  // limpando a diagonal
  for i = 1: n do
    I(i,:) = I(i,:) / A(i,i);
    A(i,i) = 1;
    // mprintf ("%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", A, I);
    // mprintf ("\n");
  end
endfunction

