procedure minverse(var m1,m2: matrix);
var
  i,j,k: integer;
  s1,s2,s3: scalar;
  m0: matrix;
begin { minverse }
  write('(minverse'); flush(output);
  m0:=m1;
  for i:=0 to lmax do for j:=0 to lmax do szero(m2[i,j]);
  for i:=0 to lmax do m2[i,i]:=sone;

  for i:=0 to lmax do begin       { simple Gauss-Jordan }
    s1:=m0[i,i];
    m0[i,i]:=sone;
    for j:=i+1 to lmax do begin
      squot(m0[i,j],s1,s2);
      m0[i,j]:=s2;
    end;
    for j:=0 to lmax do begin
      squot(m2[i,j],s1,s2);
      m2[i,j]:=s2;
    end;

    for k:=0 to lmax do if k<>i then begin
      s1:=m0[k,i];
      szero(m0[k,i]);
      for j:=i+1 to lmax do begin
        sprod(s1,m0[i,j],s2);
        sdiff(m0[k,j],s2,s3);
        m0[k,j]:=s3;
      end;
      for j:=0 to lmax do begin
        sprod(s1,m2[i,j],s2);
        sdiff(m2[k,j],s2,s3);
        m2[k,j]:=s3;
      end;
    end;
  end;
  write(')'); flush(output);
end { minverse };

