a=new Array();
var n=0;
var nein=1==0;

function Run()
{
	if((document.f.modus.selectedIndex==1)&&(!nein)){RunBr();return;}
	var i,d,start,t;	
	d=new Date();
	start=d.getTime();
	t=new String(document.f.t.value);
	t=t.replace(/\,/g,".").replace(/\n/g,"!").replace(/;/g,"!").replace(/\t/g,"!").replace(/\r/,"!").replace(/\s+/g,"!");
	t=t.replace(/!+/g,"!");
	while((t.indexOf("!")==0)&&(t.length>0)){t=t.substr(1);}
	while((t.lastIndexOf("!")==t.length-1)&&(t.length>0)){t=t.substr(0,t.length-1);}
	var k=1;
	if (t.search(/\.\d/)>=0) k=1e+10;
	if (t.search(/\//)>=0) k=1e+12;
	/*if (t.search(/\.\d\d/)>=0) k=100;
	if (t.search(/\.\d\d\d/)>=0) k=1000;
	if (t.search(/\.\d\d\d\d/)>=0) k=10000;*/
	a=t.split("!");
	if(t.indexOf("/")>=0){for(i=0;i<a.length;i++)if(isNaN(a[i]))a[i]=eval(a[i]);}
	n=Math.sqrt(a.length);
	document.f.d.value="";
	if((n<1)||(t==""))return;
	if(n != Math.floor(n)){ alert("Die Matrix ist nicht quadratisch.\nVielleicht Eingabefehler?");return;}
	document.f.dim.value=n;
	for (i=0;i<n*n;i++) a[i]=Number(a[i]);
	document.f.d.value="Die Determinante dieser "+n+"x"+n+"-Matrix ist "+String(Math.round(Det()*k)/k).replace(/\./,",");
	dd=new Date();
	document.f.dauer.value="benötigte Rechenzeit: "+((dd.getTime()-start)/1000+"s").replace(/\./,",").replace(/ ,/," 0,");
	//document.f.modus.selectedIndex=0;
}

function RunBr()
{
	var i,j,d,start,k,t,Z=new Array(),N=new Array(),zz,nn,tt,g;
	d=new Date();
	start=d.getTime();
	t=new String(document.f.t.value);
	t=t.replace(/\,/g,".").replace(/\n/g,"!").replace(/;/g,"!").replace(/\t/g,"!").replace(/\r/,"!").replace(/\s+/g,"!");
	t=t.replace(/!+/g,"!");
	while((t.indexOf("!")==0)&&(t.length>0)){t=t.substr(1);}
	while((t.lastIndexOf("!")==t.length-1)&&(t.length>0)){t=t.substr(0,t.length-1);}
	a=t.split("!");
	document.f.d.value="";
	n=Math.sqrt(a.length);
	if((n<1)||(t==""))return;
	if(n*n!=a.length){alert("Die Matrix ist nicht quadratisch.\nVielleicht Eingabefehler?");return;}
	document.f.dim.value=n;
	for(i=0;i<a.length;i++)
	{
		if(String(a[i]).indexOf(".")>-1)
		{
			k=1;var aa=a[i];while(aa*k!=Math.round(aa*k))k*=10;
			g=ggt(aa*k,k);
			a[i]=(aa*k/g)+"/"+(k/g);
		}
		if(a[i].indexOf("/")==-1)a[i]+="/1";
		tt=a[i].split("/");Z[i]=tt[0];N[i]=tt[1];
	}
	if(!detGLSLBr(Z,N,n)){nein=(1==1);Run();nein=(1==0);return;};
	//alert(Z+"\n\n"+N);
	zz=Z[0];nn=N[0];
	for(i=1;i<n;i++)
	{
		zz*=Z[i*n+i];nn*=N[i*n+i];
		if(zz==0){nn=1;break;}
		if((Math.abs(zz)>1e+15)||(nn>1e+15)||(isNaN(zz))){nein=(1==1);Run();nein=(1==0);return;}
		g=ggt(zz,nn);zz/=g;nn/=g;
	}
	tt=zz;
	if(nn!=1)
	{
		tt+="/"+nn;tt+=" = "+String(eval(tt)).replace(/\./,",");
		var nnn=nn;while((nnn%2)==0)nnn/=2;while((nnn%5)==0)nnn/=5;
		if(nnn!=1)tt+="...";
	}
	document.f.d.value="Die Determinante dieser "+n+"x"+n+"-Matrix ist "+tt;
	dd=new Date();
	document.f.dauer.value="benötigte Rechenzeit: "+((dd.getTime()-start)/1000+"s").replace(/\./,",").replace(/ ,/," 0,");
}

function Det()
{
	if (n==1) return a[0];
	if (n==2) return a[0]*a[3]-a[1]*a[2];
	if (n==3) return a[0]*(a[4]*a[8] - a[5]*a[7])+a[1]*(a[5]*a[6]-a[3]*a[8])+a[2]*(a[3]*a[7]-a[4]*a[6]);
	if (n==4)
	{
		d= a[0]*(a[5]*(a[10]*a[15]-a[11]*a[14])+a[6]*(a[11]*a[13]-a[9]*a[15])+a[7]*(a[9]*a[14]-a[10]*a[13]));
		d-=a[1]*(a[4]*(a[10]*a[15]-a[11]*a[14])+a[6]*(a[11]*a[12]-a[8]*a[15])+a[7]*(a[8]*a[14]-a[10]*a[12]));
		d+=a[2]*(a[4]*(a[9]*a[15]-a[11]*a[13])+a[5]*(a[11]*a[12]-a[8]*a[15])+a[7]*(a[8]*a[13]-a[9]*a[12]))-a[3]*(a[4]*(a[9]*a[14]-a[10]*a[13])+a[5]*(a[10]*a[12]-a[8]*a[14])+a[6]*(a[8]*a[13]-a[9]*a[12]));
		return d;
	}
	detGLSL(n);
	var p=1.0;
	for (i=0; i<n; i++)
	{
//	alert(a[i*(n+1)]);
		p*=a[i*(n+1)];
	}
	return p;			
}



function detGLSL(n)
{
	var i,j,q,k;
	for(j=0;j<n;j++)
	{
        	q=a[j*n+j];
	        if(q==0)
		{
            		for(i=j+1;i<n;i++)
			{
                    		if(a[i*n+j]!=0)
				{
					for(k=0;k<n;k++) a[j*n+k]+=a[i*n+k];
					q=a[j*n+j];
					break;
				}
			}
		}
		if(q!=0)
		{
			for(i=j+1;i<n;i++)
			{
				if(i!=j)
				{
					q=a[i*n+j]/a[j*n+j];
					for(k=0;k<n;k++) a[i*n+k]-=q*a[j*n+k];
				}
			}
		}
	else return;
    }
}


function detGLSLBr(Z,N,n)
{
	var j,i,k,qz,qn;
	for(j=0;j<n;j++)
	{
        	qz=Z[j*n+j];qn=N[j*n+j];//if(Math.abs(qz)>1e+14)return false;
	        if(qz==0)
		{
            		for(i=j+1;i<n;i++)
			{
                    		if(Z[i*n+j]!=0)
				{
					for(k=0;k<n;k++)addBr(Z,N,j*n+k,i*n+k,1,1,j*n+k); //a[j*n+k]+=a[i*n+k];
					qz=Z[j*n+j];qn=N[j*n+j];
					break;
				}
			}
		}
		if(qz!=0)
		{
			for(i=j+1;i<n;i++)
			{
				if(i!=j)
				{
					qz=Z[i*n+j]*N[j*n+j];qn=N[i*n+j]*Z[j*n+j];g=ggt(qz,qn);qn/=g;qz/=g;
					for(k=0;k<n;k++)addBr(Z,N,i*n+k,j*n+k,-qz,qn,i*n+k);  // a[i*n+k]-=q*a[j*n+k];
				}
			}
		}
	else return false;
    }
	return true;
}

function addBr(Z,N,f1,f2,faktorZ,faktorN,p)
{
	var n=N[f1]*N[f2]*faktorN;
	var z=Z[f1]*N[f2]*faktorN+faktorZ*Z[f2]*N[f1];
	var g=ggt(n,z);
	Z[p]=z/g;
	N[p]=n/g;
	if(N[p]<0){Z[p]=-Z[p];N[p]=-N[p];}
	if(Z[p]==0)N[p]=1;
}
/*
function multBr(Z,N,f1,f2,p)
{
	var n=N[f1]*N[f2];
	var z=Z[f1]*Z[f2];
	var g=ggt(n,z);
	Z[p]=z/g;
	N[p]=n/g;
	if(N[p]<0){Z[p]=-Z[p];N[p]=-N[p];}
}
function divBr(Z,N,f1,f2,p)
{
	var n=N[f1]*Z[f2];
	var z=Z[f1]*N[f2];
	var g=ggt(n,z);
	Z[p]=z/g;
	N[p]=n/g;
}*/
function ggt(a,b)
{
	a=Math.abs(a);b=Math.abs(b);
	if((a<=1)||(b<=1))return 1;
	var c;
	do{c=a%b;a=b;b=c;}while(c>0);
	return a;
}
function Zufall(m)
{
	var n=m,br=document.f.modus.selectedIndex==1;
	var t=new String("");
	var s="          ";
	var d=new Date();
	var start=d.getTime();
	if (m<0)t="Matrizen aus Antimaterie kann das Programm leider nicht berechnen";
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			tt=String(Math.floor(Math.random()*10)-5);
//			if(tt.charAt(0)!="-")tt=" "+tt;
			if((n<7)&&(Math.random()>.8)&&(tt!="0")&&(br))
			{
				nn=Math.floor(Math.random()*10+2);
				while(ggt(parseInt(tt),nn)!=1)nn++;
				tt+="/"+nn;
			}
			if(tt.charAt(0)=="-")tt+=" ";
			if((n<7)&&(br))t+=s.substring(0,Math.floor((6-tt.length)/2))+tt+s.substring(0,Math.ceil((6-tt.length)/2));
			else t+=s.substring(0,Math.floor((3-tt.length)/2))+tt+s.substring(0,Math.ceil((3-tt.length)/2));
		}
	t+="\n";}
	document.f.t.value=t;
	document.f.d.value="";
	document.f.dauer.value="";
	var dd=new Date();
	var ddd=(dd.getTime()-start)/1000
	document.f.dauer.value="benötigte Zeit, "+(n*n)+" Zufallszahlen zu erzeugen: "+(ddd+"s").replace(/\./,",").replace(/ ,/," 0,");
}

function eingabe()
{
	document.f.d.value='';document.f.dauer.value='';
	if(document.f.t.value.indexOf("/")>0)document.f.modus.selectedIndex=1;
}
