iipr
iipr

Reputation: 1270

Display polynomials in reverse order in SageMath

So I would like to print polynomials in one variable (s) with one parameter (a), say

a·s^3 − s^2 - a^2·s − a + 1.

Sage always displays it with decreasing degree, and I would like to get something like

1 - a - a^2·s - s^2 + a·s^3

to export it to LaTeX. I can't figure out how to do this... Thanks in advance.

Upvotes: 4

Views: 1435

Answers (2)

user3717023
user3717023

Reputation:

As an alternative to string manipulation, one can use the series expansion.

F = a*s^3 - s^2 - a^2*s - a + 1
F.series(s, F.degree(s)+1)

returns

(-a + 1) + (-a^2)*s + (-1)*s^2 + (a)*s^3

which appears to be what you wanted, save for some redundant parentheses.

This works because (a) a power series is ordered from lowest to highest coefficients; (b) making the order of remainder greater than the degree of the polynomial ensures that the series is just the polynomial itself.

Upvotes: 5

kcrisman
kcrisman

Reputation: 4402

This is not easy, because the sort order is defined in Pynac, a fork of Ginac, which Sage uses for its basic symbolic manipulation. However, depending on what you need, it is possible programmatically:

sage: F = 1 + x + x^2
sage: "+".join(map(str,sorted([f for f in F.operands()],key=lambda exp:exp.degree(x))))
'1+x+x^2'

I don't know whether this sort of thing is powerful enough for your needs, though. You may have to traverse the "expression tree" quite a bit but at least your sort of example seems to work.

sage: F = a + a^2*x + x^2 - a*x^2
sage: "+".join(map(str,sorted([f for f in F.operands()],key=lambda exp:exp.degree(x))))
'a+a^2*x+-a*x^2+x^2'

Doing this in a short statement requires a number of Python tricks like this, which are very well worth learning if you are going to use Sage (or Numpy, or pandas, or ...) a fair amount.

Upvotes: 4

Related Questions