Beispiel #1
0
inline void display_poly(std::ostream& o, const ResPolyRing& R, const poly& f)
{
  auto end = poly_iter(R, f, 1);  // end
  int i = 0;
  for (auto it = poly_iter(R, f); it != end; ++it, ++i)
    {
      R.resGausser().out(o, f.coeffs, i);
      res_const_packed_monomial mon = it.monomial();
      R.monoid().showAlpha(mon);
    }
}
Beispiel #2
0
inline void display_poly(FILE* fil, const ResPolyRing& R, const poly& f)
{
  auto end = poly_iter(R, f, 1); // end
  for (auto it = poly_iter(R, f); it != end; ++it)
    {
      FieldElement c = R.resGausser().coeff_to_int(it.coefficient());
      packed_monomial mon = it.monomial();
      if (c != 1) fprintf(fil, "%d", c);
      R.monoid().showAlpha(mon);
    }
}
Beispiel #3
0
void ResF4toM2Interface::from_M2_vec(const ResPolyRing& R,
                                  const FreeModule *F,
                                  vec v,
                                  poly &result)
{
  const PolynomialRing* origR = F->get_ring()->cast_to_PolynomialRing();
  const Ring* K = origR->getCoefficientRing();
  const Monoid* M = origR->getMonoid();

  ring_elem denom;
  gbvector *f = origR->translate_gbvector_from_vec(F,v, denom);
  GBRing *GR = origR->get_gb_ring();
  int n = GR->gbvector_n_terms(f);

  int *exp = new int[M->n_vars()+1];
  res_ntuple_word *lexp = new res_ntuple_word[M->n_vars()+1];

  //  result.len = n;
  int* relem_array = new int[n]; // doesn't need to be allocated with gc, as
          // all these pointers (or values) are still in the element f.
  auto monoms = std::unique_ptr<res_monomial_word[]>(new res_monomial_word[n * R.monoid().max_monomial_size()]);
  n = 0;
  res_monomial_word *nextmonom = monoms.get();
  for (gbvector *t = f; t != 0; t=t->next)
    {
      relem_array[n] = static_cast<int>(K->coerceToLongInteger(t->coeff).second);
      M->to_expvector(t->monom, exp);
      for (int a =0; a<M->n_vars(); a++)
        lexp[a] = exp[a];
      R.monoid().from_exponent_vector(lexp, t->comp-1, nextmonom); // gbvector components are shifted up by one
      nextmonom += R.monoid().monomial_size(nextmonom);
      n++;
    }
  auto coeffs = std::unique_ptr<FieldElement[]>(R.resGausser().from_ints(n, relem_array));
  poly_constructor::setPolyFromArrays(result, n, coeffs, monoms);
  GR->gbvector_remove(f);
  delete [] exp;
  delete [] lexp;
  delete [] relem_array;
}
Beispiel #4
0
vec ResF4toM2Interface::to_M2_vec(const ResPolyRing& R,
                               const poly &f,
                               const FreeModule *F)
{
  const PolynomialRing *origR = F->get_ring()->cast_to_PolynomialRing();
  const Ring* K = origR->getCoefficientRing();
  const Monoid *M = origR->getMonoid();
  
  int *m1 = M->make_one();

  Nterm **comps = newarray(Nterm *, F->rank());
  Nterm **last = newarray(Nterm *, F->rank());
  for (int i=0; i<F->rank(); i++)
    {
      comps[i] = 0;
      last[i] = 0;
    }

  int *exp = new int[M->n_vars()+1];
  res_ntuple_word *lexp = new res_ntuple_word[M->n_vars()+1];

  int* relem_array = new int[f.len];
  R.resGausser().to_ints(f.len, f.coeffs.get(), relem_array);

  const res_monomial_word *w = f.monoms.get();
  for (int i=0; i<f.len; i++)
    {
      long comp;
      R.monoid().to_exponent_vector(w, lexp, comp);
      w = w + R.monoid().monomial_size(w);
      for (int a=0; a<M->n_vars(); a++)
        exp[a] = static_cast<int>(lexp[a]);
      M->from_expvector(exp, m1);
      ring_elem a = K->from_long(relem_array[i]);
      Nterm * g = origR->make_flat_term(a, m1);
      g->next = 0;
      if (last[comp] == 0)
        {
          comps[comp] = g;
          last[comp] = g;
        }
      else
        {
          last[comp]->next = g;
          last[comp] = g;
        }
    }
  vec result = 0;
  for (int i=0; i<F->rank(); i++)
    {
      if (comps[i] != 0)
        {
          vec v = origR->make_vec(i,comps[i]);
          origR->add_vec_to(result,v);
          comps[i] = 0;
          last[i] = 0;
        }
    }

  delete [] relem_array;
  delete [] exp;
  delete [] lexp;
  return result;
}
Beispiel #5
0
 poly_constructor(const ResPolyRing& R) : mRing(R)
 {
   coeffs = R.resGausser().allocateCoefficientVector();
 }