| @@ -0,0 +1,22 @@ | |||||
| // Ryser's algorithm | |||||
| static npy_complex128 perm_ryser(PyArrayObject *submatrix) { | |||||
| int n = (int) PyArray_DIM(submatrix, 0); | |||||
| npy_complex128 rowsum, rowsumprod; | |||||
| npy_complex128 perm = complex_zero; | |||||
| int exp = 1 << n; | |||||
| int i, y, z; | |||||
| for (i=0; i<exp; ++i) { | |||||
| rowsumprod = complex_one; | |||||
| for (y=0; y<n; ++y) { | |||||
| rowsum = complex_zero; | |||||
| for (z=0; z<n; ++z) { | |||||
| if ((i & (1 << z)) != 0) { complex_inc(&rowsum, SM(z, y)); } | |||||
| } | |||||
| complex_multiply(&rowsumprod, rowsum); | |||||
| } | |||||
| complex_inc(&perm, complex_float_prod(rowsumprod, bitparity(i))); | |||||
| } | |||||
| if (n%2 == 1) {perm=complex_float_prod(perm, -1);} | |||||
| return perm; | |||||
| } | |||||