Univariate and multivariate polynomials

A basic implemententation is proposed for handling univariate and multivariate polynomials (represented by their coefficients). You should use those classes carefully for two reasons :

So these classes are useful for developing, testing new methods. Here we briefly describe how to use them.

Basic Use

First, we show examples for 1-D polynomials (univariate) :

// first we create two useful polynoms : 1 and x
UnivariatePolynomial<double> x(1), one(0);
x(0) = 0; x(1) = 1.0;
one(0) = 1.0;

// then you can construct other polynomials with those basic polynoms
// for example chebyshev polynomials are constructed  :
UnivariatePolynomial<double> Pn_m1, Pn, Pn_p1;
Pn_m1 = one;
Pn = x;
int n = 10;
for (int k = 1; k < n; k++)
  {
    Pn_p1 = 2.0*x*Pn - Pn_m1;
    Pn_m1 = Pn;
    Pn = Pn_p1;
  }

// of course you can enter directly coefficients
// P = a0 + a1 X + a2 X^2 + .. + an x^n
UnivariatePolynomial<double> P;
P.SetOrder(n);
P(0) = a0;
P(1) = a1;
// ...
P(n) = an;

// and evaluate y = P(x) for a given x with Horner algorithm :
double y = P.Evaluate(2.53);

// and operators -, +, * can be used 
UnivariatePolynomial<double> Q, R, S;
S = 2.5*P*Q + R;

// polynoms can be derived or integrated (with 0-constant)
UnivariatePolynomial<double> dP_dx, Primitive_P;
DerivatePolynomial(P, dP_dx);
IntegratePolynomial(P, Primitive_P);

For multivariate polynomials, the degree of the polynom is the sum of the degree for each variable.

// for 3-D polynoms, we create 1, x, y and z
// the first argument of the constructor is the number of variables
// by default, we set all the coefficients to 0
MultivariatePolynomial<double> x(3, 1), one(3, 0), y(3, 1), z(3,
1);
one(0, 0, 0) = 1.0
x(1, 0, 0) = 1.0;
y(0, 1, 0) = 1.0;
z(0, 0, 1) = 1.0;

// then you can construct other polynomials with those basic polynoms
MultivariatePolynomial<double> P;
P = x*(x + 2.5*y*z); 

// of course you can enter directly coefficients
P.SetOrder(3, n);
P(0, 0, 0) = a000;
P(1, 0, 0) = a100;
// ...
P(n, 0, 0) = an00;
P(0, n, 0) = a0n0;
P(0, 0, n) = a00n;

// and evaluate y = P(x) for a given x with Horner algorithm :
TinyVector<double, 3> pt(-3.4, 2.31, 0.56);
double value = P.Evaluate(pt);

// and operators -, +, * can be used 
MultivariatePolynomial<double> Q, R, S;
S = 2.5*P*Q + R;

// polynoms can be derived or integrated (with 0-constant)
MultivariatePolynomial<double> dP_dx, dP_dy, Primitive_Px;
DerivatePolynomial(P, dP_dx, 0);
DerivatePolynomial(P, dP_dy, 1);
IntegratePolynomial(P, Primitive_Px, 0);

// operator () has been overloaded for 2-D and 3-D polynoms
// for higher dimensions, you have to use IndexToPowers, PowersToIndex
// for example in 4-D :
MultivariatePolynomial<double> t;
one.SetOrder(4, 1);
x.SetOrder(4, 1);
y.SetOrder(4, 1);
z.SetOrder(4, 1);
t.SetOrder(4, 1);

IVect powers(4);
powers.Fill(0);
int pos = one.PowersToIndex(powers);
one(pos) = 1.0;

powers(0) = 1;
pos = x.PowersToIndex(powers);
x(pos) = 1.0;

powers(0) = 0; powers(1) = 1;
pos = y.PowersToIndex(powers);
y(pos) = 1.0;

powers(1) = 0; powers(2) = 1;
pos = z.PowersToIndex(powers);
z(pos) = 1.0;

powers(2) = 0; powers(3) = 1;
pos = t.PowersToIndex(powers);
t(pos) = 1.0;

Methods for univariate polynomials

constructors
operators
GetOrder returns the degree of polynomial
SetOrder modifies the degree of polynomial and removes previous coefficients
ResizeOrder modifies the degree of polynomial and keeps previous coefficients
Zero sets all coefficients to 0
Evaluate evaluates the polynomial with Horner algorithm

Methods for the class LegendrePolynomial

constructor
EvaluateDerivative evaluates Pn(cos θ) and its derivatives
EvaluatePn evaluates Legendre polynomials at a given point
EvaluateDerive evaluates Legendre polynomials and derivatives

Methods for the class AssociatedLegendrePolynomial

Init inits the computation of associated Legendre polynomials
EvaluatePnm evaluates associated Legendre polynomials

Functions for univariate polynomials

Pow Computes a power of the polynomial
DerivatePolynomial Computes the derivative of a polynomial
IntegratePolynomial Computes the primitive of a polynomial
ComputeLegendrePolynome Computes Legendre polynomials
Add adds two polynomials
Mlt computes the product of two polynomials
MltAdd adds the product of two polynomals
SolvePolynomialEquation finds the roots of a polynomial

Methods for multivariate polynomials

constructors
operators
GetM returns the number of coefficients of the polynomial
GetDimension returns the number of variables (called dimension)
GetOrder returns the degree of polynomial
SetOrder modifies the degree and dimension of polynomial and removes previous coefficients
ResizeOrder modifies the degree and dimension of polynomial and keeps previous coefficients
Zero sets all coefficients to 0
Evaluate evaluates the polynomial with Horner algorithm
PowersToIndex computes scalar index from the tuple (i, j, ...)
IndexToPowers computes the tuple (i, j, ...) from the scalar index
PrintRational displays coefficients as fractions
PrintMonomial displays a single monomial of the polynomial

Functions for multivariate polynomials

Pow Computes a power of the polynomial
DerivatePolynomial Computes the derivative of a polynomial
Derivate Computes the derivative of a polynomial
GetCurlPolynomial Computes the curl of a 3-D vector of polynomials
GetDivPolynomial Computes the divergence of a 3-D vector of polynomials
IntegratePolynomial Computes the primitive of a polynomial
Mlt computes the product of a polynomial with a scalar
MltAdd adds the product of two polynomals
IntegrateOnSimplex computes the integral of the polynomial over the simplex (triangle in 2-D, tetrahedron in 3-D)
Add adds two polynomials
ScalePolynomVariable all the variables of the polynomial are multiplied by the same coefficient
CompressPolynom sets to 0 small coefficients of the polynomial
OppositeX x-variable is replaced by its opposite
OppositeY y-variable is replaced by its opposite
PermuteXY x-variable and y-variable are swapped
GenerateSymPol generates polynomials obtained by symmetry with respect to diagonals of the square [-1, 1]2
GenerateSym4_Edges generates polynomials obtained by symmetry with respect to axis x=0 and y=0 of the square [-1, 1]2
GenerateSym8 generates polynomials obtained by symmetry with respect to diagonals and axis x=0 and y=0 of the square [-1, 1]2

Constructors for UnivariatePolynomial

Syntax

  UnivariatePolynomial();
  UnivariatePolynomial(int order);

The default constructor creates a polynomial equal to 0 (of degree 0). The second constructor takes the degree of the polynomial as argument and initializes all coefficients to 0.

Example :

// P is equal to 0
UnivariatePolynomial<Real_wp> P;

// P = 2x^2 + 5x - 8
UnivariatePolynomial<Real_wp> P(2);
P(0) = -8.0; P(1) = 5.0; P(2) = 2.0;

Location :

Share/UnivariatePolynomialInline.cxx

Operators for UnivariatePolynomial

The operators +, -, * are implemented for univariate polynomials and as well as operators +=, -= and *=. The operator * can mix scalars with polynomials.

Example :

// P is equal to 0
UnivariatePolynomial<Real_wp> P;

// P = 2x^2 + 5x - 8
UnivariatePolynomial<Real_wp> P(2), Q(3), R;
P(0) = -8.0; P(1) = 5.0; P(2) = 2.0;

// Q = x^3 - 7 x
Q(3) = 1.0; Q(1) = -7.0;

// R = 2.0 P Q - 3.0 P
R = 2.0*P*Q - 3.0*P;

// Q = Q + R
Q += R;

Location :

Share/UnivariatePolynomialInline.cxx

GetOrder

Syntax

  int GetOrder() const;

This method returns the degree of the polynomial.

Example :

// P is equal to 0
UnivariatePolynomial<Real_wp> P;

// P = 2x^2 + 5x - 8
UnivariatePolynomial<Real_wp> P(2);
P(0) = -8.0; P(1) = 5.0; P(2) = 2.0;

// P.GetOrder() should return 2
int deg = P.GetOrder();

Location :

Share/UnivariatePolynomialInline.cxx

SetOrder

Syntax

  void SetOrder(int k);

This method modifies the degree of the polynomial and sets all coefficients of the polynomial to 0.

Example :

// P is equal to 0
UnivariatePolynomial<Real_wp> P;

// P = 2x^2 + 5x - 8
UnivariatePolynomial<Real_wp> P(2);
P(0) = -8.0; P(1) = 5.0; P(2) = 2.0;

// we change the degree of P : all coefficients are set to 0
P.SetOrder(4);
P(0) = 2.5; P(2) = -4.1; P(4) = 6.0;

Location :

Share/UnivariatePolynomial.cxx

ResizeOrder

Syntax

  void ResizeOrder(int k);

This method modifies the degree of the polynomial and sets new coefficients of the polynomial to 0. Old coefficients are kept.

Example :

// P is equal to 0
UnivariatePolynomial<Real_wp> P;

// P = 2x^2 + 5x - 8
UnivariatePolynomial<Real_wp> P(2);
P(0) = -8.0; P(1) = 5.0; P(2) = 2.0;

// we change the degree of P and we keep old coefficients
P.SetOrder(4);
// P = 4x^4 + 3 x^3 + 2x^2 + 5x - 8
P(4) = 4.0; P(3) = 3.0;

Location :

Share/UnivariatePolynomial.cxx

Zero

Syntax

  void Zero();

This method sets all coefficients to 0.

Example :

// P is equal to 0
UnivariatePolynomial<Real_wp> P;

// P = 2x^2 + 5x - 8
UnivariatePolynomial<Real_wp> P(2);
P(0) = -8.0; P(1) = 5.0; P(2) = 2.0;

// P = 0
// P is not resized, coefficients are just set to 0
P.Zero();

Location :

vector/VectorInline.cxx

Evaluate

Syntax

  T Evaluate(T x);

This method evaluates the polynomial at a given point x with Horner's algorithm.

Example :

// P is equal to 0
UnivariatePolynomial<Real_wp> P;

// P = 2x^2 + 5x - 8
UnivariatePolynomial<Real_wp> P(2);
P(0) = -8.0; P(1) = 5.0; P(2) = 2.0;

// we compute y = P(x)
Real_wp x = 5.0;
Real_wp y = P.Evaluate(x);

Location :

Share/UnivariatePolynomial.cxx

Constructor for LegendrePolynomial

Syntax

LegendrePolynomial(int n);

The constructor takes the maximum number of Legendre polynomials to evaluate.

Example :

// coefficients of the recurrence are computed
int n = 10;
LegendrePolynomial<Real_wp> P(n);

// now we can evaluate P_0(x), P_1(x), ..., P_{n-1}(x)
// where P_k is the k-th Legendre polynomial
VectReal_wp EvalP;
Real_wp x = 0.4; 
P.EvaluatePn(n, x, EvalP);

Location :

Share/UnivariatePolynomial.cxx

EvaluateDerivative

Syntax

void EvaluateDerivative(int n, T cos_teta, T sin_teta, Vector& Pn0, Vector& Pn1, Vector& dPn1);

This method evaluates Pn(cos θ) where Pn are Legendre polynomials. It also evaluates sin θ P'n(cos θ) and the derivative of this expression.

Example :

// coefficients of the recurrence are computed
int n = 10;
LegendrePolynomial<Real_wp> P(n);

// P_k(cos teta) are evaluated for k = 0..n-1
// P_k^1 = sin teta P'_k(cos teta) are also evaluated
// and the derivatives of P_k^1 = cos teta P'_k(cos_teta) - sin^2 teta P''_k(cos_teta)
// where P_k is the k-th Legendre polynomial
VectReal_wp EvalP, EvalP1, dP1;
Real_wp teta = pi_wp/4, cos_teta = cos(teta), sin_teta = sin(teta); 
P.EvaluateDerivative(n, cos_teta, sin_teta, EvalP, EvalP1, dP1);

Location :

Share/UnivariatePolynomial.cxx

EvaluatePn

Syntax

void EvaluatePn(int n, T x, Vector& EvalP);

This method evaluates the Legendre polynomials P0, P1, ..., Pn-1 at a given point.

Example :

// coefficients of the recurrence are computed
int n = 10;
LegendrePolynomial<Real_wp> P(n);

// now we can evaluate P_0(x), P_1(x), ..., P_{n-1}(x)
// where P_k is the k-th Legendre polynomial
VectReal_wp EvalP;
Real_wp x = 0.4; 
P.EvaluatePn(n, x, EvalP);

Location :

Share/UnivariatePolynomial.cxx

EvaluateDerive

Syntax

void EvaluateDerive(int n, T x, Vector& EvalP, Vector& dP);

This method evaluates the Legendre polynomials P0, P1, ..., Pn-1 at a given point and the derivatives.

Example :

// coefficients of the recurrence are computed
int n = 10;
LegendrePolynomial<Real_wp> P(n);

// now we can evaluate P_0(x), P_1(x), ..., P_{n-1}(x)
// where P_k is the k-th Legendre polynomial
// and the derivatives P'_0(x), P'_1(x), ..., P'_{n-1}(x)
VectReal_wp EvalP, derP;
Real_wp x = 0.4; 
P.EvaluateDerive(n, x, EvalP, derP);

Location :

Share/UnivariatePolynomial.cxx

Init

Syntax

void Init(int Lmax)

This method comptes coefficients involved in reccurence relation used to evaluate normalized associated Legendre polynomials. They are defined as:

where are the usual associated Legendre polynomials satisfying the recurrence:

The normalization factor is designed such that the L2 norm of polynomials over the sphere is equal to one.

Example :

// coefficients of the recurrence are computed
// we need to know the maximal value of l
int Lmax = 100;
AssociatedLegendrePolynomial<Real_wp> P(Lmax);

// now we can evaluate \bar{P}_l^m(cos teta)
// these coefficients are stored in EvalP(l)(m)
// and computed for l = 0..Lmax
Vector<VectReal_wp> EvalP;
Real_wp teta = pi_wp/4;
P.EvaluatePnm(Lmax, Lmax, teta, EvalP);

Location :

Share/UnivariatePolynomial.cxx

EvaluatePnm

Syntax

void EvaluatePnm(int Lmax, int Mmax, T teta, Vector<Vector>& EvalP);

This methods evaluates normalized associated Legendre polynomials. They are defined as:

where are the usual associated Legendre polynomials satisfying the recurrence:

The normalization factor is designed such that the L2 norm of polynomials over the sphere is equal to one. The polynomials are evaluated for l=0..Lmax and for m=0..min(l, Mmax).

Example :

// coefficients of the recurrence are computed
// we need to know the maximal value of l
int Lmax = 100;
AssociatedLegendrePolynomial<Real_wp> P(Lmax);

// now we can evaluate \bar{P}_l^m(cos teta)
// these coefficients are stored in EvalP(l)(m)
// and computed for l = 0..Lmax
Vector<VectReal_wp> EvalP;
Real_wp teta = pi_wp/4;
// The second argument can be lower than Lmax, if you do not want to compute all polynomials m=0..l
P.EvaluatePnm(Lmax, Lmax, teta, EvalP);

Location :

Share/UnivariatePolynomial.cxx

Pow

Syntax

  UnivariatePolynomial Pow(const UnivariatePolynomial& P, int n);

This functions returns the power of a polynomial.

Example :

// P is equal to 0
UnivariatePolynomial<Real_wp> P, Q;

// P = 2x^2 + 5x - 8
UnivariatePolynomial<Real_wp> P(2);
P(0) = -8.0; P(1) = 5.0; P(2) = 2.0;

// if you want to compute Q = P^4
Q = Pow(P, 4);

Location :

Share/UnivariatePolynomial.cxx

DerivatePolynomial

Syntax

  void DerivatePolynomial(const UnivariatePolynomial& P, UnivariatePolynomial& Q);

This functions computes the derivative of a polynomial.

Example :

// P is equal to 0
UnivariatePolynomial<Real_wp> P, Q;

// P = 2x^2 + 5x - 8
UnivariatePolynomial<Real_wp> P(2);
P(0) = -8.0; P(1) = 5.0; P(2) = 2.0;

// if you want to compute Q = P' = 4x + 5 here
DerivatePolynomial(P, Q);

Location :

Share/UnivariatePolynomial.cxx

IntegratePolynomial

Syntax

  void IntegratePolynomial(const UnivariatePolynomial& P, UnivariatePolynomial& Q);

This functions computes the primitive of a polynomial that cancels for x=0.

Example :

// P is equal to 0
UnivariatePolynomial<Real_wp> P, Q;

// P = 2x^2 + 5x - 8
UnivariatePolynomial<Real_wp> P(2);
P(0) = -8.0; P(1) = 5.0; P(2) = 2.0;

// if you want to compute Q = \int P = 2/3 x^3 + 5/2 x^2 - 8x here
IntegratePolynomial(P, Q);

Location :

Share/UnivariatePolynomial.cxx

ComputeLegendrePolynome

Syntax

  void ComputeLegendrePolynome(int n0, int n, Vector<UnivariatePolynomial>& P)

This functions computes the n first Legendre polynomials. This function should not be used since coefficients of Legendre polynomials blow up. The class LegendrePolynomial should be used instead to evaluate these polynomials.

Example :

// if you want to know the coefficients of Legendre polynomials
// P_0, P_1, ... P_{n-1}
Vector<UnivariatePolynomial<Real_wp> > P;

int n = 10;
ComputeLegendrePolynome(0, n, P);

Location :

Share/UnivariatePolynomial.cxx

Add

Syntax

  void Add(T alpha, const UnivariatePolynomial& P, UnivariatePolynomial& Q);

This functions adds a polynomial to another one.

Example :

UnivariatePolynomial<Real_wp> P, Q;

// if you want to update Q
// Q = Q + 2.5*P
Add(Real_wp(2.5), P, Q);

Location :

Share/UnivariatePolynomial.cxx

Mlt

Syntax

  void Mlt(T alpha, UnivariatePolynomial& Q);

This functions multiplies a polynomial by a coefficient.

Example :

UnivariatePolynomial<Real_wp> P;

// if you want to multiply P by a scalar
// P = P*4.2
Mlt(Real_wp(2.5), P);

Location :

Share/UnivariatePolynomial.cxx

MltAdd

Syntax

  void MltAdd(T alpha, const UnivariatePolynomial& P, UnivariatePolynomial& Q, T beta, UnivariatePolynomial& R);

This functions computes the product of two polynomials P and Q and adds the result to R. R is replaced by beta R + alpha P Q.

Example :

UnivariatePolynomial<Real_wp> P, Q, R;

// if you want to update R
// R = beta R + alpha P Q 
Real_wp alpha(2), beta(3);
MltAdd(alpha, P, Q, beta, R);

Location :

Share/UnivariatePolynomial.cxx

SolvePolynomialEquation

Syntax

   void SolvePolynomialEquation(const UnivariatePolynomial& P, Vector& R, Vector& Rimag);
   void SolvePolynomialEquation(const UnivariatePolynomial<complex>& P, Vector<complex>& R);

This functions computes the roots of the polynomials P, the roots are R + i Rimag. If the polynomial is complex, only R should be given. This functions drops zero-valued roots.

Example :

UnivariatePolynomial<Real_wp> P(3);

// P = 2 x^3 + 3 x^2 + 5 x
P(3) = 2.0; P(2) = 3.0; P(1) = 5.0;

// if you want to find all the roots of P
// here P has 0 as simple root, this root will not be computed
VectReal_wp R, Rimag;
SolvePolynomialEquation(P, R, Rimag);

// R stores real part of roots and Rimag imaginary parts

Location :

Share/UnivariatePolynomial.cxx

Constructors for MultivariatePolynomial

Syntax

  MultivariatePolynomial();
  MultivariatePolynomial(int dimension, int n);

The default constructor initializes a null polynom of dimension 0 (no variable) and degree 0. The second constructor takes as arguments the dimension (i.e. the number of variables) and the degree. The degree is the total degree of the polynomial, i.e. the sum of degrees for each variable. By default all the coefficients are set to 0.

Example :

MultivariatePolynomial<Real_wp> Q;

// here P = 0, you do not need to call Zero()
MultivariatePolynomial<Real_wp> P(2, 3);

// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

Location :

Share/MultivariatePolynomial.cxx

Operators for MultivariatePolynomial

Syntax

 T& operator()(int i);
 T& operator()(int i, int j);
 T& operator()(int i, int j, int k);

The operators +, -, * are implemented between multivariate polynomials or between a multivariate polynomial and a scalar. The operators +=, -= and *= are also implemented. The operators == and != are implemented between polynomials. The access operator () is implemented for 2-D and 3-D multivariate polynomials. For higher dimensions, the user must use the methods PowersToIndex and IndexToPowers to convert a multi-index into a single integer.

Example :

MultivariatePolynomial<Real_wp> P(2, 3), R, S;

// for 2-D polynomials, P(i, j) modifies the coefficient associated with x^i y^j
// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// for 3-D polynomials, P(i, j, k) is implemented
// for higher dimension polynomials function PowersToIndex must be used
MultivariatePolynomial<Real_wp> Q(4, 1);

// Q = 2.0 x + 3.0 y - z + 2.5 t + 10.0
IVect powers(4);
powers.Zero(); powers(0) = 1;
Q(Q.PowersToIndex(powers)) = 2.0;
powers.Zero(); powers(1) = 1;
Q(Q.PowersToIndex(powers)) = 3.0;
powers.Zero(); powers(2) = 1;
Q(Q.PowersToIndex(powers)) = -1.0;
powers.Zero(); powers(3) = 1;
Q(Q.PowersToIndex(powers)) = 2.5;
powers.Zero();
Q(Q.PowersToIndex(powers)) = 10.0;

// Operators +, -, * can be used between polynomials of same dimension
R.SetOrder(2, 2);
S = 2.0*P*R - 5.0*P + R;

// Operators +=, -= and *= are also available
// and accept scalar or polynomials
S *= 0.9;

Location :

Share/MultivariatePolynomial.cxx

GetM

Syntax

  int GetM() const;

This method returns the number of coefficients contained in the polynomial.

Example :

MultivariatePolynomial<Real_wp> Q;
MultivariatePolynomial<Real_wp> P(2, 3);

// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// P.GetM() should return here 4*5/2 = 10
int nb_coef = P.GetM();

Location :

Share/MultivariatePolynomial.cxx

GetDimension

Syntax

  int GetDimension() const;

This method returns the dimension, i.e. the number of variables of the polynomial.

Example :

MultivariatePolynomial<Real_wp> Q;
MultivariatePolynomial<Real_wp> P(2, 3);

// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// P.GetDimension() should return 2
int dim = P.GetDimension();

Location :

Share/MultivariatePolynomial.cxx

GetOrder

Syntax

  int GetOrder() const;

This method returns the total degree of the polynomial, i.e. the sum of degrees for each variable.

Example :

MultivariatePolynomial<Real_wp> Q;
MultivariatePolynomial<Real_wp> P(2, 3);

// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// P.GetOrder() should return 3
int k = P.GetOrder();

Location :

Share/MultivariatePolynomial.cxx

SetOrder

Syntax

  void SetOrder(int dimension, int order);

This method changes the dimension and the degree of the polynomial. All the coefficients are set to 0.

Example :

MultivariatePolynomial<Real_wp> Q;
MultivariatePolynomial<Real_wp> P(2, 3);

// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// we switch to a 3-D polynomial of order 1
P.SetOrder(3, 1);
// P is equal to 0

Location :

Share/MultivariatePolynomial.cxx

ResizeOrder

Syntax

  void ResizeOrder(int dimension, int order);

This method changes the dimension and the degree of the polynomial. New coefficients are set to 0 whereas old coefficients are kept.

Example :

MultivariatePolynomial<Real_wp> Q;
MultivariatePolynomial<Real_wp> P(2, 3);

// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// we switch to a 3-D polynomial of order 1
P.ResizeOrder(3, 1);
// P should be equal to 5 x - 2.5 y + 8

Location :

Share/MultivariatePolynomial.cxx

Zero

Syntax

  void Zero();

This method sets all coefficients of the polynomial to 0.

Example :

MultivariatePolynomial<Real_wp> Q;
MultivariatePolynomial<Real_wp> P(2, 3);

// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// you can restart from P = 0
// it only zeroes coefficients, the polynomial is not resized
P.Zero();

// P = 5 x^3
P(3, 0) = 5.0;

Location :

Share/MultivariatePolynomial.cxx

Evaluate

Syntax

  T Evaluate(const TinyVector& x) const;

This method evaluates the polynomial at a given point x.

Example :

MultivariatePolynomial<Real_wp> Q;
MultivariatePolynomial<Real_wp> P(2, 3);

// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// you can evaluate P at point x=0.5,y=0.3
Real_wp val = P.Evaluate(R2(0.5, 0.3));

Location :

Share/MultivariatePolynomial.cxx

PowersToIndex

Syntax

  int PowersToIndex(const IVect& powers);

This method returns the scalar index associated with the multi-index (one per variable) given as argument. This method can be used to set a coefficient of a polynomial of dimension greater or equal to four.

Example :

MultivariatePolynomial<Real_wp> P(2, 3), R, S;

// for 2-D polynomials, P(i, j) modifies the coefficient associated with x^i y^j
// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// for 3-D polynomials, P(i, j, k) is implemented
// for higher dimension polynomials function PowersToIndex must be used
MultivariatePolynomial<Real_wp> Q(4, 1);

// Q = 2.0 x + 3.0 y - z + 2.5 t + 10.0
IVect powers(4);
powers.Zero(); powers(0) = 1;
Q(Q.PowersToIndex(powers)) = 2.0;
powers.Zero(); powers(1) = 1;
Q(Q.PowersToIndex(powers)) = 3.0;
powers.Zero(); powers(2) = 1;
Q(Q.PowersToIndex(powers)) = -1.0;
powers.Zero(); powers(3) = 1;
Q(Q.PowersToIndex(powers)) = 2.5;
powers.Zero();
Q(Q.PowersToIndex(powers)) = 10.0;

// if you want to modify the coefficient associated with the monomial x^i y^j z^k t^m
// powers is initialized to (i, j, k, m)
powers(0) = i; powers(1) = j; powers(2) = k; powers(3) = m;

// then PowersToIndex returns a 1-D index
int pos = Q.PowersToIndex(powers);

// that can be used to change the corresponding coefficient in Q
Q(pos) = 2.0

Location :

Share/MultivariatePolynomial.cxx

IndexToPowers

Syntax

  void IndexToPowers(int pos, IVect& powers);

This method computes a multi-index powers from a scalar index pos. This method is the reciprocal of PowersToIndex.

Example :

MultivariatePolynomial<Real_wp> P(2, 3), R, S;

// for 2-D polynomials, P(i, j) modifies the coefficient associated with x^i y^j
// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// if you want to loop over all coefficients of P with a scalar index:
IVect powers;
for (int pos = 0; pos < P.GetM(); p++)
  {
    // powers will store here (i, j) from pos
    P.IndexToPowers(pos, powers);

    // if (i+j) == 2, we make a treatment
    if (powers(0) + powers(1) == 2)
      P(pos) *= 2.0;
  }

Location :

Share/MultivariatePolynomial.cxx

PrintRational

Syntax

  void PrintRational(T epsilon);

This method displays the polynomial by trying to find approximate fractions for each coefficient.

Example :

MultivariatePolynomial<Real_wp> P(2, 3), R, S;

// for 2-D polynomials, P(i, j) modifies the coefficient associated with x^i y^j
// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// P is displayed with fractions
P.PrintRational(1e-12);

Location :

Share/MultivariatePolynomial.cxx

PrintRational

Syntax

  void PrintMonomial(int pos, ostream& out);

This method displays the monomial associated with a scalar index.

Example :

MultivariatePolynomial<Real_wp> P(2, 3), R, S;

// for 2-D polynomials, P(i, j) modifies the coefficient associated with x^i y^j
// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// if you want to loop over all coefficients of P with a scalar index:
IVect powers;
for (int pos = 0; pos < P.GetM(); p++)
  {
    // powers will store here (i, j) from pos
    P.IndexToPowers(pos, powers);

    // if (i+j) == 2, we make a treatment
    if (powers(0) + powers(1) == 2)
      {
        P(pos) *= 2.0;
        // we can display this monomial
        P.PrintMonomial(pos, cout);
      }
  }


Location :

Share/MultivariatePolynomial.cxx

Pow

Syntax

  MultivariatePolynomial Pow(const MultivariatePolynomial& P, int n);

This function returns the power of a polynomial.

Example :

MultivariatePolynomial<Real_wp> P(2, 3), R, S;

// for 2-D polynomials, P(i, j) modifies the coefficient associated with x^i y^j
// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// you can compute P^3 for instance
R = Pow(P, 3);

Location :

Share/MultivariatePolynomial.cxx

DerivatePolynomial

Syntax

  void DerivatePolynomial(const MultivariatePolynomial& P, MultivariatePolynomial& Q, int n);

This function computes the derivative of a polynomial with respect to a variable, the last argument corresponds to the variable number.

Example :

MultivariatePolynomial<Real_wp> P(2, 3), R, S;

// for 2-D polynomials, P(i, j) modifies the coefficient associated with x^i y^j
// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// you can compute the derivative of P with respect to x
// x : 0, y : 1
DerivatePolynomial(P, R, 0);

// you should obtain R = 6 x^2 + 8 x y - y^2 + 6 x - 4 y + 5

Location :

Share/MultivariatePolynomial.cxx

Derivate

Syntax

  MultivariatePolynomial Derivate(const MultivariatePolynomial& P, int n);

This function returns the derivative of a polynomial with respect to a variable, the last argument corresponds to the variable number.

Example :

MultivariatePolynomial<Real_wp> P(2, 3), R, S;

// for 2-D polynomials, P(i, j) modifies the coefficient associated with x^i y^j
// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// you can compute the derivative of P with respect to x
// x : 0, y : 1
R = Derivate(P, 0);

// you should obtain R = 6 x^2 + 8 x y - y^2 + 6 x - 4 y + 5

Location :

Share/MultivariatePolynomial.cxx

GetCurlPolynomial

Syntax

  void GetCurlPolynomial(const TinyVector<MultivariatePolynomial, 3>& P, TinyVector<MultivariatePolynomial, 3>& Q);

This function computes the curl of P and stores it in Q.

This function is meaningful for 3-D polynomials.

Example :

TinyVector<MultivariatePolynomial<Real_wp>, 3> P, Q;

// P consists of 3-D polynomials
P(0).SetOrder(3, 2);
P(1).SetOrder(3, 1);
P(2).SetOrder(3, 4);

// we compute Q = curl(P)
GetCurlPolynomial(P, Q);

Location :

Share/MultivariatePolynomial.cxx

GetDivPolynomial

Syntax

  void GetDivPolynomial(const TinyVector<MultivariatePolynomial, 3>& P, MultivariatePolynomial& Q);

This function computes the divergence of P and stores it in Q.

This function is meaningful for 3-D polynomials.

Example :

TinyVector<MultivariatePolynomial<Real_wp>, 3> P;

// P consists of 3-D polynomials
P(0).SetOrder(3, 2);
P(1).SetOrder(3, 1);
P(2).SetOrder(3, 4);

// we compute Q = div(P)
MultivariatePolynomial<Real_wp> Q;
GetDivPolynomial(P, Q);

Location :

Share/MultivariatePolynomial.cxx

IntegratePolynomial

Syntax

  void IntegratePolynomial(const MultivariatePolynomial& P, MultivariatePolynomial& Q, int n);

This function computes the primitive of a polynomial with respect to a variable, the last argument corresponds to the variable number. This function is not implemented.

Example :

MultivariatePolynomial<Real_wp> P(2, 3), R, S;

// for 2-D polynomials, P(i, j) modifies the coefficient associated with x^i y^j
// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// you can compute the primitive of P with respect to x
// x : 0, y : 1
IntegratePolynomial(P, R, 0);

Location :

Share/MultivariatePolynomial.cxx

Mlt

Syntax

  void Mlt(T alpha, MultivariatePolynomial& P);

This function multiplies a polynomial by a scalar.

Example :

MultivariatePolynomial<Real_wp> P(2, 3);

// for 2-D polynomials, P(i, j) modifies the coefficient associated with x^i y^j
// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// you can multiply P by a scalar
// equivalent to P = P*2.5
Mlt(Real_wp(2.5), P);

Location :

Share/MultivariatePolynomial.cxx

MltAdd

Syntax

  void MltAdd(T alpha, const MultivariatePolynomial& P, const MultivariatePolynomial& Q, T beta, MultivariatePolynomial& R);

This function multiplies two polynomials P and Q and adds the result to R.

Example :

MultivariatePolynomial<Real_wp> P(2, 3), Q, R;

// for 2-D polynomials, P(i, j) modifies the coefficient associated with x^i y^j
// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

Q = P*P;

// equivalent to R = beta*R + alpha*P*Q
Real_wp alpha(2.2), beta(3.2);
MltAdd(alpha, P, Q, beta, R);

Location :

Share/MultivariatePolynomial.cxx

Add

Syntax

  void Add(T alpha, const MultivariatePolynomial& P, MultivariatePolynomial& Q);

This function adds alpha*P to the polynomial Q.

Example :

MultivariatePolynomial<Real_wp> P(2, 3), Q;

// for 2-D polynomials, P(i, j) modifies the coefficient associated with x^i y^j
// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// equivalent to Q = Q + alpha*P
Real_wp alpha = 2.4;
Add(alpha, P, Q);

Location :

Share/MultivariatePolynomial.cxx

IntegrateOnSimplex

Syntax

  T IntegrateOnSimplex(const MultivariatePolynomial& P);

This function returns the integral of P over the unit simplex (in 2-D this simplex is the unit triangle, in 3-D the unit tetrahedron).

Example :

MultivariatePolynomial<Real_wp> P(2, 3), Q;

// for 2-D polynomials, P(i, j) modifies the coefficient associated with x^i y^j
// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// intP = \int_0^1 \int_0^{1-x} P dy dx
Real_wp intP = IntegrateOnSimplex(P);

Location :

Share/MultivariatePolynomial.cxx

ScalePolynomVariable

Syntax

  void ScalePolynomVariable(MultivariatePolynomial& P, T alpha);

This function computes the polynomial Q such that Q(x) = P(alpha x). P is overwritten with Q.

Example :

MultivariatePolynomial<Real_wp> P(2, 3), Q;

// for 2-D polynomials, P(i, j) modifies the coefficient associated with x^i y^j
// P = 2 x^3 + 4 x^2 y - x y^2 + 5 y^3 + 3 x^2  - 4 x y - 3.2 y^2 + 5 x - 2.5 y + 8
P(3, 0) = 2.0; P(2, 1) = 4.0; P(1, 2) = -1.0; P(0, 3) = 5.0;
P(2, 0) = 3.0; P(1, 1) = -4.0; P(0, 2) = -3.2;
P(1, 0) = 5.0; P(0, 1) = -2.5;
P(0, 0) = 8.0;

// P is replaced by P(alpha x)
Real_wp alpha = 2.5;
ScalePolynomVariable(P, alpha);

Location :

Share/MultivariatePolynomial.cxx

CompressPolynom

Syntax

  void CompressPolynom(MultivariatePolynomial& P, T epsilon);

This function tries to reduce the degree of the polynomial P by removing coefficients smaller than epsilon.

Example :

MultivariatePolynomial<Real_wp> P(2, 2);

// P = 1e-10 x^2 - 2e-9 x y + 2e-10 y^2 + 2.0 x - 3.0 y - 5.0;
P(2, 0) = 1e-10; P(1, 1) = -2e-9; P(0, 2) = 2e-10;
P(1, 0) = 2.0; P(0, 1) = -3.0;
P(0, 0) = -5.0;

// here P will be reduced to a polynomial of degree 1
CompressPolynom(P, 1e-8);

Location :

Share/MultivariatePolynomial.cxx

OppositeX

Syntax

  void OppositeX(MultivariatePolynomial& P);

This function replaces P(x, y, z) by P(-x, y, z). It is only implemented for 3-D polynomials.

Example :

MultivariatePolynomial<Real_wp> P(3, 2);

// P = 2 x^2 + 3 x y - 2.5 x z + 4 y^2 + 3.2 y z + 5 z^2 + 2 x - 1.5 y - 2.4 z + 8
P(2, 0, 0) = 2; P(1, 1, 0) = 3.0; P(1, 0, 1) = -2.5; 
P(0, 2, 0) = 4.0; P(0, 1, 1) = 3.2; P(0, 0, 2) = 5;
P(1, 0, 0) = 2.0; P(0, 1, 0) = -1.5; P(0, 0, 1) = -2.4; P(0, 0, 0) = 8.0;

// P is replaced by P(-x, y, z)
// here it should give
// 2 x^2 - 3 x y + 2.5 x z + 4 y^2 + 3.2 y z + 5 z^2 - 2 x - 1.5 y - 2.4 z + 8
OppositeX(P);

Location :

Share/MultivariatePolynomial.cxx

OppositeY

Syntax

  void OppositeY(MultivariatePolynomial& P);

This function replaces P(x, y, z) by P(x, -y, z). It is only implemented for 3-D polynomials.

Example :

MultivariatePolynomial<Real_wp> P(3, 2);

// P = 2 x^2 + 3 x y - 2.5 x z + 4 y^2 + 3.2 y z + 5 z^2 + 2 x - 1.5 y - 2.4 z + 8
P(2, 0, 0) = 2; P(1, 1, 0) = 3.0; P(1, 0, 1) = -2.5; 
P(0, 2, 0) = 4.0; P(0, 1, 1) = 3.2; P(0, 0, 2) = 5;
P(1, 0, 0) = 2.0; P(0, 1, 0) = -1.5; P(0, 0, 1) = -2.4; P(0, 0, 0) = 8.0;

// P is replaced by P(x, -y, z)
// here it should give
// 2 x^2 - 3 x y - 2.5 x z + 4 y^2 - 3.2 y z + 5 z^2 + 2 x + 1.5 y - 2.4 z + 8
OppositeY(P);

Location :

Share/MultivariatePolynomial.cxx

PermuteXY

Syntax

  void PermuteXY(MultivariatePolynomial& P);

This function replaces P(x, y, z) by P(y, x, z). It is only implemented for 3-D polynomials.

Example :

MultivariatePolynomial<Real_wp> P(3, 2);

// P = 2 x^2 + 3 x y - 2.5 x z + 4 y^2 + 3.2 y z + 5 z^2 + 2 x - 1.5 y - 2.4 z + 8
P(2, 0, 0) = 2; P(1, 1, 0) = 3.0; P(1, 0, 1) = -2.5; 
P(0, 2, 0) = 4.0; P(0, 1, 1) = 3.2; P(0, 0, 2) = 5;
P(1, 0, 0) = 2.0; P(0, 1, 0) = -1.5; P(0, 0, 1) = -2.4; P(0, 0, 0) = 8.0;

// P is replaced by P(y, x, z)
// here it should give
// 2 y^2 + 3 x y - 2.5 y z + 4 x^2 + 3.2 x z + 5 z^2 + 2 y - 1.5 x - 2.4 z + 8
PermuteXY(P);

Location :

Share/MultivariatePolynomial.cxx

GenerateSymPol

Syntax

  void GenerateSymPol(const MultivariatePolynomial& P, MultivariatePolynomial& Q, MultivariatePolynomial& R, MultivariatePolynomial& S);

This function computes P(-y, x, z), P(-x, -y, z) and P(y, -x, z) and stores them in Q, R and S. It is only implemented for 3-D polynomials.

Example :

MultivariatePolynomial<Real_wp> P(3, 2), Q, R, S;

// P = 2 x^2 + 3 x y - 2.5 x z + 4 y^2 + 3.2 y z + 5 z^2 + 2 x - 1.5 y - 2.4 z + 8
P(2, 0, 0) = 2; P(1, 1, 0) = 3.0; P(1, 0, 1) = -2.5; 
P(0, 2, 0) = 4.0; P(0, 1, 1) = 3.2; P(0, 0, 2) = 5;
P(1, 0, 0) = 2.0; P(0, 1, 0) = -1.5; P(0, 0, 1) = -2.4; P(0, 0, 0) = 8.0;

GenerateSymPol(P, Q, R, S);

Location :

Share/MultivariatePolynomial.cxx

GenerateSym4_Vertices

Syntax

  void GenerateSym4_Vertices(const MultivariatePolynomial& P, MultivariatePolynomial& Q, MultivariatePolynomial& R, MultivariatePolynomial& S);

This function computes P(-x, y, z), P(-x, -y, z) and P(x, -y, z) and stores them in Q, R and S. It is only implemented for 3-D polynomials.

Example :

MultivariatePolynomial<Real_wp> P(3, 2), Q, R, S;

// P = 2 x^2 + 3 x y - 2.5 x z + 4 y^2 + 3.2 y z + 5 z^2 + 2 x - 1.5 y - 2.4 z + 8
P(2, 0, 0) = 2; P(1, 1, 0) = 3.0; P(1, 0, 1) = -2.5; 
P(0, 2, 0) = 4.0; P(0, 1, 1) = 3.2; P(0, 0, 2) = 5;
P(1, 0, 0) = 2.0; P(0, 1, 0) = -1.5; P(0, 0, 1) = -2.4; P(0, 0, 0) = 8.0;

GenerateSym4_Vertices(P, Q, R, S);

Location :

Share/MultivariatePolynomial.cxx

GenerateSym4_Edges

Syntax

  void GenerateSym4_Edges(const MultivariatePolynomial& P, MultivariatePolynomial& Q, MultivariatePolynomial& R, MultivariatePolynomial& S);

This function computes P(x, -y, z), P(-y, x, z) and P(y, -x, z) and stores them in Q, R and S. It is only implemented for 3-D polynomials.

Example :

MultivariatePolynomial<Real_wp> P(3, 2), Q, R, S;

// P = 2 x^2 + 3 x y - 2.5 x z + 4 y^2 + 3.2 y z + 5 z^2 + 2 x - 1.5 y - 2.4 z + 8
P(2, 0, 0) = 2; P(1, 1, 0) = 3.0; P(1, 0, 1) = -2.5; 
P(0, 2, 0) = 4.0; P(0, 1, 1) = 3.2; P(0, 0, 2) = 5;
P(1, 0, 0) = 2.0; P(0, 1, 0) = -1.5; P(0, 0, 1) = -2.4; P(0, 0, 0) = 8.0;

GenerateSym4_Edges(P, Q, R, S);

Location :

Share/MultivariatePolynomial.cxx

GenerateSym8

Syntax

  void GenerateSym8(const MultivariatePolynomial& P, MultivariatePolynomial& Q, MultivariatePolynomial& R, MultivariatePolynomial& S, 
MultivariatePolynomial& T, MultivariatePolynomial& U, MultivariatePolynomial& V, MultivariatePolynomial& W);

This function computes P(-x, y, z), P(-x, -y, z), P(x, -y, z), P(-y, x, z), P(-y, -x, z), P(y, -x, z) and P(y, x, z) and stores them in Q, R, S, T, U, V and W. It is only implemented for 3-D polynomials.

Example :

MultivariatePolynomial<Real_wp> P(3, 2), Q, R, S, T, U, V, W;

// P = 2 x^2 + 3 x y - 2.5 x z + 4 y^2 + 3.2 y z + 5 z^2 + 2 x - 1.5 y - 2.4 z + 8
P(2, 0, 0) = 2; P(1, 1, 0) = 3.0; P(1, 0, 1) = -2.5; 
P(0, 2, 0) = 4.0; P(0, 1, 1) = 3.2; P(0, 0, 2) = 5;
P(1, 0, 0) = 2.0; P(0, 1, 0) = -1.5; P(0, 0, 1) = -2.4; P(0, 0, 0) = 8.0;

GenerateSym8(P, Q, R, S, T, U, V, W);

Location :

Share/MultivariatePolynomial.cxx