# Polynomials

One can handle polynomials with symbolic variables. In this chapter, however, we work with the Octave approach of using vectors as list of polynomial coefficients: A polynomial of degree n is represented by a vector having n+1 elements, the element with index 1 being the coefficient of the highest exponent in the polynomial. With poly(x) a normal polynomial is created, whose zeros are the elements of x, polyval(a,x) returns function values of the polynomial with coefficients a in the point x, roots(a) calculates the zeros, and polyfit(x,y,n) calculates the coefficients of the polynomial of degree $n$, whose graph passes through the points x and y. If their number is larger than n+1 a least square estimate is performed. The regression analysis in exercise 8 was performed using this method.

The roots of a 4th-degree polynomial are -4,-2,2,4 and it intersects the y-axis at (y=-64). Calculate its coefficients:

<jc lang="math"> a=poly([-4, -2, 2, 4]); printf('%f',a) b=polyval(a,1) a=-64/polyval(a,0) * a; printf('%f',a) a = polyfit([-4 -2 2 4 0],[0 0 0 0 -64],4) </jc>

One can use alternative engine requiring symbolic calculations:

<jc lang="math"> a=poly([-4,-2,2,4]); printf('%f\n',a) a = -64/polyval(a,0) * a; printf('%f\n',a) a = polyfit([-4,-2,2,4,0],[0,0,0,0,-64],4) </jc>

Example 2: On a grid with $x,y$-Coordinates we have the following grey values of a digital image:

y\x 	1 	2 	3 	4
1 	98 	110 	122 	136
2 	91 	112 	131 	141
3 	73 	118 	145 	190
4 	43 	129 	170 	230

Which grey value do you expect at position $x=2,35; y=2,74$? Calculate the bi-cubic interpolation.

Solution: <jc lang="math"> Z=[98,110,122,136;

  91,112,131,141;
73,118,145,190;
43,129,170,230];


i=1; p=polyfit(1:4,Z(i,:),3); z(i)=polyval(p,2.35); i=2; p=polyfit(1:4,Z(i,:),3); z(i)=polyval(p,2.35); i=3; p=polyfit(1:4,Z(i,:),3); z(i)=polyval(p,2.35); i=4; p=polyfit(1:4,Z(i,:),3); z(i)=polyval(p,2.35); p=polyfit(1:4,z,3) printf('p=%f\n',p) zp=polyval(p,2.74) printf('zp=%f',zp) </jc>

## Polynomial functions. Summary table

We have learnt that polynomials may be represented by the vector of their coefficient. Using a symbolic variable x we will now create a symbolic polynomial p. Conversely, we can extract the coefficients from a symbolic polynomial using the function coeff(p, x, exponent). The command allroots(p) returns the zeros.

<jc lang="math"> a=[3 2 5 7 4];  % coefficients syms x y=polyval(a,x)  % symbolic polynomial ans=coeff(y,x,3)  % get one coefficient b=coeff(y,x,4:-1:0)  % or all at once printf('%f\n',b) ans=allroots(y)  % same as roots(a) printf('%f\n',ans) </jc>

Up to this point there is little advantage of using symbolic calculations, it is just another way of specifying a problem. The main benefit of symbolic calculations emerges when we are dealing with more than one symbolic variable, or, meaning essentially the same, when our polynomial has non-constant coefficients. This case can be treated efficiently only with symbolic variables. Notice in the example below how the polynomial y is automatically multiplied through, and brought into a canonical form. In this form the symbolic variables are sorted alphabetically, i.e. z is main variable compared to x. The coefficients can be calculated for each variable separately.

<jc lang="math"> syms x,z y=(x-3)*(x-1)*(z-2)*(z+1); printf('%f\n',y) ans=coeff(y,x,2); printf('%f\n',ans) ans=coeff(y,z,2); printf('%f',ans) </jc>

## Roots

The command allroots functions with variable coefficients also, but only, if the polynomials degree in the main variable is smaller than 3, or it is biquadratic. If roots of other variables x are searched, one should use the more general solve(p,x), which will be discussed in more detail later.

<jc lang="math"> syms x,z y = x*z^2-3*x*z+(2*x+1); ans=allroots(y); printf('All roots=%f\n',ans) ans=solve(y,x); printf('Solves=%f',ans) </jc>

## Squarefree Decomposition

The decomposition of p in linear, quadratic, cubic etc factors is accomplished by sqfr(p). Returned is a vector of factors sorted in ascending order of the exponents.

<jc lang="math"> syms x y=(x-1)^3*(x-2)^2*(x-3)*(x-4); printf('Input=%f\n',y) z=sqfr(y); printf('sqfr=%f\n',z) </jc>

## Division and Common Denominator

The division of two polynomials p and q in one polynomial and remainder is calculated using divide(p,q). If the polynomials have more than one variable, an optional variable can be specified, which will be used for division. gcd(p,q) returns the greatest common denominator of two expressions. Both functions also work with numbers as arguments.

<jc lang="math"> ans=divide(122344,7623); printf('ans=%f',ans) </jc>

<jc lang="math"> ans=divide(2+i,3+2*i); printf('ans=%f\n',ans) </jc>

<jc lang="math"> syms x,z ans=divide(x^3*z-1,x*z-x,x); printf('ans=%f\n',ans) ans=divide(x^3*z-1,x*z-x,z); printf('ans=%f',ans) </jc>

<jc lang="math"> syms x,z ans=gcd(32897397,24552502); printf('ans=%f\n',ans) ans=gcd(z*x^5-z,x^2-2*x+1); printf('ans=%f',ans) </jc>

## Real- and Imaginary Part

realpart(expression) and imagpart(expression) is used to decompose complex expressions. Symbolic variables in these expressions are assumed to be real-valued.

<jc lang="math"> syms x y=(3+i*x)/(2-i*x); printf('Input=%f\n',y) ans=realpart(y); printf('Real=%f\n',ans) ans=imagpart(y); printf('Imag=%f',ans) </jc>