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

◆ reduce3()

res2_pair * res2_comp::reduce3 ( res2term *& f,
res2term *& fsyz,
res2term *& pivot,
res2_pair * p )
private

Definition at line 1308 of file res-a0.cpp.

1316{
1317 // 'lastterm' is used to append the next monomial to fsyz->syz
1320
1321 res2term *lastterm = (fsyz->next == nullptr ? fsyz : fsyz->next);
1322 res2term head;
1323 res2term *red = &head;
1324 res2_pair *result = nullptr;
1325 res2_pair *q;
1326 ring_elem rg;
1327 respolyHeap fb(R); // No bucket is needed for fsyz, since we
1328 // only append elements to the end of fsyz.
1329 fb.add(f);
1330 f = nullptr;
1331 res2term *lead;
1332 // Bag *b;
1333
1334 int count = 0;
1335 if (M2_gbTrace >= 4) emit_wrapped(",");
1336
1337 while ((lead = fb.remove_lead_term()) != nullptr)
1338 {
1339 M->divide(lead->monom, lead->comp->syz->monom, REDUCE_mon);
1340 M->to_expvector(REDUCE_mon, REDUCE_exp);
1341 if (find_ring_divisor(REDUCE_exp, rg))
1342 {
1343 // Subtract off f, leave fsyz alone
1344 Nterm *r = rg;
1345 M->divide(lead->monom, r->monom, REDUCE_mon);
1346 ring_elem c = K->negate(lead->coeff);
1347 res2term *h =
1348 R->ring_mult_by_term(r->next, c, REDUCE_mon, lead->comp);
1349 R->remove(lead);
1350 K->remove(c);
1351 fb.add(h);
1353 count++;
1354 }
1355 else if (find_divisor(lead->comp->mi, REDUCE_exp, q))
1356 {
1357 // q = (res2_pair *) (b->basis_ptr());
1359 {
1360 if (result == nullptr)
1361 {
1362 lastterm->next =
1363 R->new_term(K->negate(lead->coeff), lead->monom, q);
1364 lastterm = lastterm->next;
1365 pivot = lastterm;
1366 result = q;
1367 }
1368 red->next = lead;
1369 red = red->next;
1370 continue;
1371 }
1372 else
1373 {
1374 ring_elem c = K->negate(lead->coeff);
1375 M->divide(lead->monom, q->syz->monom, REDUCE_mon);
1376 res2term *h = R->mult_by_term(q->syz->next, c, REDUCE_mon);
1377 lastterm->next = R->new_term(c, lead->monom, q);
1378 lastterm = lastterm->next;
1379 R->remove(lead);
1380 fb.add(h);
1382 count++;
1383 }
1384 }
1385 else
1386 {
1387 red->next = lead;
1388 red = red->next;
1389 }
1390 }
1391 red->next = nullptr;
1392 f = head.next;
1393 if (M2_gbTrace >= 4)
1394 {
1395 buffer o;
1396 o << count;
1397 emit_wrapped(o.str());
1398 }
1399 return result;
1400}
exponents::Exponents exponents_t
char * str()
Definition buffer.hpp:72
size_t exp_size
Definition res-a0.hpp:192
int total_reduce_count
Definition res-a0.hpp:184
size_t monom_size
Definition res-a0.hpp:193
res2_poly * R
Definition res-a0.hpp:123
const Monoid * M
Definition res-a0.hpp:124
int find_ring_divisor(const int *exp, ring_elem &result) const
Definition res-a0.cpp:1048
int find_divisor(const MonomialIdeal *mi, const int *exp, res2_pair *&result)
Definition res-a0.cpp:1060
const Ring * K
Definition res-a0.hpp:125
#define monomial
Definition gb-toric.cpp:11
VALGRIND_MAKE_MEM_DEFINED & result(result)
int M2_gbTrace
Definition m2-types.cpp:52
#define ALLOCATE_EXPONENTS(byte_len)
Definition monoid.hpp:62
#define ALLOCATE_MONOMIAL(byte_len)
Definition monoid.hpp:65
@ SYZ2_MAYBE_MINIMAL
@ SYZ2_S_PAIR
geobucket< const res2_poly, res2term * > respolyHeap
Definition res-a0.cpp:13
Nterm * next
Definition ringelem.hpp:157
int monom[1]
Definition ringelem.hpp:160
MonomialIdeal * mi
res2term * syz
unsigned char syz_type
res2term * next
res2_pair * comp
ring_elem coeff
int monom[1]
void emit_wrapped(const char *s)
Definition text-io.cpp:27

References geobucket< FREEMODULETYPE, VECTYPE >::add(), ALLOCATE_EXPONENTS, ALLOCATE_MONOMIAL, res2term::coeff, res2term::comp, emit_wrapped(), exp_size, find_divisor(), find_ring_divisor(), K, M, M2_gbTrace, res2_pair::mi, Nterm::monom, res2term::monom, monom_size, monomial, Nterm::next, res2term::next, R, geobucket< FREEMODULETYPE, VECTYPE >::remove_lead_term(), result(), buffer::str(), res2_pair::syz, SYZ2_MAYBE_MINIMAL, SYZ2_S_PAIR, res2_pair::syz_type, and total_reduce_count.

Referenced by handle_pair().