21void solve(
double *a,
double *b,
double *c,
size_t n) {
25 const size_t nsq = n * n;
26 double *asave =
gv_calloc(nsq,
sizeof(
double));
27 double *csave =
gv_calloc(n,
sizeof(
double));
29 for (
size_t i = 0; i < n; i++)
31 for (
size_t i = 0; i < nsq; i++)
34 const size_t nm = n - 1;
35 for (
size_t i = 0; i < nm; i++) {
39 for (
size_t ii = i; ii < n; ii++) {
40 const double dum = fabs(a[ii * n + i]);
50 for (
size_t j = i; j < n; j++) {
51 const size_t t = istar * n + j;
52 SWAP(&a[t], &a[i * n + j]);
54 SWAP(&c[istar], &c[i]);
56 const size_t ip = i + 1;
57 for (
size_t ii = ip; ii < n; ii++) {
58 const double pivot = a[ii * n + i] / a[i * n + i];
59 c[ii] -= pivot * c[i];
60 for (
size_t j = 0; j < n; j++)
61 a[ii * n + j] = a[ii * n + j] - pivot * a[i * n + j];
65 if (fabs(a[n * n - 1]) < 1.e-10)
67 b[n - 1] = c[n - 1] / a[n * n - 1];
69 for (
size_t k = 0; k < nm; k++) {
70 const size_t m = n - k - 2;
72 const size_t mp = m + 1;
73 for (
size_t j = mp; j < n; j++)
74 b[m] -= a[m * n + j] * b[j];
78 for (
size_t i = 0; i < n; i++)
80 for (
size_t i = 0; i < nsq; i++)
86 printf(
"ill-conditioned\n");