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

◆ rawGCDRingElement()

const RingElement * rawGCDRingElement ( const RingElement * f,
const RingElement * g,
const RingElement * mipo,
M2_bool inExtension )

Polynomial GCD and factorization interface routines via Factory and MPSolve

Definition at line 488 of file factory.cpp.

492{
493 const RingElement *ret = nullptr;
496 if (P == nullptr)
497 {
498 if (f->get_ring()->cast_to_Tower() != nullptr) return towerGCD(f, g);
499 // else we really do have an error:
500 ERROR("expected polynomial ring");
501 return nullptr;
502 }
503 if (P != P2)
504 {
505 ERROR("encountered different rings");
506 return nullptr;
507 }
508 {
509 struct enter_factory foo(P);
510 if (foo.mode == modeError)
511 {
512 algebraicElement_M2 = nullptr;
513 return nullptr;
514 }
515 if (foo.mode == modeGF)
516 {
517 assert(!inExtension);
518 set_GF_minimal_poly(P);
519 }
520 if (inExtension)
521 {
522 CanonicalForm minp = convertToFactory(*mipo, false);
523 algebraicElement_Fac = rootOf(minp, 'a');
524 }
525 CanonicalForm p = convertToFactory(*f, inExtension);
526 CanonicalForm q = convertToFactory(*g, inExtension);
527 CanonicalForm h = gcd(p, q);
528 if (inExtension)
529 {
530 assert(foo.mode != modeGF);
532 P, P->var(P->n_vars() - 1)); // the algebraic generator is always
533 // the last variable in M2, the first
534 // one in factory
535 }
536 ret = convertToM2(P, h);
537 if (error())
538 {
539 algebraicElement_M2 = nullptr;
540 return nullptr;
541 }
542 }
543 if (ret->is_zero()) return ret;
545 ret->get_value()); // an element in the coeff ring
546 ring_elem b = P->getCoefficients()->invert(a);
547 ring_elem r = ret->get_value();
548 P->mult_coeff_to(b, r);
549 algebraicElement_M2 = nullptr;
550 return RingElement::make_raw(P, r);
551}
ring_elem preferred_associate_divisor(ring_elem ff) const
Definition poly.cpp:459
virtual ring_elem var(int v) const =0
virtual void mult_coeff_to(ring_elem a, ring_elem &f) const =0
virtual const Ring * getCoefficients() const
Definition polyring.hpp:277
virtual const PolyRing * getNumeratorRing() const
Definition polyring.hpp:259
int n_vars() const
Definition polyring.hpp:196
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
virtual ring_elem invert(const ring_elem f) const =0
virtual const PolynomialRing * cast_to_PolynomialRing() const
Definition ring.hpp:243
virtual const Tower * cast_to_Tower() const
Definition ring.hpp:241
ring_elem get_value() const
Definition relem.hpp:79
bool is_zero() const
Definition relem.hpp:167
static RingElement * make_raw(const Ring *R, ring_elem f)
Definition relem.cpp:20
const Ring * get_ring() const
Definition relem.hpp:81
Front-end-visible "ring element" value: an engine ring_elem paired with the Ring* that gives it meani...
Definition relem.hpp:67
int error()
Definition error.c:48
@ modeGF
Definition factory.cpp:48
@ modeError
Definition factory.cpp:44
static const RingElement * convertToM2(const PolynomialRing *R, CanonicalForm h)
Definition factory.cpp:214
static CanonicalForm convertToFactory(mpz_srcptr p)
Definition factory.cpp:312
CanonicalForm algebraicElement_Fac
Definition factory.cpp:80
const RingElement * algebraicElement_M2
Definition factory.cpp:81
int p
const int ERROR
Definition m2-mem.cpp:55
const RingElement * towerGCD(const RingElement *F, const RingElement *G)
Definition tower.cpp:433

References algebraicElement_Fac, algebraicElement_M2, Ring::cast_to_PolynomialRing(), Ring::cast_to_Tower(), convertToFactory(), convertToM2(), ERROR, error(), RingElement::get_ring(), RingElement::get_value(), PolynomialRing::getCoefficients(), PolynomialRing::getNumeratorRing(), Ring::invert(), RingElement::is_zero(), RingElement::make_raw(), enter_factory::mode, modeError, modeGF, PolynomialRing::mult_coeff_to(), p, PolyRing::preferred_associate_divisor(), and towerGCD().

Referenced by LocalRing::lift_up(), FractionField::lower_content(), LocalRing::lower_content(), FractionField::simplify(), and LocalRing::simplify().