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

◆ computeIdealQuotient()

component_index SchreyerFrame::computeIdealQuotient ( int lev,
component_index begin,
component_index elem )
private

std::cout << "computeIdealQuotient(" << lev << "," << begin << "," << elem << ")" << std::endl;

Definition at line 480 of file res-schreyer-frame.cpp.

483{
486 // Returns the number of elements added
487 res_packed_monomial m = monomial(lev, elem);
488 std::vector<PreElement*> elements;
489 if (ring().isSkewCommutative())
490 {
491 auto skewvars = new int[ring().monoid().n_vars()];
492 int a = ring().monoid().skew_vars(ring().skewInfo(), m, skewvars);
493 // std::cout << "adding " << a << " syz from skew" << std::endl;
494 for (int i = 0; i < a; ++i)
495 {
496 PreElement* vp = mPreElements.allocate();
497 vp->vp = mVarpowers.reserve(mMaxVPSize);
498 monoid().variable_as_vp(skewvars[i], vp->vp);
499 vp->degree = monoid().degree_of_vp(vp->vp);
500 int len = static_cast<int>(res_varpower_monomials::length(vp->vp));
501 mVarpowers.intern(len);
502
503 elements.push_back(vp);
504 }
505 delete[] skewvars;
506 }
507 for (component_index i = begin; i < elem; i++)
508 elements.push_back(createQuotientElement(monomial(lev, i), m));
509 typedef ResF4MonomialLookupTableT<int32_t> MonomialLookupTable;
510 MonomialLookupTable montab(monoid().n_vars());
511
512#if 0
513 std::cout << " #pre elements = " << elements.size() << std::endl;
514 for (auto i=elements.begin(); i != elements.end(); ++i)
515 {
516 varpower_monomials::elem_text_out(stdout, (*i)->vp);
517 fprintf(stdout, "\n");
518 }
519#endif
520 PreElementSorter C;
521 std::stable_sort(elements.begin(), elements.end(), C);
522
523 component_index n_elems = 0;
524 for (auto i = elements.begin(); i != elements.end(); ++i)
525 {
526 int32_t not_used;
527 bool inideal = montab.find_one_divisor_vp(0, (*i)->vp, not_used);
528 if (inideal) continue;
529 // Now we create a res_packed_monomial, and insert it into 'lev+1'
530 montab.insert_minimal_vp(0, (*i)->vp, 0);
531 res_packed_monomial monom =
532 monomialBlock().allocate(monoid().max_monomial_size());
533 monoid().from_varpower_monomial((*i)->vp, elem, monom);
534 // Now insert it into the frame
536 monom,
537 (*i)->degree + degree(currentLevel() - 1,
538 monoid().get_component(monom)));
539 n_elems++;
540 }
541 // std::cout << " returns " << n_elems << std::endl;
542 return n_elems;
543}
static void elem_text_out(buffer &o, ConstExponents m, bool p_one=true)
static const Exponent length(ConstExponents m)
T * allocate(int len=1)
int skew_vars(const SkewMultiplication *skew, res_const_packed_monomial m, int *skewvars) const
void from_varpower_monomial(res_const_varpower_monomial m, component_index comp, res_packed_monomial result) const
void variable_as_vp(int v, res_varpower_monomial result) const
int degree_of_vp(res_const_varpower_monomial a) const
const ResMonoid & monoid() const
int degree(int lev, component_index component) const
const ResMonoid & monoid() const
ResMemoryBlock< res_monomial_word > & monomialBlock()
ResMemoryBlock< PreElement > mPreElements
ResMemoryBlock< res_varpower_word > mVarpowers
SchreyerFrameTypes::PreElement PreElement
void insertBasic(int lev, res_packed_monomial monom, int degree)
const ResPolyRing & ring() const
PreElement * createQuotientElement(res_packed_monomial m1, res_packed_monomial m)
F4MonomialLookupTableT< int32_t > MonomialLookupTable
Definition f4-types.hpp:357
#define monomial
Definition gb-toric.cpp:11
myword component_index
res_monomial_word * res_packed_monomial
TermIterator< Nterm > begin(Nterm *ptr)
Definition ringelem.cpp:4

References ResMemoryBlock< T, NSLAB >::allocate(), begin(), createQuotientElement(), currentLevel(), degree(), SchreyerFrameTypes::PreElement::degree, ResMonoidDense::degree_of_vp(), ExponentList< long, false >::elem_text_out(), F4MonomialLookupTableT< Key >::find_one_divisor_vp(), ResMonoidDense::from_varpower_monomial(), F4MonomialLookupTableT< Key >::insert_minimal_vp(), insertBasic(), ExponentList< myword, false >::length(), mMaxVPSize, ResPolyRing::monoid(), monoid(), monomial, monomialBlock(), mPreElements, mVarpowers, ResMonoidDense::n_vars(), ring(), ResMonoidDense::skew_vars(), ResMonoidDense::variable_as_vp(), and SchreyerFrameTypes::PreElement::vp.

Referenced by computeNextLevel().