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

◆ reduce_heap_by_level()

res2_pair * res2_comp::reduce_heap_by_level ( res2term *& f,
res2term *& fsyz )
private

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

1555{
1556 // 'lastterm' is used to append the next monomial to fsyz->syz
1559
1560 res2term *lastterm = (fsyz->next == nullptr ? fsyz : fsyz->next);
1561 res2_pair *q;
1562 ring_elem rg;
1563 respolyHeap fb(R); // No bucket is needed for fsyz, since we
1564 // only append elements to the end of fsyz.
1565 fb.add(f);
1566 f = nullptr;
1567 res2term *lead;
1568
1569 int count = 0;
1570 if (M2_gbTrace >= 4) emit_wrapped(",");
1571
1572 while ((lead = fb.remove_lead_term()) != nullptr)
1573 {
1574 M->divide(lead->monom, lead->comp->syz->monom, REDUCE_mon);
1575 M->to_expvector(REDUCE_mon, REDUCE_exp);
1576 if (find_ring_divisor(REDUCE_exp, rg))
1577 {
1578 // Subtract off f, leave fsyz alone
1579 Nterm *r = rg;
1580 M->divide(lead->monom, r->monom, REDUCE_mon);
1581 ring_elem c = K->negate(lead->coeff);
1582 res2term *h =
1583 R->ring_mult_by_term(r->next, c, REDUCE_mon, lead->comp);
1584 R->remove(lead);
1585 K->remove(c);
1586 fb.add(h);
1588 count++;
1589 }
1590 else if (find_divisor(lead->comp->mi, REDUCE_exp, q))
1591 {
1592 ring_elem c = K->negate(lead->coeff);
1593 M->divide(lead->monom, q->syz->monom, REDUCE_mon);
1594 res2term *h = R->mult_by_term(q->pivot_term->next, c, REDUCE_mon);
1595 lastterm->next = R->new_term(c, lead->monom, q);
1596 lastterm = lastterm->next;
1597 R->remove(lead);
1598 fb.add(h);
1600 count++;
1601 }
1602 else
1603 {
1604 R->remove(lead);
1605 }
1606 }
1607 f = nullptr;
1608 if (M2_gbTrace >= 4)
1609 {
1610 buffer o;
1611 o << count;
1612 emit_wrapped(o.str());
1613 }
1614 return nullptr;
1615}
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 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
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
res2term * pivot_term
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, res2_pair::pivot_term, R, geobucket< FREEMODULETYPE, VECTYPE >::remove_lead_term(), buffer::str(), res2_pair::syz, and total_reduce_count.

Referenced by handle_pair_by_level().