73 for (
int i = 0; i < len; i++)
75 if (array[i] !=
nullptr)
95 for (
const vecterm *
p = v;
p !=
nullptr;
p =
p->next)
127 if (b ==
nullptr)
return true;
130 if (b ==
nullptr)
return false;
131 if (a->
comp != b->
comp)
return false;
138 for (;; v = v->next, w = w->next)
142 if (w ==
nullptr)
return 0;
145 if (w ==
nullptr)
return 1;
146 int cmp = v->comp - w->comp;
147 if (cmp > 0)
return cmp;
148 if (cmp < 0)
return cmp;
150 if (cmp > 0)
return cmp;
151 if (cmp < 0)
return cmp;
157 for (
const vecterm *
p = v;
p !=
nullptr;
p =
p->next)
160 else if (
p->comp == r)
172 if (v->comp == r)
return v->coeff;
190 for (
vecterm *a = v; a !=
nullptr; a = a->next)
224 if (
is_zero(f))
return nullptr;
227 for (vec v = w; v !=
nullptr; v = v->next)
243 if (
is_zero(f))
return nullptr;
246 for (vec v = w; v !=
nullptr; v = v->next)
262 if (v ==
nullptr)
return nullptr;
265 for (
int i = 0; i < v->
comp; i++) trans.push_back(-1);
267 for (
unsigned j = 0; j < r->len; j++)
268 if (r->array[j] >= 0 && r->array[j] <= v->
comp) trans[r->array[j]] = j;
272 for (; v !=
nullptr; v = v->
next)
273 if (trans[v->
comp] != -1)
292 for (
const vecterm *
p = v;
p !=
nullptr;
p =
p->next)
297 w->comp =
p->comp + n;
309 for (; v !=
nullptr; v = v->next)
314 w->comp = n * v->comp + m;
324 for (; v !=
nullptr; v = v->next)
346 for (
const vecterm *t = v; t !=
nullptr; t = t->
next)
349 o <<
"<" << t->comp <<
">";
358 const Ring *targetRing = map->get_ring();
363 for (vec t = v; t !=
nullptr; t = t->next)
380 for (
const vecterm *
p = v;
p !=
nullptr;
p =
p->next)
401 for (
const vecterm *
p = v;
p !=
nullptr;
p =
p->next)
419 while (
p->next !=
nullptr)
424 c = this->
mult(p->next->coeff, r);
426 c = this->
mult(r,
p->next->coeff);
428 if (this->
is_zero(p->next->coeff))
444 for (vec
p = &head;
p->next !=
nullptr;
p =
p->next)
445 if (
p->next->comp < i)
447 else if (
p->next->comp == i)
451 c =
mult(
p->next->coeff, r);
453 c =
mult(r,
p->next->coeff);
475 for (; v !=
nullptr; v = v->next)
494 while (
p->next !=
nullptr)
498 this->
divide(p->next->coeff, a);
500 if (this->
is_zero(p->next->coeff))
516 for (vec
p = &head;
p->next !=
nullptr;
p =
p->next)
517 if (
p->next->comp < r)
519 else if (
p->next->comp == r)
522 this->
divide(
p->next->coeff, a);
552 if (w ==
nullptr)
return;
562 if (v->comp < w->comp)
574 else if (v->comp > w->comp)
593 tmv->coeff = this->
add(tmv->coeff, tmw->coeff);
625 if (v ==
nullptr)
return result;
626 if (w ==
nullptr)
return result;
644 bool iszero = this->
is_zero(a);
647 for (
p = &head;
p->next !=
nullptr;
p =
p->next)
648 if (
p->next->comp <= r)
break;
650 if (
p->next ==
nullptr ||
p->next->comp < r)
659 else if (
p->next->comp == r)
682 if (f ==
nullptr || f->
next ==
nullptr)
return;
692 if (f ==
nullptr)
break;
710 if (v ==
nullptr)
return nullptr;
718 for (; v !=
nullptr; v = v->next)
728 t->
comp = rankFw * v->comp +
p->comp;
740 if (PR ==
nullptr || v ==
nullptr)
return true;
742 for (vec w = v; w !=
nullptr; w = w->next)
751 ERROR(
"attempting to find degree of zero vector");
755 for (vec w = v->next; w !=
nullptr; w = w->next)
759 if (lo1 < lo) lo = lo1;
760 if (hi1 > hi) hi = hi1;
768 for (vec w = v; w !=
nullptr; w = w->next)
786 for (vec w = v; w !=
nullptr; w = w->next)
811 if (f ==
nullptr)
return true;
816 for (vec v = f->next; v !=
nullptr; v = v->next)
835 if (f ==
nullptr)
return true;
842 for (
vecterm *t = f->next; (t !=
nullptr) &&
result; t = t->next)
860 const std::vector<int> &wts,
873 for (t = t->
next; t !=
nullptr; t = t->
next)
879 if (hi1 > hi) hi = hi1;
880 if (lo1 < lo) lo = lo1;
888 const std::vector<int> &wts)
const
896 for (vec w = f; w !=
nullptr; w = w->next)
898 int e = F->primary_degree(w->comp);
913 const std::vector<int> &wts)
const
916 if (f ==
nullptr)
return result;
920 int d = (wts[v] > 0 ? hi : lo);
939 for (f = f1, g = g1; f !=
nullptr && g !=
nullptr; f = f->
next, g = g->
next)
945 if (!isequal)
return false;
947 if (f ==
nullptr && g ==
nullptr)
return true;
955 if (f ==
nullptr)
return true;
956 if (g ==
nullptr)
return true;
958 if (PR ==
nullptr)
return true;
961#warning "use numerator only"
963 if (f->comp != g->comp)
return false;
969 for (
p = f, q = g;
p !=
nullptr && q !=
nullptr;
p =
p->next, q = q->next)
971 if (
p->comp != q->comp)
return 0;
974 if (q ==
nullptr &&
p ==
nullptr)
return true;
981 if (PR ==
nullptr)
return copy_vec(f);
982 if (f ==
nullptr)
return nullptr;
991 if (make_squarefree_only)
993 for (
int i = 0; i < PR->
n_vars(); i++)
994 if (exp[i] >= 1) exp[i]--;
1004 if (f ==
nullptr)
return zero();
1006 for (vec t = f->next; t !=
nullptr; t = t->next)
lower_content(c, t->coeff);
1012 if (f ==
nullptr)
return nullptr;
1015 for (
const vecterm *
p = f;
p !=
nullptr;
p =
p->next)
1029 if (f ==
nullptr)
return nullptr;
exponents::ConstExponents const_exponents
exponents::Exponents exponents_t
const_monomial degree(int i) const
int primary_degree(int i) const
Engine-side free module R^n over a Ring.
ring_elem elem(int i, int j) const
void to_expvector(const_monomial m, exponents_t result_exp) const
bool in_subring(int nslots, const_monomial m) const
monomial make_one() const
int compare(int nslots, const_monomial m, const_monomial n) const
void remove(monomial d) const
void mult(const_monomial m, const_monomial n, monomial result) const
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Concrete PolyRingFlat subclass implementing ordinary commutative polynomial rings K[x_1,...
virtual const Monoid * getMonoid() const
virtual const Ring * getCoefficients() const
virtual const PolyRing * getNumeratorRing() const
virtual const_monomial lead_flat_monomial(const ring_elem f) const =0
Abstract base for the engine's polynomial-ring hierarchy.
virtual ring_elem divide_by_expvector(const_exponents exp, const ring_elem a) const
vec mult_vec(int n, vec v) const
virtual void remove(ring_elem &f) const =0
vec component_shift(int n, vec v) const
virtual void monomial_divisor(const ring_elem a, exponents_t exp) const
virtual ring_elem content(ring_elem f) const
bool vec_multi_degree(const FreeModule *F, const vec f, monomial degf) const
vec vec_homogenize(const FreeModule *F, const vec f, int v, int deg, const std::vector< int > &wts) const
vec sub_vector(const vecterm *v, M2_arrayint r) const
void negate_to(ring_elem &f) const
vec make_vec(int r, ring_elem a) const
virtual ring_elem divide(const ring_elem f, const ring_elem g) const =0
vec add_vec(vec v, vec w) const
vec tensor(const FreeModule *F, vec v, const FreeModule *G, vec w) const
virtual void increase_maxnorm(gmp_RRmutable norm, const ring_elem f) const
void remove_vec_node(vec n) const
virtual void degree_weights(const ring_elem f, const std::vector< int > &wts, int &lo, int &hi) const
int n_nonzero_terms(const vecterm *v) const
void vec_text_out(buffer &o, const vecterm *v, bool p_one=true, bool p_plus=false, bool p_parens=false) const
virtual ring_elem add(const ring_elem f, const ring_elem g) const =0
virtual ring_elem divide_by_given_content(ring_elem f, ring_elem c) const
bool get_entry(const vecterm *v, int r, ring_elem &result) const
virtual void degree_of_var(int n, const ring_elem a, int &lo, int &hi) const
vec vec_divide_by_content(vec f) const
vec vec_zeroize_tiny(gmp_RR epsilon, const vec f) const
vec mult_vec_matrix(const Matrix *m, vec v, bool opposite_mult) const
virtual bool is_equal(const ring_elem f, const ring_elem g) const =0
void divide_row(vec &v, int r, const ring_elem a) const
void remove_vec(vec v) const
vec tensor_shift(int n, int m, vec v) const
void set_entry(vec &v, int i, ring_elem r) const
void vec_sort(vecterm *&f) const
virtual ring_elem homogenize(const ring_elem f, int v, int deg, const std::vector< int > &wts) const
int vec_in_subring(int n, const vec v) const
vec vec_remove_monomial_factors(vec f, bool make_squarefree_only) const
vec negate_vec(vec v) const
virtual void lower_content(ring_elem &c, ring_elem g) const
virtual ring_elem from_long(long n) const =0
virtual ring_elem negate(const ring_elem f) const =0
virtual const PolynomialRing * cast_to_PolynomialRing() const
virtual void elem_text_out(buffer &o, const ring_elem f, bool p_one=true, bool p_plus=false, bool p_parens=false) const =0
vec make_vec_from_array(int len, Nterm **array) const
void divide_vec_to(vec &v, const ring_elem a) const
void subtract_vec_to(vec &v, vec &w) const
void mult_vec_to(vec &v, const ring_elem r, bool opposite_mult) const
vec rightmult_vec(const vec w, const ring_elem f) const
vec subtract_vec(vec v, vec w) const
virtual vec vec_lead_term(int nparts, const FreeModule *F, vec v) const
vec vec_divide_by_given_content(vec f, ring_elem c) const
virtual ring_elem divide_by_var(int n, int d, const ring_elem a) const
bool vec_is_homogeneous(const FreeModule *F, const vec f) const
virtual bool multi_degree(const ring_elem f, monomial d) const
vec vec_divide_by_var(int n, int d, const vec v) const
void vec_increase_maxnorm(gmp_RRmutable norm, const vec f) const
vec vec_eval(const RingMap *map, const FreeModule *F, const vec v) const
virtual ring_elem zeroize_tiny(gmp_RR epsilon, const ring_elem f) const
void negate_vec_to(vec &v) const
void vec_degree_of_var(int n, const vec v, int &lo, int &hi) const
virtual bool is_zero(const ring_elem f) const =0
virtual ring_elem diff(ring_elem a, ring_elem b, int use_coeff) const
void vec_degree_weights(const FreeModule *F, const vec f, const std::vector< int > &wts, int &lo, int &hi) const
bool vec_is_scalar_multiple(vec f, vec g) const
ring_elem vec_content(vec f) const
void add_vec_to(vec &v, vec &w) const
virtual int compare_elems(const ring_elem f, const ring_elem g) const =0
int compare_vecs(vec v, vec w) const
vec vec_diff(vec v, int rankFw, vec w, int use_coeff) const
void mult_row(vec &v, const ring_elem r, int i, bool opposite_mult) const
ring_elem vec_split_off_content(vec f, vec &result) const
virtual ring_elem mult(const ring_elem f, const ring_elem g) const =0
virtual bool is_graded() const
vec vec_divide_by_expvector(const_exponents exp, const vec v) const
ring_elem dot_product(const vecterm *v, const vecterm *w) const
virtual ring_elem eval(const RingMap *map, const ring_elem f, int first_var) const =0
vec copy_vec(const vecterm *v) const
const Monoid * degree_monoid() const
vec new_vec() const
vector operations ////////////////////
Engine-side ring homomorphism: stores, for each source-ring variable, the target-ring element it maps...
static int compare(const vecterm *t, const vecterm *s)
vecHeap — geometric heap specialised for accumulating vec values.
VALGRIND_MAKE_MEM_DEFINED & result(result)
Matrix — the engine's immutable homomorphism F -> G between free modules.
#define newarray_atomic(T, len)
Concrete commutative PolyRing — standard polynomial ring inheriting from PolyRingFlat.
static bool check_nterm_multiples(const PolyRing *R, ring_elem f1, ring_elem g1, ring_elem c, ring_elem d)
Ring — the legacy abstract base class for every coefficient and polynomial ring.
RingMap — engine representation of a ring homomorphism.
Singly linked-list node carrying one term of a polynomial-ring element.
Text-formatting helpers layered on buffer: bignum print, line wrapping, M2_gbTrace-gated emit.