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); } }
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); } }
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; }
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; }
poly_constructor(const ResPolyRing& R) : mRing(R) { coeffs = R.resGausser().allocateCoefficientVector(); }