11#define monomial monomial0
19 F(RR->make_FreeModule(1)),
29 for (i = 0; i <
nvars; i++)
30 degrees[i] = -
R->getMonoid()->primary_degree_of_var(i);
44 ERROR(
"MES: not implemented yet");
56 if (m ==
nullptr)
return;
124 for (
int i = 0; i <
nvars; i++)
125 if (m[i] > n[i])
return false;
133 for (
int i = 0; i <
nslots; i++)
146 for (
int i = 0; i <
nvars; i++)
result[i] = (m[i] > n[i] ? m[i] : n[i]);
154 for (
int i = 0; i <
nslots; i++)
result[i] = m[i] - n[i];
161 for (
int i = 0; i <
nslots; i++)
result[i] = m[i] + n[i];
169 for (
int i = 0; i <
nslots; i++)
result[i] = lcm[i] - a[i] + b[i];
175 for (
int i = 0; i <
nslots; i++) a[i] += -b[i] + c[i];
181 for (
int i = 0; i <
nvars; i++)
182 if (m[i] > 0 && n[i] > 0)
return false;
198 for (
int i = 0; i <
nvars; i++)
200 if (m[i] > 0 && n[i] > 0)
229 if (m[i] < n[i])
return GT;
230 if (m[i] > n[i])
return LT;
236 if (m[i] < n[i])
return GT;
237 if (m[i] > n[i])
return LT;
241 if (m[i] > n[i])
return LT;
242 if (m[i] < n[i])
return GT;
247 if (m[i] > n[i])
return GT;
248 if (m[i] < n[i])
return LT;
256 if (m[i] < n[i])
return GT;
257 if (m[i] > n[i])
return LT;
261 if (m[i] < n[i])
return GT;
262 if (m[i] > n[i])
return LT;
271 if (m[i] > n[i])
return LT;
272 if (m[i] < n[i])
return GT;
277 if (m[i] > n[i])
return GT;
278 if (m[i] < n[i])
return LT;
287 if (m ==
nullptr)
return;
289 for (i = 0; i < old_ring->
nvars; i++)
result[i] = m[i];
305 if (m ==
nullptr)
return nullptr;
307 R->getCoefficients(),
R->getCoefficients()->one(), m);
308 return R->make_vec(0, f);
315 R->subtract_vec_to(v1, v2);
321 bool include_tail =
false;
333 R->subtract_vec_to(v1, v2);
342 if (f ==
nullptr)
return false;
344 if (t ==
nullptr || t->
next ==
nullptr || t->
next->
next !=
nullptr)
return false;
359 for (
int i = 0; i <
nslots; i++)
365 for (; f !=
nullptr; f = f->next)
367 std::pair<bool, long> res =
globalZZ->coerceToLongInteger(f->coeff);
369 int e =
static_cast<int>(res.second);
374 result.tail[f->comp] = -e;
386 int cmp =
compare(f.lead, f.tail);
387 if (cmp ==
EQ)
return false;
402 for (
int i = 0; i <
nslots; i++) f.lead[i] += -g.lead[i] + g.tail[i];
411 for (
int i = 0; i <
nslots; i++)
421 if (m ==
nullptr)
return;
425 R->getMonoid()->from_varpower(vp.data(), n);
426 R->getMonoid()->elem_text_out(o, n);
427 R->getMonoid()->remove(n);
433 if (f.
tail ==
nullptr)
return;
457 thisdeg = thisdeg->next)
459 thislcm = thislcm->
next)
460 R->translate_monomial(old_ring, thislcm->lcm);
465 while (
p->pairs !=
nullptr)
468 p->pairs = thispair->
next;
471 R->remove_monomial(
p->lcm);
476 while (
p->pairs !=
nullptr)
479 p->pairs = thislcm->
next;
503 if (r->
next ==
nullptr || ((cmp =
R->compare(
s.lcm, r->
next->
lcm)) ==
GT))
515 R->remove_monomial(
s.lcm);
529 monomial lcm =
R->make_monomial(
R->lead_monomial(
p->f));
536 int deg =
R->degree(
s.lcm);
561 if (q->
next->
deg == deg)
break;
577 if (
_pairs->next ==
nullptr)
return false;
578 if (d !=
nullptr &&
_pairs->next->deg > *d)
return false;
582 result_deg = thisdeg->
deg;
591 if (thislcm->
pairs ==
nullptr)
597 thislcm->
lcm =
nullptr;
600 if (thisdeg->
pairs ==
nullptr)
614 if (
_pairs->next ==
nullptr)
return -1;
621 while (
p->next !=
nullptr &&
p->next->deg < d)
p =
p->next;
622 if (
p->next ==
nullptr ||
p->next->deg != d)
return 0;
623 return p->next->n_elems;
689 int deg =
R->degree(m);
691 for (
p = &head;
p->next !=
nullptr;
p =
p->next)
693 if (
R->graded_compare(m,
p->next->elem->f.lead) ==
LT)
break;
700 while (
p->next !=
nullptr)
702 if (
R->degree(
p->next->elem->f.lead) > deg &&
703 R->divides(m,
p->next->elem->f.lead))
724 unsigned int mask = ~(
R->mask(m));
725 int d =
R->degree(m);
728 if (
R->degree(
p->m) > d)
return nullptr;
729 if (mask &
p->mask)
continue;
730 if (
R->divides(
p->m, m))
return p;
739 for (
int i = 0; i <=
_max_degree; i++) deglist[i] =
nullptr;
747 int d =
R->degree(n);
748 nl->
next = deglist[d];
754 if (deglist[d] !=
nullptr)
757 while (deglist[d] !=
nullptr)
760 deglist[d] =
p->next;
763 R->remove_monomial(
p->m);
770 R->remove_monomial(
p->m);
777 p->next = currentresult;
783 else if (currentresult !=
nullptr)
788 q->
next = currentresult;
790 currentresult =
nullptr;
816 if (
R->gcd_is_one(
R->lead_monomial(f->
f),
R->lead_monomial(g->
f)))
826 if (!
R->gcd_is_one(f->
f.
tail, g->
f.
tail))
continue;
838 while (mm !=
nullptr)
840 R->remove_monomial(mm->
m);
866 unsigned int mask = ~(
R->mask(m));
867 int d =
R->degree(m);
870 if (
R->degree(
p->elem->f.lead) > d)
return nullptr;
871 if (mask &
p->mask)
continue;
872 if (
R->divides(
p->elem->f.lead, m))
return p->elem;
892 return R->normalize(f);
897 if (!
R->one_reduction_step(f,
p->f))
938 unsigned int nmasks = 1;
939 masks[0] =
first->mask;
944 for (
unsigned int i = 0; i < nmasks && !found; i++)
945 if (masks[i] ==
p->mask)
950 if (!found) masks[nmasks++] =
p->mask;
962 R->elem_text_out(o, g->
f);
975 unsigned int options)
999 int max_degree_limit)
1002 (void) use_max_degree_limit;
1003 (void) max_degree_limit;
1004 if (collect_syz || n_rows_to_keep > 0)
1006 ERROR(
"Groebner basis Algorithm=>Toric cannot keep syzygies");
1012 ERROR(
"expected polynomial ring");
1016 result->add_generators(m);
1026 for (i = 0; i < Gens.size(); i++)
freemem(Gens[i]);
1028 for (i = 0; i <
G.size(); i++)
freemem(
G[i]);
1030 for (i = 0; i < mingens.size(); i++) mingens[i] =
nullptr;
1031 for (i = 0; i < mingens_subring.size(); i++) mingens_subring[i] =
nullptr;
1049 for (i = 0; i < Gens.size(); i++)
1050 R->translate_binomial(old_ring, Gens[i]->f);
1051 for (i = 0; i <
G.size(); i++)
R->translate_binomial(old_ring,
G[i]->f);
1063 for (i = 0; i < m->
n_cols(); i++)
1065 f =
R->make_binomial();
1066 R->intvector_to_binomial((*m)[i], f);
1074 for (i = 0; i < m->
n_cols(); i++)
1076 f =
R->make_binomial();
1077 if (
R->vector_to_binomial((*m)[i], f))
1085 ERROR(
"expected binomials");
1098 bool ismin, subringmin;
1101 if (
s.f2 ==
nullptr)
1106 f =
R->copy_binomial(
1111 if (
s.f1->smaller !=
nullptr ||
s.f2->smaller !=
nullptr)
1113 if (
s.f1->smaller !=
s.f2 &&
s.f2->smaller !=
s.f1)
1123 R->elem_text_out(o,
s.f1->f);
1125 R->elem_text_out(o,
s.f2->f);
1129 if (!
R->calc_s_pair(
s, f))
1135 subringmin = (
R->weight(
s.lcm) > 0);
1138 if (
Gmin->reduce(f))
1143 o <<
" reduced to ";
1144 R->elem_text_out(o, f);
1147 subringmin = (subringmin &&
R->weight(f.
lead) == 0);
1150 Gmin->minimalize_and_insert(
p);
1151 if (ismin) mingens.push_back(
p);
1152 if (subringmin) mingens_subring.push_back(
p);
1156 R->remove_binomial(f);
1169 if (
stop_.always_stop)
return;
1170 if (
stop_.stop_after_degree) deg = &
stop_.degree_limit->array[0];
1182 if (
Pairs->n_elems() == 0)
1197 for (
int i = 0; i < mingens_subring.size(); i++)
1199 result.append(
R->binomial_to_vector(mingens_subring[i]->f));
1200 mingens_subring[i] =
nullptr;
1202 mingens_subring.clear();
1203 return result.to_matrix();
1210 if (
R->weight((*p)->f.lead) == 0)
1211 result.append(
R->binomial_to_vector((*p)->f));
1212 return result.to_matrix();
1218 ERROR(
"MES: not implemented yet");
1224 ERROR(
"MES: not implemented yet");
1231 for (
int i = 0; i < mingens.size(); i++)
1232 result.append(
R->binomial_to_vector(mingens[i]->f));
1233 return result.to_matrix();
1240 result.append(
R->binomial_to_vector((*p)->f, n));
1241 return result.to_matrix();
1248 result.append(
R->binomial_to_vector((*p)->f));
1249 return result.to_matrix();
1262 const Matrix **result_remainder,
1263 const Matrix **result_quotient)
1267 *result_remainder =
nullptr;
1268 *result_quotient =
nullptr;
1269 ERROR(
"rawGBMatrixLift not implemented for toric GB's");
1276 o <<
"binomial GB ";
1278 o <<
"homogeneous ";
1280 o <<
"inhomogeneous ";
1284 o <<
"--- pairs ----" <<
newline;
exponents::ConstExponents const_exponents
Dense exponent-vector template [e_0, ..., e_{nvars-1}] for monomial operations.
enum ComputationStatusCode set_status(enum ComputationStatusCode)
static void from_expvector(int n, exponents::ConstExponents a, Vector &result)
static HashExponent mask(int nvars, ConstExponents a)
const Ring * get_ring() const
Mutable builder used to assemble an immutable Matrix one column (or one term) at a time.
Abstract base for the engine's polynomial-ring hierarchy.
virtual bool is_ZZ() const
virtual const PolynomialRing * cast_to_PolynomialRing() const
bool gcd_is_one(monomial0 m, monomial0 n) const
void elem_text_out(buffer &o, const binomial &f) const
void set_weights(monomial0 m) const
monomial0 mult(monomial0 m, monomial0 n) const
bool vector_to_binomial(vec f, binomial &result) const
bool normalize(binomial &f) const
void remove_binomial(binomial &f) const
vec monomial_to_vector(monomial0 m) const
int degree(monomial0 m) const
unsigned int mask(const_exponents m) const
monomial0 make_monomial(const_exponents exp) const
bool calc_s_pair(binomial_s_pair &s, binomial &result) const
binomial make_binomial() const
monomial0 new_monomial() const
monomial0 quotient(monomial0 m, monomial0 n) const
void translate_binomial(const binomial_ring *old_ring, binomial &f) const
bool remove_content(binomial &f) const
monomial0 monomial_lcm(monomial0 m, monomial0 n) const
void intvector_to_binomial(vec f, binomial &result) const
monomial0 copy_monomial(monomial0 m) const
bool divides(monomial0 m, monomial0 n) const
void translate_monomial(const binomial_ring *old_ring, monomial0 &m) const
void remove_monomial(monomial0 &m) const
int weight(monomial0 m) const
monomial0 spair(monomial0 lcm, monomial0 m, monomial0 n) const
monomial0 divide(monomial0 m, monomial0 n) const
binomial copy_binomial(const binomial &f) const
void monomial_out(buffer &o, const_exponents m) const
int compare(monomial0 m, monomial0 n) const
vec binomial_to_vector(binomial f) const
int graded_compare(monomial0 m, monomial0 n) const
binomial_ring(const PolynomialRing *RR)
void spair_to(monomial0 a, monomial0 b, monomial0 c) const
bool one_reduction_step(binomial &f, binomial g) const
void insert_pair(s_pair_degree_list *q, binomial_s_pair &s)
void insert(binomial_gb_elem *p)
bool next(const int *d, binomial_s_pair &result, int &result_deg)
void remove_lcm_list(s_pair_lcm_list *p)
int lowest_degree() const
binomial_s_pair_set(const binomial_ring *R)
void remove_pair_list(s_pair_degree_list *p)
s_pair_degree_list * _pairs
void enlarge(const binomial_ring *R)
virtual const Matrix * get_initial(int nparts)
virtual const Matrix * get_syzygies()
virtual ~binomialGB_comp()
ComputationStatusCode gb_done() const
virtual const Matrix * get_mingens()
virtual const Matrix * matrix_remainder(const Matrix *m)
Matrix * reduce(const Matrix *m, Matrix *&lift)
binomial_s_pair_set * Pairs
virtual int contains(const Matrix *m)
virtual bool stop_conditions_ok()
void enlarge(const PolynomialRing *R, int *wts)
void process_pair(binomial_s_pair p)
static binomialGB_comp * create(const Matrix *m, M2_bool collect_syz, int n_rows_to_keep, M2_arrayint gb_weights, int strategy, M2_bool use_max_degree, int max_degree)
virtual M2_bool matrix_lift(const Matrix *m, const Matrix **result_remainder, const Matrix **result_quotient)
virtual const Matrix * get_gb()
virtual const Matrix * get_change()
binomialGB_comp(const PolynomialRing *R, int *wts, bool revlex, unsigned int options)
void add_generators(const Matrix *m)
void debug_display() const
binomialGB(const binomial_ring *R, bool bigcell, bool homogprime)
void remove_monomial_list(monomial_list *mm) const
bool reduce(binomial &f) const
void reduce_monomial(monomial0 m) const
monomial_list * find_divisor(monomial_list *I, monomial0 m) const
bool is_homogeneous_prime
monomial_list * ideal_quotient(monomial0 m) const
void minimalize_and_insert(binomial_gb_elem *f)
void enlarge(const binomial_ring *newR)
void make_new_pairs(binomial_s_pair_set *Pairs, binomial_gb_elem *f) const
#define GB_FLAG_IS_HOMOGENEOUS
#define GB_FLAG_IS_NONDEGENERATE
binomialGB_comp — Buchberger GB specialised to binomial / toric ideals.
static int compare(const vecterm *t, const vecterm *s)
bool system_interrupted()
system_interrupted() — thread-safe polling predicate for Ctrl+C handling.
VALGRIND_MAKE_MEM_DEFINED & result(result)
MatrixConstructor — the mutable builder that produces an immutable Matrix.
typename std::vector< T, gc_allocator< T > > gc_vector
a version of the STL vector, which allocates its backing memory with gc.
#define newarray_atomic(T, len)
Singly linked-list node carrying one term of a polynomial-ring element.
binomial_gb_elem * smaller
s_pair_degree_list * next
void emit_line(const char *s)
Text-formatting helpers layered on buffer: bignum print, line wrapping, M2_gbTrace-gated emit.