#include #define n 5 /* This uses twice the necessary storage and does perhaps twice the necessary computation. Many of the results are known to be zero or one. These are stored as well. */ double ab(double); double ab(double x){return x<0?-x:x;} int invrt(double A[n][n]); int invrt(double A[n][n]){int i, j, k, im; double a[n][2*n]; for(i=0; i int main(){double a[5][5] = { {1, 4, 3, 6, 5}, {3, 4, 1, 2.32, 7}, {7, 4, 5, 2, 1}, {4, 6, 1, 8, 5}, {2, 7, 4, 1, 2}}, x[5][5], p[5][5]; {int i, j; for(i=0; i<5; ++i) for (j=0; j<5; ++j) a[i][j] = i==0?-1:(i==j);} {int i, j; for(i=0; i<5; ++i) for (j=0; j<5; ++j) x[i][j] = a[i][j];} invrt(a); printf("One\n"); {int i, j; for(i=0; i<5; ++i) for (j=0; j<5; ++j) {int k; p[i][j] = 0; for(k=0; k<5; ++k) p[i][j] += a[i][k]*x[k][j];}} {int i, j; for(i=0; i<5; ++i) {for (j=0; j<5; ++j) printf("%.9f ", x[i][j]); printf("\n");} for(i=0; i<5; ++i) {for (j=0; j<5; ++j) printf("%.9f ", a[i][j]); printf("\n");} for(i=0; i<5; ++i) {for (j=0; j<5; ++j) printf("%.9f ", p[i][j]); printf("\n");}}}