I have a rational function in $\mathbb{Q}(x)$ which can be computed by substitution of a polynomial in the polynomial ring with integer compositions as variables, with coefficients in $\mathbb{Q}(x)$. The compositions can have unbounded parts. For example, one monomial might be $\frac{1}{1-x}C_{[2,2]}C_{[1,3,1]}$, where $C_\lambda$ is a formal variable related to the integer composition $\lambda$.
I would be happy to have this "symbolic" representation as polynomial over the set of all integer compositions, and not just the polynomial after substituting all of the $C_\lambda$'s. I have tried the following two approaches which failed.
- Using the
InfinitePolynomialRing
class. The setup used:
sage: R = FractionField(QQ["x"])
sage: R.inject_variables()
Defining x
sage: RC.<c> = InfinitePolynomialRing(R)
sage: f = 1/(1-x)*c[3] + 3*c[2]
But then f.subs does not work:
sage: f.subs({c[3]:5})
...[snip]
TypeError: <class 'sage.rings.polynomial.infinite_polynomial_ring.InfinitePolynomialGen'> is not hashable
sage: f.subs(c[3]=5) # Expected not to work.
SyntaxError: keyword can't be an expression
There is also a method called f.specialization
which seems to work with substitution of just one variable, but not with more than one, nor when using an element from InfinitePolynomialRing(R, "cd")
. There is also the annoyance of using a bijection between the natural numbers and compositions.
- Using
CombinatorialFreeModule
. I know this might seem as an abuse, but a module can also have the structure of a ring...
sage: R = FractionField(QQ["x"])
sage: FM = FreeAbelianMonoid(Compositions())
sage: CR = Rings().Commutative()
sage: CMR = ModulesWithBasis(R)
sage: M = CombinatorialFreeModule(R, FM, category=(CR,CMR)) # Does not work also with category=None
sage: a = M.an_element(); a*a
...[snip]
TypeError: 'NotImplementedType' object is not callable
I assume some magic with the category
argument might help. Note that in my case only a free abelian semigroup indexed by compositions is needed, and not a monoid.
Any help is welcomed.