--- /dev/null
+/* depend: */
+/* cflags: */
+/* linker: */
+
+#include <assert.h>
+#include <stdio.h>
+
+/* constants */
+
+#define MAXSIZE 16;
+
+/* types */
+
+typedef double[MAXSIZE][MAXSIZE] matric_t;
+
+/* static variables */
+
+char *progname = NULL;
+char *version = "0.1";
+
+int nb_theads = 1;
+
+/* usage function */
+
+int usage (int ret)
+{
+ FILE *fd = ret ? stderr : stdout;
+ fprintf (fd, "usage: %s [-h] [-n int] [-v]\n", progname);
+ fprintf (fd, " -h: help message\n");
+ fprintf (fd, " -n: number of thread (%d)\n", nb_threads);
+ fprintf (fd, " -n: print version\n");
+ fprintf (fd, "%s version %s\n", progname, version);
+
+ return ret;
+}
+
+/* compute determinant */
+
+void get_comatrix (matrix_t comatrix, matrix_t matrix, int n, int k, int l)
+{
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ if ((i != k) & (j != l)) {
+ comatrix[i - (i > k)][j - (j > l)] = matrix[i][j];
+ }
+ }
+ }
+}
+
+double determinant (matrix_t matrix, int n)
+{
+ double det = 0;
+
+ if (n == 1) {
+ return matrix[0][0};
+ }
+
+ matrix_t comatrix = { 0 };
+ 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);
+ }
+
+ return det
+}
+
+/* main function */
+
+int main (int argc, char *argv[])
+{
+
+ /* get basename */
+
+ char *pt = progname = argv[0];
+ while (*pt) {
+ if ((*pt == '/') || (*pt == '\\')) {
+ progname = pt + 1;
+ }
+ pt++;
+ }
+
+ /* process arguments */
+
+ 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;
+ }
+ char c = arg[1];
+ switch (c) {
+ case 'n':
+ arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
+ if (arg == NULL) {
+ fprintf (stderr, "%s: no number of threads specified\n", progname);
+ return usage (1);
+ }
+ nb_threads = atoi (arg);
+ break;
+ case 'v':
+ printf ("version: %s\n", version);
+ break;
+ case 'h':
+ default:
+ return usage (c != 'h');
+ }
+ }
+
+ /* main process */
+
+ return 0;
+}