Exemplo n.º 1
0
  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
      }
  }
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
    }
}
Exemplo n.º 4
0
void DetComputation::clear()
{
  if (do_exterior) return;
  result = MatrixConstructor(F,0);
}