Macaulay2 Engine
Loading...
Searching...
No Matches
dpoly.hpp
Go to the documentation of this file.
1#ifndef __dpoly_h_
2#define __dpoly_h_
3
38
39// Code for univariate polynomials over algebraic extensions of QQ
40// and over finite fields
41
42// The basic operations:
43// "monic gcd mod p" over extension fields
44// modular gcd algorithm
45// Later, we will extend this to multivariate polynomials and function fields
46
47#include <cstdio>
48#include <sstream>
49#include <vector>
50
51#include "ExponentVector.hpp"
52#include "ringelem.hpp"
53#include "buffer.hpp"
54
55class Tower;
56class DPolyTraverser;
57
58typedef struct TowerPolynomialStruct *TowerPolynomial;
59//typedef const struct TowerPolynomialStruct *const_poly;
60
64
81{
82 int deg;
83 int len;
84 union
85 {
86 long *ints; // array of integers. at level == 0
87 TowerPolynomial *polys; // array of more ptrs to poly structs, at level > 0
88 } arr;
89};
90
109class DPoly
110{
111 friend class DPolyTraverser;
112 int nvars;
113 int nlevels; // #vars is nlevels+1
114 TowerPolynomial *extensions;
115 long charac;
116
117 private:
118 void initialize(long p, int nvars0, const TowerPolynomial* ext0);
119
120 void reset_degree_0(TowerPolynomial &f); // possibly sets f to 0
121 void reset_degree_n(int level, TowerPolynomial &f); // ditto
122
123 void mult_by_coeff_0(TowerPolynomial &f, long b);
124 void mult_by_coeff_n(int level, TowerPolynomial &f, TowerPolynomial b);
125 // f *= b. b should have level 'level-1'.
126
127 void make_monic_0(TowerPolynomial &f, long &result_multiplier);
128 void make_monic_n(int level, TowerPolynomial &f, TowerPolynomial &result_multiplier);
129
130 bool make_monic3(int level, TowerPolynomial &u1, TowerPolynomial &u2, TowerPolynomial &u3);
131
132 static TowerPolynomial read_poly_0(char *&str);
133 static TowerPolynomial read_poly_n(char *&str, int level);
134
135 void add_in_place_0(TowerPolynomial &f, const TowerPolynomial g);
136 void add_in_place_n(int level, TowerPolynomial &f, const TowerPolynomial g);
137
138 void subtract_in_place_0(TowerPolynomial &f, const TowerPolynomial g);
139 void subtract_in_place_n(int level, TowerPolynomial &f, const TowerPolynomial g);
140
141 TowerPolynomial mult_0(const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension);
142 TowerPolynomial mult_n(int level, const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension);
143
144 TowerPolynomial random_0(int deg);
145 TowerPolynomial random_n(int level, int deg);
146
147 TowerPolynomial diff_0(const TowerPolynomial f);
148 TowerPolynomial diff_n(int level, int whichvar, const TowerPolynomial f);
149
150 TowerPolynomial mult_by_int_0(long c, const TowerPolynomial f);
151 TowerPolynomial mult_by_int_n(int level, long c, const TowerPolynomial f);
152
153 public:
154 int degree_of_extension(int level); // if negative, then that variable is
155 // transcendental over lower vars
156 bool down_level(int newlevel, int oldlevel, TowerPolynomial &f);
157
158 static void increase_size_0(int newdeg, TowerPolynomial &f);
159 static void increase_size_n(int newdeg, TowerPolynomial &f);
160 static TowerPolynomial alloc_poly_n(int deg, TowerPolynomial *elems = nullptr);
161 static TowerPolynomial alloc_poly_0(int deg, long *elems = nullptr);
162 static void dealloc_poly(TowerPolynomial &f);
163
164 static void display_poly(FILE *fil, int level, const TowerPolynomial f);
165 static TowerPolynomial read_poly(char *&str, int level);
166 static std::ostream &append_to_stream(std::ostream &o,
167 int level,
168 const TowerPolynomial f);
169 static char *to_string(int level, const TowerPolynomial f);
170
171 static bool is_equal(int level, const TowerPolynomial f, const TowerPolynomial g);
172 static TowerPolynomial copy(int level, const TowerPolynomial f);
173
174 static TowerPolynomial from_long(int level, long c); // c should be reduced mod p
175
176 static bool is_zero(TowerPolynomial f) { return f == nullptr; }
177 void remove(int level, TowerPolynomial &f);
178
179 int compare(int level, const TowerPolynomial f, const TowerPolynomial g); // this is a total order
180
181 TowerPolynomial random(int level, int deg);
182 TowerPolynomial random(int level); // obtains a random element, using only variables
183 // which are algebraic over the base
184
185 TowerPolynomial var(int level, int v); // make the variable v (but at level 'level')
186
187 void add_term(int level,
188 TowerPolynomial &result,
189 long coeff,
190 exponents_t exp) const; // modifies result.
191 // exp is an array [0..level-1] of exponent values for each variable
192 // 0..level-1
193 // the outer variable is at index 0.
194 // coeff is an already normalized coefficient.
195
196 void negate_in_place(int level, TowerPolynomial &f);
197 void add_in_place(int level, TowerPolynomial &f, const TowerPolynomial g);
198 void subtract_in_place(int level, TowerPolynomial &f, const TowerPolynomial g);
199 TowerPolynomial mult_by_int(int level, long c, const TowerPolynomial f);
200 TowerPolynomial mult(int level, const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension);
201 void remainder(int level, TowerPolynomial &f, const TowerPolynomial g);
202 TowerPolynomial division_in_place_monic(int level, TowerPolynomial &f, const TowerPolynomial g);
203 bool division_in_place(int level, TowerPolynomial &f, const TowerPolynomial g, TowerPolynomial &result_quot);
204
205 void pseudo_remainder(int level, TowerPolynomial &f, const TowerPolynomial g);
206 TowerPolynomial pseudo_division(int level, TowerPolynomial &f, const TowerPolynomial g);
207
208 TowerPolynomial gcd(int level, const TowerPolynomial f, const TowerPolynomial g);
209 TowerPolynomial gcd_coefficients(int level,
210 const TowerPolynomial f,
211 const TowerPolynomial g,
212 TowerPolynomial &result_u,
213 TowerPolynomial &result_v);
214 TowerPolynomial resultant(int level, TowerPolynomial f, TowerPolynomial g);
215
216 void make_monic(int level, TowerPolynomial &f);
217 TowerPolynomial invert(int level, const TowerPolynomial a);
218
219 void normal_form(int level,
220 TowerPolynomial &f); // hmmm, I need to think this one through...
221
222 void subtract_multiple_to(int level, TowerPolynomial &f, long a, int i, TowerPolynomial g);
223
224 void elem_text_out(buffer &o,
225 int level,
226 const TowerPolynomial f,
227 bool p_one,
228 bool p_plus,
229 bool p_parens,
230 M2_ArrayString names) const;
231
232 void extensions_text_out(buffer &o, M2_ArrayString names) const;
233
234 int degree(int level, int var, const TowerPolynomial f) const;
235 TowerPolynomial diff(int level, int var, const TowerPolynomial f);
236 TowerPolynomial power_mod(int level, const TowerPolynomial f, mpz_srcptr n, const TowerPolynomial g); // f^n mod g
237 TowerPolynomial lowerP(int level, const TowerPolynomial f);
238
239 static bool is_one(int level, const TowerPolynomial f);
240 int index_of_var(int level, const TowerPolynomial f) const;
241 void degrees_of_vars(int level,
242 const TowerPolynomial f,
243 std::vector<int> &result_max_degs) const;
244
245 // DPoly management
247 DPoly(long p, int nvars0, const TowerPolynomial* extensions = nullptr);
248};
249
265class DRing : public our_new_delete
266{
267 int level;
268 mutable DPoly D;
269 long P;
270
271 DRing(long charac, int nvars, const TowerPolynomial *exts);
272
273 public:
275 typedef TowerPolynomial elem;
276
277 DPoly *getDPoly() const { return &D; }
278 static DRing *create(long p, int nvars0, const TowerPolynomial *ext0);
279 // ext0 should be an array of poly's of level 'nvars0'? 0..nvars0-1
280
281 void init_set(elem &result, elem a) const { result = a; }
282 void set_zero(elem &result) const { result = nullptr; }
283 void set(elem &result, elem a) const
284 {
285 D.remove(level, result);
286 result = a;
287 }
288
289 bool is_zero(elem result) const { return result == nullptr; }
290 bool invert(elem &result, elem a) const
291 // returns true if invertible. Returns true if not, and then result is set to
292 // 0.
293 {
294 result = D.invert(level, a);
295 return result != nullptr;
296 }
297
298 void add_term(elem &result, long coeff, exponents_t exp) const;
299
300 void add(elem &result, elem a, elem b) const
301 {
302 if (a == nullptr)
303 result = b;
304 else if (b == nullptr)
305 result = a;
306 else
307 {
308 TowerPolynomial a1 = D.copy(level, a);
309 D.add_in_place(level, a1, b);
310 result = a1;
311 }
312 }
313
314 void subtract(elem &result, elem a, elem b) const
315 {
316 TowerPolynomial a1 = D.copy(level, a);
317 D.subtract_in_place(level, a1, b);
318 result = a1;
319 }
320
322 {
323 if (a == nullptr || b == nullptr) return;
324 elem ab = D.mult(level, a, b, true);
325 D.subtract_in_place(level, result, ab);
326 }
327
328 void mult(elem &result, elem a, elem b) const
329 {
330 if (a == nullptr || b == nullptr)
331 result = nullptr;
332 else
333 result = D.mult(level, a, b, true);
334 }
335
336 void divide(elem &result, elem a, elem b) const
337 {
338 if (a == nullptr || b == nullptr)
339 result = nullptr;
340 else
341 {
342 elem a1 = D.copy(level, a);
343 if (!D.division_in_place(level, a1, b, result)) result = nullptr;
344 D.dealloc_poly(a1);
345 }
346 }
347
348 void remainder(elem &result, elem a, elem b) const
349 {
350 if (a == nullptr || b == nullptr)
351 result = nullptr;
352 else
353 {
354 result = D.copy(level, a);
355 D.remainder(level, result, b);
356 }
357 }
358
359 void to_ring_elem(ring_elem &result, const elem a) const
360 {
361 TowerPolynomial h = D.copy(level, a);
363 }
364
365 void from_ring_elem(elem &result, const ring_elem &a) const
366 {
367 TowerPolynomial a1 = reinterpret_cast<TowerPolynomial>(a.poly_val);
368 result = D.copy(level, a1);
369 }
370
371 void swap(elem &a, elem &b) const
372 {
373 elem tmp = a;
374 a = b;
375 b = tmp;
376 }
377
378 bool is_one(const TowerPolynomial f) { return D.is_one(level, f); }
379 bool is_equal(const TowerPolynomial f, const TowerPolynomial g) { return D.is_equal(level, f, g); }
380 bool compare(const TowerPolynomial f, const TowerPolynomial g) { return D.compare(level, f, g); }
381 bool is_unit(const TowerPolynomial g); // what does this really do?
382
383 void set_var(TowerPolynomial &result, int n)
384 {
385 // n from 0..nvars-1, sets result to 0 f n is out of range
386 result = D.var(level, n);
387 }
388
389 void set_from_long(TowerPolynomial &result, long r)
390 {
391 r = r % P;
392 if (r < 0) r += P;
393 result = D.from_long(level, r);
394 }
395
396 void set_from_int(TowerPolynomial &result, mpz_srcptr r); // written
397
398 bool set_from_mpq(TowerPolynomial &result, mpq_srcptr r); // written
399
400 void set_random(TowerPolynomial &result) { result = D.random(level); }
401 void elem_text_out(buffer &o,
402 const TowerPolynomial f,
403 bool p_one,
404 bool p_plus,
405 bool p_parens,
406 M2_ArrayString names) const;
407
408 void gcd(TowerPolynomial &result, const TowerPolynomial f, const TowerPolynomial g)
409 {
410 result = D.gcd(level, f, g);
411 }
412
413 void gcd_coefficients(TowerPolynomial &result_gcd,
414 TowerPolynomial &result_u,
415 TowerPolynomial &result_v,
416 const TowerPolynomial f,
417 const TowerPolynomial g)
418 {
419 result_gcd = D.gcd_coefficients(level, f, g, result_u, result_v);
420 }
421
422 void extensions_text_out(buffer &o, M2_ArrayString names) const
423 {
424 D.extensions_text_out(o, names);
425 }
426
427 int degree(int var, const TowerPolynomial f) const { return D.degree(level, var, f); }
428 void diff(int var, TowerPolynomial &result, const TowerPolynomial f) const
429 {
430 result = D.diff(level, var, f);
431 }
432 int extension_degree(int firstvar); // returns -1 if infinite
433 void power_mod(TowerPolynomial &result, const TowerPolynomial f, mpz_srcptr n, const TowerPolynomial g) const
434 {
435 result = D.power_mod(level, f, n, g);
436 } // f^n mod g
437 void lowerP(TowerPolynomial &result, const TowerPolynomial f) { result = D.lowerP(level, f); }
438 int index_of_var(const TowerPolynomial f) const { return D.index_of_var(level, f); }
439 void degrees_of_vars(const TowerPolynomial f, std::vector<int> &result) const
440 {
441 result.resize(level + 1);
442 for (size_t i = 0; i <= level; i++) result[i] = 0;
443 D.degrees_of_vars(level, f, result);
444 }
445};
446
463{
464 const DPoly *D;
465
466 bool traverse1(int level, const TowerPolynomial g, exponents_t exp);
467
468 protected:
469 virtual bool viewTerm(long coeff, const_exponents exp) = 0;
470
471 public:
472 DPolyTraverser(const DRing *D0) : D(D0->getDPoly()) {}
473 virtual ~DPolyTraverser() {}
474 void traverse(const TowerPolynomial f);
475};
476
477// Format for polynomials in a file:
478// [[,,[,,1,2]],,[1,3,4,,8]]
479
480// write following functions:
481// read_poly, read_polys
482// write_poly, write_polys
483// add, subtract
484
485#endif
486
487// Local Variables:
488// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
489// indent-tabs-mode: nil
490// End:
exponents::ConstExponents const_exponents
exponents::Exponents exponents_t
Dense exponent-vector template [e_0, ..., e_{nvars-1}] for monomial operations.
Append-only GC-backed byte buffer used throughout the engine for text output.
void subtract_in_place(int level, TowerPolynomial &f, const TowerPolynomial g)
Definition dpoly.cpp:794
TowerPolynomial * extensions
Definition dpoly.hpp:114
static void increase_size_n(int newdeg, TowerPolynomial &f)
Definition dpoly.cpp:249
void make_monic(int level, TowerPolynomial &f)
Definition dpoly.cpp:922
void remove(int level, TowerPolynomial &f)
void mult_by_coeff_0(TowerPolynomial &f, long b)
Definition dpoly.cpp:872
void subtract_multiple_to(int level, TowerPolynomial &f, long a, int i, TowerPolynomial g)
static TowerPolynomial read_poly(char *&str, int level)
Definition dpoly.cpp:383
static TowerPolynomial alloc_poly_n(int deg, TowerPolynomial *elems=nullptr)
Definition dpoly.cpp:265
TowerPolynomial mult_n(int level, const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension)
Definition dpoly.cpp:818
TowerPolynomial random(int level, int deg)
Definition dpoly.cpp:549
TowerPolynomial pseudo_division(int level, TowerPolynomial &f, const TowerPolynomial g)
Definition dpoly.cpp:1104
static TowerPolynomial copy(int level, const TowerPolynomial f)
Definition dpoly.cpp:483
DPoly(long p, int nvars0, const TowerPolynomial *extensions=nullptr)
Definition dpoly.cpp:95
TowerPolynomial diff_0(const TowerPolynomial f)
Definition dpoly.cpp:1326
void reset_degree_n(int level, TowerPolynomial &f)
Definition dpoly.cpp:635
TowerPolynomial var(int level, int v)
Definition dpoly.cpp:515
TowerPolynomial invert(int level, const TowerPolynomial a)
Definition dpoly.cpp:855
int degree_of_extension(int level)
Definition dpoly.cpp:100
void elem_text_out(buffer &o, int level, const TowerPolynomial f, bool p_one, bool p_plus, bool p_parens, M2_ArrayString names) const
Definition dpoly.cpp:144
TowerPolynomial gcd_coefficients(int level, const TowerPolynomial f, const TowerPolynomial g, TowerPolynomial &result_u, TowerPolynomial &result_v)
Definition dpoly.cpp:1159
void mult_by_coeff_n(int level, TowerPolynomial &f, TowerPolynomial b)
Definition dpoly.cpp:886
void remainder(int level, TowerPolynomial &f, const TowerPolynomial g)
Definition dpoly.cpp:1089
TowerPolynomial random_0(int deg)
Definition dpoly.cpp:533
TowerPolynomial power_mod(int level, const TowerPolynomial f, mpz_srcptr n, const TowerPolynomial g)
Definition dpoly.cpp:1375
void add_in_place(int level, TowerPolynomial &f, const TowerPolynomial g)
Definition dpoly.cpp:722
static std::ostream & append_to_stream(std::ostream &o, int level, const TowerPolynomial f)
Definition dpoly.cpp:389
void add_in_place_n(int level, TowerPolynomial &f, const TowerPolynomial g)
Definition dpoly.cpp:691
static bool is_equal(int level, const TowerPolynomial f, const TowerPolynomial g)
Definition dpoly.cpp:459
void make_monic_n(int level, TowerPolynomial &f, TowerPolynomial &result_multiplier)
Definition dpoly.cpp:912
long charac
Definition dpoly.hpp:115
TowerPolynomial diff_n(int level, int whichvar, const TowerPolynomial f)
Definition dpoly.cpp:1343
static bool is_zero(TowerPolynomial f)
Definition dpoly.hpp:176
void degrees_of_vars(int level, const TowerPolynomial f, std::vector< int > &result_max_degs) const
Definition dpoly.cpp:1477
TowerPolynomial mult_by_int_0(long c, const TowerPolynomial f)
Definition dpoly.cpp:1292
void pseudo_remainder(int level, TowerPolynomial &f, const TowerPolynomial g)
Definition dpoly.cpp:1097
static void increase_size_0(int newdeg, TowerPolynomial &f)
Definition dpoly.cpp:233
~DPoly()
Definition dpoly.hpp:246
TowerPolynomial random_n(int level, int deg)
Definition dpoly.cpp:541
friend class DPolyTraverser
Definition dpoly.hpp:111
TowerPolynomial mult_0(const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension)
Definition dpoly.cpp:802
TowerPolynomial mult(int level, const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension)
Definition dpoly.cpp:846
TowerPolynomial diff(int level, int var, const TowerPolynomial f)
Definition dpoly.cpp:1368
void subtract_in_place_0(TowerPolynomial &f, const TowerPolynomial g)
Definition dpoly.cpp:730
TowerPolynomial gcd(int level, const TowerPolynomial f, const TowerPolynomial g)
Definition dpoly.cpp:1126
void add_in_place_0(TowerPolynomial &f, const TowerPolynomial g)
Definition dpoly.cpp:670
static TowerPolynomial read_poly_n(char *&str, int level)
Definition dpoly.cpp:301
int compare(int level, const TowerPolynomial f, const TowerPolynomial g)
Definition dpoly.cpp:560
bool make_monic3(int level, TowerPolynomial &u1, TowerPolynomial &u2, TowerPolynomial &u3)
Definition dpoly.cpp:938
TowerPolynomial lowerP(int level, const TowerPolynomial f)
Definition dpoly.cpp:1421
void initialize(long p, int nvars0, const TowerPolynomial *ext0)
Definition dpoly.cpp:80
static void dealloc_poly(TowerPolynomial &f)
Definition dpoly.cpp:292
void make_monic_0(TowerPolynomial &f, long &result_multiplier)
Definition dpoly.cpp:902
void add_term(int level, TowerPolynomial &result, long coeff, exponents_t exp) const
Definition dpoly.cpp:649
static TowerPolynomial alloc_poly_0(int deg, long *elems=nullptr)
Definition dpoly.cpp:279
void negate_in_place(int level, TowerPolynomial &f)
Definition dpoly.cpp:604
TowerPolynomial mult_by_int(int level, long c, const TowerPolynomial f)
Definition dpoly.cpp:1319
void reset_degree_0(TowerPolynomial &f)
Definition dpoly.cpp:623
static TowerPolynomial read_poly_0(char *&str)
Definition dpoly.cpp:341
int nvars
Definition dpoly.hpp:112
TowerPolynomial resultant(int level, TowerPolynomial f, TowerPolynomial g)
Definition dpoly.cpp:1112
int index_of_var(int level, const TowerPolynomial f) const
Definition dpoly.cpp:1456
static bool is_one(int level, const TowerPolynomial f)
Definition dpoly.cpp:595
void subtract_in_place_n(int level, TowerPolynomial &f, const TowerPolynomial g)
Definition dpoly.cpp:762
int nlevels
Definition dpoly.hpp:113
void extensions_text_out(buffer &o, M2_ArrayString names) const
Definition dpoly.cpp:221
TowerPolynomial mult_by_int_n(int level, long c, const TowerPolynomial f)
Definition dpoly.cpp:1307
void normal_form(int level, TowerPolynomial &f)
static void display_poly(FILE *fil, int level, const TowerPolynomial f)
Definition dpoly.cpp:428
bool down_level(int newlevel, int oldlevel, TowerPolynomial &f)
Definition dpoly.cpp:109
bool division_in_place(int level, TowerPolynomial &f, const TowerPolynomial g, TowerPolynomial &result_quot)
Definition dpoly.cpp:1015
int degree(int level, int var, const TowerPolynomial f) const
Definition dpoly.cpp:1274
static char * to_string(int level, const TowerPolynomial f)
Definition dpoly.cpp:417
TowerPolynomial division_in_place_monic(int level, TowerPolynomial &f, const TowerPolynomial g)
Definition dpoly.cpp:966
static TowerPolynomial from_long(int level, long c)
Definition dpoly.cpp:501
Arithmetic engine for tower-polynomial rings: (Z/p)[x_0][x_1]...[x_{nvars-1}] modulo a chain of exten...
Definition dpoly.hpp:110
const DPoly * D
Definition dpoly.hpp:464
bool traverse1(int level, const TowerPolynomial g, exponents_t exp)
Definition dpoly.cpp:1574
virtual ~DPolyTraverser()
Definition dpoly.hpp:473
void traverse(const TowerPolynomial f)
Definition dpoly.cpp:1564
DPolyTraverser(const DRing *D0)
Definition dpoly.hpp:472
virtual bool viewTerm(long coeff, const_exponents exp)=0
Visitor base class that walks every term of a TowerPolynomial, calling viewTerm(coeff,...
Definition dpoly.hpp:463
void set_random(TowerPolynomial &result)
Definition dpoly.hpp:400
DPoly * getDPoly() const
Definition dpoly.hpp:277
void set_var(TowerPolynomial &result, int n)
Definition dpoly.hpp:383
bool compare(const TowerPolynomial f, const TowerPolynomial g)
Definition dpoly.hpp:380
void swap(elem &a, elem &b) const
Definition dpoly.hpp:371
void power_mod(TowerPolynomial &result, const TowerPolynomial f, mpz_srcptr n, const TowerPolynomial g) const
Definition dpoly.hpp:433
void gcd(TowerPolynomial &result, const TowerPolynomial f, const TowerPolynomial g)
Definition dpoly.hpp:408
void lowerP(TowerPolynomial &result, const TowerPolynomial f)
Definition dpoly.hpp:437
void add_term(elem &result, long coeff, exponents_t exp) const
Definition dpoly.cpp:1556
void from_ring_elem(elem &result, const ring_elem &a) const
Definition dpoly.hpp:365
void set_from_int(TowerPolynomial &result, mpz_srcptr r)
Definition dpoly.cpp:1499
bool is_one(const TowerPolynomial f)
Definition dpoly.hpp:378
void extensions_text_out(buffer &o, M2_ArrayString names) const
Definition dpoly.hpp:422
void to_ring_elem(ring_elem &result, const elem a) const
Definition dpoly.hpp:359
bool is_unit(const TowerPolynomial g)
int degree(int var, const TowerPolynomial f) const
Definition dpoly.hpp:427
long P
Definition dpoly.hpp:269
int extension_degree(int firstvar)
Definition dpoly.cpp:1534
void divide(elem &result, elem a, elem b) const
Definition dpoly.hpp:336
bool is_equal(const TowerPolynomial f, const TowerPolynomial g)
Definition dpoly.hpp:379
bool invert(elem &result, elem a) const
Definition dpoly.hpp:290
void set(elem &result, elem a) const
Definition dpoly.hpp:283
void set_from_long(TowerPolynomial &result, long r)
Definition dpoly.hpp:389
Tower ring_type
Definition dpoly.hpp:274
void remainder(elem &result, elem a, elem b) const
Definition dpoly.hpp:348
void elem_text_out(buffer &o, const TowerPolynomial f, bool p_one, bool p_plus, bool p_parens, M2_ArrayString names) const
Definition dpoly.cpp:1546
bool set_from_mpq(TowerPolynomial &result, mpq_srcptr r)
Definition dpoly.cpp:1510
static DRing * create(long p, int nvars0, const TowerPolynomial *ext0)
Definition dpoly.cpp:1494
int level
Definition dpoly.hpp:267
bool is_zero(elem result) const
Definition dpoly.hpp:289
DRing(long charac, int nvars, const TowerPolynomial *exts)
Definition dpoly.cpp:1489
TowerPolynomial elem
Definition dpoly.hpp:275
void gcd_coefficients(TowerPolynomial &result_gcd, TowerPolynomial &result_u, TowerPolynomial &result_v, const TowerPolynomial f, const TowerPolynomial g)
Definition dpoly.hpp:413
void init_set(elem &result, elem a) const
Definition dpoly.hpp:281
void subtract(elem &result, elem a, elem b) const
Definition dpoly.hpp:314
void add(elem &result, elem a, elem b) const
Definition dpoly.hpp:300
void diff(int var, TowerPolynomial &result, const TowerPolynomial f) const
Definition dpoly.hpp:428
void mult(elem &result, elem a, elem b) const
Definition dpoly.hpp:328
DPoly D
Definition dpoly.hpp:268
void degrees_of_vars(const TowerPolynomial f, std::vector< int > &result) const
Definition dpoly.hpp:439
void subtract_multiple(elem &result, elem a, elem b) const
Definition dpoly.hpp:321
void set_zero(elem &result) const
Definition dpoly.hpp:282
int index_of_var(const TowerPolynomial f) const
Definition dpoly.hpp:438
Single-level view of a tower-polynomial ring: a DPoly plus a fixed working level and a Tower-flavoure...
Definition dpoly.hpp:266
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
int p
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define TOWER_RINGELEM(a)
Definition ringelem.hpp:214
ring_elem — the universal value type carried by every Ring* in the engine.
union TowerPolynomialStruct::@077201160245317346022251034307367344162303106102 arr
TowerPolynomial * polys
Definition dpoly.hpp:87
Heap-allocated node of a tower polynomial: a dense degree-indexed coefficient array that recurses thr...
Definition dpoly.hpp:81
Nterm * poly_val
Definition ringelem.hpp:86