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

◆ imp_attempt_to_cancel_lead_term()

bool PolyRing::imp_attempt_to_cancel_lead_term ( ring_elem & f,
ring_elem g,
ring_elem & coeff,
monomial monom ) const
protected

Definition at line 1010 of file poly.cpp.

1014{
1015 bool result;
1016 Nterm *t = f;
1017 Nterm *s = g;
1018 if (t == nullptr || s == nullptr) return true;
1019 if (K_->is_field())
1020 {
1021 coeff = K_->divide(t->coeff, s->coeff);
1022 result = true;
1023 }
1024 else if (K_ == globalZZ)
1025 {
1026 ring_elem r = globalZZ->remainderAndQuotient(t->coeff, s->coeff, coeff);
1027 result =
1028 (globalZZ->is_zero(r)); // true means lead term will be cancelled.
1029 }
1030 else
1031 {
1032 throw exc::internal_error("should not get to this code in imp_attempt_to_cancel_lead_term");
1033 coeff = K_->zero();
1034 result = false;
1035 // What do we do here?? Call divide, and hope for the best?
1036 }
1037 if (!K_->is_zero(coeff))
1038 {
1039 if (is_skew_)
1040 {
1044 M_->to_expvector(t->monom, EXP1);
1045 M_->to_expvector(s->monom, EXP2);
1046 int sign = skew_.divide(EXP1, EXP2, EXP3);
1047 M_->from_expvector(EXP3, monom);
1048 if (sign < 0) K_->negate_to(coeff);
1049 imp_subtract_multiple_to(f, coeff, monom, g);
1050 }
1051 else
1052 {
1053 M_->divide(t->monom, s->monom, monom);
1054 imp_subtract_multiple_to(f, coeff, monom, g);
1055 }
1056 }
1057 return result;
1058}
exponents::Exponents exponents_t
void imp_subtract_multiple_to(ring_elem &f, ring_elem a, const_monomial m, const ring_elem g) const
Definition poly.cpp:1000
SkewMultiplication skew_
Definition polyring.hpp:104
const Ring * K_
Definition polyring.hpp:123
const Monoid * M_
Definition polyring.hpp:124
virtual bool is_zero(const ring_elem f) const
Definition ZZ.cpp:155
virtual ring_elem remainderAndQuotient(const ring_elem f, const ring_elem g, ring_elem &quot) const
Definition ZZ.cpp:317
RingZZ * globalZZ
Definition relem.cpp:13
void size_t s
Definition m2-mem.cpp:271
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define ALLOCATE_EXPONENTS(byte_len)
Definition monoid.hpp:62
ring_elem coeff
Definition ringelem.hpp:158
int monom[1]
Definition ringelem.hpp:160

References ALLOCATE_EXPONENTS, Nterm::coeff, PolynomialRing::exp_size, globalZZ, imp_subtract_multiple_to(), PolynomialRing::is_skew_, PolynomialRing::K_, PolynomialRing::M_, Nterm::monom, monomial, result(), s, and PolynomialRing::skew_.

Referenced by division_algorithm(), division_algorithm(), and powerseries_division_algorithm().