25 for (
int i = 1; i <
_nslots; i++) *me++ = *baseMonom++;
42 if (rk == 0)
return result;
46 for (i = 0; i < rk; i++)
49 if (v ==
nullptr || S ==
nullptr)
55 std::sort<int *>(tiebreaks, tiebreaks + rk);
56 for (i = 0; i < rk; i++) ties[tiebreaks[i] % rk] = i;
57 for (i = 0; i < rk; i++)
62 else if (S ==
nullptr)
83#warning "the logic in SchreyerOrder creation is WRONG!"
93 if (rk == 0)
return result;
98 for (i = 0; i < rk; i++)
101 if (v ==
nullptr || S ==
nullptr)
107 std::sort<int *>(tiebreaks, tiebreaks + rk);
108 for (i = 0; i < rk; i++) ties[tiebreaks[i] % rk] = i;
109 for (i = 0; i < rk; i++)
117#warning "Schreyer unencoded case not handled here"
137 if (
G ==
nullptr)
return false;
138 for (
int i = 0; i <
rank(); i++)
141 if (
M->compare(
base_monom(i),
G->base_monom(i)) != 0)
return false;
149 for (
int i = 0; i <
rank(); i++)
156 if (n < 0 || n >
rank())
158 ERROR(
"sub schreyer order: index out of bounds");
172 for (
unsigned int i = 0; i < a->len; i++)
173 if (a->array[i] >= 0 && a->array[i] <
rank())
177 ERROR(
"schreyer order subspace: index out of bounds");
186 for (
int i = 0; i <
G->rank(); i++)
187 append(
G->compare_num(i),
G->base_monom(i));
193 result->append_order(
this);
208 for (
int i = 0; i <
rank(); i++)
209 for (
int j = 0; j <
G->rank(); j++)
229 size_t p =
static_cast<size_t>(pp);
232 for (
size_t i = 0; i <
p; i++) a[i] = i;
239 for (
size_t r = 0; r <
p; r++)
280 for (
int i = lastn; i <
S->rank(); i++)
328 for (
int i = 0; i <
_rank; i++)
330 if (i != 0) o <<
' ';
344 for (
int i =
M->monomial_size(); i > 0; --i)
346 int cmp = *ms++ + *m++ - *ns++ - *n++;
347 if (cmp < 0)
return LT;
348 if (cmp > 0)
return GT;
351 if (cmp < 0)
return LT;
352 if (cmp > 0)
return GT;
361 int cmp =
M->compare(m, n);
362 if (cmp !=
EQ)
return cmp;
364 if (cmp < 0)
return LT;
365 if (cmp > 0)
return GT;
Older Schreyer-style kernel computation, predecessor of schreyer-resolution/.
const Ring * get_ring() const
const SchreyerOrder * get_schreyer_order() const
Engine-side free module R^n over a Ring.
const Ring * get_ring() const
const FreeModule * rows() const
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
virtual const Monoid * getMonoid() const
virtual const_monomial lead_flat_monomial(const ring_elem f) const =0
Abstract base for the engine's polynomial-ring hierarchy.
virtual const PolynomialRing * cast_to_PolynomialRing() const
void append_order(const SchreyerOrder *G)
void text_out(buffer &o) const
int schreyer_compare_encoded(const_monomial m, int m_comp, const_monomial n, int n_comp) const
bool is_equal(const SchreyerOrder *G) const
SchreyerOrder * exterior(int p) const
void append(int compare_num, const_monomial base_monom)
SchreyerOrder * symm(int n) const
SchreyerOrder * sub_space(int n) const
static SchreyerOrder * create(const Monoid *m)
SchreyerOrder(const Monoid *m)
int schreyer_compare(const_monomial m, int m_comp, const_monomial n, int n_comp) const
SchreyerOrder * direct_sum(const SchreyerOrder *G) const
SchreyerOrder * tensor(const SchreyerOrder *G) const
int compare_num(int i) const
const_monomial base_monom(int i) const
SchreyerOrder * copy() const
Per-component tie-breaker data for a Schreyer monomial order on a FreeModule.
static bool increment(size_t n, Subset &s)
std::vector< size_t > Subset
Subsets — combinatorial-number-system encoding of p-subsets of {0,...,n-1}.
static CanonicalForm base
void intern_SchreyerOrder(SchreyerOrder *G)
intern_* helpers that register long-lived engine objects with bdwgc finalisers.
const int * const_monomial
VALGRIND_MAKE_MEM_DEFINED & result(result)
Matrix — the engine's immutable homomorphism F -> G between free modules.
#define newarray_atomic(T, len)
PolynomialRing — abstract polynomial-ring base, the engine's most-reused class.
TermIterator< Nterm > end(Nterm *)
SchreyerOrder — per-basis-element data backing the Schreyer order on a free module.
const FreeModule * get_free_module() const
gc_vector< gbvector * > elems
gbvector-side matrix: a target FreeModule plus a list of gbvector* columns living in it.
SchreyerOrder_symm(const SchreyerOrder *S0, int n0)
void symm1(int lastn, int pow)
SchreyerOrder * symm1_result
Helper functor that builds the n-th symmetric power of a SchreyerOrder by walking multi-indices.