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

◆ reduce4()

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

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

1411{
1412 // 'lastterm' is used to append the next monomial to fsyz->syz
1415
1416 res2term *lastterm = fsyz;
1417 while (lastterm->next != nullptr) lastterm = lastterm->next;
1418
1419 res2term head;
1420 res2term *red = &head;
1421 res2_pair *result = nullptr;
1422 res2_pair *q;
1423 ring_elem rg;
1424
1425 int count = total_reduce_count;
1426 if (M2_gbTrace >= 4) emit_wrapped(",");
1427
1428 while (f != nullptr)
1429 {
1430 res2term *lead = f;
1431 f = f->next;
1432 lead->next = nullptr;
1433 M->divide(lead->monom, lead->comp->syz->monom, REDUCE_mon);
1434 M->to_expvector(REDUCE_mon, REDUCE_exp);
1435 if (find_ring_divisor(REDUCE_exp, rg))
1436 {
1437 // Subtract off f, leave fsyz alone
1438 Nterm *r = rg;
1439 M->divide(lead->monom, r->monom, REDUCE_mon);
1440 ring_elem c = K->negate(lead->coeff);
1441 res2term *h =
1442 R->ring_mult_by_term(r->next, c, REDUCE_mon, lead->comp);
1443 R->remove(lead);
1444 K->remove(c);
1445 R->add_to(f, h);
1447 }
1448 else if (find_divisor(lead->comp->mi, REDUCE_exp, q))
1449 {
1450 if (q->degree == p->degree + 1)
1451 // if (q->syz_type == SYZ2_S_PAIR)
1452 {
1453 lastterm->next =
1454 R->new_term(K->negate(lead->coeff), lead->monom, q);
1455 lastterm = lastterm->next;
1456 if (result == nullptr && q->syz_type == SYZ2_S_PAIR)
1457 {
1458 // Only do this for the first non-computed pair
1459 // Question: do we really need to keep this information
1460 // around?
1461 pivot = lastterm;
1462 result = q;
1463 }
1464 red->next = lead;
1465 red = red->next;
1466 continue;
1467 }
1468 else
1469 {
1470 ring_elem c = K->negate(lead->coeff);
1471 M->divide(lead->monom, q->syz->monom, REDUCE_mon);
1472 res2term *h = R->mult_by_term(q->syz->next, c, REDUCE_mon);
1473 lastterm->next = R->new_term(c, lead->monom, q); // grabs 'c'.
1474 lastterm = lastterm->next;
1475 R->remove(lead);
1476 R->add_to(f, h);
1478 }
1479 }
1480 else
1481 {
1482 red->next = lead;
1483 red = red->next;
1484 }
1485 }
1486 red->next = nullptr;
1487 f = head.next;
1488 if (M2_gbTrace >= 4)
1489 {
1490 buffer o;
1491 o << (total_reduce_count - count);
1492 emit_wrapped(o.str());
1493 }
1494 return result;
1495}
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
int p
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_S_PAIR
Nterm * next
Definition ringelem.hpp:157
int monom[1]
Definition ringelem.hpp:160
unsigned short degree
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 ALLOCATE_EXPONENTS, ALLOCATE_MONOMIAL, res2term::coeff, res2term::comp, res2_pair::degree, 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, p, R, result(), buffer::str(), res2_pair::syz, SYZ2_S_PAIR, res2_pair::syz_type, and total_reduce_count.

Referenced by handle_pair_by_degree().