31 unsigned int hashval =
size();
35 if (
count >= 5)
break;
80 if (
p ==
nullptr)
return;
119 std::vector<std::pair<int, int>> degs_and_indices;
121 for (
auto& b : elems)
124 degs_and_indices.push_back(std::make_pair(deg,
count));
127 std::stable_sort(degs_and_indices.begin(), degs_and_indices.end());
129 for (
auto p : degs_and_indices)
131 Bag* b = elems[
p.second];
134 rejects.push_back(b);
156 std::vector<std::pair<int, int>> degs_and_indices;
158 for (
auto& b : elems)
161 degs_and_indices.push_back(std::make_pair(deg,
count));
164 std::stable_sort(degs_and_indices.begin(), degs_and_indices.end());
166 for (
auto p : degs_and_indices)
168 Bag* b = elems[
p.second];
190 for (
auto& b : *
this)
197 if (
this == &mi0)
return true;
198 if (
size() != mi0.
size())
return false;
202 while (i != sentinel)
210 GC_reachable_here(&mi0);
216 if (
mi ==
nullptr)
return 0;
226 if ((
p =
p->down()) ==
nullptr)
return 0;
230 if (
p->exp > exp[
p->var])
232 if ((
p =
p->header->down()) ==
nullptr)
return 0;
249 if (
mi ==
nullptr)
return;
259 if ((
p =
p->down()) ==
nullptr)
return;
263 if (
p->exp > exp[
p->var])
265 if ((
p =
p->header->down()) ==
nullptr)
return;
271 b.push_back(
p->baggage());
300 return reinterpret_cast<void *
>(
next(
reinterpret_cast<Nmi_node *
>(
p)));
318 return reinterpret_cast<void *
>(
prev(
reinterpret_cast<Nmi_node *
>(
p)));
329 int insert_var = i.var();
336 (*p)->header = (*p)->left = (*p)->right = *
p;
338 else if ((*p)->var < insert_var)
345 header_node->
left = header_node->
right = zero_node;
346 (*p)->
down() = zero_node;
348 zero_node->
right = header_node;
351 if ((*p)->var > insert_var)
353 insert_var = (*p)->var;
358 insert_exp = i.exponent();
364 if (q->
exp != insert_exp)
371 insert_var, insert_exp,
static_cast<Nmi_node*
>(
nullptr));
399 assert(
p !=
nullptr);
401 p->baggage() =
nullptr;
404 for (;
p !=
nullptr;)
406 p->left->right =
p->right;
407 p->right->left =
p->left;
409 p->left =
p->right =
nullptr;
416 if (
p !=
nullptr)
p->down() =
nullptr;
430 assert(dad !=
nullptr);
448 if (
p ==
nullptr)
mi =
nullptr;
454 if (
p ==
nullptr)
return 0;
469 assert(
p->left !=
nullptr);
470 assert(
p->right !=
nullptr);
471 assert(
p->left->right ==
p);
472 assert(
p->right->left ==
p);
475 for (i = 1; i <=
indent; i++) o <<
' ';
476 o <<
p->var <<
' ' <<
p->exp;
484 o <<
p->baggage()->basis_elem();
487 else if (
p ==
p->header)
534 assert(
p !=
nullptr);
536 if (up !=
nullptr) assert(
p->var < up->var);
537 assert(
p->header ==
p);
539 assert(
p->down() == up);
540 assert(
p->left !=
nullptr);
541 assert(
p->right !=
nullptr);
545 for (q =
p->left; q !=
p; q = q->
left)
547 assert(q->
left !=
nullptr);
548 assert(q->
right !=
nullptr);
552 assert(q->
var ==
p->var);
559 for (q =
p->right; q !=
p; q = q->
right)
571 assert(
mi ==
nullptr);
574 assert(
mi !=
nullptr);
580 if (
mi ==
nullptr)
return true;
601 for (
Nmi_node* q =
p->right; q !=
p; q = q->right)
604 if (q->left->right != q)
throw exc::engine_error(
"the double link list is inconsistent");
605 if (q->left !=
p and q->left->exp >= q->exp)
throw exc::engine_error(
"exponents are not increasing going to the right");
642 assert(P !=
nullptr);
652 std::cout <<
"bad news: count is not 1, but ideal is 1..." << std::endl;
679 new_elems.push_back(
new Bag(a));
688 new_elems.push_back(new_elem);
692 GC_reachable_here(&J);
704 new_elems.push_back(b);
718 new_elems.push_back(c);
722 GC_reachable_here(&J);
731 new_elems.push_back(
new Bag(a));
735 new_elems.push_back(
new Bag(a));
738 GC_reachable_here(&J);
750 if (!J.search(a.
monom().data(), c))
755 GC_reachable_here(&J);
767 new_elems.push_back(b);
799 GC_reachable_here(&J);
814 i.var(), top->array[i.var()] + 1 - i.exponent(), b->
monom());
823 for (
int i = 0; i <
result->len; i++)
result->array[i] = 0;
828 if (
result->array[j.var()] < j.exponent())
829 result->array[j.var()] = j.exponent();
861 new_elems.push_back(b);
895 GC_reachable_here(&J);
910 new_elems.push_back(b);
929 for (
int i = 0; i <= a; i++)
962 for (
int j =
get_ring()->n_vars() - 1; j >= 1; j--)
970 if (!isthere)
return 0;
979 if (
size() != 1)
return false;
varpower::ConstExponents const_varpower
ExponentListIterator< int, true > index_varpower
Variable-length sparse (variable, exponent) encoding of monomials.
exponents::ConstExponents const_exponents
exponents::Exponents exponents_t
Dense exponent-vector template [e_0, ..., e_{nvars-1}] for monomial operations.
static void radical(ConstExponents a, Vector &result)
static HashExponent computeHashValue(ConstExponents vp)
static void one(Vector &result)
static void lcm(ConstExponents a, ConstExponents b, Vector &result)
static void mult(ConstExponents a, ConstExponents b, Vector &result)
static void quotient(ConstExponents a, ConstExponents b, Vector &result)
static void from_expvector(int n, exponents::ConstExponents a, Vector &result)
static Exponent simple_degree(ConstExponents m)
static void elem_text_out(buffer &o, ConstExponents m, bool p_one=true)
static void erase(ConstExponents a, ConstExponents b, Vector &result)
static bool is_pure_power(ConstExponents a, Exponent &v, Exponent &e)
static bool is_equal(ConstExponents a, ConstExponents b)
static void to_expvector(int n, ConstExponents a, exponents::Exponents result)
static void var(Exponent v, Exponent e, Vector &result)
void elem_text_out(buffer &o, const_monomial m, bool p_one=true) const
void from_varpower(const_varpower vp, monomial result) const
monomial make_one() const
void remove(monomial d) const
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Bidirectional forward iterator over the Bags stored in a MonomialIdeal.
int search(const_varpower m, Bag *&b) const
Nmi_node * next(Nmi_node *p) const
void do_node(Nmi_node *p, int indent, int disp) const
virtual unsigned int computeHashValue() const
MonomialIdeal * erase(const_varpower m) const
int search_expvector(const_exponents m, Bag *&b) const
void insert_minimal(Bag *b)
bool is_equal(const MonomialIdeal &mi) const
MonomialIdeal * operator+(const MonomialIdeal &F) const
void debug_out(int disp=1) const
int n_pure_powers() const
Nmi_node * new_leaf_mi_node(int v, int e, Bag *b)
MonomialIdeal * quotient(const_varpower m) const
int debug_check(Nmi_node *p, const Nmi_node *up) const
void delete_mi_node(Nmi_node *p)
MonomialIdeal(const PolynomialRing *RR, stash *mi_stash=nullptr)
MonomialIdeal * sat(const MonomialIdeal &J) const
MonomialIdeal * operator*(const MonomialIdeal &G) const
void find_all_divisors(const_exponents exp, VECTOR(Bag *)&b) const
void text_out(buffer &o) const
Nmi_node * first_node() const
MonomialIdeal * copy() const
void remove_MonomialIdeal()
void do_tree(Nmi_node *p, int depth, int indent, int disp) const
void insert1(Nmi_node *&p, Bag *b)
MonomialIdeal * intersect(const_varpower m) const
bool isWellFormed() const
MonomialIdeal * operator-(const MonomialIdeal &F) const
MonomialIdeal * borel() const
const_varpower second_elem() const
Nmi_node * new_internal_mi_node(int v, int e, Nmi_node *d)
MonomialIdeal * alexander_dual(const M2_arrayint a) const
const PolynomialRing * get_ring() const
MonomialIdeal * radical() const
Nmi_node * prev(Nmi_node *p) const
void remove1(Nmi_node *p)
const_varpower first_elem() const
Engine-side monomial ideal: a decision tree of Nmi_nodes storing the (typically minimal) generators b...
enum Nmi_node::@355074146072071371146336002330246050056154227161 tag
gc_vector< int > & monom()
void insert_to_left(Nmi_node *q)
Internal tree node of the MonomialIdeal decision tree.
virtual const Monoid * getMonoid() const
virtual const PolynomialRing * cast_to_PolynomialRing() const
Abstract base for the engine's polynomial-ring hierarchy.
gc_vector< int > & monom()
Debugger-callable d* helpers that pretty-print engine values to stderr.
VALGRIND_MAKE_MEM_DEFINED & result(result)
M2_arrayint M2_makearrayint(int n)
static void borel1(VECTOR(Bag *) &result, exponents_t m, int loc, int nvars)
static MonomialIdeal * varpower_monideal(const PolynomialRing *R, const M2_arrayint top, const_varpower vp)
MonomialIdeal — exponent-vector-only representation of an ideal generated by monomials.
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
#define newarray_atomic(T, len)
#define ARRAY_ON_STACK(type, nelems)
ARRAY_ON_STACK.
void emit_line(const char *s)
Text-formatting helpers layered on buffer: bignum print, line wrapping, M2_gbTrace-gated emit.