int main(void) { int i; FLINT_TEST_INIT(state); flint_printf("parity...."); fflush(stdout); /* check inv(inv(a)) == a */ for (i = 0; i < 10000; i++) { slong n, *a, *b, *c; int ap, bp, cp, ap2, bp2, cp2; n = n_randint(state, 100); a = _perm_init(n); b = _perm_init(n); c = _perm_init(n); ap = _perm_randtest(a, n, state); bp = _perm_randtest(b, n, state); _perm_compose(c, a, b, n); cp = ap ^ bp; ap2 = _perm_parity(a, n); bp2 = _perm_parity(b, n); cp2 = _perm_parity(c, n); if (ap != ap2 || bp != bp2 || cp != cp2) { flint_printf("FAIL:\n"); flint_printf("a: "); _perm_print(a, n); flint_printf("\n\n"); flint_printf("b: "); _perm_print(b, n); flint_printf("\n\n"); flint_printf("c: "); _perm_print(c, n); flint_printf("\n\n"); flint_printf("ap = %d\n", ap); flint_printf("bp = %d\n", bp); flint_printf("cp = %d\n", cp); flint_printf("ap2 = %d\n", ap2); flint_printf("bp2 = %d\n", bp2); flint_printf("cp2 = %d\n", cp2); abort(); } _perm_clear(a); _perm_clear(b); _perm_clear(c); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return 0; }
mp_limb_t _nmod_mat_det(nmod_mat_t A) { mp_limb_t det; long * P; long m = A->r; long rank; long i; P = flint_malloc(sizeof(long) * m); rank = nmod_mat_lu(P, A, 1); det = 0UL; if (rank == m) { det = 1UL; for (i = 0; i < m; i++) det = n_mulmod2_preinv(det, nmod_mat_entry(A, i, i), A->mod.n, A->mod.ninv); } if (_perm_parity(P, m) == 1) det = nmod_neg(det, A->mod); flint_free(P); return det; }
void _fmpz_mat_det_bareiss(fmpz_t det, fmpz_mat_t tmp) { long *perm, n = fmpz_mat_nrows(tmp); perm = _perm_init(n); fmpz_mat_fflu(tmp, det, perm, tmp, 1); if (_perm_parity(perm, n) == 1) fmpz_neg(det, det); _perm_clear(perm); }
int fmpz_poly_mat_inv(fmpz_poly_mat_t Ainv, fmpz_poly_t den, const fmpz_poly_mat_t A) { long n = fmpz_poly_mat_nrows(A); if (n == 0) { fmpz_poly_one(den); return 1; } else if (n == 1) { fmpz_poly_set(den, E(A, 0, 0)); fmpz_poly_one(E(Ainv, 0, 0)); return !fmpz_poly_is_zero(den); } else if (n == 2) { fmpz_poly_mat_det(den, A); if (fmpz_poly_is_zero(den)) { return 0; } else if (Ainv == A) { fmpz_poly_swap(E(A, 0, 0), E(A, 1, 1)); fmpz_poly_neg(E(A, 0, 1), E(A, 0, 1)); fmpz_poly_neg(E(A, 1, 0), E(A, 1, 0)); return 1; } else { fmpz_poly_set(E(Ainv, 0, 0), E(A, 1, 1)); fmpz_poly_set(E(Ainv, 1, 1), E(A, 0, 0)); fmpz_poly_neg(E(Ainv, 0, 1), E(A, 0, 1)); fmpz_poly_neg(E(Ainv, 1, 0), E(A, 1, 0)); return 1; } } else { fmpz_poly_mat_t LU, I; long * perm; int result; perm = _perm_init(n); fmpz_poly_mat_init_set(LU, A); result = (fmpz_poly_mat_fflu(LU, den, perm, LU, 1) == n); if (result) { fmpz_poly_mat_init(I, n, n); fmpz_poly_mat_one(I); fmpz_poly_mat_solve_fflu_precomp(Ainv, perm, LU, I); fmpz_poly_mat_clear(I); } else fmpz_poly_zero(den); if (_perm_parity(perm, n)) { fmpz_poly_mat_neg(Ainv, Ainv); fmpz_poly_neg(den, den); } _perm_clear(perm); fmpz_poly_mat_clear(LU); return result; } }