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

◆ invert()

ring_elem PolyRingQuotient::invert ( const ring_elem f) const
virtual

Implements Ring.

Definition at line 161 of file polyquotient.cpp.

162{
163 if (nvars_ == 1 && n_quotients() == 1 && K_->is_field() && ! K_->is_fraction_field())
164 {
165 ring_elem g = quotient_element(0);
166
167 RingElement *f1 = RingElement::make_raw(getAmbientRing(), f);
168 RingElement *g1 = RingElement::make_raw(getAmbientRing(), g);
169 const RingElement *u1;
170 const RingElement *v1;
171 const RingElement *ret = rawExtendedGCDRingElement(f1, g1, &u1, &v1);
172 if (ret == nullptr)
173 {
174 // one reason this might return nullptr is if the coefficient ring is not
175 // ZZ/n, ZZ, or QQ
176 // now what do we do?
177 // we can't return nullptr
178 INTERNAL_ERROR("ring element gcd computation failed");
179 }
180 if (!getAmbientRing()->is_unit(ret->get_value())) return from_long(0);
181 return u1->get_value();
182 }
183 else if (M_->numNonTermOrderVariables() == 0)
184 return ann(from_long(1), f);
185 else
186 {
187 // An error message is generated higher up
188 return from_long(0);
189 }
190}
virtual ring_elem from_long(long n) const
ring_elem ann(const ring_elem a, const ring_elem b) const
virtual bool is_unit(const ring_elem f) const
int n_quotients() const
Definition polyring.hpp:219
virtual const PolynomialRing * getAmbientRing() const
Definition polyring.hpp:260
const Ring * K_
Definition polyring.hpp:123
const Monoid * M_
Definition polyring.hpp:124
Nterm * quotient_element(int i) const
Definition polyring.hpp:220
ring_elem get_value() const
Definition relem.hpp:79
static RingElement * make_raw(const Ring *R, ring_elem f)
Definition relem.cpp:20
void INTERNAL_ERROR(const char *s,...)
Definition error.c:36
const RingElement * rawExtendedGCDRingElement(const RingElement *f, const RingElement *g, const RingElement **A, const RingElement **B)
Definition factory.cpp:553

References ann(), from_long(), RingElement::get_value(), PolynomialRing::getAmbientRing(), INTERNAL_ERROR(), is_unit(), PolynomialRing::K_, PolynomialRing::M_, RingElement::make_raw(), PolynomialRing::n_quotients(), PolynomialRing::nvars_, PolynomialRing::quotient_element(), and rawExtendedGCDRingElement().

Referenced by is_unit().