int HOUS(double c[][MMax], double d[], double x[], double eps, double &rd, int m, int n)
{
/*
c: c[1..n][1..m]
d: d[1..n]
m: the number of unknown
n: the number of equations
rd: ||d+cx||
*/
double lk, ckk, beta, sm;
double qk[MMax], ad[MMax];
int i,j,k;
for(k=1; k<=m; k++){
for(sm=0, i=k; i<=n; i++)
sm+=c[i][k]*c[i][k]; //ak^2=sigma(cik*cik) for i=k to n
if(sm < eps)
return -1; //error occurs
ckk=c[k][k];
lk=ckk<0? sqrt(sm) : -sqrt(sm); //lk = -sign(ckk)*sqrt(sm)
//L={0, ..., lk, 0, ..., 0}
//S={0,..., ckk, ck+1,k, ..., cn,k}
ad[k]=lk;
//sigma=||S-L||^2=(ckk-lk)^2 + S*S - ckk^2
// =S*S + (2ckk-lk)(-lk)
// =lk^2 - 2ckk*lk +lk^2
// =2lk^2-2ckk*lk
// =2sm-2ckk*lk
beta=1/(sm-ckk*lk); //2 / sigma =1/(sm-ckk*lk)
c[k][k]=ckk-lk; //U=S-L
if(k<m)
for(j=k+1; j<=m; j++){
for(sm=0, i=k; i<=n; i++)
sm+=c[i][k]*c[i][j]; //U*cj
qk[j]=beta*sm; //Qkj=2U*cj/sigma
for(i=k; i<=n; i++)
c[i][j]-=c[i][k]*qk[j];
}
for(sm=0, i=k; i<=n; i++)
sm+=c[i][k]*d[i];
sm*=beta;
for(i=k; i<=n; i++)
d[i]-=c[i][k]*sm;
}// tri-anglized
for(i=m; i>=1; i--){
d[i]/=ad[i];
x[i]=d[i];
if(i>1)
for(j=1; j<i; j++)
d[j]-=c[j][i]*d[i];
}
for(rd=0, i=m+1; i<=n; i++)
rd+=d[i]*d[i]; // remained error
return 0;
}