#include <assert.h>
#include <stdio.h>
+#include <stdlib.h>
/* constants */
/* types */
-typedef double[MAXSIZE][MAXSIZE] matric_t;
+typedef struct {
+ int n;
+ double *mat;
+} matrix_t;
/* static variables */
char *progname = NULL;
char *version = "0.1";
-int nb_theads = 1;
+int nb_threads = 1;
/* usage function */
return ret;
}
+/* matix functions */
+
+matrix_t * alloc_matrix (int n)
+{
+ matrix_t *m = (matrix_t *) calloc (1, sizeof (matrix_t));
+ assert (m);
+ m->n = n;
+ m->mat = (double *) calloc (n * n, sizeof (double));
+ assert (m->mat);
+ return m;
+}
+
+void free_matrix (matrix_t *m)
+{
+ if (m) free (m->mat);
+ free (m);
+}
+
+int set_matrix (matrix_t *m, int i, int j, double val)
+{
+ int rc = (m) && (i >= 0) && (i < m->n) && (i >= 0) && (i < m->n);
+ if (rc) {
+ m->mat[i + m->n * j] = val;
+ }
+ return !rc;
+}
+
+int get_matrix (matrix_t *m, int i, int j, double *val)
+{
+ int rc = (val) && (m) && (i >= 0) && (i < m->n) && (i >= 0) && (i < m->n);
+ if (rc) {
+ *val = m->mat[i + m->n * j];
+ }
+ return !rc;
+}
+
+
/* compute determinant */
-void get_comatrix (matrix_t comatrix, matrix_t matrix, int n, int k, int l)
+void get_comatrix (matrix_t *comatrix, matrix_t *matrix, int k, int l)
{
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
+ for (int i = 0; i < matrix->n; i++) {
+ for (int j = 0; j < matrix->n; j++) {
if ((i != k) & (j != l)) {
- comatrix[i - (i > k)][j - (j > l)] = matrix[i][j];
+ double val;
+ get_matrix (matrix, i, j, &val);
+ set_matrix (comatrix, i - (i > k), j - (j > l), val);
}
}
}
}
-double determinant (matrix_t matrix, int n)
+double determinant (matrix_t *matrix)
{
double det = 0;
- if (n == 1) {
- return matrix[0][0};
+ if (matrix->n == 1) {
+ double val;
+ get_matrix (matrix, 0, 0, &val);
+ return val;
}
- matrix_t comatrix = { 0 };
+ matrix_t *comatrix = alloc_matrix (matrix->n - 1);
int sign = 1;
- for (int l = 0; l < n; l++, sign = -sign) {
- get_comatrix (comatrix, matrix, n, 0, l);
- det += sign * matrix[0][l] * determinnat (comatrix, n - 1);
+ for (int l = 0; l < matrix->n; l++, sign = -sign) {
+ get_comatrix (comatrix, matrix, 0, l);
+ double val;
+ get_matrix (matrix, 0, l, &val);
+ det += sign * val * determinant (comatrix);
}
- return det
+ return det;
}
/* main function */
while (argc-- > 1) {
char *arg = *(++argv);
if (arg[0] != '-') {
- if ((!parse_arg_ext) || (parse_arg_ext (arg))) {
- fprintf (stderr, "%s: invalid option -- %s\n", progname, arg);
- return usage (1);
- }
- continue;
+ fprintf (stderr, "%s: invalid option -- %s\n", progname, arg);
+ return usage (1);
}
char c = arg[1];
switch (c) {