Macaulay2 Engine
Loading...
Searching...
No Matches

◆ eval_term()

ring_elem RingMap::eval_term ( const Ring * coeff_ring,
const ring_elem coeff,
const int * vp,
int first_var,
int nvars_in_source ) const

Definition at line 140 of file ringmap.cpp.

145{
146 for (index_varpower i = vp; i.valid(); ++i)
147 {
148 int v = first_var + i.var();
149 if (v >= nvars || _elem[v].is_zero)
150 return R->from_long(0); // The result is zero.
151 }
152
153 // If K is a coeff ring of R, AND map is an identity on K,
154 // then don't recurse: use this value directly.
155 // Otherwise, we must recurse, I guess.
156 ring_elem result = sourceK->eval(this, a, first_var + nvars_in_source);
157 if (R->is_zero(result)) return result;
158
159 monomial result_monom = nullptr;
160 monomial temp_monom = nullptr;
161 ring_elem result_coeff = K->from_long(1);
162
163 if (P != nullptr)
164 {
165 result_monom = M->make_one();
166 temp_monom = M->make_one();
167 }
168
169 if (!R->is_commutative_ring() || R->cast_to_SchurRing())
170 {
171 // This is the only non-commutative case so far
172 for (index_varpower i = vp; i.valid(); ++i)
173 {
174 int v = first_var + i.var();
175 int e = i.exponent();
176 ring_elem g;
177 if (e >= 0)
178 g = _elem[v].bigelem;
179 else
180 g = R->invert(_elem[v].bigelem);
181 for (int j = 0; j < e; j++)
182 {
183 assert(v < nvars);
184 ring_elem tmp = R->mult(g, result);
185 R->remove(result);
186 result = tmp;
187 }
188 }
189 }
190 else
191 {
192 for (index_varpower i = vp; i.valid(); ++i)
193 {
194 int v = first_var + i.var();
195 int e = i.exponent();
196 assert(v < nvars);
197 if (_elem[v].bigelem_is_one && e > 0)
198 {
199 if (!_elem[v].coeff_is_one)
200 {
201 ring_elem tmp = K->power(_elem[v].coeff, e);
202 K->mult_to(result_coeff, tmp);
203 K->remove(tmp);
204 }
205 if (!_elem[v].monom_is_one)
206 {
207 M->power(_elem[v].monom, e, temp_monom);
208 M->mult(result_monom, temp_monom, result_monom);
209 }
210 }
211 else
212 {
213 ring_elem thispart = R->power(_elem[v].bigelem, e);
214 R->mult_to(result, thispart);
215 R->remove(thispart);
216 if (R->is_zero(result)) break;
217 }
218 }
219 if (P != nullptr)
220 {
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);
225 P->mult_to(result, temp);
226 P->remove(temp);
227 }
228 else
229 {
230 // result_monom has not been used
231 // and result, result_coeff are both in the ring K
232 result = K->mult(result, result_coeff);
233 }
234 }
235 return result;
236}
ExponentListIterator< int, true > index_varpower
const Monoid * M
Definition ringmap.hpp:93
const Ring * R
Definition ringmap.hpp:89
const Ring * K
Definition ringmap.hpp:92
const PolynomialRing * P
Definition ringmap.hpp:91
int nvars
Definition ringmap.hpp:98
var * _elem
Definition ringmap.hpp:99
#define monomial
Definition gb-toric.cpp:11
VALGRIND_MAKE_MEM_DEFINED & result(result)

References _elem, Ring::eval(), K, M, monomial, nvars, P, R, and result().

Referenced by FreeAlgebra::eval(), and PolyRing::eval().