Macaulay2 Engine
Loading...
Searching...
No Matches
schur2.hpp
Go to the documentation of this file.
1// Copyright 1996-2017 Michael E. Stillman
2
3#ifndef _Schurring2_hh_
4#define _Schurring2_hh_
5
39
40#include <vector>
41#include "poly.hpp"
42
44// typedef int schur_word;
45
46// Format for a schur_partition, const_schur_partition
47// (n+1) a1 a2 ... an
48// where a1 >= a2 >= ... >= an (can these be negative? I think so)
49// and n+1 is the length of the entire allocated amount.
50
53
55{
56 friend class SchurRing2;
57
58 int maxwt;
59 int wt;
60 int *lambda; // A partition vector 0..nvars-1
61 int *p; // A partition vector 0..nvars-1
62 int *xloc; // array 1..|p|-|lambda| of the horizontal location
63 // of this number in the skew table
64 int *yloc; // array 1..|p|-|lambda| of the vertical location
65 // of this number in the skew table
66
67 void initialize(int nvars);
68 void initialize(int maxrows, int maxwt);
71 void resize(int max_wt);
72
73 int elem(int x, int y) const;
74 void fill(int *lamb, int *pp);
75 void display() const;
76};
77
79class schur_poly_heap;
80
82{
83 friend class SchurRing2;
84 friend class schur_poly_iterator;
87 monoms; // each monomial is aschur_partition, all of these concatenated
88 // together
89 public:
91
92 iterator begin() const;
93 iterator end() const;
94 size_t size() const { return coeffs.size(); }
95 void append(iterator &first, iterator &last);
97};
98
100{
101 VECTOR(ring_elem)::const_iterator ic;
102 VECTOR(schur_word)::const_iterator im;
103
104 friend class schur_poly;
105
107 : ic(f.coeffs.begin()), im(f.monoms.begin())
108 {
109 }
110 schur_poly_iterator(const schur_poly &f, int) : ic(f.coeffs.end()) {}
111 public:
113 {
114 ++ic;
115 im += *im;
116 }
117 ring_elem getCoefficient() { return *ic; }
119 friend bool operator==(const schur_poly_iterator &a,
120 const schur_poly_iterator &b);
121 friend bool operator!=(const schur_poly_iterator &a,
122 const schur_poly_iterator &b);
123};
124
127
129{
130 return iterator(*this);
131}
133{
134 return iterator(*this, 1);
135}
136
151class SchurRing2 : public Ring
152{
153 private:
155 int nvars; // max size of a partition, or -1 meaning infinity
156 protected:
159
161 SchurRing2(const Ring *A, int n = -1);
162 virtual ~SchurRing2() {}
164 const_schur_partition b) const;
165 ring_elem truncate(const ring_elem f) const;
166 bool promote_coeffs(const SchurRing2 *Sf,
167 const ring_elem f,
168 ring_elem &resultRE) const;
169 bool lift_coeffs(const SchurRing2 *Sg,
170 const ring_elem f,
171 ring_elem &resultRE) const;
172
173 public:
174 int n_vars() const { return nvars; }
175 const Ring *getCoefficientRing() const { return coefficientRing; }
176 static SchurRing2 *create(const Ring *A, int n = -1);
177 static SchurRing2 *createInfinite(const Ring *A);
178
179 virtual const SchurRing2 *cast_to_SchurRing2() const { return this; }
180 virtual SchurRing2 *cast_to_SchurRing2() { return this; }
181 bool is_valid_partition(M2_arrayint part, bool set_error = true) const;
182 // sets global error message by default
183
186
188 bool get_scalar(const schur_poly *f, ring_elem &result) const;
189
190 size_t size(ring_elem f) const { return f.get_schur_poly()->coeffs.size(); }
191 void dimension(const int *exp, mpz_t result) const;
193 // only allowed if nvars >= 0
194
196 const ring_elem f) const;
197
199 virtual unsigned int computeHashValue(const ring_elem a) const;
200
201 virtual void text_out(buffer &o) const;
202 virtual void elem_text_out(buffer &o,
203 const ring_elem f,
204 bool p_one = true,
205 bool p_plus = false,
206 bool p_parens = false) const;
207
208 virtual ring_elem from_long(long n) const;
209 virtual ring_elem from_int(mpz_srcptr n) const;
210 virtual bool from_rational(mpq_srcptr q, ring_elem &result) const;
211
212 virtual bool promote(const Ring *R,
213 const ring_elem f,
214 ring_elem &result) const;
215 virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const;
216
217 virtual bool is_unit(const ring_elem f) const;
218 virtual bool is_zero(const ring_elem f) const;
219 virtual bool is_equal(const ring_elem f,
220 const ring_elem g) const; // NOT DONE...
221
222 virtual int compare_elems(const ring_elem f, const ring_elem g) const;
223 virtual ring_elem copy(const ring_elem f) const;
224 virtual void remove(ring_elem &f) const
225 {
226 (void) f;
227 } // let the GC do it!
228 virtual ring_elem negate(const ring_elem f) const;
229 virtual ring_elem add(const ring_elem f, const ring_elem g) const;
230 virtual ring_elem subtract(const ring_elem f, const ring_elem g) const;
231 virtual ring_elem mult(const ring_elem f, const ring_elem g) const;
232
233 virtual ring_elem eval(const RingMap *map,
234 const ring_elem f,
235 int first_var) const;
236
237 // These make little or no sense for this ring
238 virtual ring_elem invert(const ring_elem f) const; // do nothing
239 virtual ring_elem divide(const ring_elem f,
240 const ring_elem g) const; // do nothing
241 virtual void syzygy(const ring_elem a,
242 const ring_elem b,
243 ring_elem &x,
244 ring_elem &y) const; // do nothing
245
247 private:
248 // Littlewood-Richardson variables and functions
255 schur_poly_heap *SMheap; // where the answer is collected
256
257 void SMinitialize(int max_rows, int max_weight);
258 void SMbounds(int &lo, int &hi);
259 void SM();
262 // sets p[0] in the range 2..SMmaxrows+2
263
266};
267
268#include "schur-poly-heap.hpp"
269
270#endif
271
272// Local Variables:
273// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
274// indent-tabs-mode: nil
275// End:
Ring()
Definition ring.hpp:136
xxx xxx xxx
Definition ring.hpp:102
Engine-side ring homomorphism: stores, for each source-ring variable, the target-ring element it maps...
Definition ringmap.hpp:60
virtual bool is_equal(const ring_elem f, const ring_elem g) const
Definition schur2.cpp:253
ring_elem skew_schur(const_schur_partition lambda, const_schur_partition p)
Definition schur2.cpp:836
virtual void remove(ring_elem &f) const
Definition schur2.hpp:224
virtual const SchurRing2 * cast_to_SchurRing2() const
Definition schur2.hpp:179
bool get_scalar(const schur_poly *f, ring_elem &result) const
Definition schur2.cpp:273
virtual ring_elem subtract(const ring_elem f, const ring_elem g) const
Definition schur2.cpp:594
ring_elem from_coeff(ring_elem a) const
Definition schur2.cpp:281
virtual ring_elem copy(const ring_elem f) const
Definition schur2.cpp:310
virtual unsigned int computeHashValue(const ring_elem a) const
Definition schur2.cpp:93
size_t size(ring_elem f) const
Definition schur2.hpp:190
void SMinitialize(int max_rows, int max_weight)
Definition schur2.cpp:732
virtual ring_elem invert(const ring_elem f) const
Definition schur2.cpp:321
virtual bool is_unit(const ring_elem f) const
Definition schur2.cpp:240
virtual void text_out(buffer &o) const
Definition schur2.cpp:194
void dimension(const int *exp, mpz_t result) const
ring_elem mult_terms(const_schur_partition a, const_schur_partition b)
Definition schur2.cpp:867
schur_poly_heap * SMheap
Definition schur2.hpp:255
int SMfinalwt
Definition schur2.hpp:254
int n_vars() const
Definition schur2.hpp:174
virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const
Definition schur2.cpp:466
ring_elem truncate(const ring_elem f) const
Definition schur2.cpp:512
bool initialize_schur()
virtual ring_elem negate(const ring_elem f) const
Definition schur2.cpp:496
virtual ring_elem from_int(mpz_srcptr n) const
Definition schur2.cpp:296
void SMsetPartitionLength(schur_word *p, int SMmaxrows)
Definition schur2.cpp:787
tableau2 SMfilled
Definition schur2.hpp:252
virtual bool promote(const Ring *R, const ring_elem f, ring_elem &result) const
Definition schur2.cpp:431
bool lift_coeffs(const SchurRing2 *Sg, const ring_elem f, ring_elem &resultRE) const
Definition schur2.cpp:407
bool initialize_SchurRing2()
Definition schur2.cpp:145
virtual bool is_zero(const ring_elem f) const
Definition schur2.cpp:247
virtual ring_elem divide(const ring_elem f, const ring_elem g) const
Definition schur2.cpp:328
static SchurRing2 * createInfinite(const Ring *A)
Definition schur2.cpp:137
virtual bool from_rational(mpq_srcptr q, ring_elem &result) const
Definition schur2.cpp:301
int SMmaxrows
Definition schur2.hpp:250
bool is_valid_partition(M2_arrayint part, bool set_error=true) const
Definition schur2.cpp:157
void SM()
Definition schur2.cpp:795
virtual ring_elem eval(const RingMap *map, const ring_elem f, int first_var) const
Definition schur2.cpp:718
static SchurRing2 * create(const Ring *A, int n=-1)
Definition schur2.cpp:130
virtual ring_elem from_long(long n) const
Definition schur2.cpp:291
void SMbounds(int &lo, int &hi)
Definition schur2.cpp:748
virtual SchurRing2 * cast_to_SchurRing2()
Definition schur2.hpp:180
virtual ring_elem add(const ring_elem f, const ring_elem g) const
Definition schur2.cpp:530
virtual void syzygy(const ring_elem a, const ring_elem b, ring_elem &x, ring_elem &y) const
Definition schur2.cpp:336
int SMcurrent
Definition schur2.hpp:253
engine_RawArrayPairOrNull list_form(const Ring *coeffR, const ring_elem f) const
Definition schur2.cpp:682
virtual ring_elem mult(const ring_elem f, const ring_elem g) const
Definition schur2.cpp:616
void SMappendTerm(const_schur_partition f)
Definition schur2.cpp:828
schur_poly * mult_by_coefficient(ring_elem a, const schur_poly *f) const
Definition schur2.cpp:600
int SMmaxweight
Definition schur2.hpp:249
bool promote_coeffs(const SchurRing2 *Sf, const ring_elem f, ring_elem &resultRE) const
Definition schur2.cpp:383
ring_elem from_partition(M2_arrayint part) const
Definition schur2.cpp:184
virtual int compare_elems(const ring_elem f, const ring_elem g) const
Definition schur2.cpp:365
virtual void elem_text_out(buffer &o, const ring_elem f, bool p_one=true, bool p_plus=false, bool p_parens=false) const
Definition schur2.cpp:202
int compare_partitions(const_schur_partition a, const_schur_partition b) const
Definition schur2.cpp:348
const Ring * getCoefficientRing() const
Definition schur2.hpp:175
ring_elem dimension(const ring_elem f) const
virtual ~SchurRing2()
Definition schur2.hpp:162
tableau2 SMtab
Definition schur2.hpp:251
const Ring * coefficientRing
Definition schur2.hpp:154
Refactored Schur (symmetric-function) ring whose elements are schur_poly sums of partitions over a co...
Definition schur2.hpp:152
schur_poly_iterator(const schur_poly &f)
Definition schur2.hpp:106
const_schur_partition getMonomial()
Definition schur2.hpp:118
friend bool operator==(const schur_poly_iterator &a, const schur_poly_iterator &b)
Definition schur2.cpp:110
VECTOR(ring_elem) friend class(schur_word) schur_poly
Definition schur2.hpp:102
schur_poly_iterator(const schur_poly &f, int)
Definition schur2.hpp:110
ring_elem getCoefficient()
Definition schur2.hpp:117
friend bool operator!=(const schur_poly_iterator &a, const schur_poly_iterator &b)
Definition schur2.cpp:114
schur_poly_iterator iterator
Definition schur2.hpp:90
VECTOR(schur_word) monoms
friend class schur_poly_iterator
Definition schur2.hpp:84
void appendTerm(ring_elem coeff, const_schur_partition monom)
Definition schur2.cpp:119
VECTOR(ring_elem) coeffs
iterator begin() const
Definition schur2.hpp:128
friend class SchurRing2
Definition schur2.hpp:83
iterator end() const
Definition schur2.hpp:132
void append(iterator &first, iterator &last)
Definition schur2.cpp:124
size_t size() const
Definition schur2.hpp:94
int * lambda
Definition schur2.hpp:60
int * xloc
Definition schur2.hpp:62
void initialize(int nvars)
tableau2()
Definition schur2.hpp:69
int elem(int x, int y) const
Definition schur2.cpp:39
friend class SchurRing2
Definition schur2.hpp:56
~tableau2()
Definition schur2.hpp:70
void fill(int *lamb, int *pp)
Definition schur2.cpp:50
void resize(int max_wt)
Definition schur2.cpp:28
int * yloc
Definition schur2.hpp:64
int wt
Definition schur2.hpp:59
void display() const
Definition schur2.cpp:72
int * p
Definition schur2.hpp:61
int maxwt
Definition schur2.hpp:58
int p
VALGRIND_MAKE_MEM_DEFINED & result(result)
engine_RawArrayPair engine_RawArrayPairOrNull
Definition m2-types.h:184
#define VECTOR(T)
Definition newdelete.hpp:78
volatile int x
Concrete commutative PolyRing — standard polynomial ring inheriting from PolyRingFlat.
TermIterator< Nterm > begin(Nterm *ptr)
Definition ringelem.cpp:4
TermIterator< Nterm > end(Nterm *)
Definition ringelem.cpp:5
schur_poly_heap — geometric-bucket accumulator specialised for SchurRing2 polynomials.
int schur_word
Definition schur2.hpp:43
schur_word * schur_partition
Definition schur2.hpp:51
bool operator==(const schur_poly::iterator &a, const schur_poly::iterator &b)
Definition schur2.cpp:110
const schur_word * const_schur_partition
Definition schur2.hpp:52
bool operator!=(const schur_poly::iterator &a, const schur_poly::iterator &b)
Definition schur2.cpp:114
const schur_poly * get_schur_poly() const
Definition ringelem.hpp:137