function maxi(A){
var a=0,i;
for (i=0; i<A.length; i++){
a=Math.max(a,A[i]);}
return a;
}

function norm(A){
var m=A[0].length,i;
var n=A.length,j;
var l=[];
for (j=0; j<n; j++){
var a=0;
for (i=0; i<m; i++){
if (A[j][i]<0) A[j][i]=-A[j][i];
a+=A[j][i];}
l[j]=a;}
return maxi(l);
}

function sum(A,B){
   var ma=A[0].length,i;
   var na=A.length,j;
   var mb=B[0].length;
   var nb=B.length;
   var C=[];
   if (ma!=mb || na!=nb)
      alert('Operation imposible!');
   else{
      for (i=0; i<na; i++){
         var c=[];
         for (j=0; j<ma; j++){
            c[j]=A[i][j]+B[i][j];}
         C[i]='['+c+']';}
   return '['+C+']';
}
}

function sub(A,B){
   var ma=A[0].length,i;
   var na=A.length,j;
   var mb=B[0].length;
   var nb=B.length;
   var C=[];
   if (ma!=mb || na!=nb)
      alert('Operation imposible!');
   else{
      for (i=0; i<na; i++){
         var c=[];
         for (j=0; j<ma; j++){
            c[j]=A[i][j]-B[i][j];}
         C[i]='['+c+']';}
   return '['+C+']';
}
}

function mult(A,B){
   var m=B[0].length;
   var n=A.length,i,j,k;
   var ma=A[0].length;
   var nb=B.length;
   var C=[];
   if (m!=n)
    alert('Operation imposible!');
   else{
      for (i=0; i<nb; i++){
         var c=[];
         for (j=0; j<ma; j++){
            var t=0;
            for (k=0; k<n; k++){
               t+=A[k][j]*B[i][k];} 
            c[j]=t;}
         C[i]='['+c+']';}
   return '['+C+']'; 
}
}

function kA(k,A){
   var C=[],i,j;
   for (i=0; i< A.length; i++){
      var c=[];
      for (j=0; j<A[0].length; j++){
         c[j]=k*A[i][j];}
      C[i]='['+c+']';}
   return '['+C+']'
}

function tran(A){
   var m=A[0].length;
   var n=A.length;
   var C=[],i,j;
   for (i=0; i<m; i++){
      var c=[];
      for (j=0; j<n; j++){
         c[j]=A[j][i];}
      C[i]='['+c+']';}
   return '['+C+']';
}

function dlt(A,k){
  var C=[],j;
  for (j=0; j<k-1; j++){
    C[j]='['+A.slice(j,j+1)+']';
  }
  for (j=0; j<A.length-k; j++){
    C[k+j-1]='['+A.slice(k+j,k+j+1)+']';
  }
  return '['+C+']';
}

function mnr(A,i,j){
  var C=eval(dlt(A,j));
  C=eval(tran(C));
  C=eval(dlt(C,i));
  return tran(C);
}

function det(A){
  var m=A[0].length,n=A.length;
  if (m!=n)
   alert('data incorrect!');
  else{
   if (m==1)
     return A[0][0];
   else{
    var C,sg=1,S=0,j=0;
    while (j<n){
     C=eval(mnr(A,1,j+1));
     S+=sg*A[j][0]*det(C);
     sg*=(-1);
     j+=1;
    }
    return S;
   }
  }
}

function inv(A){
 var m=A[0].length,n=A.length,C=[],c,i,j=0;
 if (m!=n || det(A)==0)
  alert('Operation imposible');
 else if (n==1)
  return '[['+1/det(A)+']]';
 else{
  var k=1/det(A);
  while (j<n){
   c=[];
   i=0;
   while (i<m){
    c[i]=Math.pow(-1,i+j)*det(eval(mnr(A,i+1,j+1)));
    i+=1;
   }
   C[j]='['+c+']';
   j+=1;
  }
  C='['+C+']';
  return tran(eval(kA(k,eval(C))));
 }
}

function rplc(x,y,A){
  var n=A.length,C=[],j=0;
  while (j<n){
    if (j!=x-1 && j!=y-1)
      C[j]='['+A[j]+']';
    else if (j==x-1)
      C[j]='['+A[y-1]+']';
    else if (j==y-1)
      C[j]='['+A[x-1]+']';
    j++;
  }
  return '['+C+']';
}

function rpls(x,y,A){
  var C=eval(tran(A));
  C=eval(rplc(x,y,C));
  return tran(C);
}
  
function cond(A){
 var p,q;
 p=norm(A);
 q=norm(eval(inv(A)));
 return p*q;
}

function mixc(k,x,y,A){
  var n=A.length,j=0;
  var X=eval('[['+A[x-1]+']]');
  var Y=eval('[['+A[y-1]+']]');
  var C=eval(sub(Y,eval(kA(k,X))));
  A[y-1]='['+C[0]+']';
  while (j<n){
    if (j!=y-1)
      A[j]='['+A[j]+']';
    else
      A[j]='['+C[0]+']';
    j++;
  }
  return '['+A+']';
}

function mixs(k,x,y,A){
  var C=eval(tran(A));
  C=eval(mixc(k,x,y,C));
  return tran(C);
}

function gd(k,m,n,A,p){
 var i,j,I,J,u,v,M,C=[],R=[];
 M=Math.abs(A[k-1][k-1]);
 for (j=k-1; j<n; j++){
  for (i=k-1; i<m; i++){
   M=Math.max(M,Math.abs(A[j][i]));
   if (M==Math.abs(A[j][i]))
     I=i,J=j; 
  }
 }
 C=eval(rpls(k,I+1,A));
 C=rplc(k,J+1,C);
 u=p[k-1],v=p[J];
 p[k-1]=v,p[J]=u;
 R[0]=C,R[1]='['+p+']';
 return R;
}
        
function gdc(k,m,n,A,p){
  var R=gd(k,m,n,A,p),i;
  var C=eval(R[0]);
  if (C[k-1][k-1]==0) return R;
  else{
   for (i=k; i<m; i++)
    C=eval(mixs(C[k-1][i]/C[k-1][k-1],k,i+1,C));
   C=mixs((C[k-1][k-1]-1.)/C[k-1][k-1],k,k,C);
   R[0]=C;
   return R;
  }
}
 
function gt(m,n,A,p){
  var N=Math.min(m,n),i;
  var R=gdc(1,m,n,A,p);
  var C=eval(R[0]);
  var p=eval(R[1]);
  for (i=2; i<N+1; i++){
    R=gdc(i,m,n,C,p);
    C=eval(R[0]);
    p=eval(R[1]);
  }
  return R;
} 

function mx(m,k,x,A,B){
  var C=[],i;
  for (i=0; i<m; i++)
    C[i]=B[i]-x*A[k-1][i];
  return '['+C+']';
}

function st(m,A,B){
  var X=[],i,x=B[m-1];
  X[m-1]=x;
  for (i=0; i<m-1; i++){
    B=eval(mx(m,m-i,X[m-1-i],A,B));
    x=B[m-2-i];
    X[m-2-i]=x;
  }
  return '['+X+']';
}

function srt(B,p){
 var n=p.length,k,j,a=[];
 for (k=1; k<n+1; k++){
  for (j=0; j<n; j++){
   if (p[j]==k) a[k-1]='['+B[j]+']';
   else continue;
  }
 }
 return '['+a+']';
}

function evall(s){
	var ss="e()[]+-*/0123456789., ";
	for (var i=0;i<s.length;i++){
		if (ss.indexOf(s.charAt(i))+1) continue;
		else {
			alert("Incorrect Input Data!"+s.charAt(i)+"!");
			return;
		}
	}
	return eval(s);
}




