//Javascript: (c) Arndt Brünner, alle Rechte vorbehalten!


function htmlMatrix(m,u,n)
{
	var t='<table cellpadding=0 cellspacing=0 border=0 style="float:left;margin-bottom:30px">';
	var i,j,k;
	for(i=0;i<m.length;i++)
	{
		t+='<tr>';//<td style="background-color:#000000;width:1px;font-size:3pt">&nbsp;</td>';
		/*if(i==0)t+='<td class="td1"><font face="Symbol">æ<br>ç<br>ç</font></td>';
		else if(i<m.length-1)t+='<td class="td1"><font face="Symbol">ç<br>ç<br>ç</font></td>';
		else t+='<td class="td1"><font face="Symbol">ç<br>ç<br>è</font></td>';*/
		if(i==0)t+='<td class="td1"><font face="Symbol">&#9115;<br>&#9116;<br>&#9116;</font>';
		else if(i<m.length-1)t+='<td class="td1"><font face="Symbol">&#9116;<br>&#9116;<br>&#9116;</font></td>';
		else t+='<td class="td1"><font face="Symbol">&#9116;<br>&#9116;<br>&#9117;</font></td>';
		for(j=0;j<m[i].length;j++)
		{
			t+='<td class="td2"><nobr>';
			t+=(istBruch(m[i][j]))?"\n<center>"+htmlBruch(m[i][j])+"</center>\n":m[i][j];
			t+="</nobr></td>";
		}
		/*if(i==0)t+='<td class="td1"><font face="Symbol">ö<br>÷<br>÷</font></td>';
		else if(i<m.length-1)t+='<td class="td1"><font face="Symbol">÷<br>÷<br>÷</font></td>';
		else t+='<td class="td1"><font face="Symbol">÷<br>÷<br>ø</font></td>';*/

		if(i==0)t+='<td class="td1"><font face="Symbol">&#9118;<br>&#9119;<br>&#9119;</font></td>';
		else if(i<m.length-1)t+='<td class="td1"><font face="Symbol">&#9119;<br>&#9119;<br>&#9119;</font></td>';
		else t+='<td class="td1"><font face="Symbol">&#9119;<br>&#9119;<br>&#9120;</font></td>';

		//t+='<td style="background-color:#000000;width:1px;font-size:3pt">&nbsp;</td>';
		if(u!=null)
		{
			t+='<td class="td3"><nobr>'+u[i]+'</nobr></td>';
		}
		if((i==0)&&(n!=null))t+='<td rowspan='+(m.length)+' class="vam">'+n+'</td>';
		t+="</tr>\n";
	}
	return t+"</table>";
}
function istBruch(a)
{
	if((a[1]==null)||(a[2]!="#"))return false;
	if(a[0]=="-")return false;
	return true;
}
function htmlBruch(b)
{
	var t='<table><tr>',tt='</tr></table>';
	if(b[1]<0){b[1]=-b[1];b[0]=-b[0];}
	if(b[1]==1)return t+'<td class="tdlh18">'+b[0]+'</td>'+tt;
	if(b[0]*b[1]<0)t+='<td class="vac">–</td>';
	t+='<td class="td4">&nbsp;'+String(b[0]).replace(/-/,"")+'&nbsp;<hr size=1 width=100% color="#000000">&nbsp;'+String(b[1]).replace(/-/,"")+'&nbsp;</td>';
	return t+tt;
}
var m=new Array(3);
m[0]=new Array(1,2,3,new Array(-2,3));
m[1]=new Array(1432,new Array(-1,3),-2,0);
m[2]=new Array(0,new Array(7,1),3,new Array(-2,3));
var u=new Array(":2","+3III &nbsp;&nbsp;&rarr;&nbsp;&nbsp;","-I");
var R=new Array("I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII","XIII","XIV","XV","XVI","XVII","XVIII","XIX","XX","XXI","XXII","XXIII","XXIV","XXV","XXVI","XXVII","XXVIII","XXIX","XXX","XXXI",
	"XXXII","XXXIII","XXXIV","XXXV","XXXVI","XXXVII","XXXVIII","XXXIX","XL");
var iu1z=new Array(),iu2z=new Array(),iu1n=new Array(),iu2n=new Array(),iub=new Array();
var zv=new Array();

function parse()
{
	var t=document.f.t.value.replace(/,/g,"."),ns,nz;
	t=t.replace(/\- +/g,"-").replace(/[^0-9\-\.\/\n\r]/g," ").replace(/ +/g," ").replace(/\r/g,"\n").replace(/\n+/g,"\n");
	while((t.length>0)&&((t.charAt(0)==" ")||(t.charAt(0)=="\n")))t=t.substring(1,t.length);
	while((t.length>0)&&((t.charAt(t.length-1)==" ")||(t.charAt(t.length-1)=="\n")))t=t.substr(0,t.length-1);
	var tt=t.split("\n");nz=tt.length;
	while((tt[0].length>0)&&(tt[0].charAt(tt[0].length-1)==" "))tt[0]=tt[0].substr(0,tt[0].length-1);
	tt=tt[0].split(" ");ns=tt.length;t=t.replace(/\n/g," ").replace(/ +/g," ");
	if((t=="")||((nz==1)&&(ns==1)))return;
	t=t.split(" ");
	if(t.length!=ns*nz)return;
	var i,b,m=new Array(),k=0,j,g;
	for(i=0;i<nz;i++)
	{
		m[i]=new Array(ns);
		for(j=0;j<ns;j++)
		{
			b=t[k].split("/");
			if(b[1]==null)b[1]=1;
			if(String(b[0]).indexOf(".")>-1)
			{
				var b0=String(b[0]),ik=b0.indexOf(".");
				b[1]=("1000000000000000000000000").substr(0,b0.length-ik);
				b[0]=b0.replace(/\./,"");
			}
			g=ggT(b[0],b[1]);
			b[0]=divInt(b[0],g);
			b[1]=divInt(b[1],g);
			m[i][j]=(b[1]!=1)?new Array(b[0],b[1],"#"):b[0];
			k++;
		}
	}
	return m;
}
function berechnen()
{
	checkjava();
	status="Eingabe lesen";
	var m=parse(),Ausgabe=document.getElementById("Ausgabe"),t="",u,ns,nz,g,h,e,u1,u2,ii=0,gzue=1==0,quad,iz;
	status="Fehlermeldung";
	if(m==null){Ausgabe.innerHTML='<p>Diese Eingabe kann nicht verarbeitet werden.</p>';return;}
	nz=m.length;ns=m[0].length;
	quad=(nz==ns);
	if(nz==1){Ausgabe.innerHTML='<p>Die Matrix muß mindestens zweizeilig sein.</p>';return;}
	if(ns==1){Ausgabe.innerHTML='<p>Die Matrix muß mindestens zweispaltig sein.</p>';return;}
	if(nz>50){Ausgabe.innerHTML='<p>Die Matrix darf höchstens 50 Zeilen haben.</p>';return;}
	if(ns>50){Ausgabe.innerHTML='<p>Die Matrix darf höchstens 50 Spalten haben.</p>';return;}
	u=new Array(nz),u1=new Array(nz),u2=new Array(nz);
	var uu1=new Array(nz),uu0=new Array(nz),uum1=new Array(nz);
	iu1z=new Array();iu2z=new Array();iu1n=new Array();iu2n=new Array();iub=new Array();zv=new Array();
	var Pfeil="&nbsp;&nbsp;&nbsp;&nbsp;&rarr;&nbsp;&nbsp;&nbsp;&nbsp;";
	var nss=(document.f.lv.checked)?ns-1:ns;
	var kp=document.f.kp.checked,gp=document.f.gp.checked,odm=document.f.odm.checked,lrz=document.f.lrz.checked;
	var dt=document.f.dt.checked,iv=document.f.iv.checked,us=!document.f.kus.checked;
	if(!quad){dt=iv=document.f.dt.checked=document.f.iv.checked=false;}
	if((lrz)&&(!quad)){Ausgabe.innerHTML='<p>LR-Zerlegung nur bei quadratischen Matrizen</p>';return;}
	Ausgabe.innerHTML=status="bereite Anzeige vor";
	if(!us)t+=htmlMatrix(m,null,"&nbsp;&nbsp;&nbsp;"+Pfeil+"&nbsp;&nbsp;&nbsp;");
	Ausgabe.innerHTML=status="ganzzahlig machen";
	//ganzzahlig machen
	for(i=0;i<nz;i++)
	{
		uu0[i]=0;uu1[i]=1;uum1[i]=-1;
		g=1;
		for(j=0;j<ns;j++){if(m[i][j][2]!="#")continue;g=kgV(g,m[i][j][1]);}
		u[i]=(g!=1)?"·"+g:"";u1[i]=g;
		if(g!=1)e=true;
	}
	if(e)
	{
		if(us)t+=htmlMatrix(m,u,Pfeil);
		for(i=0;i<nz;i++)
		{
			for(j=0;j<ns;j++)m[i][j]=(m[i][j][2]!="#")?multInt(m[i][j],u1[i]):divInt(multInt(m[i][j][0],u1[i]),m[i][j][1]);
		}
		if(quad)store(u1,uu1,uu0,uu1,nz,0);
	}
	
	if((useJava)&&(!iv)&&(!dt)&&(!us)&&(!lrz))
	{
		Ausgabe.innerHTML=status="Matrix mit Java umformen";
		var M=new Array(ns*nz);k=0;
		for(i=0;i<nz;i++)for(j=0;j<ns;j++)M[k++]=String(m[i][j]);
		var M=String(document.bigIntApplet.lgs2(M,nz,ns,(nss==ns)?0:1,odm?1:0)).split(",");
		k=0;for(i=0;i<nz;i++)for(j=0;j<ns;j++)m[i][j]=String(M[k++]);
		if((!odm)&&(nss!=ns))t+=htmlMatrix(m,null,Pfeil);
		else
		{
			status="erstelle Bildschirmausgabe";
			t+=htmlMatrix(m);	
			Ausgabe.innerHTML=t;
			status="fertig";
			return;
		}
	}	
	else
	{

	Ausgabe.innerHTML=status="System in Zeilennormalform bringen";
	for(i=0;(i<nz)&&(ii<nz)&&(ii<nss);i++)
	{
		//kürzen
		e=false;
		for(k=0;k<nz;k++)
		{
			g=m[k][0];for(j=1;j<ns;j++)g=ggT(g,m[k][j]);if(g==0)g=1;
			u[k]=(g!=1)?":"+g:"";
			if(g!=1)e=true;u1[k]=g;
		}
		if(e)
		{
			if(us)t+=htmlMatrix(m,u,Pfeil);
			for(k=0;k<nz;k++)for(j=0;j<ns;j++)m[k][j]=divInt(m[k][j],u1[k]);			
			store(uu1,u1,uu0,uu1,nz,0);
		}
 
		if((!lrz)&&((!iv)||(kp||gp)))
		{
			h=i;for(j=0;j<nz;j++)u[j]="";
			for(j=i+1;j<nz;j++)
			{
				if(m[j][ii]==0)continue;
				if((!gp)&&(Math.abs(m[j][ii])==1)){h=j;break;}
				if((kp)&&(Math.abs(m[j][ii])<Math.abs(m[h][ii])))h=j;
				if((gp)&&(Math.abs(m[j][ii])>Math.abs(m[h][ii])))h=j;
			}
			if((h>i)&&(Math.abs(m[i][ii])!=1))
			{
				u[h]="= "+R[i];u[i]="= "+R[h];
				if(us)t+=htmlMatrix(m,u,Pfeil);
				for(k=0;k<ns;k++){g=m[i][k];m[i][k]=m[h][k];m[h][k]=g;}
				zv[iz=zv.length]=new Array(iu2z.length,i,h);
				store(uu1,uu1,uu0,uu1,nz,i);iu2z[iu2z.length-1][h]=1;
				store(uu1,uu1,uu0,uu1,nz,h);iu2z[iu2z.length-1][i]=-1;
				store(uu1,uu1,uu0,uu1,nz,i);iu2z[iu2z.length-1][h]=1;
				store(uu1,uu1,uu0,uu1,nz,0);iu1z[iu2z.length-1][i]=-1;
			}
			else while((m[i][ii]==0)&&(ii<ns))
			{
				for(j=i+1;j<nz;j++){if(m[j][ii]!=0){u[j]="= "+R[i];u[i]="= "+R[j];break;}}
				if(j!=nz)
				{
					if(us)t+=htmlMatrix(m,u,Pfeil);
					for(k=0;k<ns;k++){g=m[i][k];m[i][k]=m[j][k];m[j][k]=g;}
					zv[iz=zv.length]=new Array(iu2z.length,i,j);
					store(uu1,uu1,uu0,uu1,nz,i);iu2z[iu2z.length-1][j]=1;
					store(uu1,uu1,uu0,uu1,nz,j);iu2z[iu2z.length-1][i]=-1;
					store(uu1,uu1,uu0,uu1,nz,i);iu2z[iu2z.length-1][j]=1;
					store(uu1,uu1,uu0,uu1,nz,0);iu1z[iu2z.length-1][i]=-1;
					break;
				}
				ii++;if(ii>=ns)break;
			}
			if(ii>=nss)break;
		}
		else if(m[i][ii]==0)
		{
			for(j=i+1;j<nz;j++){if(m[j][ii]!=0)break;}
			if(j!=nz)
			{
				for(k=0;k<nz;k++){u[k]="";u1[k]=1;u2[k]=0;}u2[j]=1;u[i]="+"+R[j];
				if(us)t+=htmlMatrix(m,u,Pfeil);
				for(k=0;k<ns;k++)m[i][k]=addInt(m[i][k],m[j][k]);
			}
		}
		
		if((document.f.lv.checked)&&(ii>=nz))break;
		//mit Pivotelement (i,ii) ii. Spalte zu 0 machen.
		e=false;
		var j0=(odm||lrz)?i+1:0;
		for(j=0;j<nz;j++){u[j]="";u2[j]=1;u1[j]=0;}
		u1[i]=0;u2[i]=1;
		for(j=j0;j<nz;j++)
		{
			if(j==i)continue;
			u2[j]=m[i][ii];u1[j]=("-"+String(m[j][ii])).replace(/--/,"");
			g=ggT(u1[j],u2[j]);if(g!=0){u1[j]=divInt(u1[j],g);u2[j]=divInt(u2[j],g);}
			if(Number(u2[j])<0){u2[j]=("-"+String(u2[j])).replace(/--/,"");u1[j]=("-"+String(u1[j])).replace(/--/,"");}
			if(u2[j]!=1)u[j]=u2[j]+"·"+R[j];
			u[j]+=(Number(u1[j])<0)?" - ":" + ";
			u[j]+=(Math.abs(u1[j])!=1)?String(u1[j]).replace(/-/,"")+"·":"";
			u[j]+=R[i];
			if(u1[j]!=0)e=true;else u[j]="";
		}
		if(e)
		{
			if(us)t+=htmlMatrix(m,u,Pfeil);
			for(j=0;j<nz;j++)
			{
				if(i==j)continue;
				for(k=0;k<ns;k++)
				{
					var mjk=u2[j]*m[j][k]+u1[j]*m[i][k];
					var oo=u2[j]+"\n"+m[j][k]+"\n"+u1[j]+"\n"+m[i][k];
					var f1=multInt(u2[j],m[j][k]),f2=multInt(u1[j],m[i][k]);
					//if((!gzue)&&(Math.abs(m[j][k])>1e16)){alert("Ganzzahlüberlauf: "+m[j][k]+"\n(Führt zu ungenauem Ergebnis)");gzue=true;}
					m[j][k]=addInt(f1,f2);
					//alert(O+"\n"+m.join("\n")+"\n\n"+j+"  "+k+"\n"+m[j][k]);
					//if(Math.abs(mjk-m[j][k])>1e15)alert(mjk+"\n"+m[j][k]+"\n"+j+" "+k+"    "+i);
					if(String(m[j][k]).indexOf("NaN")>-1){alert(m.join("\n")+"\n\n"+j+"  "+k+"\n\n"+oo+"\n"+f1+"\n"+f2);return;}
				}
			}
			store(u2,uu1,u1,uu1,nz,i);
		}
		Ausgabe.innerHTML=status="Fortschritt: "+Math.round(((i+1)/nz)*100)+"%";
		ii++;
		//alert(m.join("\n"));
	}
	}

	//Dividieren
	status="Dividieren und kürzen";
	e=false;ii=0;
	for(i=0;i<nz;i++){u1[i]=0;u[i]="";}
	for(i=0;(i<nz)&&(ii<ns);i++)
	{
		while((m[i][ii]==0)&&(ii<ns))ii++;
		if(ii>=ns)break;
		u1[i]=m[i][ii];u2[i]=ii;
		if((u1[i]!=1)&&(u1[i]!=0)){u[i]=":"+((u1[i]<0)?"(":"")+u1[i]+((u1[i]<0)?")":"");if(u1[i]==-1)u[i]="·(-1)";}
	}
	for(i=0;i<nz;i++){for(j=0;j<nss;j++){if(Math.round(m[i][j]/u1[i])*u1[i]!=m[i][j]){u1[i]=1;u[i]="";}}}
	for(i=0;i<nz;i++){if(u1[i]!=1){e=true;break;}}
	if(e)
	{
		if(us)t+=htmlMatrix(m,u,Pfeil);
		for(i=0;i<nz;i++)
		{
			if((u1[i]==0)||(u1[i]==1))continue;
			//if(u2[i]==ns-1)continue;
			for(k=0;k<nss;k++)m[i][k]=divInt(m[i][k],u1[i]);
			if(nss<ns)
			{
				m[i][ns-1]=new Array(m[i][ns-1],u1[i],"#");
				g=ggT(m[i][ns-1][0],m[i][ns-1][1]);
				m[i][ns-1][0]=divInt(m[i][ns-1][0],g);
				m[i][ns-1][1]=divInt(m[i][ns-1][1],g);
				if(m[i][ns-1][1]<0){m[i][ns-1][0]=("-"+m[i][ns-1][0]).replace(/--/,"");m[i][ns-1][1]=("-"+m[i][ns-1][1]).replace(/--/,"");}
			}
			for(k=0;k<ns;k++){if(m[i][k][0]!=null){if(m[i][k][0]==0)m[i][k]=0;}}
		}
		store(uu1,u1,uu0,uu1,nz,0);
	}

	//kürzen
	e=false;
	for(k=0;k<nz;k++)
	{
		g=m[k][0];for(j=1;j<ns;j++)g=ggT(g,m[k][j]);
		if(g==0)g=1;
		u[k]=(g!=1)?":"+g:"";if(g!=1)e=true;u1[k]=g;
	}
	if(e)
	{
		if(us)t+=htmlMatrix(m,u,Pfeil);
		for(k=0;k<nz;k++)for(j=0;j<ns;j++)m[k][j]=divInt(m[k][j],u1[k]);
		store(uu1,u1,uu0,uu1,nz,0);
	}

	t+=(lrz)?htmlMatrix(m,null,"&nbsp;&nbsp;(R-Matrix)"):htmlMatrix(m);

	if((quad)&&(!gzue))
	{
		if(dt)
		{
			Ausgabe.innerHTML=status="berechne Determinante";
			var D=det(m);
			if(D!=null)
			{t+="<table style='clear:both' cellspacing=0 cellpadding=0><tr><td>Determinante: &nbsp;&nbsp;&nbsp;&nbsp;</td><td>";
			t+=htmlBruch(D)+"</td>"+((D[1]!=1)?"<td> &nbsp;=&nbsp; "+String(D[0]/D[1]).replace(/\./,",")+"</td>":"")+"</tr></table><br>&nbsp;\n";}
		}
		//for(i=0;i<nz;i++){for(j=0;j<nz;j++){if(((m[i][j]!=0)&&(i!=j))||((m[i][j]==0)&&(i==j)))break;}if(j<nz)break;}
		if(iv||lrz)
		{
			for(i=0;i<nz;i++)if(m[i][i]==0)break;
			if(i==nz)
			{
				var tm=((odm||lrz)?"L-":" Inverse ")+"Matrix"
				Ausgabe.innerHTML=status="berechne "+tm;
				var mi=invers(!(odm||lrz));
				t+="<table style='clear:both' cellspacing=0 cellpadding=0><tr><td><p>"+tm+": &nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;<br>&nbsp;</p></td><td>\n";
				t+=((mi==null)?"Die "+tm+" kann wegen Ganzzahlüberlaufs nicht genau berechnet werden<br>&nbsp;<br>&nbsp;":htmlMatrix(mi))+"</td></tr></table>";
				if(lrz)t+="<p>(Das Script arbeitet ganzzahlig, daher ist weder die Diagonale der L- noch die der R-Matrix auf 1 normiert.)</p>";
				else if(zv.length>0)t+="<p>(Wegen der Zeilenvertauschungen hat die L-Matrix nicht Zeilenstufenform. Deaktivieren Sie die Option <i>Immer "+(kp?"kleins":"größ")+"tes Pivotelement suchen</i>.)</p>";
			}
		}
	}

	status="Bildschirmausgabe";
	Ausgabe.innerHTML=t;
	status="fertig";
	//document.getElementById("Ausgabe2").innerText=t;
	
}
function invers(inv)
{
	if(!inv)return LMatrix();
	var nz=iu1z[0].length,i,j,k,m=new Array(nz),g,z11,z12,z21,z22,n11,n12,n21,n22;
	for(i=0;i<nz;i++){m[i]=new Array(nz);for(j=0;j<nz;j++)m[i][j]=(i==j)?new Array(1,1,"#"):new Array(0,1,"#");}
	//alert(m.join("\n"));
	for(i=0;i<iub.length;i++)
	{
		for(j=0;j<nz;j++)
		{
			for(k=0;k<nz;k++)
			{
				z11=iu1z[i][j];n11=iu1n[i][j];z12=m[j][k][0];n12=m[j][k][1];
				z21=iu2z[i][j];n21=iu2n[i][j];z22=m[iub[i]][k][0];n22=m[iub[i]][k][1];
				g=ggT(z11,n12);z11=divInt(z11,g);n12=divInt(n12,g);
				g=ggT(z12,n11);z12=divInt(z12,g);n11=divInt(n11,g);
				g=ggT(z21,n22);z21=divInt(z21,g);n22=divInt(n22,g);
				g=ggT(z22,n21);z22=divInt(z22,g);n21=divInt(n21,g);
				var z1=multInt(z11,z12),n1=multInt(n11,n12),z2=multInt(z21,z22),n2=multInt(n21,n22);
				m[j][k][0]=addInt(multInt(z1,n2),multInt(z2,n1));
				m[j][k][1]=multInt(n1,n2);
				//if((Math.abs(m[j][k][0])>1e15)||(Math.abs(m[j][k][1])>1e15))return;
				if(m[j][k][0]==0)m[j][k][1]=1;
				else{g=ggT(m[j][k][0],m[j][k][1]);m[j][k][0]=divInt(m[j][k][0],g);m[j][k][1]=divInt(m[j][k][1],g);}
			}
		}//alert(m.join("\n")+"\n\n"+iu1z[i]+"\n"+iu1n[i]+"\n\n"+iu2z[i]+"\n"+iu2n[i]);
		Ausgabe.innerHTML=status="berechne Inverse, Fortschritt: "+Math.round(100*(i+1)/(iub.length+1))+"%";
	}
	return m;
}
function LMatrix()
{
	var nz=iu1z[0].length,i,j,k,m=new Array(nz),g,z11,z12,z21,z22,n11,n12,n21,n22;
	for(i=0;i<nz;i++){m[i]=new Array(nz);for(j=0;j<nz;j++)m[i][j]=(i==j)?new Array(1,1,"#"):new Array(0,1,"#");}
	//alert(m.join("\n"));
	for(i=iub.length-1;i>=0;i--)
	{
		for(j=0;j<nz;j++)
		{
			for(k=0;k<nz;k++)
			{
				z11=iu1z[i][j];n11=iu1n[i][j];z12=m[j][k][0];n12=m[j][k][1];
				z21=iu2z[i][j];n21=iu2n[i][j];z22=m[iub[i]][k][0];n22=m[iub[i]][k][1];
				//iu1n·zz/(iu1z·zn) - iu1n·yz·iu2z/(iu2n·yn·iu1z)
					/*
					  g=ggT(z22,n21);z22/=g;n21/=g;
					  g=ggT(z21,n22);z21/=g;n22/=g;
					  var z1=n11*z12,n1=z11*n12,z2=n11*z22*z21,n2=n21*n22*z11;
					  m[j][k][0]=z1*n2-z2*n1;m[j][k][1]=n1*n2;
					*/
				g=ggT(z22,n21);z22=divInt(z22,g);n21=divInt(n21,g);// z22/=g;n21/=g;
				g=ggT(z21,n22);z21=divInt(z21,g);n22=divInt(n22,g);//z21/=g;n22/=g;
				var z1=multInt(n11,z12),n1=multInt(z11,n12),z2=multInt(n11,multInt(z22,z21)),n2=multInt(n21,multInt(n22,z11));
				m[j][k][0]=subInt(multInt(z1,n2),multInt(z2,n1));m[j][k][1]=multInt(n1,n2);
				//if((Math.abs(m[j][k][0])>1e15)||(Math.abs(m[j][k][1])>1e15))return;
				if(m[j][k][0]==0)m[j][k][1]=1;
				else{g=ggT(m[j][k][0],m[j][k][1]);m[j][k][0]=divInt(m[j][k][0],g);m[j][k][1]=divInt(m[j][k][1],g);}
			}
		}//alert(m.join("\n")+"\n\n"+iu1z[i]+"\n"+iu1n[i]+"\n\n"+iu2z[i]+"\n"+iu2n[i]);
		Ausgabe.innerHTML=status="berechne L-Matrix, Fortschritt: "+Math.round(100-100*(i+1)/(iub.length+1))+"%";
	}
	return m;
}

function det(m)
{
	var i,z,n,dz=1,dn=1,g,zz="",nn="",zzz,nnn,j;
	for(i=0;i<m.length;i++)
	{
		z=isNaN(m[i][i])?m[i][i][0]:m[i][i];
		if(z==0){return new Array(0,1,"#");}
		n=isNaN(m[i][i])?m[i][i][1]:1;
		if(z!=1)zz+=z+",";
		if(n!=1)nn+=n+",";
	}
	for(i=iub.length-1;i>=0;i--)
		for(j=0;j<m.length;j++)
		{
			if((iu1z[i][j]!=0)&&(iu1z[i][j]!=iu1n[i][j]))
			{
				if(iu1n[i][j]!=1)zz+=iu1n[i][j]+",";
				if(iu1z[i][j]!=1)nn+=iu1z[i][j]+",";
			}
		}
	if(zz=="")zz="1,";if(nn=="")nn="1,";
	zz=(zzz=zz.substr(0,zz.length-1)).split(",");
	nn=(nnn=nn.substr(0,nn.length-1)).split(",");
	//prompt("",zz.join("*")+"/("+nn.join("*")+")");
	for(i=0;i<zz.length;i++)
	{
		for(j=0;j<nn.length;j++)
		{
			if(zz[i]==1)break;
			g=ggT(zz[i],nn[j]);
			if(Number(g)!=0)
			{
				//alert(zz[i]+"  "+nn[j]+"  ggT="+g);
				var zzz=zz[i],nnn=nn[j],ggg=g;
				zz[i]=divInt(zz[i],g);nn[j]=divInt(nn[j],g);
				if(isNaN(zz[i])){alert(zzz+" "+nnn+" "+ggg);return;}
				if(nn[j]==0){alert(zzz+" "+nnn+" "+ggg);return;}
			}
		}	
		Ausgabe.innerHTML=status="berechne Determinante, Fortschritt: "+Math.round(100*(i+1)/(zz.length+1))+"%";
	}
	//alert(zz+"\n\n"+nn);
	for(i=0;i<zz.length;i++)dz=multInt(dz,zz[i]);
	for(i=0;i<nn.length;i++)dn=multInt(dn,nn[i]);
	if(Number(dn)<0){dn=("-"+dn).replace(/--/,"");dz=("-"+dz).replace(/--/,"");}
	return new Array(dz,dn);
}

function store(u1z,u1n,u2z,u2n,n,bezug)
{//alert(u1z+"\n"+u1n+"\n"+u2z+"\n"+u2n+"\n"+n+"\n"+bezug);
	var i,k=iu1z.length;
	iu1z[k]=new Array(n);iu2z[k]=new Array(n);
	iu1n[k]=new Array(n);iu2n[k]=new Array(n);
	iub[iub.length]=bezug;
	for(i=0;i<n;i++)
	{
		iu1z[k][i]=u1z[i];
		iu2z[k][i]=u2z[i];
		iu1n[k][i]=u1n[i];
		iu2n[k][i]=u2n[i];
	}
}
function ggT(a,b)
{
	if((Math.abs(a)>1e15)||(Math.abs(b)>1e15))return ggTInt(a,b);
	if(isNaN(a)||isNaN(b))return 1;
	if(a*b==0)return Math.max(Math.abs(a),Math.abs(b));//if(!confirm(a+"  "+b))return 1;
	a=Math.abs(a);b=Math.abs(b);
	var c;do{c=a%b;a=b;b=c;}while(c!=0);return a;
}
function kgV(a,b){return a*b/ggT(a,b);}
function checkjava()
{
	var a=document.getElementById("javachecker");
	if(navigator.javaEnabled()==false){a.innerHTML="";usejava=false;return;}
	if(document.bigIntApplet!=null)
	{
		if(a.innerHTML.length<10)
		a.innerHTML='<input type="checkbox" name="ua" '+(useJava?'checked':'')+' onclick="useJava=this.checked"> <font style="font-family:Verdana">Java verwenden (schneller bei großen Zahlen)</font>';
	}
}

