#include <stdio.h>
#include <math.h>
#define m1 201
#define n1 101
#define Max(a,b) (a>b ? a:b)
int HQRdecomp(int m, int n, double eps, double a[][n1], double d[]){
double r,s,p;
int i,j,k;
for(k=1;k<=n;k++){
s=0;
for(i=k;i<=m;i++){
s+=a[i][k]*a[i][k];
}
if(s<eps){
return k;
}
d[k]=(a[k][k]>0)? -s:s;
r
=1/sqrt(d
[k
]*(d
[k
]-a
[k
][k
])); a[k][k]=(a[k][k]-d[k])*r;
for(i=k+1;i<=m;i++){
a[i][k]*=r;
}
for(j=k+1;j<=n;j++){
p=0;
for(i=k;i<=m;i++){
p+=a[i][j]*a[i][k];
}
for(i=k;i<=m;i++){
a[i][j]-=p*a[i][k];
}
}
}
return 0;
}
int HQRsolve(double a[][n1],double d[],int m,int n,double b[]){
double p;
int i,j,k;
for(k=1;k<=n;k++){
p=0;
for(i=k;i<=m;i++){
p+=b[i]*a[i][k];
}
for(i=k;i<=m;i++){
b[i]-=p*a[i][k];
}
}
for(i=n;i>=1;i--){
for(j=i+1;j<=n;j++){
b[i]-=a[i][j]*b[j];
}
b[i]=b[i]/d[i];
}
return 0;
}
int main(void) {
double a[m1][n1],d[m1],b[m1],eps;
int i,j,m,n,cnd;
m=4;
n=2;
a[1][1]=1;
a[1][2]=1;
a[2][1]=1;
a[2][2]=3;
a[3][1]=1;
a[3][2]=6;
a[4][1]=1;
a[4][2]=9;
b[1]=3;
b[2]=5;
b[3]=7;
b[4]=12;
eps=1.0e-14;
cnd=HQRdecomp(m,n,eps,a,d);
HQRsolve(a,d,m,n,b);
for(i=1;i<=n;i++){
printf("b[%2d]=%10.7f\n",i
,b
[i
]); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNkZWZpbmUgbTEgMjAxCiNkZWZpbmUgbjEgMTAxCiNkZWZpbmUgTWF4KGEsYikgKGE+YiA/IGE6YikKaW50IEhRUmRlY29tcChpbnQgbSwgaW50IG4sIGRvdWJsZSBlcHMsIGRvdWJsZSBhW11bbjFdLCBkb3VibGUgZFtdKXsKCWRvdWJsZSByLHMscDsKCWludCBpLGosazsKCWZvcihrPTE7azw9bjtrKyspewoJCXM9MDsKCQlmb3IoaT1rO2k8PW07aSsrKXsKCQkJcys9YVtpXVtrXSphW2ldW2tdOwoJCX0KCQlzPXNxcnQocyk7CgkJaWYoczxlcHMpewoJCQlyZXR1cm4gazsKCQl9CgkJZFtrXT0oYVtrXVtrXT4wKT8gLXM6czsKCQlyPTEvc3FydChkW2tdKihkW2tdLWFba11ba10pKTsKCQlhW2tdW2tdPShhW2tdW2tdLWRba10pKnI7CgkJZm9yKGk9aysxO2k8PW07aSsrKXsKCQkJYVtpXVtrXSo9cjsKCQl9CgkJZm9yKGo9aysxO2o8PW47aisrKXsKCQkJcD0wOwoJCQlmb3IoaT1rO2k8PW07aSsrKXsKCQkJCXArPWFbaV1bal0qYVtpXVtrXTsKCQkJfQoJCQlmb3IoaT1rO2k8PW07aSsrKXsKCQkJCWFbaV1bal0tPXAqYVtpXVtrXTsKCQkJfQoJCX0KCX0KCXJldHVybiAwOwp9CmludCBIUVJzb2x2ZShkb3VibGUgYVtdW24xXSxkb3VibGUgZFtdLGludCBtLGludCBuLGRvdWJsZSBiW10pewoJZG91YmxlIHA7CglpbnQgaSxqLGs7Cglmb3Ioaz0xO2s8PW47aysrKXsKCQlwPTA7CgkJZm9yKGk9aztpPD1tO2krKyl7CgkJCXArPWJbaV0qYVtpXVtrXTsKCQl9CgkJZm9yKGk9aztpPD1tO2krKyl7CgkJCWJbaV0tPXAqYVtpXVtrXTsKCQl9Cgl9Cglmb3IoaT1uO2k+PTE7aS0tKXsKCQlmb3Ioaj1pKzE7ajw9bjtqKyspewoJCQliW2ldLT1hW2ldW2pdKmJbal07CgkJfQoJCWJbaV09YltpXS9kW2ldOwoJfQoJcmV0dXJuIDA7Cn0KaW50IG1haW4odm9pZCkgewoJZG91YmxlIGFbbTFdW24xXSxkW20xXSxiW20xXSxlcHM7CglpbnQgaSxqLG0sbixjbmQ7CgltPTQ7CgluPTI7CglhWzFdWzFdPTE7CglhWzFdWzJdPTE7CglhWzJdWzFdPTE7CglhWzJdWzJdPTM7CglhWzNdWzFdPTE7CglhWzNdWzJdPTY7CglhWzRdWzFdPTE7CglhWzRdWzJdPTk7CgliWzFdPTM7CgliWzJdPTU7CgliWzNdPTc7CgliWzRdPTEyOwoJCgllcHM9MS4wZS0xNDsKCWNuZD1IUVJkZWNvbXAobSxuLGVwcyxhLGQpOwoJcHJpbnRmKCJjbmQ9JWRcbiIsY25kKTsKCUhRUnNvbHZlKGEsZCxtLG4sYik7Cglmb3IoaT0xO2k8PW47aSsrKXsKCQlwcmludGYoImJbJTJkXT0lMTAuN2ZcbiIsaSxiW2ldKTsKCX0KCXJldHVybiAwOwp9Cg==