24 ERROR(
"internal error - ring is not a polynomial ring");
28 M =
GR->get_flattened_monoid();
29 K =
GR->get_flattened_coefficients();
57 monideals.push_back(
nullptr);
58 for (i = 0; i <
F->rank(); i++)
61 monideals.push_back(
p);
83 setup(Fsyz0, mi_stash0, gens0, lodegree, origsyz, level0, strat);
105 for (
int i = 0; i <
gb.size(); i++)
108 GR->gbvector_remove(g->
f);
109 GR->gbvector_remove(g->
fsyz);
123 result->degree =
M->primary_degree(lcm) +
F->primary_degree(
p->f->comp - 1);
130 result->lcm =
M->make_new(lcm);
140 result->degree =
M->primary_degree(lcm) +
F->primary_degree(
p->f->comp - 1);
147 result->lcm =
M->make_new(lcm);
158 const int *pivot_monom = pivot->
f->
monom;
167 while (
M->compare(
gb[j]->f->monom, pivot_monom) < 0);
172 while (
M->compare(
gb[i]->f->monom, pivot_monom) > 0);
206 GR->gbvector_get_lead_monomial(
F,
p->f, f_m);
207 if (
GR->is_skew_commutative())
210 M->to_expvector(f_m, find_pairs_exp);
212 for (
int v = 0; v <
GR->n_skew_commutative_vars(); v++)
214 int w =
GR->skew_variable(v);
215 if (find_pairs_exp[w] == 0)
continue;
218 M->from_expvector(find_pairs_exp, find_pairs_lcm);
222 M->to_varpower(find_pairs_lcm, vplcm);
224 elems.push_back(
new Bag(q, vplcm));
233 for (
int i = 0; i <
originalR->n_quotients(); i++)
236 M->lcm(f->
monom, f_m, find_pairs_lcm);
238 M->to_varpower(find_pairs_lcm, vplcm);
240 elems.push_back(
new Bag(q, vplcm));
248 M->from_varpower(a.monom().data(), find_pairs_m);
249 M->lcm(find_pairs_m, f_m, find_pairs_lcm);
251 M->to_varpower(find_pairs_lcm, vplcm);
254 reinterpret_cast<gb_elem *
>(a.basis_ptr()),
256 elems.push_back(
new Bag(q, vplcm));
261 M->to_varpower(f_m, vp);
269 for (
auto& b : rejects)
276 int is_ideal2 = (
F->rank() == 1 &&
orig_syz == 0);
285 if (
M->is_one(find_pairs_m))
306 M->remove(find_pairs_m);
316 GR->gbvector_get_lead_monomial(
F,
p->first->f,
s);
317 M->divide(
p->lcm,
s,
s);
319 GR->gbvector_mult_by_term(
320 F,
Fsyz,
GR->one(),
s,
p->first->f,
p->first->fsyz,
p->f,
p->fsyz);
322 GR->gbvector_reduce_lead_term(
323 F,
Fsyz,
nullptr,
p->f,
p->fsyz,
p->second->f,
p->second->fsyz);
345 GR->gbvector_text_out(o,
F, f);
351 GR->gbvector_get_lead_exponents(
F, f, div_totalexp);
353 originalR->get_quotient_monomials()->search_expvector(div_totalexp,
357 GR->gbvector_reduce_lead_term(
F,
Fsyz, head.
next, f, fsyz, g,
nullptr);
360 else if (monideals[f->
comp]->mi_search->search_expvector(div_totalexp, b))
363 GR->gbvector_reduce_lead_term(
370 GR->gbvector_text_out(o,
F, q->
f);
373 GR->gbvector_text_out(o,
F, f);
414 GR->gbvector_get_lead_exponents(
F, lead, div_totalexp);
416 originalR->get_quotient_monomials()->search_expvector(div_totalexp,
420 GR->reduce_lead_term_heap(
F,
431 else if (monideals[lead->
comp]->mi_search->search_expvector(div_totalexp,
435 GR->reduce_lead_term_heap(
436 F,
Fsyz, lead, div_totalexp, head.
next, fb, fsyzb, q->
f, q->
fsyz);
455 fsyz = fsyzb.
value();
472#warning " schreyer append: wrong if not encoded order"
479 GR->gbvector_multidegree(
F, f, d);
492 GR->gbvector_remove_content(
p->f, bull);
494 GR->gbvector_remove_content(
p->f,
p->fsyz);
499 o <<
"inserting level " <<
level <<
" ";
500 GR->gbvector_text_out(o,
F,
p->f);
505 GR->gbvector_get_lead_monomial(
F,
p->f, f_m);
510 M->to_varpower(f_m, vp);
511 monideals[
p->f->comp]->mi_search->insert(
new Bag(
p, vp));
524 GR->gbvector_auto_reduce(
F,
Fsyz,
gb[i]->f,
gb[i]->fsyz,
p->f,
p->fsyz);
539 if (
p ==
nullptr)
break;
551 slast->
next =
nullptr;
585 else if (fsyz !=
nullptr &&
syz !=
nullptr)
587 if (
syz->receive_generator(fsyz,
n_syz++,
GR->one()))
601 if (fsyz !=
nullptr)
GR->gbvector_remove(fsyz);
619 for (
int i = monideals.size(); i <= F->rank(); i++)
622 monideals.push_back(
p);
629 fsyz =
GR->gbvector_term(
634 if (fsyz !=
nullptr &&
syz !=
nullptr)
635 syz->receive_generator(fsyz,
n_syz++,
GR->one());
646 GR->gbvector_remove(fsyz);
647 GR->gbvector_remove_content(f,
nullptr);
712 hsyz =
syz->hilbertNumerator();
735 o <<
"<WARNING: remaining nsyz+ngb = " <<
n_gb_syz <<
">";
753 o <<
'[' <<
level <<
',' << npairs;
785 ret =
gens->calc_gb(deg);
812 ret =
gens->calc_gb(deg);
831 for (
int i = 0; i <
gb.size(); i++)
835 if (f ==
nullptr)
continue;
839 vec v =
originalR->translate_gbvector_to_vec(
F, f);
843 return result.to_matrix();
857 if (
hf ==
nullptr)
return nullptr;
870 for (
int i = 0; i <
gb.size(); i++)
878 return gens->get_matrix();
886 for (
int i = 0; i <
gb.size(); i++)
890 GR->gbvector_remove(tmp);
898 for (
int i = 0; i <
gb.size(); i++)
906 for (
int i = 0; i <
gb.size(); i++)
919 if (q ==
nullptr)
return;
921 if (q->
first !=
nullptr)
931 M->elem_text_out(o, q->
lcm);
943 for (
int i = 0; i <
gb.size(); i++)
945 nmonoms +=
GR->gbvector_n_terms(
gb[i]->f);
946 nchange +=
GR->gbvector_n_terms(
gb[i]->fsyz);
974 for (
int i = 0; i <
gb.size(); i++)
977 GR->gbvector_text_out(o,
F,
gb[i]->f);
989 for (
int i = 0; i <
gb.size(); i++)
991 nmonoms +=
GR->gbvector_n_terms(
gb[i]->f);
992 nchange +=
GR->gbvector_n_terms(
gb[i]->fsyz);
1023 o <<
"free module is ";
1026 for (
int i = 0; i <
gb.size(); i++)
1030 GR->gbvector_text_out(o,
F,
gb[i]->f);
exponents::Exponents exponents_t
const Ring * get_ring() const
Engine-side free module R^n over a Ring.
void set_column(int c, vec v)
Mutable builder used to assemble an immutable Matrix one column (or one term) at a time.
Engine-side monomial ideal: a decision tree of Nmi_nodes storing the (typically minimal) generators b...
Abstract base for the engine's polynomial-ring hierarchy.
virtual const PolynomialRing * cast_to_PolynomialRing() const
static RingElement * make_raw(const Ring *R, ring_elem f)
Front-end-visible "ring element" value: an engine ring_elem paired with the Ring* that gives it meani...
s_pair * new_ring_pair(gb_elem *p, const int *lcm)
void setup(FreeModule *Fsyz, stash *mi_stash, gb_node *gens, int lodegree, int origsyz, int level, int strategy)
Matrix * initial_matrix(int n)
gc_vector< int > total_pairs
void gb_insert(gbvector *f, gbvector *fsyz, int ismin)
enum ComputationStatusCode calc_gens(int deg)
enum ComputationStatusCode calc_gb(int deg)
void gb_sort(int lo, int hi)
void remove_pair(s_pair *&p)
Matrix * min_gens_matrix()
virtual void text_out(buffer &o) const
Matrix * make_lead_term_matrix()
void find_pairs(gb_elem *p)
void debug_out(s_pair *q) const
void gb_geo_reduce(gbvector *&f, gbvector *&fsyz)
void schreyer_append(gbvector *f)
gb2_comp(FreeModule *Fsyz, stash *mi_stash, gb_node *gens, int lodegree, int orig_syz, int level, int strategy)
virtual void set_output(gb_node *p)
void gb_reduce(gbvector *&f, gbvector *&fsyz)
const PolynomialRing * originalR
virtual RingElement * hilbertNumerator()
void compute_s_pair(s_pair *p)
int gb_sort_partition(int lo, int hi)
bool receive_generator(gbvector *f, int n, const ring_elem denom)
virtual void reduce(gbvector *&f, gbvector *&fsyz)
s_pair * new_s_pair(gb_elem *p, gb_elem *q, const int *lcm)
virtual const FreeModule * output_free_module() const =0
gbvector * remove_lead_term()
const gbvector * get_lead_term()
static int coeff_of(const RingElement *h, int deg)
static RingElement * hilbertNumerator(const Matrix *M)
GBComputation — abstract base of every Groebner-basis algorithm in the engine.
@ STRATEGY_LONGPOLYNOMIALS
void gb(IntermediateBasis &F, int n)
Hilbert-series numerator via the Bigatti-Caboara-Robbiano recursion.
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.
Engine-wide stylistic constants: LT / EQ / GT codes, INTSIZE, GEOHEAP_SIZE.
void emit_wrapped(const char *s)
void emit_line(const char *s)
Text-formatting helpers layered on buffer: bignum print, line wrapping, M2_gbTrace-gated emit.