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

◆ reduce()

res_pair * res_comp::reduce ( resterm *& f,
resterm *& fsyz,
resterm *& pivot )
private

Definition at line 743 of file res-a1.cpp.

748{
749 // 'lastterm' is used to append the next monomial to fsyz->syz
752
753 resterm *lastterm = (fsyz->next == nullptr ? fsyz : fsyz->next);
754
755 res_pair *q;
756 ring_elem rg;
757 Bag *b;
758
759 while (f != nullptr)
760 {
761 M->divide(f->monom, f->comp->base_monom, REDUCE_mon);
762 M->to_expvector(REDUCE_mon, REDUCE_exp);
763 if (find_ring_divisor(REDUCE_exp, rg))
764 {
765 // Subtract off f, leave fsyz alone
766 Nterm *r = rg;
767 M->divide(f->monom, r->monom, REDUCE_mon);
768 R->ring_subtract_multiple_to(f, f->coeff, REDUCE_mon, f->comp, rg);
769 }
770 else if (f->comp->mi->search_expvector(REDUCE_exp, b))
771 {
772 q = reinterpret_cast<res_pair *>(b->basis_ptr());
773 lastterm->next = R->new_term(K->negate(f->coeff), f->monom, q);
774 lastterm = lastterm->next;
775 pivot = lastterm;
776 if (q->syz_type == SYZ_S_PAIR) return q; // i.e. not computed yet
777 M->divide(f->monom, q->syz->monom, REDUCE_mon);
778 R->subtract_multiple_to(f, f->coeff, REDUCE_mon, q->syz);
779 }
780 else
781 {
782 // level 1: monomial not seen yet
783 q = new_res_pair(SYZ_S_PAIR, f);
784 insert_res_pair(1, q);
785 lastterm->next = R->new_term(K->negate(f->coeff), f->monom, q);
786 lastterm = lastterm->next;
787 return q;
788 }
789 }
790 return nullptr;
791}
exponents::Exponents exponents_t
int search_expvector(const_exponents m, Bag *&b) const
Definition monideal.cpp:214
void * basis_ptr() const
Definition int-bag.hpp:67
size_t exp_size
Definition res-a1.hpp:114
const Monoid * M
Definition res-a1.hpp:80
res_poly * R
Definition res-a1.hpp:79
int find_ring_divisor(const_exponents exp, ring_elem &result) const
Definition res-a1.cpp:710
const Ring * K
Definition res-a1.hpp:81
res_pair * new_res_pair()
Definition res-a1.cpp:210
void insert_res_pair(int level, res_pair *p)
Definition res-a1.cpp:288
size_t monom_size
Definition res-a1.hpp:115
resterm * syz
MonomialIdeal * mi
int * base_monom
#define monomial
Definition gb-toric.cpp:11
int_bag Bag
Definition int-bag.hpp:70
#define ALLOCATE_EXPONENTS(byte_len)
Definition monoid.hpp:62
#define ALLOCATE_MONOMIAL(byte_len)
Definition monoid.hpp:65
@ SYZ_S_PAIR
int monom[1]
Definition ringelem.hpp:160
res_pair * comp
ring_elem coeff
int monom[1]
resterm * next

References ALLOCATE_EXPONENTS, ALLOCATE_MONOMIAL, res_pair::base_monom, int_bag::basis_ptr(), resterm::coeff, resterm::comp, exp_size, find_ring_divisor(), insert_res_pair(), K, M, res_pair::mi, Nterm::monom, resterm::monom, monom_size, monomial, new_res_pair(), resterm::next, R, MonomialIdeal::search_expvector(), res_pair::syz, SYZ_S_PAIR, and res_pair::syz_type.

Referenced by handle_pair().