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

◆ rawExtendedGCDRingElement()

const RingElement * rawExtendedGCDRingElement ( const RingElement * f,
const RingElement * g,
const RingElement ** A,
const RingElement ** B )

Definition at line 553 of file factory.cpp.

558{
559 const bool inExtension = false;
560 const RingElement *ret;
563 *A = nullptr;
564 *B = nullptr;
565 if (P == nullptr)
566 {
567 if (f->get_ring()->cast_to_Tower() != nullptr)
568 return towerExtendedGCD(f, g, A, B);
569 // else we really do have an error:
570 ERROR("expected polynomial ring");
571 return nullptr;
572 }
573 if (P != P2)
574 {
575 ERROR("encountered different rings");
576 return nullptr;
577 }
578
579 if (f->is_zero())
580 {
581 *A = RingElement::make_raw(P, P->zero());
582 *B = RingElement::make_raw(P, P->one());
583 return g;
584 }
585
586 if (g->is_zero())
587 {
588 *A = RingElement::make_raw(P, P->one());
589 *B = RingElement::make_raw(P, P->zero());
590 return f;
591 }
592
593 struct enter_factory foo(P);
594 if (foo.mode == modeError) return nullptr;
595 if (foo.mode == modeGF)
596 {
597 set_GF_minimal_poly(P);
598 }
599 CanonicalForm p = convertToFactory(*f, inExtension);
600 CanonicalForm q = convertToFactory(*g, inExtension);
601 CanonicalForm a, b;
602 CanonicalForm h = extgcd(p, q, a, b);
603 ret = convertToM2(P, h);
604 if (error())
605 {
606 algebraicElement_M2 = nullptr;
607 return nullptr;
608 }
609 *A = convertToM2(P, a);
610 if (error())
611 {
612 algebraicElement_M2 = nullptr;
613 return nullptr;
614 }
615 *B = convertToM2(P, b);
616 if (error())
617 {
618 algebraicElement_M2 = nullptr;
619 return nullptr;
620 }
621 algebraicElement_M2 = nullptr;
622 return ret;
623}
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
ring_elem one() const
Definition ring.hpp:357
ring_elem zero() const
Definition ring.hpp:359
virtual const PolynomialRing * cast_to_PolynomialRing() const
Definition ring.hpp:243
virtual const Tower * cast_to_Tower() const
Definition ring.hpp:241
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
const RingElement * algebraicElement_M2
Definition factory.cpp:81
int p
const int ERROR
Definition m2-mem.cpp:55
const RingElement * towerExtendedGCD(const RingElement *F, const RingElement *G, const RingElement **A, const RingElement **B)
Definition tower.cpp:446

References algebraicElement_M2, Ring::cast_to_PolynomialRing(), Ring::cast_to_Tower(), convertToFactory(), convertToM2(), ERROR, error(), RingElement::get_ring(), RingElement::is_zero(), RingElement::make_raw(), enter_factory::mode, modeError, modeGF, Ring::one(), p, towerExtendedGCD(), and Ring::zero().

Referenced by PolyRingQuotient::invert().