# How can I map functions into polynomial coefficients

Let's say I have the following expression (from a wide range of possibilities) :

pol =  3*a*x^(-b)*log(x)*b^2 - 6*a*b*c*sin(x*b) + 3*a*c^2 + 5


And I want to extract the coefficients of the polynomial over the polynomial ring over a & c, so that these result in:

a^0*c^0  :  5
a^1*c^0  :  3*x^(-b)*log(x)*b^2
a^0*c^1  :  0
a^1*c^1  :  -6*b*sin(x*b)
etc.


How can I define the polynomial ring?

How can I map an existing expression that defines "pol" (which is the result of other manipulations) into such ring?

edit retag close merge delete

1

Sort by » oldest newest most voted Here is a way:

sage: var('a,b,c,x')
sage: sinx = function('sinx',nargs=1)
sage: pol =  3*a*x^(-b)*log(x)*b^2 - 6*a*b*c*sinx(x*b) + 3*a*c^2 + 5
sage: R = PolynomialRing(SR, names='a,c')
sage: f = pol.polynomial(ring=R)
sage: dict(zip(f.monomials(), f.coefficients()))
{1: 5, a: 3*b^2*log(x)/x^b, a*c: -6*b*sinx(b*x), a*c^2: 3}


Note the generators of the ring R are not the same as the symbolic variables a and c.

To get the coefficient of c as in your example, you can do:

sage: f.monomial_coefficient(R.gen(1))
0


Or maybe more conveniently, something like:

sage: A,C = R.gens()
sage: f.monomial_coefficient(C)
0

more

Thanks! That works.

I guess the generator syntax is critical as R.<a,c> = Poly... definitively does not work.

But why is the "show" method not implemented on a PolynomialRing????