92 {
93
94
95 static int i, j, k, l;
96 static double s31, s32;
97 static int jm1, jp1;
98 *ifail = 0;
99
100
102
103
104 if (*idim < *n || *n <= 1) {
105 *ifail = -1;
106 return;
107 }
108
109
110 for (j = 1; j <= *n; ++j) {
111 const int ja = j * (*idim);
112 const int jj = j + ja;
113 const int ja1 = ja + (*idim);
114
115 if (
a[jj] <= 0.) { *ifail = -1;
return; }
117 if (j == *n) { break; }
118
119 for (l = j + 1; l <= *n; ++l) {
120 a[j + l * (*idim)] =
a[jj] *
a[l + ja];
121 const int lj = l + ja1;
122 for (i = 1; i <= j; ++i) {
123 a[lj] -=
a[l + i * (*idim)] *
a[i + ja1];
124 }
125 }
126 }
127
128
129
130
131 a[(*idim << 1) + 1] = -
a[(*idim << 1) + 1];
132 a[*idim + 2] =
a[(*idim << 1) + 1] *
a[(*idim << 1) + 2];
133
134 if(*n > 2) {
135
136 for (j = 3; j <= *n; ++j) {
137 const int jm2 = j - 2;
138 const int ja = j * (*idim);
139 const int jj = j + ja;
140 const int j1 = j - 1 + ja;
141
142 for (k = 1; k <= jm2; ++k) {
144
145 for (i = k; i <= jm2; ++i) {
146 s31 +=
a[k + (i + 1) * (*idim)] *
a[i + 1 + ja];
147 }
149 a[j + k * (*idim)] = -s31 *
a[jj];
150 }
152
153 a[jj - (*idim)] =
a[j1] *
a[jj];
154 }
155 }
156
157 j = 1;
158 do {
159 const int jad = j * (*idim);
160 const int jj = j + jad;
161
162 jp1 = j + 1;
163 for (i = jp1; i <= *n; ++i) {
164 a[jj] +=
a[j + i * (*idim)] *
a[i + jad];
165 }
166
167 jm1 = j;
168 j = jp1;
169 const int ja = j * (*idim);
170
171 for (k = 1; k <= jm1; ++k) {
172 s32 = 0.;
173 for (i = j; i <= *n; ++i) {
174 s32 +=
a[k + i * (*idim)] *
a[i + ja];
175 }
176 a[k + ja] =
a[j + k * (*idim)] = s32;
177 }
178 } while(j < *n);
179
180 return;
181}