42 for (
int i = 1; i <=
wt; i++)
43 if (
xloc[i] ==
x &&
yloc[i] == y)
return i;
46 fprintf(stderr,
"tableau2: location (%d,%d) out of range\n",
x, y);
60 for (i = 1; i <
p[0]; i++)
63 for (j =
p[i]; j > a; j--)
76 for (i = 1; i <
p[0]; i++)
78 for (j = 1; j <=
lambda[i]; j++) fprintf(stdout,
"-- ");
79 for (; j <=
p[i]; j++) fprintf(stdout,
"%2d ",
elem(i, j));
80 fprintf(stdout,
"\n");
90 seed ^= std::hash<T>()(val) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
100 size_t seed = 95864398;
102 for(
auto it=coeffs.begin(); it!=coeffs.end(); ++it)
104 for(
auto it=monoms.begin(); it!=monoms.end(); ++it)
107 return static_cast<unsigned>(seed);
121 coeffs.push_back(coeff);
122 for (
int i = 0; i < monom[0]; i++) monoms.push_back(monom[i]);
126 for (; first != last; ++first)
161 if (set_error)
ERROR(
"expected a partition of size at most %d\n",
nvars);
164 for (
int i = 1; i < part->len; i++)
165 if (part->array[i - 1] < part->array[i])
167 if (set_error)
ERROR(
"expected a non-increasing sequence of integers");
170 if (part->len > 0 && part->array[part->len - 1] < 0)
172 if (set_error)
ERROR(
"expected nonnegative integers only");
180 for (
int i = part->len - 1; i >= 0; i--)
181 if (part->array[i] != 0)
return i;
189 f->monoms.push_back(len + 1);
190 for (
int i = 0; i < len; i++) f->monoms.push_back(part->array[i]);
209 size_t n = g->
size();
211 bool needs_parens = p_parens && (n > 1);
214 if (p_plus) o <<
'+';
224 int isone = (len == 1);
227 o, i.getCoefficient(), p_one, p_plus, p_parens);
229 for (
int j = 0; j < len - 1; j++)
237 if (needs_parens) o <<
')';
243 if (g->
size() != 1)
return false;
250 return g->
size() == 0;
257 if (f1->
size() != g1->
size())
return false;
258 if (f1->monoms.
size() != g1->monoms.
size())
return false;
262 for (; m_f != f1->monoms.
end(); ++m_f, ++m_g)
263 if (*m_f != *m_g)
return false;
267 for (; c_f != f1->coeffs.
end(); ++c_f, ++c_g)
275 if (g->
size() != 1)
return false;
276 if (g->monoms.
size() != 1)
return false;
286 f->coeffs.push_back(a);
287 f->monoms.push_back(1);
305 if (not ok)
return false;
315 g->coeffs.insert(g->coeffs.
end(), f1->coeffs.
begin(), f1->coeffs.
end());
316 g->monoms.insert(g->monoms.
end(), f1->monoms.
begin(), f1->monoms.
end());
352 if (b[0] < len) len = b[0];
353 for (
int i = 1; i < len; i++)
355 int cmp = a[i] - b[i];
356 if (cmp < 0)
return LT;
357 if (cmp > 0)
return GT;
359 int cmp = a[0] - b[0];
360 if (cmp < 0)
return LT;
361 if (cmp > 0)
return GT;
375 for(; f_it!=f_end && g_it!=g_end; ++f_it, ++g_it) {
380 return (f_it!=f_end)-(g_it!=g_end);
393 if (i.getMonomial()[0] - 1 >
nvars)
continue;
402 result->appendTerm(a, i.getMonomial());
416 if (i.getMonomial()[0] - 1 > Sg->
n_vars())
continue;
425 result->appendTerm(a, i.getMonomial());
503 i != f1->coeffs.
end();
524 if (i.getMonomial()[0] - 1 >
nvars)
continue;
525 result->appendTerm(i.getCoefficient(), i.getMonomial());
607 c_f != f->coeffs.
end();
641 i.getMonomial(), j.getMonomial());
652 int *result_vp =
result.data();
653 int *orig_result_vp = result_vp;
661 for (
int i = 2; i < len; i++)
677 int newlen =
static_cast<int>(result_vp - orig_result_vp);
678 *orig_result_vp = newlen;
687 ERROR(
"expected coefficient ring of Schur ring");
691 int n =
static_cast<int>(f1->
size());
694 engine_RawMonomialArray monoms =
696 engine_RawRingElementArray coeffs =
707 for (
int next = 0; next < n; ++i, ++next)
709 coeffs->array[next] =
744 for (
int i = 0; i <=
nvars; i++)
SMtab.p[i] = 0;
779 int xabove =
SMtab.xloc[above];
780 int yabove =
SMtab.yloc[above];
781 for (i = xabove + 1; i <= hi; i++)
782 if (
SMtab.p[i] < yabove)
break;
791 if (
p[i] == 0)
break;
812 for (
int i = lo; i <= hi; i++)
815 this_one =
SMtab.p[i];
816 if (last_one > this_one)
843 for (
int i = 1; i < lambda[0]; i++)
SMfinalwt -= lambda[i];
870 int maxsize = (a[0] - 1 + b[0] - 1) + 1;
889 assert(r +
s + 1 == maxsize);
891 for (
int i = 1; i <= r; i++)
897 for (
int i = r + 1; i < r +
s + 1; i++)
Legacy RingZZ — a Ring-derived integer ring backed by GMP mpz_t.
static EngineMonomial * make(int v, int e)
virtual bool promote(const Ring *R, const ring_elem f, ring_elem &result) const =0
virtual const SchurRing2 * cast_to_SchurRing2() const
void initialize_ring(long charac, const PolynomialRing *DR=nullptr, const std::vector< int > &heft_vec={})
static RingElement * make_raw(const Ring *R, ring_elem f)
const Ring * get_ring() const
Engine-side ring homomorphism: stores, for each source-ring variable, the target-ring element it maps...
virtual bool is_equal(const ring_elem f, const ring_elem g) const
ring_elem skew_schur(const_schur_partition lambda, const_schur_partition p)
bool get_scalar(const schur_poly *f, ring_elem &result) const
virtual ring_elem subtract(const ring_elem f, const ring_elem g) const
ring_elem from_coeff(ring_elem a) const
virtual ring_elem copy(const ring_elem f) const
virtual unsigned int computeHashValue(const ring_elem a) const
void SMinitialize(int max_rows, int max_weight)
virtual ring_elem invert(const ring_elem f) const
virtual bool is_unit(const ring_elem f) const
virtual void text_out(buffer &o) const
ring_elem mult_terms(const_schur_partition a, const_schur_partition b)
virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const
ring_elem truncate(const ring_elem f) const
virtual ring_elem negate(const ring_elem f) const
virtual ring_elem from_int(mpz_srcptr n) const
void SMsetPartitionLength(schur_word *p, int SMmaxrows)
virtual bool promote(const Ring *R, const ring_elem f, ring_elem &result) const
bool lift_coeffs(const SchurRing2 *Sg, const ring_elem f, ring_elem &resultRE) const
bool initialize_SchurRing2()
virtual bool is_zero(const ring_elem f) const
virtual ring_elem divide(const ring_elem f, const ring_elem g) const
static SchurRing2 * createInfinite(const Ring *A)
virtual bool from_rational(mpq_srcptr q, ring_elem &result) const
bool is_valid_partition(M2_arrayint part, bool set_error=true) const
virtual ring_elem eval(const RingMap *map, const ring_elem f, int first_var) const
static SchurRing2 * create(const Ring *A, int n=-1)
virtual ring_elem from_long(long n) const
void SMbounds(int &lo, int &hi)
virtual ring_elem add(const ring_elem f, const ring_elem g) const
virtual void syzygy(const ring_elem a, const ring_elem b, ring_elem &x, ring_elem &y) const
engine_RawArrayPairOrNull list_form(const Ring *coeffR, const ring_elem f) const
virtual ring_elem mult(const ring_elem f, const ring_elem g) const
void SMappendTerm(const_schur_partition f)
schur_poly * mult_by_coefficient(ring_elem a, const schur_poly *f) const
bool promote_coeffs(const SchurRing2 *Sf, const ring_elem f, ring_elem &resultRE) const
ring_elem from_partition(M2_arrayint part) const
virtual int compare_elems(const ring_elem f, const ring_elem g) const
virtual void elem_text_out(buffer &o, const ring_elem f, bool p_one=true, bool p_plus=false, bool p_parens=false) const
int compare_partitions(const_schur_partition a, const_schur_partition b) const
const Ring * getCoefficientRing() const
const Ring * coefficientRing
const_schur_partition getMonomial()
ring_elem getCoefficient()
schur_poly_iterator iterator
void appendTerm(ring_elem coeff, const_schur_partition monom)
void append(iterator &first, iterator &last)
void initialize(int nvars)
int elem(int x, int y) const
void fill(int *lamb, int *pp)
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define sizeofarray(s, len)
struct engine_RawArrayPair_struct * engine_RawArrayPair
engine_RawArrayPair engine_RawArrayPairOrNull
#define ALLOCATE_EXPONENTS(byte_len)
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
EngineMonomial — opaque single-monomial value type used at the engine boundary.
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)
RingElement — tagged (Ring*, ring_elem) pair, the engine's universal element type.
RingMap — engine representation of a ring homomorphism.
static int last_nonzero(M2_arrayint part)
void to_varpower(const_schur_partition a, gc_vector< int > &result)
bool operator==(const schur_poly::iterator &a, const schur_poly::iterator &b)
bool operator!=(const schur_poly::iterator &a, const schur_poly::iterator &b)
static void hash_combine(size_t &seed, const T &val)
schur_word * schur_partition
const schur_word * const_schur_partition
SchurRing2 — refactored Schur ring with length-prefixed partitions and an explicit Ring base.
Text-formatting helpers layered on buffer: bignum print, line wrapping, M2_gbTrace-gated emit.
const schur_poly * get_schur_poly() const