var inverseBerechnen=1==1;

//m: Array mit Matrix-Elementen, wobei jedes Element die Form Array(re,im) hat.
function glsk(m,n)
{
	var nz=n,ns=Math.round(m.length/n);
	if(nz*ns!=m.length)return null;
	var z,s,i,j,k,nn,ib=inverseBerechnen||(nz==ns);
	if(ib){Invk=Einheitsmatrixk(nz);}
	for(i=0;i<nz;i++)
	{
		j=i;while((m[j*n+i][0]==0)&&(m[j*n+i][1]==0)){j++;if(j==nz)return null;}
		if(j>i){addzk(m,nz,ns,i,j,1,0);if(ib)addzk(Invk,nz,ns,i,j,1,0);}//alert(m.join("\n"));
		k=i*n+i;
		nn=m[k][0]*m[k][0]+m[k][1]*m[k][1];//alert(m.join("\n")+"\n\nnn="+nn+"\nm[k]="+m[k]+"\ni="+i+"\n+j="+j);
		if(ib)multzk(Invk,nz,ns,i,m[k][0]/nn,-m[k][1]/nn);
		multzk(m,nz,ns,i,m[k][0]/nn,-m[k][1]/nn);m[k][0]=1;m[k][1]=0;
		for(j=0;j<nz;j++)
		{
			k=j*n+i;
			if(i==j)continue;
			if(ib)addzk(Invk,nz,ns,j,i,-m[k][0],-m[k][1]);
			addzk(m,nz,ns,j,i,-m[k][0],-m[k][1]);
			m[j*n+i][0]=m[j*n+i][1]=0;
		}
	}
	if(nz>ns+1)	
	{
		var l=new Array(nz);
		for(i=0;i<n;i++){l[i]=new Array(2);j=i*n+i;l[i][0]=m[j][0];l[i][1]=m[j][1];}
		return l;
	}
	return Invk;
}

function multzk(m,nz,ns,z,fr,fi)
{
	var i,j,x;
	for(i=0;i<ns;i++){j=z*nz+i;x=m[j][0]*fr-m[j][1]*fi;m[j][1]=m[j][0]*fi+m[j][1]*fr;m[j][0]=x;}
}

function addzk(m,nz,ns,z0,z1,fr,fi)
{
	var i,j,k;
	for(i=0;i<ns;i++){j=z0*nz+i;k=z1*nz+i;m[j][0]+=m[k][0]*fr-m[k][1]*fi;m[j][1]+=m[k][0]*fi+m[k][1]*fr;}
}

function Einheitsmatrixk(n)
{
	var e=new Array(n),i,nn=n*n;
	for(i=0;i<nn;i++)e[i]=new Array(((i%(n+1))==0)?1:0,0);
	return e;
}


