Macaulay2 Engine
Loading...
Searching...
No Matches
ringelem.hpp
Go to the documentation of this file.
1// Copyright 1995 Michael E. Stillman
2
3#ifndef _ringelem_hh_
4#define _ringelem_hh_
5
39
40#include "M2/math-include.h" // for mpfi_srcptr, mpfr_srcptr, mpq_srcptr
41#include "monoid.hpp" // for monomial
42#include "newdelete.hpp" // for our_new_delete
43
44using ZZ = mpz_srcptr;
45using ZZmutable = mpz_ptr;
46using QQ = mpq_srcptr;
47using QQmutable = mpq_ptr;
48using RRRelement = mpfr_srcptr;
49using RRRmutable = mpfr_ptr;
50using RRielement = mpfi_srcptr;
51using RRimutable = mpfi_ptr;
52
53// The following is the data type used for complex numbers in aring-CCC
54// Perhaps we should have it be
56{
57 __mpfr_struct re;
58 __mpfr_struct im;
59};
60using cc_ptr = cc_struct *;
61using cc_srcptr = cc_struct const *;
62
64{
65 double re;
66 double im;
67};
70
72{
73 __mpfi_struct re;
74 __mpfi_struct im;
75};
77using cci_srcptr = cci_struct const *;
78
79struct Nterm;
80typedef Nterm *tpoly;
81class schur_poly;
82struct local_elem;
83
85{
87
88 private: // move this line up to the top eventually
93 double double_val;
96 mpfr_srcptr mpfr_val;
97 mpfi_srcptr mpfi_val;
101 const void *mPolyVal;
102 public:
103 ring_elem() : poly_val(nullptr) {}
104 // explicit ring_elem(int a) : int_val(a) {} // really want this version...
105 ring_elem(int a) : int_val(a) {}
107 explicit ring_elem(mpz_srcptr a) : mpz_val(a) {}
108 explicit ring_elem(long a) : long_val(a) {}
109 explicit ring_elem(double a) : double_val(a) {}
110 explicit ring_elem(mpq_srcptr a) : mpq_val(a) {}
111 explicit ring_elem(mpfr_srcptr a) : mpfr_val(a) {}
112 explicit ring_elem(mpfi_srcptr a) : mpfi_val(a) {}
113 explicit ring_elem(cc_srcptr a) : cc_val(a) {}
114 explicit ring_elem(cci_srcptr a) : cci_val(a) {}
116 explicit ring_elem(local_elem* a) : local_val(a) {}
117 explicit ring_elem(const void* a) : mPolyVal(a) {} // non-commutative polynomials
119
120 // operator int() const { return int_val; }
121 operator tpoly() const { return poly_val; }
122 Nterm *get_poly() const { return poly_val; }
123
124 int get_int() const { return int_val; }
125 long get_long() const { return long_val; }
126 double get_double() const { return double_val; }
127 mpz_srcptr get_mpz() const { return mpz_val; }
128 const void* get_Poly() const { return mPolyVal; }
129 mpq_srcptr get_mpq() const { return mpq_val; }
130 mpfr_srcptr get_mpfr() const { return mpfr_val; }
131 mpfi_srcptr get_mpfi() const { return mpfi_val; }
132
133 cc_srcptr get_cc() const { return cc_val; }
134 cci_srcptr get_cci() const { return cci_val; }
136 const local_elem* get_local_elem() const { return local_val; }
137 const schur_poly* get_schur_poly() const { return schur_poly_val; }
138};
139
154/* Implements a linked list of ring monomials along with coefficients */
155struct Nterm
156{
159 // TODO: should this have type monomial?
160 int monom[1];
161};
162
163typedef struct vecterm *vec;
164/* Implements a linked list of module monomials along with coefficients.
165 Nodes are kept in strictly decreasing order of `comp`; zero-coefficient
166 entries are omitted. */
167// TODO: why is this garbage collected?
168struct vecterm : public our_new_delete
169{
170 vec next;
171 int comp;
173};
174
175/* Implements an iterator for linked list-based multi-termed structs
176 *
177 * For example, the functions begin(Nterm*) and end(Nterm*) return
178 * a TermIterator<Nterm> object which makes for(Nterm& t : f) work. */
179template<typename T>
181{
182 T* p;
183
184 TermIterator(): p(nullptr) {}
185 TermIterator(T* ptr): p(ptr) {}
187
188 TermIterator& operator++() { p = p->next; return *this; }
189
190 T const& operator*() const { return *p; }
191 T& operator*() { return *p; }
192 T const* operator->() const { return p; }
193 T* operator->() { return p; }
194
195 bool operator==(TermIterator const& rhs) const { return p == rhs.p; }
196 bool operator!=(TermIterator const& rhs) const { return p != rhs.p; }
197};
198
201
204
205
206#define MPQ_VAL(f) ((f).get_mpq())
207
208// these should only be used as temporary const. Do not store results!
209#define BIGCC_IM(f) (&(f).get_cc()->im)
210#define BIGCC_RE(f) (&(f).get_cc()->re)
211
212// TODO: these need to be replaced... no casting, need new slot in ring_elem union type
213#define TOWER_VAL(f) (reinterpret_cast<ARingTowerPolynomial>((f).poly_val))
214#define TOWER_RINGELEM(a) (ring_elem(reinterpret_cast<Nterm *>(a)))
215
216#endif
217
218// Local Variables:
219// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
220// indent-tabs-mode: nil
221// End:
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
our_new_delete — per-class opt-in routing of new / delete through bdwgc.
Nterm * tpoly
Definition ringelem.hpp:80
mpfr_ptr RRRmutable
Definition ringelem.hpp:49
mpfi_ptr RRimutable
Definition ringelem.hpp:51
cci_struct * cci_ptr
Definition ringelem.hpp:76
cc_doubles_struct * cc_doubles_ptr
Definition ringelem.hpp:69
mpz_ptr ZZmutable
Definition ringelem.hpp:45
cc_struct * cc_ptr
Definition ringelem.hpp:60
mpfr_srcptr RRRelement
Definition ringelem.hpp:48
TermIterator< Nterm > begin(Nterm *ptr)
Definition ringelem.cpp:4
mpq_srcptr QQ
Definition ringelem.hpp:46
TermIterator< Nterm > end(Nterm *)
Definition ringelem.cpp:5
mpq_ptr QQmutable
Definition ringelem.hpp:47
cc_struct const * cc_srcptr
Definition ringelem.hpp:61
cc_doubles_struct const * cc_doubles_srcptr
Definition ringelem.hpp:68
cci_struct const * cci_srcptr
Definition ringelem.hpp:77
mpfi_srcptr RRielement
Definition ringelem.hpp:50
mpz_srcptr ZZ
Definition ringelem.hpp:44
Nterm * next
Definition ringelem.hpp:157
ring_elem coeff
Definition ringelem.hpp:158
int monom[1]
Definition ringelem.hpp:160
Singly linked-list node carrying one term of a polynomial-ring element.
Definition ringelem.hpp:156
bool operator==(TermIterator const &rhs) const
Definition ringelem.hpp:195
TermIterator(T *ptr)
Definition ringelem.hpp:185
T const * operator->() const
Definition ringelem.hpp:192
T * operator->()
Definition ringelem.hpp:193
TermIterator(ring_elem ptr)
Definition ringelem.hpp:186
T & operator*()
Definition ringelem.hpp:191
bool operator!=(TermIterator const &rhs) const
Definition ringelem.hpp:196
TermIterator & operator++()
Definition ringelem.hpp:188
T const & operator*() const
Definition ringelem.hpp:190
__mpfr_struct im
Definition ringelem.hpp:58
__mpfr_struct re
Definition ringelem.hpp:57
__mpfi_struct im
Definition ringelem.hpp:74
__mpfi_struct re
Definition ringelem.hpp:73
ring_elem coeff
Definition ringelem.hpp:172
#define T
Definition table.c:13
mpfr_srcptr get_mpfr() const
Definition ringelem.hpp:130
Nterm * poly_val
Definition ringelem.hpp:86
ring_elem(cc_srcptr a)
Definition ringelem.hpp:113
ring_elem(cc_doubles_srcptr a)
Definition ringelem.hpp:115
mpfi_srcptr get_mpfi() const
Definition ringelem.hpp:131
int int_val
Definition ringelem.hpp:91
long get_long() const
Definition ringelem.hpp:125
ring_elem(int a)
Definition ringelem.hpp:105
const schur_poly * schur_poly_val
Definition ringelem.hpp:89
mpfi_srcptr mpfi_val
Definition ringelem.hpp:97
double get_double() const
Definition ringelem.hpp:126
cc_doubles_srcptr cc_doubles_val
Definition ringelem.hpp:98
mpfr_srcptr mpfr_val
Definition ringelem.hpp:96
cc_doubles_srcptr get_cc_doubles() const
Definition ringelem.hpp:135
const local_elem * get_local_elem() const
Definition ringelem.hpp:136
ring_elem(local_elem *a)
Definition ringelem.hpp:116
mpq_srcptr get_mpq() const
Definition ringelem.hpp:129
ring_elem(long a)
Definition ringelem.hpp:108
ring_elem(cci_srcptr a)
Definition ringelem.hpp:114
cci_srcptr cci_val
Definition ringelem.hpp:100
ring_elem(const void *a)
Definition ringelem.hpp:117
cc_srcptr get_cc() const
Definition ringelem.hpp:133
ring_elem(double a)
Definition ringelem.hpp:109
ring_elem(mpq_srcptr a)
Definition ringelem.hpp:110
ring_elem(schur_poly *a)
Definition ringelem.hpp:118
cc_srcptr cc_val
Definition ringelem.hpp:99
const void * mPolyVal
Definition ringelem.hpp:101
ring_elem(mpz_srcptr a)
Definition ringelem.hpp:107
const local_elem * local_val
Definition ringelem.hpp:90
double double_val
Definition ringelem.hpp:93
cci_srcptr get_cci() const
Definition ringelem.hpp:134
const schur_poly * get_schur_poly() const
Definition ringelem.hpp:137
ring_elem(Nterm *a)
Definition ringelem.hpp:106
Nterm * get_poly() const
Definition ringelem.hpp:122
long long_val
Definition ringelem.hpp:92
ring_elem(mpfr_srcptr a)
Definition ringelem.hpp:111
mpz_srcptr get_mpz() const
Definition ringelem.hpp:127
int get_int() const
Definition ringelem.hpp:124
const void * get_Poly() const
Definition ringelem.hpp:128
ring_elem(mpfi_srcptr a)
Definition ringelem.hpp:112