
function parseQuadrik(t,d2)
{
	var i,j,k,tt,o,oo,ooo,k=1;
	var MultErg=new Array(/\dx/,/\dy/,/\dz/,/\d\(/,/\)\(/,/x\(/,/y\(/,/z\(/,/xx/,/yy/,/zz/,/\)x/,/\)y/,/\)z/,/pi\(/,/e_\(/,/\dpi/,/\de_/,/xy/,/xz/,/yz/,/yx/,/zx/,/zy/);
	t=t.replace(/x\^2/g,"x*x").replace(/y\^2/g,"y*y").replace(/z\^2/g,"z*z");
	t=t.replace(/x²/g,"x*x").replace(/y²/g,"y*y").replace(/z²/g,"z*z");
	t=t.replace(/,/g,".").replace(/·/g,"*").replace(/ /g,"");
	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);
	if(t.indexOf("=")>-1){t=t.split("=");t=t[0]+"-("+t[1]+")";}
	t=translate(t).replace(/X/g,"x").replace(/Y/g,"y");
	if((t.indexOf("z")==-1)&&(d2==true))return parseQuadrik2d(t);
	//alert(t);
	var a=new Array(10),x=new Array(10),y=new Array(10),z=new Array(10),e=new Array(10),m=new Array(110);
	for(i=0;i<5;i++)
	{
		for(j=0;j<10;j++)
		{
			if(i>0){x[j]=zz(-5,5);y[j]=zz(-5,5);z[j]=zz(-5,5);}
			else{x[j]=j-5;y[j]=2*(j-4);z[j]=(-j+6);}
			tt=t.replace(/x/g,"("+x[j]+")").replace(/y/g,"("+y[j]+")").replace(/z/g,"("+z[j]+")");
			e[j]=eval(tt);if(isNaN(e[j]))break;
			m[j*11]=x[j]*x[j];
			m[j*11+1]=y[j]*y[j];
			m[j*11+2]=z[j]*z[j];
			m[j*11+3]=x[j]*y[j];
			m[j*11+4]=x[j]*z[j];
			m[j*11+5]=y[j]*z[j];
			m[j*11+6]=x[j];
			m[j*11+7]=y[j];
			m[j*11+8]=z[j];
			m[j*11+9]=1
			m[j*11+10]=e[j];
		}if(j<10)continue;
		if(solvegs(m,10))
		{
			x[0]=zz(-5,5);y[0]=zz(-5,5);z[0]=zz(-5,5);
			tt=t.replace(/x/g,"("+x[0]+")").replace(/y/g,"("+y[0]+")").replace(/z/g,"("+z[0]+")");
			e[0]=eval(tt);e[1]=m[10]*x[0]*x[0]+m[21]*y[0]*y[0]+m[32]*z[0]*z[0]+m[43]*x[0]*y[0]+m[54]*x[0]*z[0]+m[65]*y[0]*z[0]+m[76]*x[0]+m[87]*y[0]+m[98]*z[0]+m[109];
			//alert(e[0]+"\n"+e[1]);			
			if(o=(Math.abs(e[0]-e[1])<1e-10))break;
		}
	}
	if(!o)return null;
	//alert(m);
	for(i=0;i<10;i++)a[i]=m[i*11+10];
	for(i=0;i<10;i++)
	{
		a[i]=kettenbruchapprox(a[i],1000000,1e-12);
		if((a[i][0]%1)!=0){k=1;break;}
		k*=a[i][1]/ggt_quadrik(a[i][1],k);
	}
	//alert(k+"\n\n"+a.join("\n"));
	for(j=0;(j<=i)&&(j<10);j++)a[j]=k*a[j][0]/a[j][1];
	//alert(a.join("\n"));
	return a;
}
function parseQuadrik2d(t)
{
	var i,j,k,tt,o,oo,ooo,k=1;
	var a=new Array(6),x=new Array(6),y=new Array(6),e=new Array(6),m=new Array(42);
	for(i=0;i<5;i++)
	{
		for(j=0;j<6;j++)
		{
			if(i>0){x[j]=zz(-5,5);y[j]=zz(-5,5);}
			else{x[j]=j-5;y[j]=2*(j-4);}
			tt=t.replace(/x/g,"("+x[j]+")").replace(/y/g,"("+y[j]+")");
			e[j]=eval(tt);
			m[j*7]=x[j]*x[j];
			m[j*7+1]=y[j]*y[j];
			m[j*7+2]=x[j]*y[j];
			m[j*7+3]=x[j];
			m[j*7+4]=y[j];
			m[j*7+5]=1
			m[j*7+6]=e[j];
		}
		if(solvegs(m,6))
		{
			x[0]=zz(-5,5);y[0]=zz(-5,5);
			tt=t.replace(/x/g,"("+x[0]+")").replace(/y/g,"("+y[0]+")");
			e[0]=eval(tt);
			e[1]=m[6]*x[0]*x[0]+m[13]*y[0]*y[0]+m[20]*x[0]*y[0]+m[27]*x[0]+m[34]*y[0]+m[41];
			//alert(e[0]+"\n"+e[1]);			
			if(o=(Math.abs(e[0]-e[1])<1e-10))break;
		}
	}
	if(!o)return null;
	//alert(m);
	for(i=0;i<6;i++)a[i]=m[i*7+6];
	for(i=0;i<6;i++)
	{
		a[i]=kettenbruchapprox(a[i],1000000,1e-12);
		if((a[i][0]%1)!=0){k=1;break;}
		k*=a[i][1]/ggt_quadrik(a[i][1],k);
	}
	//alert(k+"\n\n"+a.join("\n"));
	for(j=0;(j<=i)&&(j<6);j++)a[j]=k*a[j][0]/a[j][1];
	//alert(a.join("\n"));
	return a;
}

//parseQuadrik("x^2+3xy-7y = 25",true);

function zz(a,b){return Math.random()*(b-a)+a;}

function solvegs(m,n)
{
	var i,j,k,nn=n+1;
	for(i=0;i<n;i++)
	{
		if(m[i*(nn+1)]==0){for(j=i+1;j<n;j++){if(m[j*nn+i]!=0){for(k=i;k<nn;k++)m[i*nn+k]+=m[j*nn+k];break;}}if(j==n)return false;}
		for(k=n;k>=i;k--)m[i*nn+k]/=m[i*nn+i];
		for(j=0;j<n;j++){if(j==i)continue;for(k=i+1;k<nn;k++)m[j*nn+k]-=m[j*nn+i]*m[i*nn+k];m[j*nn+i]=0;}
		//alert(m+"\n\n"+m.length+"\n"+i);
	}
	return true;
}

function ggt_quadrik(a,b)
{
	if((a==0)&&(b==0))return 1;if(a==0)return b;if(b==0)return a;
	if((a%1)!=0)return 1;if((b%1)!=0)return 1;
	if(isNaN(a))return 1;if(isNaN(b))return 1;
	var c=1;while(c!=0){c=a%b;a=b;b=c;}	return a;
}
