[GiNaC-devel] Nested Polynomial Algorithm

Frank Greenhalgh fj.j.greenhalgh at gmail.com
Fri Mar 11 06:36:28 CET 2011


 The following algorithm creates a nested polynomial to minimize the number
of multiplications and additions in evaluating a polynomial at some given
point, x. I use it to reduce my Finite Element Method basis functions.

//Converts an *expanded* polynomial into a nested polynomial for efficient
evaluation at points
ex nested_polynomial( ex polynomial, realsymbol x ){
 //result is returned to the user, highest order is the peeled off highest
order term of the polynomial
 ex result=0, highest_order;
 //While the polynomial is not empty continue peeling off the highest degree
 while( polynomial.degree( x ) != 0 ){
  //get the highest order term
  highest_order = polynomial.lcoeff(x) * pow( x, polynomial.degree(x) );
  //add to nest
  result+= highest_order.lcoeff( x );
  //remove the highest order term from the expanded polynomial
  polynomial-=highest_order;
  //multiply the result by the proper amount of x's
  result*=pow(x, highest_order.degree(x)-
polynomial.degree(x) );
 }
 //correct for forgotten 0th order terms
 result+=polynomial.lcoeff(x);
 return result;
}


Example:
 polynomial = 10*x^5 + 3*x^3 + 1;
 the function would return (with polynomial and x as inputs):
 1+x^3*(3+x^2*10)
 which minimizes the number of multiplications and additions we need to do
in evaluation.
The first polynomial form needs 5+3=8 multiplications and 2 additions, while
the second form needs 2+3=5 multiplications and 2 additions.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cebix.net/pipermail/ginac-devel/attachments/20110310/8d05c372/attachment.html>


More information about the GiNaC-devel mailing list