24void solve(
double *a,
double *b,
double *c,
size_t n) {
28 const size_t nsq = n * n;
29 double *asave =
gv_calloc(nsq,
sizeof(
double));
30 double *csave =
gv_calloc(n,
sizeof(
double));
32 for (
size_t i = 0; i < n; i++)
34 for (
size_t i = 0; i < nsq; i++)
37 const size_t nm = n - 1;
38 for (
size_t i = 0; i < nm; i++) {
42 for (
size_t ii = i; ii < n; ii++) {
43 const double dum = fabs(a[ii * n + i]);
53 for (
size_t j = i; j < n; j++) {
54 const size_t t = istar * n + j;
55 SWAP(&a[t], &a[i * n + j]);
57 SWAP(&c[istar], &c[i]);
59 const size_t ip = i + 1;
60 for (
size_t ii = ip; ii < n; ii++) {
61 const double pivot = a[ii * n + i] / a[i * n + i];
62 c[ii] -= pivot * c[i];
63 for (
size_t j = 0; j < n; j++)
64 a[ii * n + j] = a[ii * n + j] - pivot * a[i * n + j];
68 if (fabs(a[n * n - 1]) < 1.e-10)
70 b[n - 1] = c[n - 1] / a[n * n - 1];
72 for (
size_t k = 0; k < nm; k++) {
73 const size_t m = n - k - 2;
75 const size_t mp = m + 1;
76 for (
size_t j = mp; j < n; j++)
77 b[m] -= a[m * n + j] * b[j];
81 for (
size_t i = 0; i < n; i++)
83 for (
size_t i = 0; i < nsq; i++)
89 printf(
"ill-conditioned\n");