// Javascript (c) Arndt Brünner
// Alle Rechte vorbehalten!
// Version: 18.4.2003

var Erkl=(1==0), ErklTyp=0;
var ET="";
var ganzzahlig=(1==9);

function test()
{
	var x=23;y=-13
	var z=new Array( 2,-3,2*x-3*y , -1,2, -1*x+2*y );
	var n=new Array(1,1,1,1,1,1);
	var lz=new Array(),ln=new Array();
	GLSLB(z,n,lz,ln,2);
	alert("Zähler: "+ lz.join("   ")+"\nNenner: "+ln.join("   "));
}

function GLSL_(m,nz)
{
	var n=new Array(),z=new Array();
	var ln=new Array(),lz=new Array();
	var i,nn=nz*(nz+1);
	status="Wandle in Brüche um";
	for(i=0;i<nn;i++)
	{
		z[i]=m[i];
		var Z=String(m[i]).replace(/,/g,".");n[i]=1;var ZZ=Z.split("/");
		if(Z.indexOf("/")>-1){z[i]=ZZ[0];n[i]=ZZ[1];kuerzen(z,n,i);}
		if(ZZ[0].indexOf(".")>-1){n[i]=Number("1"+"0000000000000000000".substr(0,ZZ[0].length-ZZ[0].indexOf(".")-1));z[i]=Number(ZZ[0].replace(/\./g,""));kuerzen(z,n,i);}
		//while(z[i]!=Math.floor(z[i])){n[i]*=10;z[i]*=10;}
	}
	GLSLB(z,n,lz,ln,nz);
	for(i=0;i<nn;i++)m[i]=String(z[i])+(((n[i]!=1)&&(z[i]!=0))?"/"+String(n[i]):"");
	for(i=0;i<nz;i++)z[i*(nz+1)+nz]=lz[i]+(((ln[i]!=1)&&(lz[i]!=0))?"/"+ln[i]:"");
}

// z: Zähler, n: Nenner
// lz,ln: Lösungen
// nz: Anzahl Zeilen
function GLSLB(z,n,lz,ln,nz)
{
	var i, j, k, d, ns=nz+1, g=ErklTyp==1;
	var qz,qn,abbruch=(1==0);
	if(ganzzahlig)return GLSLBgz(z,n,lz,ln,nz);
	ET="";
	v[nz]="";
	if(Erkl)
	{
		ET+=" \n Gleichungssystem:\n\n   "+document.f.t1.value.replace(/\n/g,"\n\n   ")+"\n\n";
		ET+=(!g)?" Umformen und sortieren (Variablen alphabetisch links, Konstanten rechts):\n\n"+getGS("+")+"\n\n":"";	}
	if(g)
	{
		ET+=" \n Die Gleichungen werden so umgeformt und untereinander geschrieben, daß alle gleichen Variablen\n\n auf der linken Seite";
		ET+=" der Gleichung untereinander stehen und die konstanten Zahlen\n\n auf der rechten Seite.\n\n";
	}
	else ET+=" \n Stelle die Koeffizientenmatrix auf. Reihenfolge der Variablen: "+v.join(", ")+"Konstante\n\n";
	if(Erkl)ET+=toStr(z,n,nz)+"\n\n\n";

	for (j = 0;j<ns-1;j++)
	{
		status="Löse das Gleichungssystem  -  zu "+Math.floor(j*100/(ns-1))+"% fertig";
		// Diagonalenfeld normalisieren
		d=j*ns+j; // Index Diagonalenfeld
		if (z[d]==0)
		{
			//Gewährleisten, daß keine 0 in der Diagonale steht
			for(i=j+1;i<nz;i++)
			{
				// Suche Reihe mit Feld <> 0 und addiere dazu
				if (z[i*ns+j]!=0)
				{
					var fi=i*ns+j;
					if(Erkl)
					{
						if(g)
						ET+=" Da in der "+(j+1)+". Gleichung kein "+v[j]+" vorkommt";
						else
						ET+=" Da das Diagonalenfeld in der "+(j+1)+". Zeile 0 ist";
						ET+=", tausche die "+(j+1)+". und die "+(i+1)+". Zeile:\n\n";
					}
//					for(k=0;k<ns;k++)plus(z,n,j*ns+k,i*ns+k,j*ns+k,1,1,n[fi],z[fi],false);
					for(k=0;k<ns;k++){var X=n[j*ns+k];n[j*ns+k]=n[i*ns+k];n[i*ns+k]=X;X=z[j*ns+k];z[j*ns+k]=z[i*ns+k];z[i*ns+k]=X;}
					if(Erkl)
					{
						ET+=toStr(z,n,nz)+"\n\n\n";
					}
                    		break;
                		}
            	}
		}
		if((z[d]!=0)&&(z[d]!=n[d]))
		{
            	// Diagonalen auf 1 bringen
			if(Erkl)
			{
				if((/*(Math.abs(n[d])<Math.abs(z[d]))||*/(Math.abs(n[d])==1))&&(Math.abs(n[d])!=Math.abs(z[d])))
				ET+=" Durch Division der "+(j+1)+((g)?". Gleichung":". Zeile")+" durch "+BrStr(z[d],n[d]);
				else
				ET+=" Durch Multiplikation der "+(j+1)+((g)?". Gleichung":". Zeile")+" mit "+BrStr(n[d],z[d]);
				if(g)ET+=" wird der Faktor vor "+v[j]+" eliminiert:\n\n";
				else ET+=" wird das Diagonalelement zu 1 gemacht:\n\n";
			}
			for(k=0;k<ns;k++)if(k!=j)geteilt(z,n,j*ns+k,d,j*ns+k,true);
				z[d]=1;n[d]=1;
			if(Erkl)ET+=toStr(z,n,nz)+"\n\n\n";
		}
		else if((Erkl)&&(z[d]!=0))
		{
			if(g)ET+=" In der "+(j+1)+". Gleichung steht "+v[j]+" bereits ohne Faktor.\n\n\n";
			else ET+=" Das Diagonalenfeld der "+(j+1)+". Zeile ist bereits 1.\n\n\n";
		}

		// Spalten außerhalb der Diagonalen auf 0 bringen
		if(Erkl)
		{
			for(i=0;i<nz;i++)
			{
				if((i!=j)&&(z[i*ns+j]!=0))
				{
					if(Erkl)
					{
						if(g)ET+=" Mit der "+(j+1)+". Gleichung wird in allen anderen Gleichung der Summand mit "+v[j]+" eliminiert.\n\n\n";
						else ET+=" Mit der "+(j+1)+". Zeile werden alle anderen Zeilen in der "+(j+1)+". Spalte auf 0 gebracht.\n\n\n";
					}
					break;
				}
			}
			if(i==nz)
			{
				if(g)ET+=" In allen übrigen Gleichungen ist kein "+v[j]+" mehr enthalten.\n\n\n";
				else ET+=" Alle übrigen Zeilen haben in der "+(j+1)+". Spalte bereits eine 0.\n\n\n";
			}
		}
		if(!Erkl)for(i=0;i<nz*(nz+1);i++)kuerzen(z,n,i);

		for (i = 0 ; i< nz ; i++)
		{
			if (i != j )
			{
				var qz=z[i*ns+j],qn=n[i*ns+j];
				if(qz!=0)
				{
					for(k=0;k<ns;k++)minus(z,n,i*ns+k,j*ns+k,i*ns+k,1,1,qz,qn,true);
					//alert("Zeile "+j+"\nZähler: "+ z.join("   ")+"\nNenner: "+n.join("   "));
					if(Erkl)
					{
						if(g)ET+=" Zur "+(i+1)+". Gleichung wird "+((-qz!=qn)?"das "+BrStr(-qz,qn)+"fache der ":"die ")+(j+1)+". Gleichung addiert:\n\n";
						else ET+=" Zur "+(i+1)+". Zeile wird "+((-qz!=qn)?"das "+BrStr(-qz,qn)+"fache der ":"die ")+(j+1)+". Zeile addiert:\n\n";
						ET+=toStr(z,n,nz)+"\n\n\n";
					}
				}
				for(k=0;k<nz;k++)if(z[i*ns+k]!=0)break;
				if(k==nz)
				{
					abbruch=true;
					if(Erkl)
					{
						if(g)ET+=" In der "+(i+1)+". Gleichung sind alle Variablen verschwunden.";
						else ET+=" In der "+(i+1)+". Zeile sind alle Koeffizienten 0.";
						ET+=" \n\n   ——> Das Gleichungssystem hat keine "+((z[(i+1)*ns-1]!=0)?"":"eindeutige ")+"Lösung.\n\n\n"; 
					}
					break;
				}
			}
		}
		if(abbruch)break;
	}
	// Lösungsvektor füllen
	//alert("Zähler: "+ z.join("   ")+"\nNenner: "+n.join("   "));
	for(i=0;i<nz;i++)
	{
		lz[i]=z[(i+1)*ns-1];ln[i]=n[(i+1)*ns-1];
		if(ln[i]<0){lz[i]=-lz[i];ln[i]=-ln[i];}
		kuerzen(lz,ln,i);
	}
	if((Erkl)&&(ErklTyp==0))if(!abbruch)ET+=" In der letzten Spalte stehen die Lösungen.\n\n";

	if((Erkl)&&(ErklTyp==1))
	{
		
	}

}

// z: Zähler, n: Nenner
// lz,ln: Lösungen
// nz: Anzahl Zeilen
function GLSLBgz(z,n,lz,ln, nz)
{
	var i, j, k, d, ns=nz+1, g=ErklTyp==1,gg,e1,e2,nnorm=1==0;
	var qz,qn,abbruch=(1==0);
	ET="";
	v[nz]="";
	if(Erkl)
	{
		ET+=" \n Gleichungssystem:\n\n   "+document.f.t1.value.replace(/\n/g,"\n\n   ")+"\n\n";
		ET+=(g)?" Umformen und sortieren (Variablen alphabetisch links, Konstanten rechts):\n\n"+getGS("+")+"\n\n\n":"";
	}
	if(g)
	{
		ET+=" \n Die Gleichungen werden so umgeformt und untereinander geschrieben, daß alle gleichen Variablen\n\n auf der linken Seite";
		ET+=" der Gleichung untereinander stehen und die konstanten Zahlen\n\n auf der rechten Seite.\n\n";
	}
	else ET+=" \n Stelle die Koeffizientenmatrix auf. "+((v[0]==null)?"":"Reihenfolge der Variablen: "+v.join(", ")+"Konstante")+"\n\n";
	if(Erkl)ET+=toStr(z,n,nz)+"\n\n\n";

	status="mache ganzzahlig und teile zeilenweise durch den ggT";
	e1=e2=false;
	for(j=0;j<nz;j++)
	{
		gg=n[j*ns];for(i=1;i<ns;i++){gg*=n[j*ns+i]/ggT(gg,n[j*ns+i]);}
		for(i=0;i<ns;i++){z[j*ns+i]*=gg/n[j*ns+i];n[j*ns+i]=1;}
		if(gg!=1)e2=true;
		gg=z[j*ns];for(i=1;i<ns;i++)gg=ggT(gg,z[j*ns+i]);
		for(i=0;i<ns;i++)z[j*ns+i]/=gg;
		if(gg!=1)e1=true;
	}
	if((Erkl)&&(e1||e2))
	{
		ET+=" \n Die Koeffizienten werden zeilenweise durch "+(e2?"Multiplikation mit dem kgV der Nenner\n\n und anschließende ":"")+"Division durch den ggT ganzzahlig gemacht.\n\n";
		ET+=toStr(z,n,nz)+"\n\n\n";
	}

	for (j = 0;j<ns-1;j++)
	{
		status="Löse das Gleichungssystem  -  zu "+Math.floor(j*100/(ns-1))+"% fertig";
		d=j*ns+j; // Index Diagonalenfeld
		if (z[d]==0)
		{
			//Gewährleisten, daß keine 0 in der Diagonale steht
			for(i=j+1;i<nz;i++)
			{
				// Suche Reihe mit Feld <> 0 und addiere dazu
				if (z[i*ns+j]!=0)
				{
					var fi=i*ns+j;
					if(Erkl)
					{
						if(g)
						ET+=" Da in der "+(j+1)+". Gleichung kein "+v[j]+" vorkommt";
						else
						ET+=" Da das Diagonalenfeld in der "+(j+1)+". Zeile 0 ist";
						ET+=", tausche die "+(j+1)+". und die "+(i+1)+". Zeile:\n\n";
					}
//					for(k=0;k<ns;k++)plus(z,n,j*ns+k,i*ns+k,j*ns+k,1,1,n[fi],z[fi],false);
					for(k=0;k<ns;k++){var X=n[j*ns+k];n[j*ns+k]=n[i*ns+k];n[i*ns+k]=X;X=z[j*ns+k];z[j*ns+k]=z[i*ns+k];z[i*ns+k]=X;}
					if(Erkl)
					{
						ET+=toStr(z,n,nz)+"\n\n\n";
					}
                    		break;
                		}
            	}
		}

		// Spalten außerhalb der Diagonalen auf 0 bringen
		if(Erkl)
		{
			for(i=0;i<nz;i++)
			{
				if((i!=j)&&(z[i*ns+j]!=0))
				{
					if(Erkl)
					{
						if(g)ET+=" Mit der "+(j+1)+". Gleichung wird in allen anderen Gleichung der Summand mit "+v[j]+" eliminiert.\n\n\n";
						else ET+=" Mit der "+(j+1)+". Zeile werden alle anderen Zeilen in der "+(j+1)+". Spalte auf 0 gebracht.\n\n\n";
					}
					break;
				}
			}
			if(i==nz)
			{
				if(g)ET+=" In allen übrigen Gleichungen ist kein "+v[j]+" mehr enthalten.\n\n\n";
				else ET+=" Alle übrigen Zeilen haben in der "+(j+1)+". Spalte bereits eine 0.\n\n\n";
			}
		}
		//if(!Erkl)for(i=0;i<nz*(nz+1);i++)kuerzen(z,n,i);

		for(i=0;i<nz;i++)
		{
			if(i!=j)
			{
				var qz=z[i*ns+j],qn=n[i*ns+j],qzz=z[j*ns+j],gg=ggT(qzz,qz);
				qz/=gg;qzz/=gg;if(qzz<0){qzz=-qzz;qz=-qz;}
				if(qz!=0)
				{
					for(k=0;k<ns;k++)plus(z,n,i*ns+k,j*ns+k,i*ns+k,qzz,1,-qz,1,true);
					//alert("Zeile "+j+"\nZähler: "+ z.join("   ")+"\nNenner: "+n.join("   "));
					if(Erkl)
					{
						if(qz!=1)
						{
							if(g)ET+=((qzz==1)?" Zur ":" Zum "+qzz+"fachen der ")+(i+1)+". Gleichung wird "+((-qz!=qzz)?"das "+(-qz)+"fache der ":"die ")+(j+1)+". Gleichung addiert:\n\n";
							else ET+=((qzz==1)?" Zur ":" Zum "+qzz+"fachen der ")+(i+1)+". Zeile wird "+((-qz!=qzz)?"das "+(-qz)+"fache der ":"die ")+(j+1)+". Zeile addiert:\n\n";
						}
						else
						{
							if(g)ET+=((qzz==1)?" Von der ":" Vom "+qzz+"fachen der ")+(i+1)+". Gleichung wird die "+(j+1)+". Gleichung subtrahiert:\n\n";
							else ET+=((qzz==1)?" Von der ":" Vom "+qzz+"fachen der ")+(i+1)+". Zeile wird die "+(j+1)+". Zeile subtrahiert:\n\n";
						}
						ET+=toStr(z,n,nz)+"\n\n\n";
					}
				}
				for(k=0;k<nz;k++)if(z[i*ns+k]!=0)break;
				if(k==nz)
				{
					abbruch=true;
					if(Erkl)
					{
						if(g)ET+=" In der "+(i+1)+". Gleichung sind alle Variablen verschwunden.";
						else ET+=" In der "+(i+1)+". Zeile sind alle Koeffizienten 0.";
						ET+=" \n\n   ——> Das Gleichungssystem hat keine "+((z[(i+1)*ns-1]!=0)?"":"eindeutige ")+"Lösung.\n\n\n"; 
					}
					break;
				}
			}
		}
		if(abbruch)break;

		if(j<nz-1)
		{
			e1=false;
			var p="",pp;
			for(i=0;i<nz;i++)
			{
				gg=z[i*ns];for(k=1;k<ns;k++)gg=ggT(gg,z[i*ns+k]);
				if(gg!=1){e1=true;for(k=0;k<ns;k++)z[i*ns+k]/=gg;if(p!="")p+=",";p+=(i+1);}
			}
			pp=p.split(",");p=pp[0];for(i=1;i<pp.length-1;i++)p+=", "+pp[i];if(pp.length>1)p+=" und "+pp[i];
			if(e1&&Erkl)ET+=" \n Die Zeile"+((pp.length==1)?" "+p+" kann":"n "+p+" können")+" per Division durch ihren ggT vereinfacht werden:\n\n"+toStr(z,n,nz)+"\n\n\n";
		}
	}

	e1=false;
	if(!abbruch)
	{
		for(i=0;i<nz;i++)
		{
			if(z[i*ns+i]!=1){n[i*ns+ns-1]=z[i*ns+i];z[i*ns+i]=1;e1=true;}
		}
		if(Erkl&&e1)ET+=" \n Nun wird zeilenweise durch die "+(g?"Koeffizienten der ":"")+"Diagonalelemente dividiert:\n\n"+toStr(z,n,nz)+"\n\n\n";
	}

	// Lösungsvektor füllen
	//alert("Zähler: "+ z.join("   ")+"\nNenner: "+n.join("   "));
	for(i=0;i<nz;i++)
	{
		kuerzen(n,z,(i+1)*ns-1);
		if(n[(i+1)*ns-1]<0){z[(i+1)*ns-1]=-z[(i+1)*ns-1];n[(i+1)*ns-1]=-n[(i+1)*ns-1];}
		lz[i]=z[(i+1)*ns-1];ln[i]=n[(i+1)*ns-1];
		//kuerzen(lz,ln,i);
	}
	if((Erkl)&&(ErklTyp==0))if(!abbruch)ET+=" In der letzten Spalte stehen die Lösungen.\n\n";

	if((Erkl)&&(ErklTyp==1))
	{
		
	}
	ET=ET.replace(/ 2fach/g," Doppelt").replace(/ 3fach/g," Dreifach").replace(/ 4fach/g," Vierfach");
	ET=ET.replace(/das 1fache der/g,"die");
}

function BrStr(z,n)
{
	if(n<0){n*=-1;z*=-1;}
	if(n==1)return z;
	if(z==0)return 0;
	return z+"/"+n;
}

function toStrV(z,n,nz)
{
	var i,j,max=new Array(nz+1),t="",bz;
	for(i=0;i<=nz;i++)
	{
		max[i]=Math.max(Math.abs(z[i]),Math.abs(n[i]));
		for(j=0;j<nz;j++)max[i]=Math.max(Math.max(max[i],Math.abs(z[j*(nz+1)+i])),Math.abs(n[j*(nz+1)+i]));
	}
	for(i=0;i<nz*(nz+1);i++)kuerzen(z,n,i);
	for(i=0;i<=nz;i++){max[i]=String(max[i]).length;}
	for(i=0;i<nz;i++)
	{
		bz=(1==0);
		for(j=0;j<nz+1;j++){if(z[i*(nz+1)+j]==0)n[i*(nz+1)+j]=1;}
		var b=(1==0);
		for(j=0;j<nz+1;j++){if(n[i*(nz+1)+j]!=1){b=true;break;}}
		if(b)
		{
			t+="\n   "
			for(j=0;j<nz+1;j++)
			{
				if(j==nz)t+="   ";
				t+="    "+((n[i*(nz+1)+j]!=1)?cStr(Math.abs(z[i*(nz+1)+j]),max[j]):"                       ".substr(0,max[j]))+"   ";
			}
		}
		t+="\n   ";
		for(j=0;j<nz+1;j++)
		{
			if(j==nz)t+=" = ";
			if((!bz)&&(j==nz)){t=t.substr(0,t.length-8)+"   0  = "; }
			var maxx=Math.max(Math.abs(n[i*(nz+1)+j]),Math.abs(z[i*(nz+1)+j]));
			maxx=String(maxx).length;
			var zz=z[i*(nz+1)+j];
			var tt=((zz<0)?" -  ":((zz>0)&&(bz))?" +  ":"    ");
			if(j<nz)tt+=((n[i*(nz+1)+j]==1)?rStr(Math.abs(zz)+"·"+v[j],max[j]+2):cStr("———————————————————————".substr(0,maxx),max[j])+"·"+v[j])+" ";
			else tt+=((n[i*(nz+1)+j]==1)?cStr(Math.abs(zz)+"·"+v[j],max[j]):cStr("———————————————————————".substr(0,maxx),max[j])+"·"+v[j])+" ";
			if((j==0)||(j==nz))tt=tt.replace(/\+/g," ");
			if((j==nz)&&(zz==0)){;}
			t+=tt;
			if(zz!=0)bz=true;
		}
		if(b)
		{
			t+="\n   ";
			for(j=0;j<nz+1;j++)
			{
				if(j==nz)t+="   ";
				t+="    "+((n[i*(nz+1)+j]!=1)?cStr(Math.abs(n[i*(nz+1)+j]),max[j]):"                       ".substr(0,max[j])) +"   ";
			}
		}
		t+="\n";
	}
//	t=t.replace(/-     /g," -    ").replace(/-    /g," -   ").replace(/-   /g," -  ").replace(/-  /g," - ").replace(/\+/g," ");
	t=t.replace(/· /g,"");	
	t=t.replace(/\n   \+/g,"\n    ");//.replace(/\n   -  /g,"\n    - ").replace(/\n     -  /g,"\n    - ");
	jj=0;
//	t=t.replace(/ 0·\D/g,"    ").replace(/- 0·/g,"    ");
	t=t.replace(/= \+/g,"=  ").replace(/ 0·\D/g,"    ").replace(/ 1·/g,"   ").replace(/- 1·/g,"  -");
	while((i=t.search(/\n +-  /))>-1)
	{
		j=t.substring(i,t.length).indexOf("-");
		t=t.substr(0,i+j)+" -"+t.substring(i+j+2,t.length);
		jj++;if(jj>n)break;
	}
	t=t.replace(/= -  /g,"=  - ").replace(/=  -  /g,"=   - ").replace(/=   -  /g,"=    - ").replace(/=    -  /g,"=     - ");
	return t;
}

function toStr(z,n,nz)
{
	var i,j,max=new Array(nz+1),t="",vv=ErklTyp==1,ns=(nz==Math.sqrt(z.length))?nz:nz+1;
	if(vv)return toStrV(z,n,nz);
	for(i=0;i<=nz;i++)
	{
		max[i]=Math.max(Math.abs(z[i]),Math.abs(n[i]));
		for(j=0;j<nz;j++)max[i]=Math.max(Math.max(max[i],Math.abs(z[j*(ns)+i])),Math.abs(n[j*(ns)+i]));
	}
	for(i=0;i<nz*(ns);i++)kuerzen(z,n,i);
	for(i=0;i<ns;i++){max[i]=String(max[i]).length;}
	for(i=0;i<nz;i++)
	{
		for(j=0;j<ns;j++){if(z[i*(ns)+j]==0)n[i*(ns)+j]=1;}
		var b=(1==0);
		for(j=0;j<ns;j++){if(n[i*(ns)+j]!=1){b=true;break;}}
		if(b)
		{
			t+="\n   "
			for(j=0;j<ns;j++)t+="  "+((n[i*(ns)+j]!=1)?cStr(Math.abs(z[i*(ns)+j]),max[j]):"                       ".substr(0,max[j]))+(vv?"  ":"")+"   ";
		}
		t+="\n   ";
		for(j=0;j<ns;j++)
		{
			var maxx=Math.max(Math.abs(n[i*(ns)+j]),Math.abs(z[i*(ns)+j]));
			maxx=String(maxx).length;
			t+=((z[i*(ns)+j]<0)?"- ":"+ ")+((n[i*(ns)+j]==1)?cStr(Math.abs(z[i*(ns)+j]),max[j]):cStr("———————————————————————".substr(0,maxx),max[j]))+"   ";
		}
		if(b)
		{
			t+="\n   ";
			for(j=0;j<ns;j++)t+="  "+((n[i*(ns)+j]!=1)?cStr(Math.abs(n[i*(ns)+j]),max[j]):"                       ".substr(0,max[j])) +(vv?"  ":"")+"   ";
		}
		t+="\n";
	}
	t=t.replace(/-     /g," -    ").replace(/-    /g," -   ").replace(/-   /g," -  ").replace(/-  /g," - ").replace(/\+/g," ");
	return t;
}

function cStr(t,max)
{
	var L0=String(t).length,L1=Math.max(Math.floor((max-L0)/2),0);
	L0=max-L1-L0;
	if(L1>L0){var LL=L0;L0=L1;L1=LL;}
	//alert(t+"\n"+max+"\n"+"             ".substr(0,L0)+t+"              ".substr(0,L1));
	return "             ".substr(0,L0)+t+"               ".substr(0,L1);
}
function rStr(t,max)
{
	var L0=max-String(t).length;
	return "                 ".substr(0,L0)+t;
}

function kuerzen(z,n,i)
{	
	if(z[i]==0){n[i]=1;return;}
	var g=ggT(z[i],n[i]);
	z[i]/=g;n[i]/=g;
	if(n[i]<0){z[i]=-z[i];n[i]=-n[i];}
	return g;
}
function plus(z,n,i,j,k,fiz,fin,fjz,fjn,kuerzn)
{
	var nn=n[i]*n[j]*fin*fjn,zz=fiz*z[i]*n[j]*fjn+fjz*z[j]*n[i]*fin;
	z[k]=zz;n[k]=nn;
	if(kuerzn)kuerzen(z,n,k);
}	
function minus(z,n,i,j,k,fiz,fin,fjz,fjn,kuerzn)
{
	return plus(z,n,i,j,k,fiz,fin,-fjz,fjn,kuerzn);
}
function mal(z,n,i,j,k,fz,fn,kuerzn)
{
	n[k]=n[i]*n[j]*fn;z[k]=f*z[i]*z[j];
	if(kuerzn)kuerzen(z,n,k);
}	
function geteilt(z,n,i,j,k,kuerzn)
{
//	alert("vor geteilt"+i+":"+j+"->"+k+"\nZähler: "+ z.join("   ")+"\nNenner: "+n.join("   ")+"\n");
	var nn=n[i]*z[j];
	z[k]=z[i]*n[j];
	n[k]=nn;
//	alert("nach geteilt\nZähler: "+ z.join("   ")+"\nNenner: "+n.join("   ")+"\n");
	if(kuerzn)kuerzen(z,n,k);
}	
function ggT(a,b)
{
	if(isNaN(a)||isNaN(b))return 1;
	if((a==0)&&(b==0))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 toBruch(m)
{
	var Z=String(m),n=1,ZZ=Z.split("/"),z=0;
	if(Z.indexOf("/")>-1){z=ZZ[0];n=ZZ[1];}else z=Number(m);
	if(ZZ[0].indexOf(".")>-1){n=Number("1"+"0000000000000000000".substr(0,ZZ[0].length-ZZ[0].indexOf(".")-1));z=Number(ZZ[0].replace(/\./g,""));}
	var s=(z*n<0)?-1:1;z=Math.abs(z);n=Math.abs(n);
	var g=ggT(z,n);z/=g;n/=g;
	return new Array(s*z,n);
}


