It seems that implementation of polynomials in sympy and symengine could be closely parallel.
There should be three kinds of polynomials: (standard) polynomials, Laurent polynomials, and Puiseux polynomials, thus adding a "fourth dimension" to the classification in the wiki (https://github.com/sympy/symengine/wiki/En-route-to-Polynomial). They can also be used for representing (truncated) series of respective types.
It is possible to implement all three kinds of polynomials with exponents, or index vectors, that consist of nonnegative integers. In sympy these vectors are tuples; in symengine they could be packed into (long) integers to accelerate the execution.
Laurent polynomials may also have negative exponents. The index vectors
could contain negative integers. In sympy that would probably make no
difference, but in symengine the packing and unpacking operations
would be less efficient because of the necessary sign manipulations.
However, there is an alternative. The exponents in a Laurent
series are bounded below. A Laurent polynomial could be implemented
as an ordinary polynomial
p together with a monomial
a vector of nonnegative integers, one for each generator) such that
the Laurent polynomia would be
p/m. The algebraic operations,
converters and printers of the Laurent polynomial class would have
take into account the shifts in the exponents.
The implementation of Puiseux polynomials by means of vectors of rational numbers would be rather inefficient even in sympy. In this case it is again possible to use polynomials with integral exponents. The exponents in a Puiseux series are rational, but their denominators are bounded, by definition. Hence, for each Puiseux series, there exists a vector of positive integers (lcm's of the denominators) such that the rational exponents of the series will become integral after multiplication by these integers. Again, the operations, converters and printers would have to be defined specifically for the Puiseux polynomial class.
- A Laurent polynomial is represented by a polynomial together with a vector of integers (monomial).
- A Puiseux polynomial is represented by a Laurent polynomial and a vector of lcm integers.