SymmMatrix(const Matrix *m0, int p) : symm1_next(0), R(m0->get_ring()), ncols(m0->n_cols()), m(m0), result() { const FreeModule *Fp = m0->rows()->symm(p); const FreeModule *Gp = m0->cols()->symm(p); int *dp = R->degree_monoid()->make_new(m->degree_shift()); R->degree_monoid()->power(dp, p, dp); result = MatrixConstructor(Fp, Gp, dp); if (p >= 0) { vec f = R->e_sub_i(0); symm1(f, 0, p); // consumes f } }
PfaffianComputation::PfaffianComputation(const Matrix *M0, int p0) : R(M0->get_ring()), M(M0), p(p0), done(false), row_set(0) { pfaffs = MatrixConstructor(R->make_FreeModule(1),0); if (p == 0) { pfaffs.append(R->make_vec(0,R->one())); done = true; return; } if (p % 2 != 0 || p < 0 || (p > M->n_cols()) || (p > M->n_rows())) { done = true; return; } row_set = newarray_atomic(int,p); for (int i=0; i<p; i++) row_set[i] = i; }
DetComputation::DetComputation(const Matrix *M0, int p0, bool do_exterior0, int strategy0) : R(M0->get_ring()), M(M0), done(false), p(p0), do_exterior(do_exterior0), strategy(strategy0), row_set(NULL), col_set(NULL), this_row(0), this_col(0), D(0) { if (do_exterior) { F = M->rows()->exterior(p); FreeModule *G = M->cols()->exterior(p); int *deg = R->degree_monoid()->make_new(M->degree_shift()); R->degree_monoid()->power(deg, p, deg); result = MatrixConstructor(F,G,deg); R->degree_monoid()->remove(deg); } else { F = R->make_FreeModule(1); result = MatrixConstructor(F,0); } // Handle trivial cases if (p < 0) { // In either case, want a zero matrix done = true; return; } if (p == 0) { // We want a single element which is '1' if (do_exterior) result.set_entry(0,0,R->one()); else result.append(R->make_vec(0,R->one())); done = true; return; } if (p > M->n_rows() || p > M->n_cols()) { // Zero matrix in either case done = true; return; } done = false; row_set = newarray_atomic(size_t,p); col_set = newarray_atomic(size_t,p); for (size_t i=0; i<p; i++) { row_set[i] = i; col_set[i] = i; } D = newarray(ring_elem *,p); for (size_t i=0; i<p; i++) { D[i] = newarray(ring_elem,p); for (size_t j=0; j<p;j++) D[i][j] = ZERO_RINGELEM; } }
void DetComputation::clear() { if (do_exterior) return; result = MatrixConstructor(F,0); }