
function eigenmatrix3(x1,v1x,v1y,v1z,x2,v2x,v2y,v2z,x3,v3x,v3y,v3z)
{
	var det=(v1z*v2y*v3x-v1y*v2z*v3x-v1z*v2x*v3y+v1x*v2z*v3y+v1y*v2x*v3z-v1x*v2y*v3z);
	if(isNaN(x1*x2*x3))return null;
	if((det==0)||(isNaN(det)))return null;
	var a11=(v1x*v2z*v3y*x1-v1x*v2y*v3z*x1-v1z*v2x*v3y*x2+v1y*v2x*v3z*x2+v1z*v2y*v3x*x3-v1y*v2z*v3x*x3)/det;
	var a12=-(v1x*v2z*v3x*x1-v1x*v2x*v3z*x1-v1z*v2x*v3x*x2+v1x*v2x*v3z*x2+v1z*v2x*v3x*x3-v1x*v2z*v3x*x3)/det;
	var a13=(v1x*v2y*v3x*x1-v1x*v2x*v3y*x1-v1y*v2x*v3x*x2+v1x*v2x*v3y*x2+v1y*v2x*v3x*x3-v1x*v2y*v3x*x3)/det;
	var a21=(v1y*v2z*v3y*x1-v1y*v2y*v3z*x1-v1z*v2y*v3y*x2+v1y*v2y*v3z*x2+v1z*v2y*v3y*x3-v1y*v2z*v3y*x3)/det;
	var a22=-(v1y*v2z*v3x*x1-v1y*v2x*v3z*x1-v1z*v2y*v3x*x2+v1x*v2y*v3z*x2+v1z*v2x*v3y*x3-v1x*v2z*v3y*x3)/det;
	var a23=(v1y*v2y*v3x*x1-v1y*v2x*v3y*x1-v1y*v2y*v3x*x2+v1x*v2y*v3y*x2+v1y*v2x*v3y*x3-v1x*v2y*v3y*x3)/det;
	var a33=(v1z*v2y*v3x*x1-v1z*v2x*v3y*x1-v1y*v2z*v3x*x2+v1x*v2z*v3y*x2+v1y*v2x*v3z*x3-v1x*v2y*v3z*x3)/det;
	var a32=-(v1z*v2z*v3x*x1-v1z*v2x*v3z*x1-v1z*v2z*v3x*x2+v1x*v2z*v3z*x2+v1z*v2x*v3z*x3-v1x*v2z*v3z*x3)/det;
	var a31=-(-v1z*v2z*v3y*x1+v1z*v2y*v3z*x1+v1z*v2z*v3y*x2-v1y*v2z*v3z*x2-v1z*v2y*v3z*x3+v1y*v2z*v3z*x3)/det;	
	probe3(x1,v1x,v1y,v1z,a11,a12,a13,a21,a22,a23,a31,a32,a33);
	probe3(x2,v2x,v2y,v2z,a11,a12,a13,a21,a22,a23,a31,a32,a33);
	probe3(x3,v3x,v3y,v3z,a11,a12,a13,a21,a22,a23,a31,a32,a33);
	return new Array(new Array(a11,a12,a13),new Array(a21,a22,a23),new Array(a31,a32,a33));
}
function eigenmatrix2(x1,v1x,v1y,x2,v2x,v2y)
{
	var det=(v1y*v2x-v1x*v2y);
	if(isNaN(x1*x2))return null;
	if((det==0)||(isNaN(det)))return null;
	var a11=(v1y*v2x*x2-v1x*v2y*x1)/det;
	var a12=(v1x*v2x*x1-v1x*v2x*x2)/det;
	var a21=(v1y*v2y*x2-v1y*v2y*x1)/det;
	var a22=(v1y*v2x*x1-v1x*v2y*x2)/det;
	probe2(x1,v1x,v1y,a11,a12,a21,a22);
	probe2(x2,v2x,v2y,a11,a12,a21,a22);
	return new Array(new Array(a11,a12),new Array(a21,a22));
}

function probe3(x,vx,vy,vz,a11,a12,a13,a21,a22,a23,a31,a32,a33)
{
	var xx=-vx*x+a11*vx+a12*vy+a13*vz,yy=-vy*x+a21*vx+a22*vy+a23*vz,zz=-vz*x+a31*vx+a32*vy+a33*vz;
	var d=Math.abs(xx)+Math.abs(yy)+Math.abs(zz);
	probenvektor=new Array(new Array(xx,0),new Array(yy,0),new Array(zz,0));
	if(d>1e-10)alert("Abweichungsbetrag vom Nullvektor: "+d);
}
function probe2(x,vx,vy,a11,a12,a21,a22)
{
	var xx=-vx*x+a11*vx+a12*vy,yy=-vy*x+a21*vx+a22*vy;
	var d=Math.abs(xx)+Math.abs(yy);
	probenvektor=new Array(new Array(xx,0),new Array(yy,0));
	if(d>1e-10)alert("Abweichungsbetrag vom Nullvektor: "+d);
}
var probenvektor;
function probe3k(xr,xi,vxr,vxi,vyr,vyi,vzr,vzi,a11r,a11i,a12r,a12i,a13r,a13i,a21r,a21i,a22r,a22i,a23r,a23i,a31r,a31i,a32r,a32i,a33r,a33i)
{
	var xxr=-a11i*vxi+a11r*vxr-a12i*vyi+a12r*vyr-a13i*vzi+a13r*vzr+vxi*xi-vxr*xr;
	var xxi=(a11i*vxr+a11r*vxi+a12i*vyr+a12r*vyi+a13i*vzr+a13r*vzi-vxi*xr-vxr*xi);
	var yyr=-a21i*vxi+a21r*vxr-a22i*vyi+a22r*vyr-a23i*vzi+a23r*vzr+vyi*xi-vyr*xr;
	var yyi=(a21i*vxr+a21r*vxi+a22i*vyr+a22r*vyi+a23i*vzr+a23r*vzi-vyi*xr-vyr*xi);
	var zzr=-a31i*vxi+a31r*vxr-a32i*vyi+a32r*vyr-a33i*vzi+a33r*vzr+vzi*xi-vzr*xr;
	var zzi=(a31i*vxr+a31r*vxi+a32i*vyr+a32r*vyi+a33i*vzr+a33r*vzi-vzi*xr-vzr*xi);
	d=Math.sqrt(xxr*xxr+xxi*xxi+yyr*yyr+yyi*yyi+zzr*zzr+zzi*zzi);
	probenvektor=new Array(new Array(xxr,xxi),new Array(yyr,yyi),new Array(zzr,zzi));
	if(d>1e-10)alert("Abweichungsbetrag vom Nullvektor: "+d);
	return d;
}
function probe2k(xr,xi,vxr,vxi,vyr,vyi,a11r,a11i,a12r,a12i,a21r,a21i,a22r,a22i,o)
{
	var xxr=-a11i*vxi+a11r*vxr-a12i*vyi+a12r*vyr+vxi*xi-vxr*xr;
	var xxi=(a11i*vxr+a11r*vxi+a12i*vyr+a12r*vyi-vxi*xr-vxr*xi);
	var yyr=-a21i*vxi+a21r*vxr-a22i*vyi+a22r*vyr+vyi*xi-vyr*xr;
	var yyi=(a21i*vxr+a21r*vxi+a22i*vyr+a22r*vyi-vyi*xr-vyr*xi);
	d=Math.sqrt(xxr*xxr+xxi*xxi+yyr*yyr+yyi*yyi);
	probenvektor=new Array(new Array(xxr,xxi),new Array(yyr,yyi));
	if((d>1e-10)&&(o==null))alert("Abweichungsbetrag vom Nullvektor: "+d);
	return d;
}
//var xr=new Array(1,0.5,0.5),xi=new Array(0,-Math.sqrt(3)/2,Math.sqrt(3)/2);
//var vr=new Array(new Array(1,0,0),new Array(0,1,0),new Array(0,1,0));
//var vi=new Array(new Array(0,0,0),new Array(0,0,1),new Array(0,0,-1));
//eigenmatrixk(xr,xi,vr,vi);

function eigenmatrixk(xr,xi,vr,vi)
{
	var n=xr.length,nn=n*n,mr=new Array(nn*(nn+1)),mi=new Array(nn*(nn+1)),i,j,k;
	for(i=0;i<mr.length;i++)mr[i]=mi[i]=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			for(k=0;k<n;k++)
			{
				mr[i*(nn+1)*n+j*(nn+1+n)+k]=vr[i][k];
				mi[i*(nn+1)*n+j*(nn+1+n)+k]=vi[i][k];
			}
			mr[(i*n+j)*(nn+1)+nn]=vr[i][j]*xr[i]-vi[i][j]*xi[i];
			mi[(i*n+j)*(nn+1)+nn]=vi[i][j]*xr[i]+vr[i][j]*xi[i];
		}
	}
	//alert(mr);
	if(glslk(mr,mi,nn)==null)return null;
	var ar=new Array(n),ai=new Array(n);
	for(i=0;i<n;i++){ar[i]=new Array(n);ai[i]=new Array(n);}
	for(i=0;i<nn;i++){ar[Math.floor(i/n)][i%n]=mr[i*(nn+1)+nn];ai[Math.floor(i/n)][i%n]=mi[i*(nn+1)+nn];}
	//alert(ar.join("\n")+"\n\n"+ai.join("\n")+"\n\n"+mr);
	if(n==3)
	{
		for(i=0;i<3;i++)
		probe3k(xr[i],xi[i],vr[i][0],vi[i][0],vr[i][1],vi[i][1],vr[i][2],vi[i][2],ar[0][0],ai[0][0],ar[0][1],ai[0][1],ar[0][2],ai[0][2],ar[1][0],ai[1][0],ar[1][1],ai[1][1],ar[1][2],ai[1][2],ar[2][0],ai[2][0],ar[2][1],ai[2][1],ar[2][2],ai[2][2]);
	}
	if(n==2)
	{
		for(i=0;i<2;i++)
		probe2k(xr[i],xi[i],vr[i][0],vi[i][0],vr[i][1],vi[i][1],ar[0][0],ai[0][0],ar[0][1],ai[0][1],ar[1][0],ai[1][0],ar[1][1],ai[1][1]);
	}
	return new Array(ar,ai);
}

function glslk(mr,mi,n)
{
	//alert(mr.join("   ")+"\n"+mi.join("   "));
	var i, j, k, tol2=0,nn=n+1;
	var qi,qnull=(1==0);
	var t="",ti,tj;
		//for(ti=0;ti<n;ti++)for(tj=0;tj<nn;tj++)t+=mr[ti*nn+tj]+"  "+((tj==n)?"\n":"");
		//alert("j="+j+"\n"+t);
	for (j=0;j<n;j++)
	{
		// Diagonalenfeld normalisieren
		qi=j*nn+j;qnull=false;
		if(betr(mr[qi],mi[qi])<=tol2){qnull=true;mr[qi]=0;mi[qi]=0;}
		if (qnull)
		{
			//Gewährleisten, daß keine 0 in der Diagonale steht
			for (i=j+1;i<n;i++)
			{
				// Suche Reihe mit Feld <> 0 und tausche
				if (betr(mr[i*nn+j],mi[i*nn+j])!=0)
				{
					for(k=0;k<nn;k++)
					{var t=mr[j*nn+k];mr[j*nn+k]=mr[i*nn+k];mr[i*nn+k]=t;t=mi[j*nn+k];mi[j*nn+k]=mi[i*nn+k];mi[i*nn+k]=t;}
					qi=j*nn+j;
                    		break;
                		}
            	}if(i==n)return null;
		}
		if (betr(mr[qi],mi[qi])!=0)
		{
            	// Diagonalen auf 1 bringen
			for(k=0;k<nn;k++)if(j*nn+k!=qi)kdiv(mr,mi,j*nn+k,qi,j*nn+k);
			mr[qi]=1;mi[qi]=0;
		}
		// Spalten außerhalb der Diagonalen auf 0 bringen
		for (i = 0 ; i< n ; i++)
		{
			if (i != j )
			{
				qi=i*nn+j;
				for(k=0;k<nn;k++)
				{
					if(k==j)continue;
					//m[i*nn+k]-=q*m[j*nn+k];
					kmult(mr,mi,qi,j*nn+k,n*nn);
					ksub(mr,mi,i*nn+k,n*nn,i*nn+k);
					//if(betr(mr[i*nn+k],mi[i*nn+k])<=tol2){mr[i*nn+k]=0;mi[i*nn+k]=0;}
				}
				kmult(mr,mi,qi,j*nn+j,nn*n);
				ksub(mr,mi,qi,nn*n,qi);
			}
		}
		t="";for(ti=0;ti<n;ti++)for(tj=0;tj<nn;tj++)t+=mr[ti*nn+tj]+"  "+((tj==n)?"\n":"");
		//alert("j="+j+"\n"+t);
	}
	//alert("fertig\n"+t);
	//	t="";for(ti=0;ti<n;ti++)for(tj=0;tj<nn;tj++)t+=mi[ti*nn+tj]+"  "+((tj==n)?"\n":"");
	//	alert("imaginär\n"+t);
	return true;
}
function kadd(r,i,s1,s2,e)
{
	r[e]=r[s1]+r[s2];
	i[e]=i[s1]+i[s2];
}
function ksub(r,i,s1,s2,e)
{
	r[e]=r[s1]-r[s2];
	i[e]=i[s1]-i[s2];
}
function kmult(r,i,f1,f2,e)
{
	var rr=r[f1]*r[f2]-i[f1]*i[f2];
	i[e]=r[f1]*i[f2]+r[f2]*i[f1];
	r[e]=rr;
}
function kdiv(r,i,d1,d2,e)
{
//	alert("teile "+KStr(r[d1],i[d1])+"\ndurch "+KStr(r[d2],i[d2]));
	var n=r[d2]*r[d2]+i[d2]*i[d2];
	var rr=(i[d1]*i[d2]+r[d1]*r[d2])/n; 
	i[e]=(i[d1]*r[d2]-i[d2]*r[d1])/n;
	r[e]=rr;
}
function kmultv(f1r,f1i,f2r,f2i,e)
{
	var rr=f1r*f2r-f1i*f2i;
	e[1]=f1r*f2i+f2r*f1i;
	e[0]=rr;
}
function kdivv(d1r,d1i,d2r,d2i,e)
{
//	alert("teile "+KStr(r[d1],i[d1])+"\ndurch "+KStr(r[d2],i[d2]));
	var n=d2r*d2r+d2i*d2i;
	var rr=(d1i*d2i+d1r*d2r)/n; 
	e[1]=(d1i*d2r-d2i*d1r)/n;
	e[0]=rr;
}

function betr(r,i){return Math.sqrt(r*r+i*i);}

function kxvbetrq(v,n)
{
	var b=0,i;
	for(i=0;i<n;i++){b+=kxbetrq(v[i]);}
	return b;
}

