Macaulay2 Engine
Loading...
Searching...
No Matches
tower.hpp
Go to the documentation of this file.
1// Copyright 2010 Michael E. Stillman.
2#ifndef _tower_hpp_
3#define _tower_hpp_
4
37
38#include "relem.hpp"
39
40class RingMap;
41
42class DRing;
43
58class Tower : public Ring
59{
60 friend class TowerEvaluator;
61 int level;
62 int nvars;
63
64 M2_ArrayString names;
65
67
68 protected:
69 Tower() {}
70 bool initialize(long charac0,
71 M2_ArrayString names0,
72 const VECTOR(ring_elem) & extensions);
73
74 public:
75 virtual ~Tower();
76
77 Tower *cast_to_Tower() { return this; }
78 const Tower *cast_to_Tower() const { return this; }
79 int n_vars() const { return nvars; }
80 static Tower *create(int charac, M2_ArrayString names);
81 static Tower *create(const Tower *R, M2_ArrayString new_names);
82 static Tower *create(const Tower *R, VECTOR(ring_elem) & extensions);
83
84 // The following are all the routines required by 'ring'
85 virtual unsigned int computeHashValue(const ring_elem a) const;
86
87 virtual void text_out(buffer &o) const;
88
89 virtual ring_elem from_long(long n) const;
90 virtual ring_elem from_int(mpz_srcptr n) const;
91 virtual ring_elem var(int v) const;
92 virtual bool from_rational(mpq_srcptr q, ring_elem &result) const;
93
94 virtual bool promote(const Ring *R,
95 const ring_elem f,
96 ring_elem &result) const;
97 virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const;
98 // promote and lift work between what rings?
99
100 virtual ring_elem eval(const RingMap *map,
101 const ring_elem f,
102 int first_var) const;
103
104 virtual bool is_unit(const ring_elem f) const;
105 virtual bool is_zero(const ring_elem f) const;
106 virtual bool is_equal(const ring_elem f, const ring_elem g) const;
107 virtual int compare_elems(const ring_elem f, const ring_elem g) const;
108
109 virtual ring_elem copy(const ring_elem f) const;
110 virtual void remove(ring_elem &f) const;
111
112 virtual ring_elem negate(const ring_elem f) const;
113 virtual ring_elem add(const ring_elem f, const ring_elem g) const;
114 virtual ring_elem subtract(const ring_elem f, const ring_elem g) const;
115 virtual ring_elem mult(const ring_elem f, const ring_elem g) const;
116 virtual ring_elem invert(const ring_elem f) const;
117 virtual ring_elem divide(const ring_elem f, const ring_elem g) const;
118
119 virtual ring_elem remainder(const ring_elem f, const ring_elem g) const;
120
121 virtual ring_elem random() const;
122
123 virtual void elem_text_out(buffer &o,
124 const ring_elem f,
125 bool p_one = true,
126 bool p_plus = false,
127 bool p_parens = false) const;
128
129 virtual void syzygy(const ring_elem a,
130 const ring_elem b,
131 ring_elem &x,
132 ring_elem &y) const;
133
134 virtual int index_of_var(const ring_elem a) const;
135 virtual M2_arrayint support(const ring_elem a) const;
136
137 ring_elem gcd(const ring_elem f, const ring_elem g) const;
139 const ring_elem g,
140 ring_elem &u,
141 ring_elem &v) const;
142
143 // These routines are here so we can write higher level operations in M2 to
144 // test the (eventual) engine routines
145 int degreeInVariable(int var, const ring_elem f) const;
146 ring_elem differentiate(int var, const ring_elem f) const;
147 int extension_degree(int nvars) const; // returns -1 if infinite
149 mpz_srcptr n,
150 const ring_elem g) const; // f^n mod g
151 ring_elem lowerP(const ring_elem f) const;
152
153 ring_elem translate(const PolynomialRing *R, ring_elem fR) const;
154 // translate the element fR into a dpoly for this ring
155};
156
157class RingElement;
158
159extern const RingElement *towerGCD(const RingElement *F, const RingElement *G);
160extern const RingElement *towerExtendedGCD(const RingElement *F,
161 const RingElement *G,
162 const RingElement **A,
163 const RingElement **B);
164
165#endif
166
167// Local Variables:
168// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
169// indent-tabs-mode: nil
170// End:
Single-level view of a tower-polynomial ring: a DPoly plus a fixed working level and a Tower-flavoure...
Definition dpoly.hpp:266
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
Ring()
Definition ring.hpp:136
Front-end-visible "ring element" value: an engine ring_elem paired with the Ring* that gives it meani...
Definition relem.hpp:67
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
ring_elem gcd(const ring_elem f, const ring_elem g) const
Definition tower.cpp:365
ring_elem lowerP(const ring_elem f) const
Definition tower.cpp:419
virtual ring_elem invert(const ring_elem f) const
Definition tower.cpp:217
ring_elem differentiate(int var, const ring_elem f) const
Definition tower.cpp:394
ring_elem power_mod(const ring_elem f, mpz_srcptr n, const ring_elem g) const
Definition tower.cpp:408
Tower()
Definition tower.hpp:69
ring_elem translate(const PolynomialRing *R, ring_elem fR) const
Definition tower.cpp:471
virtual void text_out(buffer &o) const
Definition tower.cpp:76
virtual ring_elem copy(const ring_elem f) const
Definition tower.cpp:165
virtual unsigned int computeHashValue(const ring_elem a) const
Definition tower.cpp:69
virtual bool is_equal(const ring_elem f, const ring_elem g) const
Definition tower.cpp:149
virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const
Definition tower.cpp:344
virtual int index_of_var(const ring_elem a) const
Definition tower.cpp:85
virtual ring_elem from_int(mpz_srcptr n) const
Definition tower.cpp:113
virtual ring_elem subtract(const ring_elem f, const ring_elem g) const
Definition tower.cpp:197
virtual bool is_zero(const ring_elem f) const
Definition tower.cpp:142
virtual M2_arrayint support(const ring_elem a) const
Definition tower.cpp:91
DRing * D
Definition tower.hpp:66
virtual ring_elem negate(const ring_elem f) const
Definition tower.cpp:176
int degreeInVariable(int var, const ring_elem f) const
Definition tower.cpp:388
int level
Definition tower.hpp:61
virtual void remove(ring_elem &f) const
Definition tower.cpp:171
virtual bool from_rational(mpq_srcptr q, ring_elem &result) const
Definition tower.cpp:120
virtual ring_elem mult(const ring_elem f, const ring_elem g) const
Definition tower.cpp:207
virtual ring_elem random() const
Definition tower.cpp:246
virtual ring_elem remainder(const ring_elem f, const ring_elem g) const
Definition tower.cpp:236
bool initialize(long charac0, M2_ArrayString names0, const VECTOR(ring_elem) &extensions)
Definition tower.cpp:15
int nvars
Definition tower.hpp:62
virtual ring_elem from_long(long n) const
Definition tower.cpp:106
virtual ~Tower()
Definition tower.cpp:14
M2_ArrayString names
Definition tower.hpp:64
const Tower * cast_to_Tower() const
Definition tower.hpp:78
static Tower * create(int charac, M2_ArrayString names)
Definition tower.cpp:46
virtual ring_elem var(int v) const
Definition tower.cpp:128
virtual int compare_elems(const ring_elem f, const ring_elem g) const
Definition tower.cpp:157
virtual bool promote(const Ring *R, const ring_elem f, ring_elem &result) const
Definition tower.cpp:335
virtual void syzygy(const ring_elem a, const ring_elem b, ring_elem &x, ring_elem &y) const
Definition tower.cpp:353
virtual ring_elem add(const ring_elem f, const ring_elem g) const
Definition tower.cpp:187
virtual ring_elem divide(const ring_elem f, const ring_elem g) const
Definition tower.cpp:226
virtual bool is_unit(const ring_elem f) const
Definition tower.cpp:135
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 tower.cpp:254
int n_vars() const
Definition tower.hpp:79
int extension_degree(int nvars) const
Definition tower.cpp:402
virtual ring_elem eval(const RingMap *map, const ring_elem f, int first_var) const
Definition tower.cpp:327
friend class TowerEvaluator
Definition tower.hpp:60
Tower * cast_to_Tower()
Definition tower.hpp:77
ring_elem gcd_extended(const ring_elem f, const ring_elem g, ring_elem &u, ring_elem &v) const
Definition tower.cpp:374
Ring subclass for tower polynomial rings (Z/p)[x_0][x_1]...[x_{n-1}] modulo a chain of algebraic exte...
Definition tower.hpp:59
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define VECTOR(T)
Definition newdelete.hpp:78
volatile int x
RingElement — tagged (Ring*, ring_elem) pair, the engine's universal element type.
tbb::flow::graph G
const RingElement * towerExtendedGCD(const RingElement *F, const RingElement *G, const RingElement **A, const RingElement **B)
Definition tower.cpp:446
const RingElement * towerGCD(const RingElement *F, const RingElement *G)
Definition tower.cpp:433