//var î=new Array(0,1);
//var x=new Array(3,0),y=new Array(4,5),z=new Array(2);
//var k=new Array(1,0),q=new Array(-2,2),l=new Array(3,6),a=new Array(22,4);

//solveKubKomplex(k[0],k[1],q[0],q[1],l[0],l[1],a[0],a[1]);

// Findet die drei Nullstellen von (ar+aiî)x³+(br+biî)x²+(cr+ciî)x+(dr+diî)=0
function solveKubKomplex(ar,ai,br,bi,cr,ci,dr,di)
{
	var x=new Array(2),xr,xi,i,k=new Array(ar,ai),q=new Array(br,bi),l=new Array(cr,ci),a=new Array(dr,di),d=10000,t="";
	var kk=new Array(ar,ai),qq=new Array(br,bi),ll=new Array(cr,ci),aa=new Array(dr,di),y1=new Array(2),y2=new Array(2),y3=new Array(2);
	kxdiv(q,k,q);kxdiv(l,k,l);kxdiv(a,k,a);k[0]=1;k[1]=0;
	var kx=(q[1]!=0)||(l[1]!=0)||(a[1]!=0);
	for(xr=0;xr<=20;xr++)
	{
		x[0]=xr;x[1]=0;
		kxhorner3(k,q,l,a,x,y1);if((d=kxbetrq(y1))<1e-30){t=xr;break;}
		if(xr==0)continue;
		x[0]=-xr;x[1]=0;
		kxhorner3(k,q,l,a,x,y1);if((d=kxbetrq(y1))<1e-30){t=-xr;break;}
	}
	if(xr==21)for(xr=0;xr<=20;xr++)
	{
		x[0]=xr;x[1]=0;
		kxhorner3(k,q,l,a,x,y1);if(kxbetrq(y1)<1e-30){t=xr;break;}
		d=kxnewton(k,q,l,a,x);if(d<1e-25){t=xr;break;}
		if(kx)
		{
			x[0]=xr;x[1]=1;d=kxnewton(k,q,l,a,x);if(d<1e-25){t=xr;break;}
			x[0]=xr;x[1]=-1;d=kxnewton(k,q,l,a,x);if(d<1e-25){t=xr;break;}
		}
		if(xr==0)continue;
		x[0]=xr/20;x[1]=0;d=kxnewton(k,q,l,a,x);if(d<1e-25){t=xr/20;break;}
		x[0]=-xr;x[1]=0;
		kxhorner3(k,q,l,a,x,y1);if(kxbetrq(y1)<1e-30){t=-xr;break;}
		d=kxnewton(k,q,l,a,x);if(d<1e-25){t=-xr;break;}
		x[0]=-xr/20;x[1]=0;d=kxnewton(k,q,l,a,x);if(d<1e-25){t=-xr/20;break;}
		if(kx)
		{
			x[0]=xr/20;x[1]=-0.2;d=kxnewton(k,q,l,a,x);if(d<1e-25){t=(xr/20)+",-0.2";break;}
			x[0]=-xr;x[1]=-1;d=kxnewton(k,q,l,a,x);if(d<1e-25){t=(-xr)+",-1";break;}
			x[0]=-xr/20;x[1]=-0.2;d=kxnewton(k,q,l,a,x);if(d<1e-25){t=(-xr/20)+",-0.2";break;}
			x[0]=xr/20;x[1]=0.2;d=kxnewton(k,q,l,a,x);if(d<1e-25){t=(xr/20)+",0.2";break;}
			x[0]=-xr;x[1]=1;d=kxnewton(k,q,l,a,x);if(d<1e-25){t=(-xr)+",1";break;}
			x[0]=-xr/20;x[1]=0.2;d=kxnewton(k,q,l,a,x);if(d<1e-250){t=(-xr/20)+",0.2";break;}
		}
	}
	if(d>1e-25)
	{
		for(i=100;i<10000;i+=10)
		{
			x[0]=Math.random()*Math.random()*Math.random()*Math.random()*(Math.random()-.5)*i;
			x[1]=kx?Math.random()*Math.random()*Math.random()*Math.random()*(Math.random()-.5)*i:0;t=x;
			status=t;
			d=kxnewton(k,q,l,a,x);if(d<1e-30){break;}
			t+="\nOriginale Koeffizienten";
			d=kxnewton(kk,qq,ll,aa,x);if(d<1e-30){break;}
		}
		if(d>1e-30){prompt("nicht gefunden:",kk+"  "+qq+"  "+ll+"  "+aa);return null;}
	}
	kxpdiv3(k,q,l,a,x);
	var x1=new Array(x[0],x[1]),x2=new Array(2),x3=new Array(2),D=new Array(2),pp=new Array(2);
	//alert("x="+x+"\nq="+q+"\nl="+l+"\na="+a);
	if((q[0]!=1)||(q[1]!=0)){kxdiv(l,q,l);kxdiv(a,q,a);q[0]=1;q[1]=0;}
	var x2x3=solveQuadKomplex(q[0],q[1],l[0],l[1],a[0],a[1]);
	x2[0]=x2x3[0][0];x2[1]=x2x3[0][1];x3[0]=x2x3[1][0];x3[1]=x2x3[1][1];
	fix(kk,qq,ll,aa,x2);fix(kk,qq,ll,aa,x3);
	kxhorner3(kk,qq,ll,aa,x1,y1);kxhorner3(kk,qq,ll,aa,x2,y2);kxhorner3(kk,qq,ll,aa,x3,y3);
	//alert("f("+x1+") = "+y1+"\nf("+x2+") = "+y2+"\nf("+x3+") = "+y3+"\n\nStartwert für x1: "+t);
	return new Array(x1,x2,x3);
}

function solveQuadKomplex(ar,ai,br,bi,cr,ci)
{
	var q=new Array(ar,ai),l=new Array(br,bi),a=new Array(cr,ci),xg=new Array(2);
	var x1=new Array(2),x2=new Array(2),D=new Array(2),pp=new Array(2);
	if((q[0]!=1)||(q[1]!=0)){kxdiv(l,q,l);kxdiv(a,q,a);q[0]=1;q[1]=0;}
	pp[0]=-l[0]/2;pp[1]=-l[1]/2;
	kxmult(pp,pp,D);
	kxsub(D,a,D);
	kxsqrt(D,D);
	kxsub(pp,D,x1);
	kxadd(pp,D,x2);
	xg[0]=Math.round(x1[0]*1000)/1000;xg[1]=Math.round(x1[1]*1000)/1000;
	kxhorner2(q,l,a,xg,D);if((d=kxbetrq(D))<1e-30){x1[0]=xg[0];x1[1]=xg[1];}
	xg[0]=Math.round(x2[0]*1000)/1000;xg[1]=Math.round(x2[1]*1000)/1000;
	kxhorner2(q,l,a,xg,D);if((d=kxbetrq(D))<1e-30){x2[0]=xg[0];x2[1]=xg[1];}
	return new Array(x1,x2);
}

function fix(k,q,l,a,x)
{
	var xx=new Array(Math.round(x[0]*10000)/10000,Math.round(x[1]*10000)/10000),yy=new Array(2);
	kxhorner3(k,q,l,a,xx,yy);
	if(kxbetrq(yy)<1e-20){x[0]=xx[0];x[1]=xx[1];return;}
	xx[0]=Math.round(x[0]*210000)/210000;xx[1]=Math.round(x[1]*210000)/210000;
	kxhorner3(k,q,l,a,xx,yy);if(kxbetrq(yy)<1e-20){x[0]=xx[0];x[1]=xx[1];return;}
	xx[0]=Math.round(x[0]*1430000)/1430000;xx[1]=Math.round(x[1]*1430000)/1430000;
	kxhorner3(k,q,l,a,xx,yy);if(kxbetrq(yy)<1e-20){x[0]=xx[0];x[1]=xx[1];return;}
}

function kxdiv(z,n,q)
{
	var nn=n[0]*n[0]+n[1]*n[1],zr=z[0]*n[0]+z[1]*n[1],zi=z[1]*n[0]-z[0]*n[1];
	q[0]=zr/nn;q[1]=zi/nn;
}
function kxmult(a,b,p)
{
	var r=a[0]*b[0]-a[1]*b[1],i=a[0]*b[1]+a[1]*b[0];
	p[0]=r;p[1]=i;	
}
function kxsmult(a,b,c)
{
	c[0]=a[0]*b;c[1]=a[1]*b;
}
function kxmatrixmult(a,b,c,n)
{//alert(a.join("\n")+"\n\n\n"+b.join("\n"));
	if(n==null)n=Math.round(Math.sqrt(a.length));
	var nn=n*n,s=new Array(2),p=new Array(2);
	var d=new Array(nn),i,j,k;
	for(i=0;i<n;i++)for(j=0;j<n;j++)
	{
		s[0]=s[1]=0;
		for(k=0;k<n;k++){kxmult(a[i*n+k],b[k*n+j],p);kxadd(s,p,s);}
		d[i*n+j]=new Array(s[0],s[1]);
	}
	for(i=0;i<nn;i++){c[i][0]=d[i][0];c[i][1]=d[i][1];}
}
function kxadd(a,b,s)
{
	s[0]=a[0]+b[0];s[1]=a[1]+b[1];
}
function kxsub(a,b,d)
{
	d[0]=a[0]-b[0];d[1]=a[1]-b[1];
}
function kxsqrt(x,w)
{
	if((x[1]==0)&&(x[0]>=0)){w[0]=Math.sqrt(x[0]);w[1]=0;return;}
	if((x[1]==0)&&(x[0]<0)){w[1]=Math.sqrt(-x[0]);w[0]=0;return;}
	//‹2·‹(‹(a^2 + b^2) + a)/2 + ‹2·î·‹(‹(a^2 + b^2) - a)·SIGN(b)/2
	var b=Math.sqrt(kxbetrq(x)),ww;
	ww=Math.sqrt((b+x[0])/2);
	w[1]=Math.sqrt((b-x[0])/2)*((x[1]>0)?1:-1);
	w[0]=ww;
}
function kxeq(a,b)
{
	return (Math.abs(a[0]-b[0])<1e-12)&&(Math.abs(a[1]-b[1])<1e-12)
}
function kxcos(x,c)
{
	var a=new Array(0,0);
	a[0]=Math.cos(x[0])*(Math.exp(x[1])+Math.exp(-x[1]))/2;
	a[1]=Math.sin(x[0])*(Math.exp(-x[1])-Math.exp(x[1]))/2;
	c[0]=a[0];c[1]=a[1];
}
function kxsin(x,s)
{
	var a=new Array(0,0);
	a[0]=Math.sin(x[0])*(Math.exp(x[1])+Math.exp(-x[1]))/2;
	a[1]=Math.cos(x[0])*(Math.exp(x[1])-Math.exp(-x[1]))/2;
	s[0]=a[0];s[1]=a[1];
}
function kxacos(x,a)
{
	var r=x[0],i=x[1],rr=r*r,ii=i*i,r1=r+1,r2=r-1;
	if(ii<1e-25)ii=i=0;if(rr<1e-25)rr=r=0;
	a[0]=Math.acos((Math.sqrt(ii+r1*r1)-Math.sqrt(ii+r2*r2))/2);
	a[1]=(i==0)?0:-((i<0)?-1:1)*Math.log((Math.sqrt(2)*Math.sqrt(Math.sqrt(ii+r1*r1)*Math.sqrt(ii+r2*r2)+ii+rr-1)+Math.sqrt(ii+r2*r2)+Math.sqrt(ii+r1*r1))/2);
}
function kxbetrq(x)
{
	return x[0]*x[0]+x[1]*x[1];
}
function kxhorner3(k,q,l,a,x,f)
{
	kxmult(x,k,f);kxadd(f,q,f);kxmult(f,x,f);kxadd(f,l,f);kxmult(f,x,f);kxadd(f,a,f);
}
function kxhorner2(q,l,a,x,f)
{
	kxmult(q,x,f);kxadd(f,l,f);kxmult(f,x,f);kxadd(f,a,f);
}
function kxhorner3a(k,q,l,x,f)
{
	kxmult(k,x,f);f[0]*=3;f[1]*=3;kxadd(f,q,f);kxadd(f,q,f);kxmult(f,x,f);kxadd(f,l,f);
}
function kxhorner2a(q,l,x,f)
{
	kxmult(q,x,f);f[0]*=2;f[1]*=2;kxadd(f,l,f);
}
function kxnewton(k,q,l,a,x)
{
	var i,d,dd=1e100,f=new Array(2),ff=new Array(2),Q=new Array(2),xg=new Array(2),fg=new Array(2);
	kxhorner3(k,q,l,a,x,f);
	for(i=0;i<10;i++)
	{
		xg[0]=Math.round(x[0]);xg[1]=Math.round(x[1]);
		kxhorner3(k,q,l,a,xg,fg);if((d=kxbetrq(fg))==0){x[0]=xg[0];x[1]=xg[1];break;}
		kxhorner3a(k,q,l,x,ff);
		kxdiv(f,ff,Q);
		//alert("x = "+x+"\nf = "+f+"\nff= "+ff+"\nq = "+Q);
		kxsub(x,Q,x);
		kxhorner3(k,q,l,a,x,f);
		d=kxbetrq(f);
		if(d/dd>2)break;
		//if(d<1e-40)break;
		if(d==0)break;
		if((d>1)&&(i>5))break;
	}
	//if(Math.abs(f[1])<1e-12)f[1]=0;
	return d;
}

function kxpdiv3(K,Q,L,A,X)
{
	var x1=X[0],x1i=X[1],k=K[0],ki=K[1],q=Q[0],qi=Q[1],l=L[0],li=L[1],a=A[0],ai=A[1];
	var x1q=x1*x1,x1iq=x1i*x1i,sq=x1q+x1iq,dq=x1q-x1iq,ddq=-dq;
	K[0]=K[1]=0;
	Q[0]=k;
	L[0]=-(ki*x1i-k*x1-q);
	A[0]=-2*ki*x1*x1i+k*dq+l+q*x1-qi*x1i;
	Q[1]=ki;
	L[1]=(ki*x1+k*x1i+qi);
	A[1]=ki*dq+li+2*k*x1*x1i+q*x1i+qi*x1;
	if(Math.abs(Q[0])<1e-10)Q[0]=0;
	if(Math.abs(L[0])<1e-10)L[0]=0;
	if(Math.abs(A[0])<1e-10)A[0]=0;
	if(Math.abs(Q[1])<1e-10)Q[1]=0;
	if(Math.abs(L[1])<1e-10)L[1]=0;
	if(Math.abs(A[1])<1e-10)A[1]=0;
}
