Now seriously: what is a polynomial?

Roberto Bagnara bagnara at cs.unipr.it
Wed Oct 9 16:50:55 CEST 2002


Dear all,

this message is a first of a small series where we try to summarize
our difficulties with GiNaC and its (lack of) documentation.
As a general remark, several concepts are defined only through examples
whereas formal definitions would help greatly.
In this message we concentrate on one concept that is central to our
application: the concept of "polynomial".  Here are our sources of
information:

1) The tutorial: a bunch of examples are presented that, however
    do not clarify the general idea.

2) The method `info(info_flags::polynomial)' should constitute,
    we used to believe, the very formal specification of the
    notion of "being a polynomial".

3) The message by Christian Bauer (March 7th, 2002,
    see http://www.ginac.de/lists/ginac-list/msg00232.html):

     "But this is the intended behavior:
      If e is of the form e = sum(i=n1..n2, a_i * x^i) with n1, n2
      integer and expressions a_i that satisfy has(a_i, x) == false,
      then degree(e, x) and ldegree(e, x) are well defined and accurate.

      I think this should even cover cases like

        degree(sin(y)^3-sin(y),sin(y))

      which is guaranteed to return 3."

The problem is that, while 1 is inconclusive, 2 and 3 (with the
correction replacing "integer" by "nonnegative integer") conflict
with each other.  Let us consider the expression

   e = sqrt(2)*x.

Since, clearly, has(sqrt(2), x) == false, `e' is a polynomial for 3.
But, since e.info(info_flags::polynomial) == false, `e' is not
a polynomial according to 2.

The point here is to decide _exactly_ for which class of expressions
are the functions degree(), ldegree(), coeff(), lcoeff(), tcoeff(),
expand(), collect(), quo(), rem(), prem(), gcd(), lcm(), sqrfree()
and so forth guaranteed to work.
All the best

    Roberto Bagnara
    Alessandro Zaccagnini
    Enea Zaffanella
    Tatiana Zolo

/***************************************************************************/
#include <ginac/ginac.h>
#include <iostream>

using namespace GiNaC;
using namespace std;

int
main() {
   symbol x("x");
   ex coeff = sqrt(ex(2));
   ex e = coeff*x;
   cout << (e.info(info_flags::polynomial) ? "true" : "false") << endl;
   cout << (!has(coeff, x) ? "true" : "false") << endl;
   return 0;
}
/***************************************************************************/

-- 
Prof. Roberto Bagnara
Computer Science Group
Department of Mathematics, University of Parma, Italy
http://www.cs.unipr.it/~bagnara/
mailto:bagnara at cs.unipr.it




More information about the GiNaC-list mailing list