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

◆ gbvector_combine_lead_terms_ZZ()

void GBRing::gbvector_combine_lead_terms_ZZ ( const FreeModule * F,
const FreeModule * Fsyz,
const gbvector * f,
const gbvector * fsyz,
const gbvector * g,
const gbvector * gsyz,
gbvector *& result,
gbvector *& result_syz )

Definition at line 1174 of file gbring.cpp.

1190{
1191 int comp;
1192 const ring_elem a = f->coeff;
1193 const ring_elem b = g->coeff;
1194 mpz_t gab, u1, v1;
1195
1200
1203
1204 mpz_init(gab);
1205 mpz_init(u1);
1206 mpz_init(v1);
1207 mpz_gcdext(gab, u1, v1, a.get_mpz(), b.get_mpz());
1208 mpz_clear(gab);
1209 //these ring_elem must not escape the function, because they aren't allocated on
1210 //the gc heap
1211 ring_elem u = ring_elem(u1);
1212 ring_elem v = ring_elem(v1);
1213 if (globalZZ->is_zero(u) || globalZZ->is_zero(v))
1214 {
1215 result = nullptr;
1216 result_syz = nullptr;
1217 mpz_clear(u1);
1218 mpz_clear(v1);
1219 return;
1220 }
1221 gbvector_get_lead_exponents(F, f, EXP1); // Removes the Schreyer part
1222 gbvector_get_lead_exponents(F, g, EXP2); // Removes the Schreyer part
1223 exponent_syzygy(EXP1, EXP2, EXP3, EXP4);
1224 if (g->comp == 0)
1225 comp = f->comp;
1226 else
1227 comp = 0;
1228 if (is_skew_commutative())
1229 {
1230 // Note that EXP3 * EXP1 = EXP4 * EXP2 up to sign
1231 if (_skew.mult_sign(EXP3, EXP1) != _skew.mult_sign(EXP4, EXP2))
1232 K->negate_to(v);
1233 }
1234 M->from_expvector(EXP3, MONOM1);
1235 M->from_expvector(EXP4, MONOM2);
1236 result = mult_by_term(F, f, u, MONOM1, 0);
1237 gbvector *result1 = mult_by_term(F, g, v, MONOM2, comp);
1238 gbvector_add_to(F, result, result1);
1239 if (fsyz == nullptr && gsyz == nullptr)
1240 result_syz = nullptr;
1241 else
1242 {
1243 result_syz = mult_by_term(Fsyz, fsyz, u, MONOM1, 0);
1244 gbvector *result_syz1 = mult_by_term(Fsyz, gsyz, v, MONOM2, comp);
1245 gbvector_add_to(Fsyz, result_syz, result_syz1);
1246 }
1247 mpz_clear(u1);
1248 mpz_clear(v1);
1249}
exponents::Exponents exponents_t
gbvector * mult_by_term(const FreeModule *F, const gbvector *f, ring_elem u, const int *monom, int comp)
Definition gbring.cpp:839
bool is_skew_commutative() const
Definition gbring.hpp:240
size_t monom_size
Definition gbring.hpp:170
size_t exp_size
Definition gbring.hpp:169
SkewMultiplication _skew
Definition gbring.hpp:151
const Monoid * M
Definition gbring.hpp:137
const Ring * K
Definition gbring.hpp:138
void gbvector_add_to(const FreeModule *F, gbvector *&f, gbvector *&g)
Definition gbring.cpp:668
void gbvector_get_lead_exponents(const FreeModule *F, const gbvector *f, int *result)
Definition gbring.cpp:541
void exponent_syzygy(const int *exp1, const int *exp2, int *exp3, int *exp4)
Definition gbring.cpp:814
virtual bool is_zero(const ring_elem f) const
Definition ZZ.cpp:155
RingZZ * globalZZ
Definition relem.cpp:13
int * monomial
Definition gbring.hpp:102
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define ALLOCATE_EXPONENTS(byte_len)
Definition monoid.hpp:62
#define ALLOCATE_MONOMIAL(byte_len)
Definition monoid.hpp:65
ring_elem coeff
Definition gbring.hpp:81
int comp
Definition gbring.hpp:82
mpz_srcptr get_mpz() const
Definition ringelem.hpp:127

References _skew, ALLOCATE_EXPONENTS, ALLOCATE_MONOMIAL, gbvector::coeff, gbvector::comp, exp_size, exponent_syzygy(), gbvector_add_to(), gbvector_get_lead_exponents(), ring_elem::get_mpz(), globalZZ, is_skew_commutative(), K, M, monom_size, mult_by_term(), and result().