13 P =
R->cast_to_PolynomialRing();
17 K =
P->getCoefficientRing();
30 for (
int i = 0; i <
nvars; i++)
33 _elem[i].is_zero =
false;
34 _elem[i].coeff_is_one =
true;
35 _elem[i].monom_is_one =
true;
36 _elem[i].bigelem_is_one =
true;
38 _elem[i].monom =
nullptr;
44 _elem[i].is_zero =
true;
45 else if (
P ==
nullptr)
48 if (!
K->is_equal(f, one))
50 _elem[i].coeff_is_one =
false;
51 _elem[i].coeff =
K->copy(f);
58#warning "also handle fraction rings"
61 if (t->
next ==
nullptr)
64 if (!
K->is_equal(t->
coeff, one))
66 _elem[i].coeff_is_one =
false;
73 _elem[i].monom_is_one =
false;
81 _elem[i].bigelem_is_one =
false;
90 for (
int i = 0; i <
nvars; i++)
92 if (!
_elem[i].coeff_is_one)
K->remove(
_elem[i].coeff);
93 if (!
_elem[i].monom_is_one)
M->remove(
_elem[i].monom);
94 R->remove(
_elem[i].bigelem);
104 for (
int i = 0; i <
nvars; i++)
117 for (
int i = 0; i <
nvars; i++)
118 if (!
R->is_equal(
elem(i), phi->
elem(i)))
return false;
132 for (
int i = 0; i <
nvars; i++)
134 if (i > 0) o <<
", ";
135 R->elem_text_out(o,
_elem[i].bigelem);
144 int nvars_in_source)
const
148 int v = first_var + i.var();
150 return R->from_long(0);
165 result_monom =
M->make_one();
166 temp_monom =
M->make_one();
169 if (!
R->is_commutative_ring() ||
R->cast_to_SchurRing())
174 int v = first_var + i.var();
175 int e = i.exponent();
178 g =
_elem[v].bigelem;
180 g =
R->invert(
_elem[v].bigelem);
181 for (
int j = 0; j < e; j++)
194 int v = first_var + i.var();
195 int e = i.exponent();
197 if (
_elem[v].bigelem_is_one && e > 0)
199 if (!
_elem[v].coeff_is_one)
202 K->mult_to(result_coeff, tmp);
205 if (!
_elem[v].monom_is_one)
207 M->power(
_elem[v].monom, e, temp_monom);
208 M->mult(result_monom, temp_monom, result_monom);
221 ring_elem temp =
P->make_flat_term(result_coeff, result_monom);
222 K->remove(result_coeff);
223 M->remove(result_monom);
224 M->remove(temp_monom);
242 if (
error())
return nullptr;
249 for (
int i = 0; i < m->
n_cols(); i++)
251 if (
error())
return nullptr;
varpower::ConstExponents const_varpower
ExponentListIterator< int, true > index_varpower
Engine-side free module R^n over a Ring.
const Ring * get_ring() const
ring_elem elem(int i, int j) const
Mutable builder used to assemble an immutable Matrix one column (or one term) at a time.
unsigned int hash() const
virtual unsigned int computeHashValue(const ring_elem a) const =0
vec vec_eval(const RingMap *map, const FreeModule *F, const vec v) const
virtual ring_elem eval(const RingMap *map, const ring_elem f, int first_var) const =0
ring_elem get_value() const
static RingElement * make_raw(const Ring *R, ring_elem f)
const Ring * get_ring() const
Front-end-visible "ring element" value: an engine ring_elem paired with the Ring* that gives it meani...
const ring_elem elem(int i) const
bool is_equal(const RingMap *phi) const
virtual unsigned int computeHashValue() const
const Ring * get_ring() const
void text_out(buffer &o) const
static const RingMap * make(const Matrix *m)
RingElement * eval(const RingElement *r) const
ring_elem eval_term(const Ring *coeff_ring, const ring_elem coeff, const int *vp, int first_var, int nvars_in_source) const
VALGRIND_MAKE_MEM_DEFINED & result(result)
MatrixConstructor — the mutable builder that produces an immutable Matrix.
Matrix — the engine's immutable homomorphism F -> G between free modules.
PolynomialRing — abstract polynomial-ring base, the engine's most-reused class.
RingElement — tagged (Ring*, ring_elem) pair, the engine's universal element type.
RingMap — engine representation of a ring homomorphism.
Singly linked-list node carrying one term of a polynomial-ring element.
Per-source-variable image record: a factored representation of the target-ring element that variable ...