40 for (
int i = 0; i < cols0->
rank(); i++)
mEntries.push_back(entries0[i]);
45 unsigned int hashval = 234123 + (7 *
n_rows() + 157 *
n_cols());
48 for (
int c = 0; c <
n_cols(); c++)
53 hashval = 34224 * hashval +
get_ring()->computeHashValue(i.
entry());
54 if (++count > 2)
break;
62 const engine_RawRingElementArray M)
70 for (
unsigned int i = 0; i < M->len; i++)
72 if (R != M->array[i]->get_ring())
74 ERROR(
"expected vectors in the same ring");
82 unsigned int next = 0;
83 for (
int r = 0; r < target->
rank(); r++)
84 for (
int c = 0; c < ncols && next < M->len; c++)
86 mat.
set_entry(r, c, M->array[next]->get_value());
96 const engine_RawRingElementArray M)
102 ERROR(
"expected free modules over the same ring");
105 if (D->n_vars() !=
static_cast<int>(deg->len))
107 ERROR(
"expected degree of matrix to have %d entries", D->n_vars());
113 for (
unsigned int i = 0; i < M->len; i++)
115 if (R != M->array[i]->get_ring())
117 ERROR(
"expected vectors in the same ring");
124 D->from_expvector(deg->array, degshift);
129 unsigned int next = 0;
130 for (
int r = 0; r < target->
rank(); r++)
132 for (
int c = 0; c < source->
rank(); c++)
134 mat.
set_entry(r, c, M->array[next]->get_value());
136 if (next >= M->len)
break;
148 const engine_RawRingElementArray entries)
153 for (
unsigned int i = 0; i < entries->len; i++)
155 if (R != entries->array[i]->get_ring())
157 ERROR(
"expected vectors in the same ring");
161 if (
rows->len !=
cols->len ||
rows->len != entries->len)
163 ERROR(
"sparse matrix creation: encountered different length arrays");
166 for (
int x = 0;
x < entries->len;
x++)
168 int r =
rows->array[
x];
169 int c =
cols->array[
x];
170 if (r < 0 || r >= target->
rank())
172 ERROR(
"sparse matrix creation: row index out of range");
175 if (c < 0 || c >= ncols)
177 ERROR(
"sparse matrix creation: column index out of range");
182 for (
int x = 0;
x < entries->len;
x++)
184 int r =
rows->array[
x];
185 int c =
cols->array[
x];
186 mat.
set_entry(r, c, entries->array[
x]->get_value());
196 const engine_RawRingElementArray entries)
211 const engine_RawRingElementArray entries)
214#warning "check that all rings are correct, give error otherwise"
219 D->from_expvector(deg->array, degshift);
234 ERROR(
"wrong number of rows or columns");
239 if (deg->len != D->n_vars())
241 ERROR(
"degree for matrix has the wrong length");
246 if (R != Rtarget || Rtarget != Rsource)
248 ERROR(
"expected same ring");
253 D->from_expvector(deg->array, degshift);
255 for (
int i = 0; i < source->
rank(); i++)
264 ERROR(
"wrong number of rows");
270 ERROR(
"expected same ring");
275 for (
int i = 0; i <
n_cols(); i++)
286 ERROR(
"expected a matrix over a polynomial ring");
315 if (
this == &m)
return true;
316 if (
hash() != m.
hash())
return false;
317 if (R != m.
get_ring())
return false;
320 for (
int i = 0; i <
n_cols(); i++)
321 if (!R->is_equal(
elem(i), m.
elem(i)))
return false;
327 for (
int i = 0; i <
n_cols(); i++)
328 if (
elem(i) !=
nullptr)
return false;
335 auto D = R->degree_monoid();
336 if (!R->is_graded())
return 0;
338 for (
int i = 0; i <
n_cols(); i++)
340 if (
elem(i) ==
nullptr)
continue;
341 if (!R->vec_is_homogeneous(
rows(),
elem(i)))
347 R->vec_multi_degree(
rows(),
elem(i), d);
349 if (0 != D->compare(d,
cols()->degree(i)))
363 for (
int i = 0; i <
n_cols(); i++)
373 ERROR(
"free modules have different base rings");
394 ERROR(
"matrices have different base rings");
399 ERROR(
"matrices have different shapes");
411 auto D = R->degree_monoid();
418 for (
int i = 0; i <
n_cols(); i++)
420 vec v = R->copy_vec(
elem(i));
421 vec w = R->copy_vec(m[i]);
433 ERROR(
"matrices have different base rings");
438 ERROR(
"matrices have different shapes");
450 auto D = R->degree_monoid();
457 for (
int i = 0; i <
n_cols(); i++)
465 for (
int i = 0; i <
n_cols(); i++)
474 if (F ==
nullptr ||
G ==
nullptr)
return nullptr;
478 for (
int i = 0; i <
n_rows(); i++)
484 for (
int i = 0; i < r->len; i++)
485 if (r->array[i] >= 0 && r->array[i] <
n_rows())
487 minrow[r->array[i]] = std::min(minrow[r->array[i]], i);
488 maxrow[r->array[i]] = std::max(maxrow[r->array[i]], i);
492 for (
size_t j = 0; j < c->len; j++)
494 vec v =
elem(c->array[j]);
495 for (; v !=
nullptr; v = v->next)
496 for (
int i = minrow[v->comp]; i <= maxrow[v->comp]; i++)
497 if (v->comp == r->array[i])
508 if (
G ==
nullptr)
return nullptr;
511 for (
unsigned int i = 0; i < c->len; i++)
523 ERROR(
"reshape: expected same ring");
528 ERROR(
"reshape: ranks of the free modules are incorrect");
534 for (
int c = 0; c <
n_cols(); c++)
538 int loc = c *
n_rows() +
p->comp;
539 int result_col = loc / F->rank();
540 int result_row = loc % F->rank();
542 mat.
set_entry(result_row, result_col,
p->coeff);
550 if (R !=
G->get_ring())
552 ERROR(
"flip: expected same ring");
560 for (
int f = 0; f < F->
rank(); f++)
561 for (
int g = 0; g <
G->rank(); g++)
577 for (
int c = 0; c <
n_cols(); c++)
591 auto D = R->degree_monoid();
593 if (!R->is_zero(r)) R->multi_degree(r, deg);
596 for (
int i = 0; i <
n_cols(); i++)
598 vec w = R->copy_vec(
elem(i));
599 R->mult_vec_to(w, r, opposite_mult);
610 ERROR(
"concat: different base rings");
615 ERROR(
"concat: matrices have different numbers of rows");
624 for (i = 0; i < m.
n_cols(); i++)
634 ERROR(
"concat: different base rings");
654 for (i = 0; i < m->
n_cols(); i++)
664 ERROR(
"matrix mult: different base rings");
669 ERROR(
"matrix mult: matrix sizes don't match");
681 for (
int i = 0; i < m->
n_cols(); i++)
691 ERROR(
"module tensor: different base rings");
697 G->direct_sum_to(G1);
704 for (i = 0; i <
n_rows(); i++)
705 for (j = 0; j < m->
n_cols(); j++)
708 for (i = 0; i < m->
n_rows(); i++)
709 for (j = 0; j <
n_cols(); j++)
721 bool doing_fraction =
false;
734 doing_fraction =
true;
735 threshold =
static_cast<int>(density * 10000);
738 if (special_type == 0)
740 for (
int i = 0; i < c; i++)
741 for (
int j = 0; j < r; j++)
746 if (u > threshold)
continue;
756 else if (special_type == 1)
758 for (
int i = 0; i < c; i++)
760 int top = (i >= r ? r : i);
761 for (
int j = 0; j < top; j++)
766 if (u > threshold)
continue;
785 ERROR(
"matrix tensor: different base rings");
792 auto D = R->degree_monoid();
799 for (i = 0; i <
n_cols(); i++)
800 for (j = 0; j < m->
n_cols(); j++)
810 ERROR(
"expected a polynomial ring");
815 ERROR(
"matrix diff: different base rings");
832 for (i = 0; i <
n_cols(); i++)
833 for (j = 0; j < m->
n_cols(); j++)
848 for (
int i = 0; i <
n_cols(); i++)
931 for (
int i = 0; i < R->
n_vars(); i++) exp[i] = exp2[i] = 0;
932 for (
int j = 0; j <
n_cols(); j++)
933 for (vec v =
elem(j); v !=
nullptr; v = v->next)
937 for (
int k = 0; k < n; k++)
938 if (exp2[k] != 0 && exp[k] == 0)
941 if (++nsupp == n)
goto out;
947 for (
int i = 0; i < n; i++)
948 if (exp[i] > 0)
result->array[next++] = i;
960 std::vector<int> exp,exp2;
961 for (
int i = 0; i < n; i++)
963 for (
int j = 0; j <
n_cols() && nsupp < n; j++)
964 for (vec v =
elem(j); v !=
nullptr && nsupp < n; v = v->next)
966 auto f = Q->
toPoly(v->coeff);
967 for (
auto t = f->cbegin(); t != f->cend(); ++t)
970 for (
int k = 0; k < exp2.size(); k++)
972 if (exp[exp2[k]] == 0)
975 if (++nsupp == n)
break;
983 for (
int i = 0; i < n; i++)
984 if (exp[i] > 0)
result->array[next++] = i;
990 ERROR(
"expected a polynomial ring");
999 ERROR(
"expected polynomial ring");
1004 for (
int i = 0; i <
n_cols(); i++)
1015 if (var < R->n_vars())
1018 b = R->
power(a, exp);
1029 return result.to_matrix();
1038 ERROR(
"expected polynomial ring");
1042 for (
int i = 0; i <
n_cols(); i++)
1053 ERROR(
"expected polynomial ring");
1057 for (
int i = 0; i <
n_cols(); i++)
1067 ERROR(
"expected polynomial ring");
1072 for (
int i = 0; i <
n_cols(); i++)
1074 if (
elem(i) !=
nullptr)
1078 if (maxd >= 0 && lo > maxd) lo = maxd;
1079 if (lo > maxdivided) maxdivided = lo;
1091 ERROR(
"expected a matrix with one row");
1103 for (
int c = 0; c <
G->rank(); c++)
1106 int negate = ((
p % 2) != 0);
1107 for (
int r =
p - 1; r >= 0; r--)
1128 ERROR(
"expected polynomial ring");
1134 for (
int i = 0; i < A->
n_cols(); i++)
1137 if (v ==
nullptr)
continue;
1140 new_elems.push_back(b);
1150 for (
int i = 0; i < n; i++)
1152 int e = a[i] - b[i];
1153 if (e < 0)
return 0;
1159 if (sign == 0)
return 1;
1175 ERROR(
"expected polynomial ring");
1187 for (
int j = 0; j < nskew; j++) skew_list[j] = j;
1196 for (
int i = 0; i < ncols; i++)
1198 if (c->
elem(i) ==
nullptr)
continue;
1203 for (
int j = 0; j < divisors.size(); j++)
1205 int rownum = divisors[j]->basis_elem();
1209 int sign = skew.
mult_sign(result_exp, bexp);
1232 if (P ==
nullptr)
return nullptr;
1245 for (
int i = 0; i < ncols; i++)
1247 if (c->
elem(i) ==
nullptr)
continue;
1250 for (
int j = 0; j < nrows; j++)
1252 if (r->
elem(j) ==
nullptr)
continue;
1255 int sign =
signdivide(nvars, aexp, bexp, result_exp);
1284 if (
p == 0 || q == 0)
1286 for (
int i = 0; i <
G->rank(); i++) mat.
set_entry(i, i, R->
one());
1296 for (
int i = 0; i < Fp->
rank(); i++)
1299 for (
int j = 0; j < Fq->
rank(); j++)
1309 int row =
static_cast<int>(C.
encode(c));
1325 for (
int c = 0; c < ncols; c++)
1328 for (r = 0; r < nrows; r++)
1331 R->elem_text_out(
p[r], f);
1333 if (
p[r].size() > maxcount) maxcount =
p[r].size();
1335 for (r = 0; r < nrows; r++)
1336 for (
int k = maxcount + 1 -
p[r].size(); k > 0; k--)
p[r] <<
' ';
1338 for (r = 0; r < nrows; r++)
1341 char *
s =
p[r].str();
1350 for (
int i = 0; i <
n_cols(); i++)
1352 return result.to_matrix();
1442 for (
int i = 0; i <
n_cols(); i++)
1445 if (f ==
nullptr)
continue;
1447 for (
int j = i + 1; j <
n_cols(); j++)
1450 if (g ==
nullptr)
continue;
1451 if (R->vec_is_scalar_multiple(f, g))
1457 if (keep)
result.append(R->copy_vec(f));
1459 return result.to_matrix();
1469 for (
int i = 0; i <
n_cols(); i++)
1471 vec f = R->vec_remove_monomial_factors(
elem(i), make_squarefree_only);
1474 return result.to_matrix();
1596 if (Q ==
nullptr)
return;
1600 for (
int c = 0; c < M->
n_cols(); c++)
1603 for (; v !=
nullptr; v = v->next)
1606 auto f = Q->
toPoly(v->coeff);
1607 for (
auto i = f->cbegin(); i != f->cend(); ++i)
1608 H.
insert(i.monom(), comp);
1620 ERROR(
"expected NC polynomial algebra");
1625 for (
auto i = H.
begin(); i != H.
end(); ++i)
1628 vec v = Q->
make_vec(i->component(), rf);
1636 return result->sub_matrix(perm);
1644 ERROR(
"expected NC polynomial algebra");
1651 for (
int c = 0; c < M->
n_cols(); c++)
1654 for (; v !=
nullptr; v = v->next)
1657 auto f = Q->
toPoly(v->coeff);
1658 for (
auto i = f->cbegin(); i != f->cend(); ++i)
1678 ERROR(
"expected NC polynomial algebra");
1679 return {
nullptr,
nullptr};
1689 return {
nullptr,
nullptr};
1711 ERROR(
"expected polynomial ring");
1731 for (
unsigned int i = 0; i < vars->len; i++)
1732 if (vars->array[i] < 0 || vars->array[i] >= nvars)
1734 ERROR(
"expected a list of indices of indeterminates");
1745 for (
int c = 0; c <
n_cols(); c++)
1748 for (; v !=
nullptr; v = v->next)
1750 for (
Nterm& t : v->coeff)
1754 for (
unsigned int i = 0; i < vars->len; i++)
1755 exp1[i] = exp[vars->array[i]];
1756 exp1[vars->len] = v->comp;
1765 for (
int i = 0; i < nvars; i++) exp[i] = 0;
1766 for (
int i = 0; monoms[i] !=
nullptr; i += 2)
1769 for (
unsigned int j = 0; j < vars->len; j++)
1770 exp[vars->array[j]] = exp1[j];
1771 int x = exp1[vars->len];
1785 return result->sub_matrix(perm);
1798 for (
int j = 0; j < vars->len; j++)
1800 int v = vars->array[j];
1804 result[vars->len] = comp;
1813#warning "coeffs_of_vec should maybe be in PolynomialRing"
1816 if (f ==
nullptr)
return nullptr;
1818 if (P ==
nullptr)
return nullptr;
1828 for (vec g = f; g !=
nullptr; g = g->next)
1853 const Matrix *monoms)
const
1870 ERROR(
"expected matrices with the same number of rows");
1873 for (
unsigned int i = 0; i < vars->len; i++)
1874 if (vars->array[i] < 0 || vars->array[i] >= nvars)
1876 ERROR(
"coeffs: expected a set of variable indices");
1889 vec v = monoms->
elem(i);
1892 ERROR(
"expected non-zero column");
1909 for (
int i = 0; i <
n_cols(); i++)
1921 ERROR(
"expected polynomial ring");
1927 bool use_only_monomials_with_unit_coeffs)
const
1932 ERROR(
"expected polynomial ring");
1936 use_only_monomials_with_unit_coeffs);
1939 for (
int i = 0; i <
n_cols(); i++)
1942 if (v ==
nullptr)
continue;
1944 if (w->
comp != n)
continue;
1949 new_elems.push_back(b);
1959 new_elems.push_back(b);
1965 for (
int i = 0; i < M->
n_vars(); i++)
1970 new_elems.push_back(b);
1982 bool is_ZZ = K->
is_ZZ();
1983 int base = (is_ZZ ? 1 : 0);
1988 for (
int i = 0; i <
n_rows(); i++)
2003 for (i = 0; i <
n_rows(); i++) dims[i] =
base;
2004 for (j = 0; j <
n_cols(); j++)
2007 if (f ==
nullptr)
continue;
2008 if (dims[f->comp] == -1)
continue;
2014 for (i = 0; i <
n_rows(); i++)
2029 for (
int i = 0; i <
n_cols(); i++)
2038 for (
int i = 0; i <
n_cols(); i++)
2054 for (
int i = 0; i <
n_cols(); i++)
2069 for (
int i = 0; i <
n_cols(); i++)
2079 ERROR(
"expected ring over an RR or CC");
2083 mpfr_init2(nm, mpfr_get_prec(
p));
2084 mpfr_ui_div(nm, 1,
p, MPFR_RNDN);
2085 if (!mpfr_zero_p(nm))
2087 ERROR(
"Lp norm only implemented for p = infinity");
static const int nelements
exponents::ConstExponents const_exponents
exponents::Exponents exponents_t
Dense exponent-vector template [e_0, ..., e_{nvars-1}] for monomial operations.
Ring-shaped wrapper that exposes a non-commutative FreeAlgebra to the rest of the engine.
AssociatedPrimes — codimension and minimal-codimension associated primes of a monomial ideal.
unsigned int hash() const
static void var(Exponent v, Exponent e, Vector &result)
static void divide(int nvars, ConstExponents a, ConstExponents b, Exponents result)
const FreeMonoid & monoid() const
FreeModule * tensor(const FreeModule *G) const
const Ring * get_ring() const
FreeModule * exterior(int p) const
Engine-side free module R^n over a Ring.
void support(const Monom &m, std::vector< int > &result) const
bool insert(Monom m, int comp)
std::pair< int, bool > find(Monom m, int comp)
auto begin() const -> decltype(mElements.begin())
auto end() const -> decltype(mElements.end())
virtual ring_elem from_coefficient(const ring_elem a) const =0
const Poly * toPoly(const ring_elem f) const
virtual int n_vars() const =0
ring_elem fromModuleMonom(const ModuleMonom &m) const
virtual const FreeAlgebra & freeAlgebra() const =0
Abstract Ring subclass that lifts either a FreeAlgebra or a FreeAlgebraQuotient into the engine's Rin...
Reseatable iterator over the non-zero entries of one column of the matrix.
static const Matrix * make_sparse(const FreeModule *target, int ncols, M2_arrayint rows, M2_arrayint cols, const engine_RawRingElementArray entries)
const_monomial degree_shift() const
static Matrix * flip(const FreeModule *G, const FreeModule *H)
Matrix * concat(const Matrix &m) const
const Ring * get_ring() const
ring_elem elem(int i, int j) const
Matrix * mult(const Matrix *m, bool opposite_mult) const
Matrix * remove_monomial_factors(bool make_squarefree_only) const
Matrix * top_coefficients(Matrix *&monoms) const
Matrix * clean(gmp_RR epsilon) const
gc_vector< vec > mEntries
static Matrix * wedge_product(int p, int q, const FreeModule *F)
static Matrix * identity(const FreeModule *F)
static const Matrix * make(const FreeModule *target, int ncols, const engine_RawRingElementArray M)
M2_arrayintOrNull support() const
Matrix * operator-() const
const Matrix * remake(const FreeModule *target, const FreeModule *source, M2_arrayint deg) const
const Matrix * remove_content() const
friend class MatrixConstructor
Matrix * module_tensor(const Matrix *m) const
Matrix * monomials(M2_arrayint vars) const
Matrix(const FreeModule *rows, const FreeModule *cols, const_monomial degree_shift, VECTOR(vec) &entries)
M2_arrayint elim_keep(int nparts) const
virtual unsigned int computeHashValue() const
static Matrix * zero(const FreeModule *F, const FreeModule *G)
bool is_homogeneous() const
const Matrix * split_off_content(const Matrix *&result) const
static Matrix * koszul_monomials(int nskew, const Matrix *rows, const Matrix *cols)
static Matrix * random(const Ring *R, int r, int c)
Matrix * homogenize(int v, const std::vector< int > &wts) const
MonomialIdeal * make_monideal(int n, bool use_only_monomials_with_unit_coeffs=false) const
Matrix * operator+(const Matrix &m) const
const FreeModule * rows() const
Matrix * diff(const Matrix *m, int use_coef) const
Matrix * lead_term(int n=-1) const
void text_out(buffer &o) const
Matrix * transpose() const
const FreeModule * cols() const
Matrix * koszul(int p) const
Matrix * tensor(const Matrix *m) const
Matrix * compress() const
Matrix * divide_by_var(int n, int maxd, int &maxdivided) const
bool is_equal(const Matrix &m) const
M2_arrayint elim_vars(int nparts) const
Matrix * reshape(const FreeModule *G, const FreeModule *H) const
const Matrix * content() const
Matrix * direct_sum(const Matrix *m) const
Matrix * scalar_mult(const ring_elem r, bool opposite_mult) const
Matrix * remove_scalar_multiples() const
Matrix * coeffs(M2_arrayint vars, const Matrix *monoms) const
gmp_RRorNull norm(gmp_RR p) const
Matrix * sub_matrix(M2_arrayint r, M2_arrayint c) const
static bool make_sparse_vecs(MatrixConstructor &mat, const FreeModule *target, int ncols, M2_arrayint rows, M2_arrayint cols, const engine_RawRingElementArray entries)
void compute_column_degrees()
void set_entry(int r, int c, ring_elem a)
void set_column(int c, vec v)
Mutable builder used to assemble an immutable Matrix one column (or one term) at a time.
Current IntsSet configuration: exposes Hash and Eq as discrete member functors so the unordered_set c...
void to_expvector(const_monomial m, exponents_t result_exp) const
void to_varpower(const_monomial m, gc_vector< int > &result_vp) const
void from_varpower(const_varpower vp, monomial result) const
monomial make_one() const
void remove(monomial d) const
void from_expvector(const_exponents exp, monomial result) const
int n_slots(int nparts) const
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Iterator beginAtLast() const
void find_all_divisors(const_exponents exp, VECTOR(Bag *)&b) const
const PolynomialRing * get_ring() const
Engine-side monomial ideal: a decision tree of Nmi_nodes storing the (typically minimal) generators b...
const Ring * getCoefficientRing() const
virtual ring_elem var(int v) const =0
virtual const Monoid * getMonoid() const
virtual ring_elem lead_flat_coeff(const ring_elem f) const =0
virtual const PolynomialRing * cast_to_PolynomialRing() const
virtual ring_elem make_flat_term(const ring_elem a, const_monomial m) const =0
Nterm * quotient_element(int i) const
virtual vec vec_top_coefficient(const vec v, int &var, int &exp) const =0
bool is_skew_var(int v) const
virtual const Ring * getCoefficients() const
virtual const vecterm * vec_locate_lead_term(const FreeModule *F, vec v) const =0
CoefficientType coefficient_type() const
bool is_skew_commutative() const
virtual const_monomial lead_flat_monomial(const ring_elem f) const =0
Abstract base for the engine's polynomial-ring hierarchy.
virtual bool is_ZZ() const
virtual FreeModule * make_FreeModule() const
void negate_to(ring_elem &f) const
vec make_vec(int r, ring_elem a) const
virtual bool is_unit(const ring_elem f) const =0
vec vec_divide_by_content(vec f) const
vec mult_vec_matrix(const Matrix *m, vec v, bool opposite_mult) const
void vec_sort(vecterm *&f) const
int vec_in_subring(int n, const vec v) const
virtual unsigned long get_precision() const
virtual ring_elem from_long(long n) const =0
ring_elem minus_one() const
virtual const PolynomialRing * cast_to_PolynomialRing() const
virtual ring_elem copy(const ring_elem f) const =0
virtual ring_elem antipode(ring_elem f) const
vec vec_divide_by_var(int n, int d, const vec v) const
void vec_increase_maxnorm(gmp_RRmutable norm, const vec f) const
void vec_degree_of_var(int n, const vec v, int &lo, int &hi) const
ring_elem vec_content(vec f) const
virtual ring_elem random() const
vec vec_diff(vec v, int rankFw, vec w, int use_coeff) const
ring_elem vec_split_off_content(vec f, vec &result) const
virtual ring_elem power(const ring_elem f, mpz_srcptr n) const
Exponentiation. This is the default function, if a class doesn't define this.
vec copy_vec(const vecterm *v) const
const Monoid * degree_monoid() const
int mult_sign(const int *exp1, const int *exp2) const
Sign-rule helper used by every ring that has a skew-commutative subset of variables (exterior factor,...
static int concatenateSubsets(const Subset &s, const Subset &t, Subset &result)
size_t encode(const Subset &a)
void decode(size_t val, Subset &result)
size_t encodeBoundary(size_t index, const Subset &a)
Bijective integer encoding of q-subsets of {0, ..., n-1} via binomial(a_0, 1) + binomial(a_1,...
gc_vector< int > & monom()
std::vector< size_t > Subset
Subsets — combinatorial-number-system encoding of p-subsets of {0,...,n-1}.
void exponent_table_free(exponent_table **E)
const void ** exponent_table_to_array(exponent_table *E)
exponent_table * exponent_table_new(int hint, int nvars)
long exponent_table_put(exponent_table *E, const exponent expon, long value)
long exponent_table_get(exponent_table *E, const exponent expon)
Hash table specialisation for (exponent vector, unsigned long) pairs.
static CanonicalForm base
FreeModule — finite-rank free module R^n, the type-level anchor for every Matrix.
mpfr_srcptr moveTo_gmpRR(mpfr_ptr _z)
Inline helpers that move GMP / MPFR / MPFI limbs from malloc-managed storage into the bdwgc heap.
const int * const_monomial
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define getmemstructtype(S)
M2_arrayint M2_makearrayint(int n)
M2_arrayint M2_arrayintOrNull
MatrixConstructor — the mutable builder that produces an immutable Matrix.
static void get_part_of_expvector(M2_arrayint vars, exponent big, int comp, exponent result)
static MonomialIdeal * makemonideal(const Matrix *A)
Matrix * NCMonomialMatrix(ModuleMonomialSet &H, const FreeModule *target)
static int signdivide(int n, const_exponents a, const_exponents b, exponents_t exp)
static vec coeffs_of_vec(exponent_table *E, M2_arrayint vars, const FreeModule *F, vec f)
void NCMonomials(ModuleMonomialSet &H, const Matrix *M)
Matrix * NCCoefficientMatrix(ModuleMonomialSet &H, const Matrix *M)
Matrix — the engine's immutable homomorphism F -> G between free modules.
MonomialIdeal — exponent-vector-only representation of an ideal generated by monomials.
IntsSet< ModuleMonomDefaultConfig > ModuleMonomialSet
IntsSet<Configuration> — set of monomials with insert / lookup / insertion-ordered iteration.
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)
PolynomialRing — abstract polynomial-ring base, the engine's most-reused class.
int32_t rawRandomInt(int32_t max)
Engine-boundary C API for the engine's PRNG and rational / real / complex random draws.
RingElement — tagged (Ring*, ring_elem) pair, the engine's universal element type.
Ring — the legacy abstract base class for every coefficient and polynomial ring.
Singly linked-list node carrying one term of a polynomial-ring element.
Engine-wide stylistic constants: LT / EQ / GT codes, INTSIZE, GEOHEAP_SIZE.
Text-formatting helpers layered on buffer: bignum print, line wrapping, M2_gbTrace-gated emit.
M2_arrayint stdvector_to_M2_arrayint(const std::vector< T > &v)
Conversion helpers between M2 boundary types and standard C++ containers.