1 #ifndef _BPAS_POLYNOMIAL_H_ 2 #define _BPAS_POLYNOMIAL_H_ 9 #include "Ring/BPASGCDDomain.hpp" 10 #include "Symbol/Symbol.hpp" 12 #include "Utils/TemplateHelpers.hpp" 20 template <
class Ring,
class Derived>
31 virtual Derived&
operator= (
const Ring&) = 0;
32 virtual Derived operator+ (
const Ring&)
const = 0;
33 virtual Derived& operator+= (
const Ring&) = 0;
34 virtual Derived
operator- (
const Ring&)
const = 0;
36 virtual Derived& operator-= (
const Ring&) = 0;
37 virtual Derived operator* (
const Ring&)
const = 0;
38 virtual Derived& operator*= (
const Ring&) = 0;
40 virtual Integer degree()
const = 0;
41 virtual Ring leadingCoefficient()
const = 0;
42 virtual Ring trailingCoefficient()
const = 0;
43 virtual bool isConstantTermZero()
const = 0;
44 virtual Integer numberOfTerms()
const = 0;
50 template <
class Ring,
class Derived>
53 private Derived_from<Ring, BPASIntegralDomain<Ring>> {
60 template <
class Ring,
class Derived>
63 private Derived_from<Ring, BPASGCDDomain<Ring>> {
64 virtual Ring content()
const = 0;
65 virtual Derived primitivePart()
const = 0;
71 template <
class Ring,
class Derived>
72 class BPASIntegralPolynomialTester :
public std::conditional<std::is_base_of<BPASIntegralDomain<Ring>, Ring>::value, BPASIntegralPolynomial<Ring, Derived>, BPASBasePolynomial<Ring, Derived>>::type {};
80 template <
class Ring,
class Derived>
81 class BPASPolynomial :
public std::conditional<std::is_base_of<BPASGCDDomain<Ring>, Ring>::value,
82 BPASGCDPolynomial<Ring, Derived>, BPASIntegralPolynomialTester<Ring, Derived> >::type {};
87 template <
class Ring,
class Derived>
92 virtual void differentiate() = 0;
93 virtual void differentiate(
int) = 0;
94 virtual Derived derivative()
const = 0;
95 virtual Derived derivative(
int)
const = 0;
96 virtual Ring evaluate(
const Ring& r)
const = 0;
97 virtual Derived monicDivide(
const Derived&) = 0;
98 virtual Derived monicDivide(
const Derived&, Derived*)
const = 0;
99 virtual Derived lazyPseudoDivide(
const Derived&, Ring*, Ring*) = 0;
100 virtual Derived lazyPseudoDivide(
const Derived&, Derived*, Ring*, Ring*)
const = 0;
101 virtual Derived pseudoDivide(
const Derived&, Ring*) = 0;
102 virtual Derived pseudoDivide(
const Derived&, Derived*, Ring*)
const = 0;
103 virtual Ring coefficient(
int)
const = 0;
104 virtual void setCoefficient(
int,
const Ring&) = 0;
105 virtual void setVariableName (
const Symbol&) = 0;
106 virtual Symbol variable()
const = 0;
108 virtual Derived& operator<<= (
int) = 0;
109 virtual Derived operator>> (
int)
const = 0;
110 virtual Derived& operator>>= (
int) = 0;
116 template <
class Ring,
class Derived>
124 virtual void differentiate(
const Symbol&) = 0;
125 virtual void differentiate(
const Symbol&,
int) = 0;
126 virtual Derived derivative(
const Symbol&)
const = 0;
127 virtual Derived derivative(
const Symbol&,
int)
const = 0;
135 virtual Derived evaluate(
int,
const Symbol*,
const Ring*)
const = 0;
136 virtual Derived evaluate(
const std::vector<Symbol>&,
const std::vector<Ring>&)
const = 0;
138 virtual int numberOfVariables()
const = 0;
139 virtual int numberOfRingVariables()
const = 0;
142 virtual Ring coefficient(
int,
const int*)
const = 0;
143 virtual Ring coefficient(
const std::vector<int>& v)
const = 0;
144 virtual void setCoefficient(
int,
const int*,
const Ring& r) = 0;
145 virtual void setCoefficient(
const std::vector<int>& v,
const Ring& r) = 0;
148 virtual void setRingVariables (
const std::vector<Symbol>& xs) = 0;
150 virtual std::vector<Symbol> ringVariables()
const = 0;
153 virtual std::vector<Symbol> variables()
const = 0;
165 template <
class Ring,
class Derived>
169 virtual Derived initial()
const = 0;
170 virtual Symbol mainVariable()
const = 0;
171 virtual int mainDegree()
const = 0;
172 virtual Derived rank()
const = 0;
173 virtual Derived tail()
const = 0;
174 virtual Derived head()
const = 0;
175 virtual Derived separant()
const = 0;
185 template <
class Domain,
class Derived>
195 template <
class Field,
class RecursiveFieldPoly>
197 private Derived_from<Field, BPASField<Field>>,
198 private Derived_from<RecursiveFieldPoly, BPASRecursivelyViewedPolynomial<Field,RecursiveFieldPoly>>
205 virtual int numberOfVariables()
const = 0;
206 virtual std::vector<Symbol> variables()
const = 0;
208 virtual RecursiveFieldPoly select(
const Symbol&)
const = 0;
211 virtual RecursiveFieldPoly pseudoDivide (
const RecursiveFieldPoly&, std::vector<RecursiveFieldPoly>*, RecursiveFieldPoly*)
const = 0;
212 virtual RecursiveFieldPoly normalForm (
const RecursiveFieldPoly&, std::vector<RecursiveFieldPoly>*)
const = 0;
219 template <
class Field,
class RecursiveFieldPoly>
232 template <
class Field,
class RecursiveFieldPoly>
An abstract class defining the interface of a commutative ring.
Definition: BPASRing.hpp:76
An abstract class defining the interface of a field of fractions.
Definition: BPASFieldOfFractions.hpp:16
An abstract class defining the interface of a GCD domain.
Definition: BPASGCDDomain.hpp:14
An abstract class defining the interface of a zero-dimensional regular chain.
Definition: polynomial.h:233
virtual Derived & operator=(const Ring &)=0
In addition to the ring arithmetic for Derived defined by BPASRing polynomials must do arithmetic wit...
An abstract class defining the interface of a rational function.
Definition: polynomial.h:186
friend std::ostream & operator<<(std::ostream &ostream, const Derived &d)
Output operator.
Definition: BPASRing.hpp:201
An abstract class defining the interface of a polynomial over an arbitrary BPASRing.
Definition: polynomial.h:81
virtual Derived operator-() const =0
Negation.
An abstract class defining the interface of a multivariate polynomial over an arbitrary BPASRing...
Definition: polynomial.h:117
Used by BPASPolynomial for compile-time template introspection.
Definition: polynomial.h:72
An arbitrary-precision Integer.
Definition: Integer.hpp:22
Abstract Polynomial Classes.
Definition: polynomial.h:21
An abstract class defining the interface of a univariate polynomial over an arbitrary BPASRing...
Definition: polynomial.h:88
An abstract class defining the interface of a triangular set.
Definition: polynomial.h:196
An encapsulation of a mathematical symbol.
Definition: Symbol.hpp:23
An abstract class defining the interface of a polynomial over an arbitrary BPASGCDDomain.
Definition: polynomial.h:61
An abstract class defining the interface of a regular chain.
Definition: polynomial.h:220
An abstract class defining the interface of a polynomial over an arbitrary BPASIntegralDomain.
Definition: polynomial.h:51
An abstract class defining the interface of an integral domain.
Definition: BPASIntegralDomain.hpp:14
An abstract class defining the interface of a multivariate polynomial that can be viewed recursively...
Definition: polynomial.h:166