// Javascript von Arndt Brünner,
// alle Rechte vorbehalten!

var a,b,c;
var MultErg=new Array(/\dx/,/\d\(/,/\)\(/,/x\(/,/\)x/,/pi\(/,/e_\(/,/\dpi/,/\de_/);
var grad_rad=Grad_rad;
var brueche=(1==1);

function calcKoeffs(x1,y1,x2,y2,x3,y3,k)
{
k[2]=(x3*(y2-y1)+x2*(y1-y3)+x1*(y3-y2))/((x1-x2)*(x3-x1)*(x3-x2));
k[1]=(x3*x3*(y2-y1)+x2*x2*(y1-y3)+x1*x1*(y3-y2))/((x2-x1)*(x3-x1)*(x3-x2));
k[0]=(x3*x3*(x2*y1-x1*y2)+x3*(x1*x1*y2-x2*x2*y1)+x1*x2*y3*(x2-x1))/((x2-x1)*(x3-x1)*(x3-x2));
//alert(k);
}

function normPolynom(t,k)
{
	t=t.toLowerCase().replace(/·/g,"*").replace(/[—–]/g,"-").replace(/[—–]/g,"-");
	if(t=="")return "?";
	if(t.indexOf("x")==-1){alert("Die Eingabe enthält kein x");return "?";}
	t=t.replace(/,/g,".").replace(/²/g,"^2").replace(/³/g,"^3");
	t=t.replace(/·/g,"*").replace(/ +/g,"");
	while(t.indexOf("xx")>-1){t=t.replace(/xx/,"x*x");}
	var i,j,T="";
	for(j=0;j<MultErg.length;j++)
		do{i=t.search(MultErg[j]);if(i==-1)break;t=t.substr(0,i+1)+"*"+t.substring(i+1,t.length);}while(true);
	t=translate(t);
	t=t.replace(/Math\.pow\(X,2\)/g,"(X*X)");
	t=t.replace(/Math\.pow\(X,3\)/g,"(X*X*X)");
	t=t.replace(/Math\.pow\(X,4\)/g,"(X*X*X*X)");
	t=t.replace(/Math\.pow\(X,5\)/g,"(X*X*X*X*X)");//alert(t);
	var x1=-17.625,x2=-3.125,x3=14.75;
	var y1=eval(t.replace(/X/g,"x1"));//T+="f(-Math.PI*Math.E)="+y1+"\n";
	var y2=eval(t.replace(/X/g,"x2"));//T+="f(Math.PI)="+y2+"\n";
	var y3=eval(t.replace(/X/g,"x3"));//T+="f(Math.PI*Math.PI)="+y3+"\n";
	if(Math.abs(y1)+Math.abs(y2)+Math.abs(y3)<1000000)
	{
		calcKoeffs(x1,y1,x2,y2,x3,y3,k);
		return t;
	}
	x1=-Math.PI*Math.E,x2=Math.PI,x3=Math.PI*Math.PI;
	y1=eval(t.replace(/X/g,"x1"));//T+="f(-Math.PI*Math.E)="+y1+"\n";
	y2=eval(t.replace(/X/g,"x2"));//T+="f(Math.PI)="+y2+"\n";
	y3=eval(t.replace(/X/g,"x3"));//T+="f(Math.PI*Math.PI)="+y3+"\n";
	calcKoeffs(x1,y1,x2,y2,x3,y3,k);
	return t;
}

function test1(a,b,c,t,f)
{
	for(i=0;i<10;i++)
	{
		var x=Math.random()*20-10;
		var y4=x*(a*x+b)+c;
		var y5=eval(t.replace(/X/g,"x"));
		if(Math.abs(y5-y4)>0.000001)
		{
			if(f!="")document.f.t2.value="Das ist leider keine quadratische "+f+"!"; 
			return false;
		}
	}
	return true;
}
function get_Bruch(ee)
{
	if(ee==Math.round(ee))return String(ee);
	var eee=String(GetBruch2(ee));
	if(eee=="")eee=String(GetBruchKB(ee,1e-8,10000000));//alert(ee+"\n"+eee);
	return (eee!="")?eee:String(Math.round(ee*1e10)/1e10);
}
var space="                                                       ";
space+=space;space+=space;

function quaderg(t)
{
	t=t.toLowerCase().replace(/·/g,"*").replace(/[—–]/g,"-");
	var k=new Array(1,0,0),i,j,x1,x2,nn="";
	for(j=0;j<MultErg.length;j++)
		do{i=t.search(MultErg[j]);if(i==-1)break;t=t.substr(0,i+1)+"*"+t.substring(i+1,t.length);}while(true);
	var tt=t.split("=");
	t=(tt.length==1)?tt[0]:tt[0]+"-("+tt[1]+")";
	var merkt=t;
	document.f.t2.value="";
	t=normPolynom(t,k);
	if(t.indexOf("/")>-1)
	{//alert(t);
		nn=findeNenner("("+merkt+")"); 
		if((nn!="")&&(!test1(k[2],k[1],k[0],t,"")))
		{
			t=("("+merkt+")*"+nn).replace(/X/g,"x");
			t=normPolynom(t,k);
		}
	}
	if(t=="?")return;
	k[2]=r(k[2]);
	k[1]=r(k[1]);
	k[0]=r(k[0]);
	if(!test1(k[2],k[1],k[0],t,"Gleichung"))return;
	var a=new RationaleZahl(0,1),b=new RationaleZahl(0,1),c=new RationaleZahl(0,1);
	var d=get_Bruch(k[2]),D=d.split("/");if(D.length==1)D[1]=1;a.set(D[0],D[1]);
	d=get_Bruch(k[1]),D=d.split("/");if(D.length==1)D[1]=1;b.set(D[0],D[1]);
	d=get_Bruch(k[0]),D=d.split("/");if(D.length==1)D[1]=1;c.set(D[0],D[1]);
	var T=new Array(),ti=0,U=new Array();
	k[2]=a;k[1]=b;k[0]=c;

	if(a.z==0)
	{
		if(k[1].z!=0)
		{
			T[ti++]="Diese Gleichung ist linear!\n";
			T[ti]=PStrR("x",k)+" = 0";
			if(b.n!=b.z)
			{
				U[ti++]="|  : "+kl(b);
				k[0].div(b);k[1].set(1,1);
				T[ti]=PStrR("x",k)+" = 0";
			}
			k[0].z=-k[0].z;
			U[ti++]="|  "+umf(k[0]);
			T[ti]="x = "+k[0].str();x1=x2=k[0].z/k[0].n;
			if(k[0].n!=1)T[ti]+="\n  = "+String(k[0].z/k[0].n).replace(/\./,",").replace(/-,/,"-0,").replace(/ ,/," 0,");
			U[ti++]="";
		}
		else
		{
			T[ti++]=PStrR("x",k)+" = 0";
			U[ti++]="";
			if(k[0].z==0)T[ti]="L = R";else T[ti]="L = { }";U[ti++]="";
		}
	}
	else
	{
	if(k[2].z!=k[2].n)
	{
		T[ti]="Standardform der Gleichung:";U[ti++]="";
		T[ti]=PStrR("x",k)+" = 0";U[ti++]="|  : "+kl(a);
		b.div(a);c.div(a);a.z=1;a.n=1;		
	}
	T[ti]=PStrR("x",k).replace(/\^2/g,"²")+" = 0";U[ti++]="";
	T[ti]="";U[ti++]="";
	T[ti]="Die Normalform der Gleichung ist  "+PStrR("x",k).replace(/\^2/g,"²")+" = 0";
	U[ti++]="";
	var bh=new RationaleZahl(b.z,b.n*2);
	var bhq=new RationaleZahl(bh.z*bh.z,bh.n*bh.n);
	var h=new RationaleZahl(bhq.z,bhq.n);
	h.sub(c);
	T[ti]="Lies p als Faktor vor dem x ab: p = "+b.str();
	if(b.z!=0)
	{
		T[ti]+="\nBerechne  p/2 = "+bh.str()+"  sowie  (p/2)² = "+bhq.str();
		U[ti++]="";
		T[ti]="Die Konstante links muß (p/2)², also "+bhq.str()+", sein, daß die linke Seite \nals Binom geschrieben werden kann.";
		if(h.z==0)
		{
			T[ti]+=" Das ist hier bereits der Fall.";
		}
		U[ti++]="";
		T[ti]="";U[ti++]="";
	}
	else
	{
		T[ti]="Da kein linearer Summand vorhanden ist, isoliere einfach x² und ziehe die Wurzeln:\n";
		U[ti++]="";
	}
	if(h.z!=0)
	{
		T[ti]=PStrR("x",k)+" = 0";
		U[ti++]="|  "+umf(h)+((b.z!=0)?"  (damit links  + "+bhq.str()+" steht)":"");
	}
	k[0].setR(bhq);

	T[ti]=PStrR("x",k)+" = "+h.str();
	if(k[0].z!=0)
	{
		U[ti++]="|  als Binom schreiben";

		k[2].z=0;k[1].set(1,1);k[0].setR(bh);
		T[ti]="("+PStrR("x",k)+")² = "+h.str();
	}

	var hz=h.z;
	if(hz>0)
	{
		U[ti++]="|  Wurzeln ziehen";

		var rs="Sqr("+h.str()+")";
		T[ti]=PStrR("x",k)+" = ±"+rs;	

		var sz=Math.sqrt(h.z),sn=Math.sqrt(h.n),s="",ss=0;
		if(((sz%1)==0)&&((sn%1)==0))
		{
			U[ti++]="";
			h.set(sz,sn);
			T[ti]=PStrR("x",k)+" = ±"+h.str();
		}
		else if((sz%1)==0)
		{
			U[ti++]="";
			T[ti]=PStrR("x",k)+" = ±"+(s=sz+"/Sqr("+h.n+")");
			ss=sz/Math.sqrt(h.n);
		}
		else if(((sn%1)==0)&&(sn!=1))
		{
			U[ti++]="";
			T[ti]=PStrR("x",k)+" = ±"+(s="Sqr("+h.z+")/"+sn);
			ss=Math.sqrt(h.z)/sn;
		}
		else
		{
			T[ti]=PStrR("x",k)+" = ±"+(s="Sqr("+h.str()+")");
			ss=Math.sqrt(h.z/h.n);
		}
		bh.z=-bh.z
		U[ti++]=(bh.z!=0)?"|  "+umf(bh):"";
		var hh=new RationaleZahl(-h.z,h.n);
		T[ti]="zwei Lösungen:";
		if(nn!="")T[ti]="zwei Lösungen, für die jeweils noch überprüft werden muß, \nob sie in der Definitionsmenge liegen oder zur Division durch Null führen:";
		U[ti++]="";
		if(s=="")
		{
			hh.add(bh);h.add(bh);
			T[ti]="x = "+hh.str();
			x1=hh.z/hh.n;
			if(hh.n!=1)T[ti]+=(" = "+String(x1)).replace(/\./,",").replace(/-,/,"-0,").replace(/ ,/," 0,");
			U[ti++]="";
			T[ti]="oder";U[ti++]="";
			T[ti]="x = "+h.str();
			x2=h.z/h.n;
			if(h.n!=1)T[ti]+=(" = "+String(x2)).replace(/\./,",").replace(/-,/,"-0,").replace(/ ,/," 0,");
		}
		else
		{
			x1=bh.z/bh.n-ss;
			T[ti]="x = "+bh.str()+" - "+s+(" = "+String(x1)).replace(/\./,",").replace(/-,/,"-0,").replace(/ ,/," 0,");
			U[ti++]="";
			T[ti]="oder";U[ti++]="";
			x2=bh.z/bh.n+ss;
			T[ti]="x = "+bh.str()+" + "+s+(" = "+String(x2)).replace(/\./,",").replace(/-,/,"-0,").replace(/ ,/," 0,");
		}
		U[ti++]="";
	}
	if(hz==0)
	{
		U[ti++]="|  Wurzel ziehen";
		bh.z=-bh.z
		var rs="Sqr("+h.str()+")";
		T[ti]=PStrR("x",k)+" = 0";	
		U[ti++]="|  "+umf(bh);
		var hh=new RationaleZahl(bh.z,bh.n);
		T[ti]="eine Lösung:";
		if(nn!="")T[ti]="eine Lösung, für die noch überprüft werden muß, \nob sie in der Definitionsmenge liegt oder zur Division durch Null führt:";
		U[ti++]="";
		T[ti]="x = "+hh.str();x1=x2=hh.z/hh.n;
		if(hh.n!=1)T[ti]+=(" = "+String(x1)).replace(/\./,",").replace(/-,/,"-0,").replace(/ ,/," 0,");
		U[ti++]="";
	}
	if(hz<0)
	{
		U[ti++]="";
		T[ti]=" \nDie rechte Seite ist negativ, daher gibt es keine reelle Wurzel.\n——> Die Gleichung hat keine reelle Lösung";
	}
	}
	if((nn!="")&&(x1!=null))
	{
		nn=nn.toLowerCase().replace(/\)\(/g,")*(");//alert(translate(nn).replace(/X/g,"("+x1+")"));
		var y1=eval(translate(nn).replace(/X/g,"("+x1+")")),y2=eval(translate(nn).replace(/X/g,"("+x2+")"));
		if(x1!=x2)
		{
			T[ti++]=" \nPrüfen, ob die Lösungen zur Definitionsmenge gehören oder ob sie Nenner zu Null machen:";
			if(Math.abs(y1)<1e-10)T[ti++]="x1 führt zur Division durch Null und ist daher keine Lösung!";
			else T[ti++]="x1 gehört zur Definitionsmenge und ist daher Lösung";
			if(Math.abs(y2)<1e-10)T[ti++]="x2 führt zur Division durch Null und ist daher keine Lösung!";
			else T[ti++]="x2 gehört zur Definitionsmenge und ist daher Lösung";
		}
		else
		{
			T[ti++]=" \nPrüfen, ob die Lösung zur Definitionsmenge gehört oder ob sie Nenner zu Null macht:";
			if(Math.abs(y1)<1e-10)T[ti++]="x führt zur Division durch Null und ist daher keine Lösung!";
			else T[ti++]="x gehört zur Definitionsmenge und ist daher Lösung";
		}
	}
	var max=0;
	for(i=0;i<ti;i++){if(T[i]==null)T[i]="";if(U[i]==null)U[i]="";T[i]=T[i].replace(/= 0 \+ /g,"= ").replace(/= 0 - /g,"= -")}
	for(i=1;i<ti;i++){if(U[i].indexOf("|")>-1)max=Math.max(T[i].length,max);} 
	for(i=0;i<ti;i++)
		T[i]+=space.substr(0,max+5-T[i].length)+U[i];
	if((T[ti-1]+T[ti-4]).indexOf("1/2 + Sqr(5)/2")>-1)T[ti++]="\nDie Gleichung beschreibt den goldenen Schnitt!";
	document.f.t2.value=T.join("\n");
}

var space="                                                    ";space+=space;space+=space;

function calcSP(t)
{
	t=t.toLowerCase().replace(/ /g,"");
	if(t.search(/\^\D/)>-1){alert("Ungültige Eingabe: \nnach ^ muß Zahl folgen");return;}
	var tt=t.replace(/[x,\.\(\)\-\+\^²³*\/·—–]/g,"");
	if(tt.search(/\D/)>-1){alert("Ungültige Eingabe!\nZeichen: "+tt.replace(/\d/g,""));return;}
	var i,j,T="",xs,ys;
	var k=new Array(1,0,0);
	brueche=(document.f.brueche.selectedIndex==0);
	t=normPolynom(t,k);if(t=="?")return;
	var que=document.f.algo.selectedIndex==1;
	if(brueche){if(calcSPR(t,k))return; T="Koeffizienten zu groß für Brüche-Modus\n\n";}
	k[2]=r(k[2]);
	k[1]=r(k[1]);
	k[0]=r(k[0]);
	var a=k[2],b=k[1],c=k[0];
	if(!test1(a,b,c,t,"Funktion"))return;
	if((que)&&(a!=0))
	{
		var u0="";u1="";
		u0="f(x) = "+PStr("x",k).replace(/\^2/g,"²")+"\n";
		var ls=((a<0)?"-":"")+"f(x)"+((Math.abs(a)!=1)?"/"+Math.abs(a):"")+" = ";
		var kk=new Array(r(k[0]/a),r(k[1]/a),1);
		var qe=kk[1]*kk[1]/4;
		if(a!=1){u1=": "+((a<0)?"(":"")+r(a)+((a<0)?")":"")+"\n";u0+=ls+PStr("x",kk)+"\n";}
		if(kk[1].z!=0)
		{
			u1+="quadratische Ergänzung: + (p/2)²\n";
			u0+=ls+"x² + "+r(kk[1])+"·x + "+r(qe)+" + "+r(kk[0])+" - "+r(qe)+"\n";
		}
		xs=-kk[1]/2;ys=kk[0]-qe;
		if(b!=0)
		{
			u1+="Mit binomischer Formel faktorisieren\n";
			u0+=ls+"(x - "+r(xs)+")² + "+r(ys);
		}
		if(a!=1)
		{
			u1+="· "+((a<0)?"(":"")+r(a)+((a<0)?")":"");
			ys*=a;
			u0+="\nf(x) = "+r(a)+"·(x - "+r(xs)+")² + "+r(ys);
		}
		
		u0=u0.replace(/\+ -/g,"- ").replace(/- -/g,"+ ").replace(/\n1·/g,"\n");
		var U=u0.split("\n"),UU=u1.split("\n"),ml=0;
		for(i=0;i<U.length;i++)ml=Math.max(ml,U[i].length);
		for(i=0;i<U.length;i++)U[i]+=space.substr(0,4+ml-U[i].length)+(((UU[i]!="")&&(i<UU.length))?"|  "+UU[i]:"");
		T+=U.join("\n\n");
		T+="\n\nKoordinaten des Scheitelpunkts ablesen:\n\nx  = "+r(xs)+"\n s\n\ny  = "+r(ys)+"\n s";
	}
	else
	{
		T+="f(x) = "+PStr("x",k).replace(/\^2/g,"²")+"\n";
		if(a!=1)T+="\na = "+a+"       b = "+b+"       c = "+c;
		if(a==1)T+="\np = "+b+"       q = "+c;
	}
	if(a==0)
	{
		T+="\n\nDa a=0 ist, handelt es sich um eine Gerade, die keinen Scheitelpunkt besitzt!";
	}
	else if(!que)
	{
		T+="\n\nKoordinaten des Scheitelpunkts:";
		var aa=(a>0)?a:"("+a+")",aaa=(a>0)?r(4*a):"("+r(4*a)+")";
		if(a!=1)
		T+="\n\nx  = -b/(2a) = "+r(-b)+"/(2·"+aa+") = "+r(-b/(2*a))+"\n";
		else
		T+="\n\nx  = -p/2 = "+r(-b)+"/2 = "+r(-b/(2*a))+"\n";
		T+=" s\n\n";
		if(a!=1)
		T+="y  = c - b²/(4a) = "+c+" - "+r(b*b)+"/"+aaa+" = "+r(c-b*b/(4*a))+" \n";
		else
		T+="y  = q - p²/4 = "+c+" - "+r(b*b)+"/4 = "+r(c-b*b/4)+" \n";
		T+=" s";
	}
	
	if((a!=0)&&(!que))T+="\n\nScheitelpunktform der Funktionsgleichung:\n\nf(x) = "+a+"·(x - "+r(-b/(2*a))+")² + "+r(c-b*b/(4*a))+" ";

	T+="\n\n\nSchnittpunkte mit den Koordinatenachsen:";

	if(a==0)
	{
		if((b==0)&&(c!=0))T+="\n\n • keine Nullstelle, die Gerade verläuft parallel zur x-Achse";
		else if((b==0)&&(c==0))T+="\n\n • die Gerade ist deckungsgleich mit der x-Achse";
		else T+="\n\n • Nullstelle (Schnittpunkt der Geraden mit der x-Achse) bei: x = -c/b = "+r(-c/b);
	}
	else if(b*b==4*a*c)
		T+="\n\n • Nullstelle (Schnittpunkt mit der x-Achse) am Scheitelpunkt";
	else if(b*b<4*a*c)
		T+="\n\n • keine Nullstelle, die Parabel schneidet die x-Achse nicht";
	else
	{
		T+="\n\n • Nullstellen (Schnittpunkte mit x-Achse): \n\n      x  = "+r(-b/(a+a)-Math.sqrt(b*b-4*a*c)/Math.abs(a+a))+"\n       1\n\n";
		T+="      x  = "+r(-b/(a+a)+Math.sqrt(b*b-4*a*c)/Math.abs(a+a))+"\n       2";
	}

	T+="\n\n • Schnittpunkt mit y-Achse bei y = f(0) = "+((a==1)?"q":"c")+" = "+r(c)+"\n\n";

	T=T.replace(/\./g,",").replace(/- -/g,"+ ").replace(/\+ -/g,"- ");
	T=T.replace(/-1·/g,"-").replace(/ 1·/g," ").replace(/\(x - 0\)/g,"x");
	T=T.replace(/ ,/g," 0,").replace(/-,/g,"-0,").replace(/\+ 0 /g,"");
	document.f.t2.value=T;
}

function calcSPR(t,kk)
{
	if(!test1(kk[2],kk[1],kk[0],t,"Funktion"))return;
	var i,j,T="";
	var k=new Array(new RationaleZahl(0,1),new RationaleZahl(0,1),new RationaleZahl(0,1));
	var xs=new RationaleZahl(0,1),ys=new RationaleZahl(0,1);
	for(i=0;i<3;i++){if(!kettenbruchapprox(kk[i],k[i],1000000,1e-10))return false;}
	var a=kk[2],b=kk[1],c=kk[0];
	var bq=new RationaleZahl(k[1].z*k[1].z,k[1].n*k[1].n);
	var que=document.f.algo.selectedIndex==1;

	var B=new RationaleZahl(2*k[2].z,k[2].n);

	if((que)&&(a!=0))
	{
		var u0="";u1="";
		u0="f(x) = "+PStrR("x",k).replace(/\^2/g,"²")+"\n";
		B.setR(k[2]);B.kehrwert();
		var kk=new Array(new RationaleZahl(k[0].z,k[0].n),new RationaleZahl(k[1].z,k[1].n),new RationaleZahl(1,1));
		kk[1].mult(B);kk[0].mult(B);
		var qe=new RationaleZahl(1,1);
		qe.setR(kk[1]);qe.n*=2;qe.mult(qe);
		if(a!=1){u1=": "+kstr(k[2])+"\n";u0+=B.str()+"·f(x) = "+PStrR("x",kk)+"\n";}
		if(kk[1].z!=0)
		{
			u1+="quadratische Ergänzung: + (p/2)²\n";
			u0+=B.str()+"·f(x) = x² + "+kk[1].str()+((kk[1].n!=1)?"·":"")+"x + "+qe.str()+" - "+qe.str()+" + "+kk[0].str()+"\n";
		}
		xs.setR(kk[1]);xs.n*=2;xs.z*=-1;xs.kuerzen();
		ys.setR(kk[0]);ys.sub(qe);
		if(b!=0)
		{
			u1+="Mit binomischer Formel faktorisieren\n";
			u0+=B.str()+"·f(x) = (x - "+xs.str()+")² + "+ys.str();
		}
		if(a!=1)
		{
			B.kehrwert();
			u1+="· "+kstr(B);
			ys.mult(B);
			u0+="\nf(x) = "+B.str()+"·(x - "+xs.str()+")² + "+ys.str();
		}
		
		u0=u0.replace(/\+ -/g,"- ").replace(/- -/g,"+ ").replace(/\n1·/g,"\n");
		var U=u0.split("\n"),UU=u1.split("\n"),ml=0;
		for(i=0;i<U.length;i++)ml=Math.max(ml,U[i].length);
		for(i=0;i<U.length;i++)U[i]+=space.substr(0,4+ml-U[i].length)+(((UU[i]!="")&&(i<UU.length))?"|  "+UU[i]:"");
		T+=U.join("\n\n");
		T+="\n\nKoordinaten des Scheitelpunkts ablesen:\n\nx  = "+xs.str()+"\n s\n\ny  = "+ys.str()+"\n s";
	}
	else
	{
		T+="f(x) = "+PStrR("x",k).replace(/\^2/g,"²")+"\n";
		if(a!=1)T+="\na = "+k[2].str()+"       b = "+k[1].str()+"       c = "+k[0].str();
		if(a==1)T+="\np = "+k[1].str()+"       q = "+k[0].str();
	}
	B=new RationaleZahl(2*k[2].z,k[2].n);
	if(a==0)
	{
		T+="\n\nDa a=0 ist, handelt es sich um eine Gerade, die keinen Scheitelpunkt besitzt!";
	}
	else if(!que)
	{

		T+="\n\nKoordinaten des Scheitelpunkts:";
		var aa=(a>0)?a:"("+a+")",aaa=(a>0)?r(4*a):"("+r(4*a)+")";
		k[1].z*=-1;
		if(a!=1)
		{
			T+="\n\nx  = -b/(2a) = "+kstr(k[1])+"/(2·"+kstr(k[2])+") = ";
			B.kehrwert();B.mult(k[1]);
			T+=B.str()+"\n";
		}
		else
		{
			B.setR(k[1]);if((B.z%2)==0)B.z/=2;else B.n*=2;
			T+="\n\nx  = -p/2 = "+kstr(k[1])+"/2 = "+B.str()+"\n";
		}
		T+=" s\n\n";
		xs.setR(B);
		B.setR(bq);B.div(k[2]);B.n*=4;B.sub(k[0]);B.z*=-1;
		if(a!=1)
		T+="y  = c - b²/(4a) = "+k[0].str()+" - "+kstr(bq)+"/(4·"+kstr(k[2])+") = "+B.str()+" \n";
		else
		T+="y  = q - p²/4 = "+k[0].str()+" - "+kstr(bq)+"/4 = "+B.str()+" \n";
		ys.setR(B);
		T+=" s";
		k[1].z*=-1;
	}
	

	if((a!=0)&&(!que))T+=("\n\nScheitelpunktform der Funktionsgleichung:\n\nf(x) = "+k[2].str()+"·(x - "+xs.str()+")² + "+ys.str()+" ").replace(/- -/,"+ ").replace(/\+ -/,"- ");

	T+="\n\n\nSchnittpunkte mit den Koordinatenachsen:";
	if(a==0)
	{
		if((b==0)&&(c!=0))T+="\n\n • keine Nullstelle, die Gerade verläuft parallel zur x-Achse";
		else if((b==0)&&(c==0))T+="\n\n • die Gerade ist deckungsgleich mit der x-Achse";
		else {B.setR(k[0]);B.z*=-1;B.div(k[1]);T+="\n\n • Nullstelle (Schnittpunkt der Geraden mit der x-Achse) bei: x = -c/b = "+B.str();}
	}
	else if(b*b==4*a*c)
		T+="\n\n • Nullstelle (Schnittpunkt mit der x-Achse) am Scheitelpunkt";
	else if(b*b<4*a*c)
		T+="\n\n • keine Nullstelle, die Parabel schneidet die x-Achse nicht";
	else
	{
		B.setR(k[0]);B.z*=4;B.mult(k[2]).sub(bq);B.z*=-1;
		var wurz=quadk(B);
		T+="\n\n • Nullstellen (Schnittpunkte mit x-Achse): \n\n      x  = ";
		if(wurz=="")
		{
			bq.setR(k[1]);bq.z*=-1;bq.sub(B);bq.n*=2;bq.div(k[2]);
			var bq1=new RationaleZahl(k[1].z,k[1].n);
			bq1.z*=-1;bq1.add(B);bq1.n*=2;bq1.div(k[2]);
			var sw=(Math.abs(bq.z/bq.n)<Math.abs(bq1.z/bq1.n));
			T+=(!sw)?bq1.str():bq.str();
			T+="\n       1\n\n";
			T+="      x  = ";
			T+=(!sw)?bq.str():bq1.str();
			T+="\n       2";
		}
		else
		{
			B.n*=2;B.div(k[2]);B.z=Math.abs(B.z);
			if(B.str()!="1")wurz=(Math.abs(B.z)!=1)?B.str()+"·"+wurz:wurz+"/"+B.n;
			bq.setR(xs);
			var x1=(-b-Math.sqrt(b*b-4*a*c))/(a+a),x2=(-b+Math.sqrt(b*b-4*a*c))/(a+a);
			T+=bq.str()+" - "+wurz+" = "+r(Math.min(x1,x2));
			T+="...\n       1\n\n      x  = ";
			T+=bq.str()+" + "+wurz+" = "+r(Math.max(x1,x2))+"...\n       2";
		}

	}

	T+="\n\n • Schnittpunkt mit y-Achse bei y = f(0) = "+((a==1)?"q":"c")+" = "+k[0].str()+"\n\n";

	T=T.replace(/\./g,",").replace(/- -/g,"+ ").replace(/\+ -/g,"- ");
	T=T.replace(/-1·/g,"-").replace(/ 1·/g," ").replace(/\(x - 0\)/g,"x");
	T=T.replace(/ ,/g," 0,").replace(/-,/g,"-0,").replace(/\+ 0 /g,"").replace(/,,,/g,"...");
	document.f.t2.value=T;
	return true;
}

var pz=new Array()
function quadk(b)
{
	var x,xq,z=b.z,n=b.n,i;
	b.z=b.n=1;
	x=Math.sqrt(z);if(x==Math.round(x)){z=1;b.z=x;}
	x=Math.sqrt(n);if(x==Math.round(x)){n=1;b.n=x;}
	var m=Math.sqrt(Math.max(Math.abs(z),Math.abs(n)));
	for(i=0;i<pz.length;i++)
	{
		x=pz[i];
		xq=x*x;
		while(((z%xq)==0)&&(z!=1)){z/=xq;b.z*=x;}
		while(((n%xq)==0)&&(n!=1)){n/=xq;b.n*=x;}
		if((n==1)&&(z==1))return "";
		if(xq>m)break;
	}
	b.n*=n;
	b.kuerzen();
	return "sqr("+(z*n)+")";
}

function r(x)
{
	return Math.round(x*10000000000)/10000000000;
}

function PStr(v,k)
// Erzeugt einen Polynomstring über die Variable v mit den Koeffizienten k[]
{
	var t="",g=k.length-1;kk=new Array(g+1);
	kk[0]=String(k[0]);
	for(i=1;i<=g;i++) kk[i]=((k[i]==1)||(k[i]==-1))?((k[i]==1)?"":"-"):String(k[i]);
	for(i=0;i<=g;i++) {kk[i]=kk[i].replace(/\-\./,"-0,").replace(/\./,",");if(kk[i].charAt(0)==",")kk[i]="0"+kk[i];}
	for(i=g;i>1;i--) if(k[i]!=0)t+="+"+kk[i]+v+"^"+i;
	if((k[1]!=0)&&(g>0))t+="+"+kk[1]+v; if(k[0]!=0)t+="+"+kk[0];
	t=t.replace(/\+\-/g,"-").replace(/\+/g," + ").replace(/\-/g," - ").replace(/\+/g," + ").replace(/\s\s/g," ");
	if(t.substr(0,3)==" - ")t="-"+t.substring(3,t.length);
	if(t.substr(0,2)==" +")t=t.substring(2,t.length);
	while(t.substr(0,1)==" ")t=t.substring(1,t.length);
	if(t=="")t="0";
	return t.replace(/\^2/,"²");
}
function kstr(b)
{
	return((b.n==1)&&(b.z>=0))?b.str():"("+b.str()+")";
}

function kl(b)
{
	if(b.z>=0)return b.str();
	return "("+b.str()+")";
}
function umf(b)
{
	if(b.z>0)return "+ "+b.str();
	return "- "+(b.str().replace(/-/,""));
}

function PStrR(v,k)
// Erzeugt einen Polynomstring über die Variable v mit den Koeffizienten k[]
{
	var t="",g=k.length-1;kk=new Array(g+1);
	kk[0]=k[0].str();
	for(i=1;i<=g;i++) kk[i]=((k[i].z==k[i].n)||(k[i].z==-k[i].n))?((k[i].z==k[i].n)?"":"-"):k[i].str();
	for(i=0;i<=g;i++) {kk[i]=kk[i].replace(/\-\./,"-0,").replace(/\./,",");if(kk[i].charAt(0)==",")kk[i]="0"+kk[i];}
	for(i=g;i>1;i--) if(k[i].z!=0)t+="+"+kk[i]+((k[i].n!=1)?"·":"")+v+"^"+i;
	if((k[1].z!=0)&&(g>0))t+="+"+kk[1]+((k[i].n!=1)?"·":"")+v; if(k[0].z!=0)t+="+"+kk[0];
	t=t.replace(/\+\-/g,"-").replace(/\+/g," + ").replace(/\-/g," - ").replace(/\+/g," + ").replace(/\s\s/g," ");
	if(t.substr(0,3)==" - ")t="-"+t.substring(3,t.length);
	if(t.substr(0,2)==" +")t=t.substring(2,t.length);
	while(t.substr(0,1)==" ")t=t.substring(1,t.length);
	if(t=="")t="0";
	return t.replace(/\^2/,"²").replace(/-·/g,"-").replace(/\+·/g,"+");
}

function findeNenner(t)
{
	t=t.toLowerCase();
	if(t.indexOf("/")==-1)return "";
	var i,k,tt="",ttt;
	for(i=0;i<t.length;i++)
	{
		if(t.charAt(i)=="/")
		{
			k=parsefind(t,i,1);
			ttt="("+t.substring(i+1,k)+")";
			if(ttt.indexOf("x")>-1)tt+=ttt;
			i=k+1;
		}
	}
	return tt;
}

function spbsp()
{
	var z1,z2,n1=1,n2=1,x1=new RationaleZahl(0,1),x2=new RationaleZahl(0,1),t="";
	var nn=new Array(2,4,5,8,10,16,20),br=(1==0);
	if(Math.random()>.25)
	{
		z1=Math.round(Math.random()*20-10);z2=Math.round(Math.random()*20-10);
	}
	else
	{
		z1=Math.round(Math.random()*40-20);z2=Math.round(Math.random()*40-20);
		if(Math.random()>.5){n1=nn[Math.floor(Math.random()*nn.length)];n2=nn[Math.floor(Math.random()*nn.length)];if(Math.random()>.5)br=true;}
		else{n1=Math.round(Math.random()*Math.abs(z1)*10+2);n2=Math.round(Math.random()*Math.abs(z2)*10+2);br=true;}
		x1.set(z1,n1);x2.set(z2,n2);
	}
	if(br)
	{
		var a=new RationaleZahl(1,1),b=new RationaleZahl(0,1),c=new RationaleZahl(0,1);
		if(Math.random()>.7)a.set(Math.round(Math.random()*20-10),Math.round(Math.random()*5)+2);
		if(a.z==0)a.z=-1;
		b.setR(x1);b.add(x2);b.z*=-1;b.mult(a);
		c.setR(x1);c.mult(x2).mult(a);
		t=PStrR("x",new Array(c,b,a));
	}
	else
	{
		var a=1,b,c;
		if(Math.random()>.7)a=r(Math.round(Math.random()*20-10)/nn[Math.floor(Math.random()*5)]);
		b=r(-a*(z1/n1+z2/n2));c=r(a*z1*z2/n1/n2);
		t=PStr("x",new Array(c,b,a));
	}
	if(t=="0")t="-4(x - 2)(x + 3)";
	return t;
}
