# This function computes the roots of the polynomial having the
# coefficients given by the vector `c'. If `c' has n+1 elements,
# the equation solved (for `x') is
#
# c[1]*x^n + c[2]*x^(n-1) + ... + c[n]*x + c[n+1] = 0
#
# A vector with zero elements is returned if this equation has
# no solution ("roots(1)", for example). NULL is returned if it
# has an infinite number of solutions ("roots(0)", for example).
# Otherwise, the vector returned contains all of the solutions.
roots = function( c )
{
local( a; index; nz; r );
c = vector( c ); # convert to vector
index = find( 1; c != 0 ); # find nonzeros
if ( index.ne > 0 )
{
# strip leading and trailing zeros
nz = c.ne - index[index.ne];
c = c[ index[1] : index[index.ne] ];
else
# no nonzeros means no solution -- return NULL
return NULL;
}
# Compute roots
if ( c.ne > 1 )
{
r = eig( [ -c[2:c.ne] / c[1];
diag( fill( c.ne-2; 1 ) ),
fill( c.ne-2; 0 )' ] ).values;
else
r = vector();
}
return fill( nz; 0 ), r;
};
syntax highlighted by Code2HTML, v. 0.9.1