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

◆ lift()

bool PolyRing::lift ( const Ring * R,
const ring_elem f,
ring_elem & result ) const
virtual

Implements Ring.

Definition at line 415 of file poly.cpp.

416{
417 // case 1: Rf = A[x]/J ---> A[x]/I is one of the 'base_ring's of 'this'.
418 // case 2: Rf = A ---> A[x]/I is the ring of scalars
419
420 // We assume that Rg is one of the coefficient rings of 'this'
421
422 Nterm *t = f;
423 if (t == nullptr)
424 {
425 result = Rg->zero();
426 return true;
427 }
428
429 int nvars0 = n_vars();
430 if (Rg != K_)
431 {
432 const PolynomialRing *Rg1 = Rg->cast_to_PolynomialRing();
433 if (Rg1 != nullptr)
434 nvars0 -= Rg1->n_vars();
435 else
436 return false;
437 }
438
439 exponents_t exp = newarray_atomic(int, nvars0);
440 lead_logical_exponents(nvars0, f, exp);
441 if (!exponents::is_one(nvars0, exp)) return false;
442 if (n_logical_terms(nvars0, f) > 1) return false;
443 result = lead_logical_coeff(Rg, f);
444 return true;
445}
exponents::Exponents exponents_t
static bool is_one(int nvars, ConstExponents a)
virtual void lead_logical_exponents(int nvars0, const ring_elem f, exponents_t result_exp) const
Definition poly.cpp:1746
virtual int n_logical_terms(int nvars0, const ring_elem f) const
Definition poly.cpp:1764
virtual ring_elem lead_logical_coeff(const Ring *coeffR, const ring_elem f) const
Definition poly.cpp:1757
const Ring * K_
Definition polyring.hpp:123
int n_vars() const
Definition polyring.hpp:196
VALGRIND_MAKE_MEM_DEFINED & result(result)
const mpreal exp(const mpreal &x, mp_rnd_t r=mpreal::get_default_rnd())
Definition mpreal.h:2298
#define newarray_atomic(T, len)
Definition newdelete.hpp:91

References Ring::cast_to_PolynomialRing(), ExponentVector< int, true >::is_one(), PolynomialRing::K_, lead_logical_coeff(), lead_logical_exponents(), n_logical_terms(), PolynomialRing::n_vars(), newarray_atomic, PolynomialRing::PolynomialRing(), result(), Ring::Ring(), and Ring::zero().