Macaulay2 Engine
Loading...
Searching...
No Matches
frac.hpp
Go to the documentation of this file.
1// Copyright 1996 Michael E. Stillman.
2#ifndef _frac_hh_
3#define _frac_hh_
4
36
37#include "monoid.hpp"
38#include "ring.hpp"
39#include "polyring.hpp"
40
46
61class FractionField : public Ring
62{
63 const PolyRingFlat *R_; // Base ring. Assumed to be a domain.
64 bool use_gcd_simplify; // Use built in gcd only if this is frac(ZZ[xs]) or
65 // frac(ZZ/p[xs])
66 // When we (if we) change fractions to be flat, then this
67 // restriction should go away.
68
70 frac_elem *new_frac_elem() const;
71 void simplify(frac_elem *f) const;
73
74 protected:
76 virtual ~FractionField() {}
77 bool initialize_frac(const PolyRingFlat *R);
78
79 public:
80 static FractionField *create(const PolyRingFlat *R);
81
83 const FractionField *cast_to_FractionField() const { return this; }
84 const Ring *get_ring() const { return R_; }
85 unsigned long get_precision() const { return R_->get_precision(); }
88 ring_elem fraction(const ring_elem top, const ring_elem bottom) const;
89
90 // The following are all the routines required by 'ring'
91 virtual bool is_fraction_field() const { return true; }
92 virtual bool is_graded() const { return R_->is_graded(); }
93 virtual CoefficientType coefficient_type() const;
94 virtual int n_fraction_vars() const;
95
96 virtual void text_out(buffer &o) const;
97
98 virtual unsigned int computeHashValue(const ring_elem a) const;
99
100 virtual ring_elem from_long(long n) const;
101 virtual ring_elem from_int(mpz_srcptr n) const;
102 virtual bool from_rational(mpq_srcptr n, ring_elem &result) const;
103 virtual ring_elem var(int v) const;
104
105 virtual int index_of_var(const ring_elem a) const;
106 virtual M2_arrayint support(const ring_elem a) const;
107
108 void lower_content(ring_elem &c, const ring_elem g) const;
109
110 virtual bool promote(const Ring *R,
111 const ring_elem f,
112 ring_elem &result) const;
113 virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const;
114
115 virtual bool is_unit(const ring_elem f) const;
116 virtual bool is_zero(const ring_elem f) const;
117 virtual bool is_equal(const ring_elem f, const ring_elem g) const;
118 virtual int compare_elems(const ring_elem f, const ring_elem g) const;
119
120 virtual bool is_homogeneous(const ring_elem f) const;
121 virtual bool multi_degree(const ring_elem f, monomial d) const;
122 virtual void degree_weights(const ring_elem f,
123 const std::vector<int> &wts,
124 int &lo,
125 int &hi) const;
126 virtual ring_elem homogenize(const ring_elem f,
127 int v,
128 int deg,
129 const std::vector<int> &wts) const;
130 virtual ring_elem homogenize(const ring_elem f,
131 int v,
132 const std::vector<int> &wts) const;
133
134 virtual ring_elem copy(const ring_elem f) const;
135 virtual void remove(ring_elem &f) const;
136
137 void internal_negate_to(ring_elem &f) const;
138 void internal_add_to(ring_elem &f, ring_elem &g) const;
139 void internal_subtract_to(ring_elem &f, ring_elem &g) const;
140
141 virtual ring_elem negate(const ring_elem f) const;
142 virtual ring_elem add(const ring_elem f, const ring_elem g) const;
143 virtual ring_elem subtract(const ring_elem f, const ring_elem g) const;
144 virtual ring_elem mult(const ring_elem f, const ring_elem g) const;
145 virtual ring_elem power(const ring_elem f, mpz_srcptr n) const;
146 virtual ring_elem power(const ring_elem f, int n) const;
147 virtual ring_elem invert(const ring_elem f) const;
148 virtual ring_elem divide(const ring_elem f, const ring_elem g) const;
149
150 virtual void syzygy(const ring_elem a,
151 const ring_elem b,
152 ring_elem &x,
153 ring_elem &y) const;
154
155 virtual ring_elem random() const;
156
157 virtual void elem_text_out(buffer &o,
158 const ring_elem f,
159 bool p_one = true,
160 bool p_plus = false,
161 bool p_parens = false) const;
162
163 virtual ring_elem eval(const RingMap *map,
164 const ring_elem f,
165 int first_var) const;
166
167 virtual int n_terms(const ring_elem f) const;
168 virtual ring_elem term(const ring_elem a, const_monomial m) const;
169 virtual ring_elem lead_coeff(const ring_elem f) const;
170 virtual ring_elem get_coeff(const ring_elem f, const_monomial m) const;
171 virtual ring_elem get_terms(int nvars0,
172 const ring_elem f,
173 int lo,
174 int hi) const;
175};
176
177#endif
178
179// Local Variables:
180// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
181// indent-tabs-mode: nil
182// End:
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 frac.cpp:232
virtual bool promote(const Ring *R, const ring_elem f, ring_elem &result) const
Definition frac.cpp:308
virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const
Definition frac.cpp:325
virtual ring_elem subtract(const ring_elem f, const ring_elem g) const
Definition frac.cpp:491
void internal_subtract_to(ring_elem &f, ring_elem &g) const
Definition frac.cpp:436
virtual int compare_elems(const ring_elem f, const ring_elem g) const
Definition frac.cpp:388
virtual ring_elem term(const ring_elem a, const_monomial m) const
Definition frac.cpp:700
virtual bool is_zero(const ring_elem f) const
Definition frac.cpp:366
virtual void text_out(buffer &o) const
Definition frac.cpp:62
virtual int index_of_var(const ring_elem a) const
Definition frac.cpp:286
virtual ring_elem homogenize(const ring_elem f, int v, int deg, const std::vector< int > &wts) const
Definition frac.cpp:662
const Ring * get_ring() const
Definition frac.hpp:84
virtual ring_elem mult(const ring_elem f, const ring_elem g) const
Definition frac.cpp:514
virtual ring_elem random() const
Definition frac.cpp:220
virtual ring_elem get_terms(int nvars0, const ring_elem f, int lo, int hi) const
Definition frac.cpp:709
virtual bool is_homogeneous(const ring_elem f) const
Definition frac.cpp:632
static FractionField * create(const PolyRingFlat *R)
Definition frac.cpp:55
virtual unsigned int computeHashValue(const ring_elem a) const
Definition frac.cpp:81
virtual ring_elem get_coeff(const ring_elem f, const_monomial m) const
Definition frac.cpp:705
frac_elem * new_frac_elem() const
Definition frac.cpp:88
virtual ring_elem eval(const RingMap *map, const ring_elem f, int first_var) const
Definition frac.cpp:611
ring_elem set_non_unit_frac(ring_elem top) const
Definition frac.cpp:89
virtual ring_elem invert(const ring_elem f) const
Definition frac.cpp:581
FractionField * cast_to_FractionField()
Definition frac.hpp:82
ring_elem numerator(ring_elem f) const
Definition frac.cpp:69
void lower_content(ring_elem &c, const ring_elem g) const
Definition frac.cpp:191
virtual ring_elem add(const ring_elem f, const ring_elem g) const
Definition frac.cpp:468
frac_elem * make_elem(ring_elem a, ring_elem b) const
Definition frac.cpp:182
void simplify(frac_elem *f) const
Definition frac.cpp:108
virtual CoefficientType coefficient_type() const
Definition frac.cpp:17
virtual bool from_rational(mpq_srcptr n, ring_elem &result) const
Definition frac.cpp:268
bool use_gcd_simplify
Definition frac.hpp:64
const PolyRingFlat * R_
Definition frac.hpp:63
virtual ring_elem divide(const ring_elem f, const ring_elem g) const
Definition frac.cpp:589
virtual ring_elem copy(const ring_elem f) const
Definition frac.cpp:397
virtual int n_fraction_vars() const
Definition frac.cpp:26
virtual void degree_weights(const ring_elem f, const std::vector< int > &wts, int &lo, int &hi) const
Definition frac.cpp:652
const FractionField * cast_to_FractionField() const
Definition frac.hpp:83
virtual ring_elem power(const ring_elem f, mpz_srcptr n) const
Exponentiation. This is the default function, if a class doesn't define this.
Definition frac.cpp:549
virtual bool multi_degree(const ring_elem f, monomial d) const
Definition frac.cpp:641
virtual bool is_equal(const ring_elem f, const ring_elem g) const
Definition frac.cpp:371
virtual ring_elem negate(const ring_elem f) const
Definition frac.cpp:459
bool initialize_frac(const PolyRingFlat *R)
Definition frac.cpp:27
virtual bool is_graded() const
Definition frac.hpp:92
unsigned long get_precision() const
Definition frac.hpp:85
ring_elem denominator(ring_elem f) const
Definition frac.cpp:75
virtual int n_terms(const ring_elem f) const
Definition frac.cpp:699
ring_elem fraction(const ring_elem top, const ring_elem bottom) const
Definition frac.cpp:102
void internal_negate_to(ring_elem &f) const
Definition frac.cpp:407
virtual bool is_unit(const ring_elem f) const
Definition frac.cpp:361
virtual ring_elem from_int(mpz_srcptr n) const
Definition frac.cpp:260
virtual ring_elem lead_coeff(const ring_elem f) const
Definition frac.cpp:704
virtual ring_elem from_long(long n) const
Definition frac.cpp:252
virtual M2_arrayint support(const ring_elem a) const
Definition frac.cpp:295
void internal_add_to(ring_elem &f, ring_elem &g) const
Definition frac.cpp:413
virtual void syzygy(const ring_elem a, const ring_elem b, ring_elem &x, ring_elem &y) const
Definition frac.cpp:601
virtual bool is_fraction_field() const
Definition frac.hpp:91
FractionField()
Definition frac.hpp:75
virtual ring_elem var(int v) const
Definition frac.cpp:278
virtual void remove(ring_elem &f) const
Definition frac.cpp:406
virtual ~FractionField()
Definition frac.hpp:76
Engine-side fraction field of a polynomial domain R_.
Definition frac.hpp:62
PolynomialRing subclass whose elements are represented as a single flat Nterm* linked list (no fracti...
Definition polyring.hpp:466
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
#define monomial
Definition gb-toric.cpp:11
const int * const_monomial
Definition imonorder.hpp:45
VALGRIND_MAKE_MEM_DEFINED & result(result)
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
volatile int x
PolynomialRing — abstract polynomial-ring base, the engine's most-reused class.
Ring — the legacy abstract base class for every coefficient and polynomial ring.
ring_elem numer
Definition frac.hpp:43
ring_elem denom
Definition frac.hpp:44