A short note on variable naming up front: You can alter the settings for the names that are used for polynomial variables in parsing them from strings or for pretty-printing using the set_var_names or local_var_names functions. Refer to their documentation for defaults and usage information. To restore the default settings to your customize.pl, type this:

> reset_custom %polynomial_var_names;

Usage of Polynomials in Perl

Constructors

The easiest way to create a simple Polynomial object is through a string:

> $p = new Polynomial("4 + 3x_1 + x_2^5");

Sometimes it's convenient to use the constructor that takes a vector of coefficients and a matrix of exponents:

> $coeff = new Vector([9,-5]);
> $exp = new Matrix<Int>([[0,4],[8,3]]);
> $p2 = new Polynomial($coeff, $exp);
> print $p2;
-5*x_0^8*x_1^3 + 9*x_1^4

There is a seperate type for univariate polynomials, called UniPolynomial.

> $up = new UniPolynomial("3x + 2x^2 + 4");

Polynomials (and UniPolynomials) are templated by their coefficient and exponent types, defaulting to Rational for coefficients and Int for exponents. You can even have polynomials of polynomials (of polynomials…).

> $pp = new UniPolynomial<UniPolynomial<Rational,Int>,Rational>("(4x^2+5)y3/2 - 5/3x4y2/3");
> print $pp;
(4*x^2 + 5)*y^3/2 + (-5/3*x^4)*y^2/3

Computations

The standard arithmetic functions “+”, “-”, “*”, “^” are defined for polynomials of matching type.

> print $p + ($p^2);
9*x_1^2 + 6*x_1*x_2^5 + 27*x_1 + x_2^10 + 9*x_2^5 + 20

However, note that due to the fact that their precedence is given in perl, it may be necessary to write more parentheses than expected at first sight. For example, as above, you always have to write “($p^2)” because of the lower precedence of the “^” operator…

> print $p + $p^2;
36*x_1^2 + 24*x_1*x_2^5 + 96*x_1 + 4*x_2^10 + 32*x_2^5 + 64

For UniPolynomials, we even have polynome division:

> print (($up^2)/$up);
(2*x^2 + 3*x + 4)/(1)

Example: Newton Polynomials

Here is one way to produce polytopes from polynomials (as the convex hull of the exponent vectors of all terms).

polytope > $np = newton($p*($p+$p));
polytope > print $np->VERTICES;
1 0 0 0
1 0 2 0
1 0 0 10
polytope > print equal_polyhedra($np,minkowski_sum(newton($p),newton($p+$p)));
1

The final “1” means “true”: The Newton polytope of the product of two polynomials always equals the Minkowski sum of the Newton polytopes of the factors.

Example: Toric Degeneration

The following describes how to construct the polynomial which describes the toric deformation with respect to a point configuration and a height function. This is the input data:

polytope > $points = new Matrix<Int>([1,0],[0,1]);
polytope > $height = new Vector<Int>([2,3]);
polytope > $coefficients = new Vector<Rational>([-1/2,1/3]);

The following is generic (assuming that the dimensions of the objects above match).

polytope > $p = new Polynomial($coefficients,$height|$points);

Notice that the points are given in Euclidean coordinates; that is, if applied, e.g., to the VERTICES of a polytope do not forget to strip the homogenizing coordinate. The output in our example looks like this:

polytope > print $p;
1/3*s^3*x2 -1/2*s^2*x1
tutorial/polynomials_tutorial.txt · Last modified: 2017/07/06 16:09 by oroehrig
Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Noncommercial-Share Alike 4.0 International
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki