1 #ifndef _UZPOLYNOMIAL_H_ 2 #define _UZPOLYNOMIAL_H_ 5 #include "../polynomial.h" 21 for (
int i = 0; i < n; ++i)
34 static mpz_class characteristic;
44 coef =
new mpz_class[1];
55 coef =
new mpz_class[n];
67 coef =
new mpz_class[1];
68 coef[0] = e.get_mpz();
71 if (e.get_den() == 1) {
72 coef =
new mpz_class[1];
73 coef[0] = e.get_num().get_mpz();
76 std::cout <<
"BPAS error, try to construct a rational number in DUZP." << std::endl;
87 coef =
new mpz_class[n];
88 std::copy(b.coef, b.coef+n, coef);
117 inline Integer trailingCoefficient()
const {
118 for(
int i = 0; i <= curd; ++i) {
126 inline Integer numberOfTerms()
const {
128 for (
size_t i = 0; i <= curd; ++i) {
142 std::cout <<
"BPAS: warning, try to access a non-exist coefficient " << k <<
" from DUZP(" << n <<
")." << std::endl;
152 if (k < 0 || k >= n) {
165 if (k >= n || k < 0) {
166 std::cout <<
"BPAS: error, DUZP(" << n <<
") but trying to access " << k <<
"." << std::endl;
170 if (k > curd && value != 0)
213 if (n) {
delete [] coef; n = 0; }
217 coef =
new mpz_class[n];
218 std::copy(b.coef, b.coef+n, coef);
234 return !(isEqual(b));
253 return (coef[0] == 0);
274 return (coef[0] == 1);
286 for (
int i = 1; i < n; ++i)
297 return (coef[0] == -1);
309 for (
int i = 1; i < n; ++i)
319 if (curd) {
return 0; }
320 else if (coef[0] >= 0) {
return 1; }
362 mpz_class c = coef[0];
363 for (
int i = 1; i <= curd; ++i) {
365 mpz_gcd(c.get_mpz_t(), c.get_mpz_t(), coef[i].get_mpz_t());
375 std::cerr <<
"BPAS ERROR: DUZP::primitivePart NOT YET IMPLEMENTED" << std::endl;
385 return (coef[0] == 0);
500 coef[0] += c.get_mpz();
555 for (
int i = 0; i <= curd; ++i) {
593 coef[0] -= c.get_mpz();
658 mpz_class c = e.get_mpz();
664 if (e != 0 && e != 1) {
665 for (
int i = 0; i <= curd; ++i)
668 else if (e == 0) {
zero(); }
678 if (e != 0 && e != 1) {
679 for (
int i = 0; i <= curd; ++i)
682 else if (e == 0) {
zero(); }
739 mpz_class c = e.get_mpz();
746 return (*
this /= mpz_class(e));
885 // THIS FUNCTION IS DEPRECATED
886 // mpz_class evaluate(const mpz_class& x) const;
893 Integer evaluate(const Integer& x) const;
900 Factors<DenseUnivariateIntegerPolynomial> squareFree() const;
908 void print(std::ostream &out) const;
913 ExpressionTree convertToExpressionTree() const;
DenseUnivariateIntegerPolynomial gcd(const DenseUnivariateIntegerPolynomial &q, int type) const
GCD(p, q)
DenseUnivariateIntegerPolynomial & operator+=(const DenseUnivariateIntegerPolynomial &b)
Overload Operator +=.
Definition: uzpolynomial.h:459
DenseUnivariateIntegerPolynomial operator*(const DenseUnivariateIntegerPolynomial &b) const
Multiply to another polynomial.
DenseUnivariateIntegerPolynomial(const Integer &e)
Construct a polynomial with a coeffient.
Definition: uzpolynomial.h:66
void integrate()
Convert current object to its integral with constant of integration 0.
DenseUnivariateIntegerPolynomial & operator=(const DenseUnivariateIntegerPolynomial &b)
Overload operator =.
Definition: uzpolynomial.h:211
DenseUnivariateIntegerPolynomial & operator>>=(int k)
Overload operator >>= replace by dividing x^k, and return the quotient.
Definition: uzpolynomial.h:442
DenseUnivariateIntegerPolynomial operator^(long long int e) const
Overload operator ^ replace xor operation by exponentiation.
DenseUnivariateIntegerPolynomial & operator*=(const DenseUnivariateIntegerPolynomial &b)
Overload operator *=.
Definition: uzpolynomial.h:627
DenseUnivariateIntegerPolynomial & operator^=(long long int e)
Overload operator ^= replace xor operation by exponentiation.
Definition: uzpolynomial.h:402
DenseUnivariateIntegerPolynomial unitCanonical(DenseUnivariateIntegerPolynomial *u=NULL, DenseUnivariateIntegerPolynomial *v=NULL) const
Obtain the unit normal (a.k.a canonical associate) of an element.
Definition: uzpolynomial.h:329
mpz_class * coefficients(int k=0) const
Get coefficients of the polynomial, given start offset.
Definition: uzpolynomial.h:139
void differentiate()
Convert current object to its derivative.
Definition: uzpolynomial.h:840
DenseUnivariateIntegerPolynomial operator+(const DenseUnivariateIntegerPolynomial &b) const
Overload operator +.
DenseUnivariateIntegerPolynomial()
Construct a polynomial.
Definition: uzpolynomial.h:43
DenseUnivariateIntegerPolynomial(int s)
Construct a polynomial with degree.
Definition: uzpolynomial.h:52
Integer unitCanonical(Integer *u=NULL, Integer *v=NULL) const
Obtain the unit normal (a.k.a canonical associate) of an element.
DenseUnivariateIntegerPolynomial monicDivide(const DenseUnivariateIntegerPolynomial &b, DenseUnivariateIntegerPolynomial *rem) const
Monic division Return quotient.
Definition: uzpolynomial.h:766
DenseUnivariateIntegerPolynomial lazyPseudoDivide(const DenseUnivariateIntegerPolynomial &b, DenseUnivariateIntegerPolynomial *rem, Integer *c, Integer *d) const
Lazy pseudo dividsion Return the quotient e is the exact number of division steps.
Definition: uzpolynomial.h:792
A univariate polynomial with Integer coefficients using a dense representation.
Definition: uzpolynomial.h:13
Symbol variable() const
Get variable's name.
Definition: uzpolynomial.h:195
void setCoefficient(int k, const mpz_class value)
Set a coefficient of the polynomial.
Definition: uzpolynomial.h:164
Integer leadingCoefficient() const
Get the leading coefficient.
Definition: uzpolynomial.h:113
void one()
Set polynomial to 1.
Definition: uzpolynomial.h:283
DenseUnivariateIntegerPolynomial lazyPseudoDivide(const DenseUnivariateIntegerPolynomial &b, Integer *c, Integer *d=NULL)
Lazy pseudo dividsion Return the quotient and itself becomes remainder e is the exact number of divis...
DenseUnivariateIntegerPolynomial derivative() const
Compute derivative.
Definition: uzpolynomial.h:859
Integer coefficient(int k) const
Get a coefficient of the polynomial.
Definition: uzpolynomial.h:151
Integer content() const
Content of the polynomial.
Definition: uzpolynomial.h:361
DenseUnivariateIntegerPolynomial derivative(int k) const
Return k-th derivative.
Definition: uzpolynomial.h:849
bool isConstantTermZero() const
Is the least signficant coefficient zero.
Definition: uzpolynomial.h:384
int isConstant() const
Is a constant.
Definition: uzpolynomial.h:318
void zero()
Zero polynomial.
Definition: uzpolynomial.h:262
DenseUnivariateIntegerPolynomial & operator<<=(int k)
Overload operator << replace by muplitying x^k.
Definition: uzpolynomial.h:421
void subtract(const DenseUnivariateIntegerPolynomial &b)
Subtract another polynomial from itself.
DenseUnivariateIntegerPolynomial integral()
Compute integral with constant of integration 0.
Definition: uzpolynomial.h:873
void negate()
Compute -f(x)
Definition: uzpolynomial.h:554
DenseUnivariateIntegerPolynomial(const DenseUnivariateIntegerPolynomial &b)
Copy constructor.
Definition: uzpolynomial.h:85
An arbitrary-precision Integer.
Definition: Integer.hpp:22
An abstract class defining the interface of a univariate polynomial over an arbitrary BPASRing...
Definition: polynomial.h:88
void differentiate(int k)
Convert current object to its k-th derivative.
DenseUnivariateIntegerPolynomial & operator-=(const DenseUnivariateIntegerPolynomial &b)
Overload operator -=.
Definition: uzpolynomial.h:534
bool operator==(const DenseUnivariateIntegerPolynomial &b) const
Overload operator ==.
Definition: uzpolynomial.h:242
void add(const DenseUnivariateIntegerPolynomial &b)
Add another polynomial to itself.
bool isZero() const
Is zero polynomial.
Definition: uzpolynomial.h:251
bool operator!=(const DenseUnivariateIntegerPolynomial &b) const
Overload operator !=.
Definition: uzpolynomial.h:233
bool isOne() const
Is polynomial a constatn 1.
Definition: uzpolynomial.h:272
DenseUnivariateIntegerPolynomial operator>>(int k) const
Overload operator >> replace by dividing x^k, and return the quotient.
An encapsulation of a mathematical symbol.
Definition: Symbol.hpp:23
bool isNegativeOne() const
Is polynomial a constatn -1.
Definition: uzpolynomial.h:295
An arbitrary-precision rational number.
Definition: RationalNumber.hpp:24
DenseUnivariateIntegerPolynomial & operator/=(const DenseUnivariateIntegerPolynomial &b)
Overload operator /= ExactDivision.
DenseUnivariateIntegerPolynomial operator-() const
Overload operator -, negate.
DenseUnivariateIntegerPolynomial operator/(const DenseUnivariateIntegerPolynomial &b) const
Overload operator / ExactDivision.
Definition: uzpolynomial.h:700
DenseUnivariateIntegerPolynomial pseudoDivide(const DenseUnivariateIntegerPolynomial &b, Integer *d=NULL)
Pseudo dividsion Return the quotient and itself becomes remainder.
void negativeOne()
Set polynomial to -1.
Definition: uzpolynomial.h:306
DenseUnivariateIntegerPolynomial monicDivide(const DenseUnivariateIntegerPolynomial &b)
Monic division Return quotient and itself become the remainder.
DenseUnivariateIntegerPolynomial operator<<(int k) const
Overload operator << replace by muplitying x^k.
Integer degree() const
Get degree of the polynomial.
Definition: uzpolynomial.h:104
~DenseUnivariateIntegerPolynomial()
Destroy the polynomial.
Definition: uzpolynomial.h:95
void setVariableName(const Symbol &x)
Set variable's name.
Definition: uzpolynomial.h:203