Re: ordering of multivariate polynomial terms
- To: mathgroup at smc.vnet.net
- Subject: [mg86646] Re: ordering of multivariate polynomial terms
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Sat, 15 Mar 2008 17:46:01 -0500 (EST)
- Organization: University of Bergen
- References: <frg0d4$evn$1@smc.vnet.net>
Stefan Porubsky wrote:
> Hello,
>
> how it is possible to rearrange the terms of a multivariate polynomial
> in Standard or Traditional Form in such a way that the terms are ordered
> according to the number of their variables, i.e. first the constant
> term, then the group of terms depending on one of the variables, then
> the group of terms depening on two variables, then the group of those
> with three variables, etc.?
>
It is not possible to do this because Plus has the Attribute orderless.
This means that Mathematica will automatically sort the terms of any
sum using its built-in ordering rules.
Here's a function that returns a list of the terms sorted by degree:
sortPoly[poly_, vars_] := Module[{x, exp},
exp[term_] := Exponent[term /. Alternatives @@ vars -> x, x];
Sort[List @@ poly, exp[#1] >= exp[#2] &]
]
(The exp[] function returns the degree of a term.)
For example:
f = 2 + 5 x + 7 x^2 + 5 x^3 + x^4 + 4 y + 16 x y + 9 x^2 y + 4 x^3 y +
10 y^2 + 15 x y^2 + 6 x^2 y^2 + 3 y^3 + 4 x y^3 + y^4
sortPoly[f, {x, y}]
{x^4, 4 x^3 y, 6 x^2 y^2, 4 x y^3, y^4, 5 x^3, 9 x^2 y,
15 x y^2, 3 y^3, 7 x^2, 16 x y, 10 y^2, 5 x, 4 y, 2}
Now we can convert the list back to a sum, and use Hold to prevent
automatic reordering.
Hold@Plus[##] & @@ %
Hold[x^4 + 4 x^3 y + 6 x^2 y^2 + 4 x y^3 + y^4 + 5 x^3 + 9 x^2 y +
15 x y^2 + 3 y^3 + 7 x^2 + 16 x y + 10 y^2 + 5 x + 4 y + 2]
...
I'm not sure if I interpreted your request correctly. Here's and
alternative "exp" function that returns the number of different
variables present in a term:
exp[term_] := Count[FreeQ[term, #] & /@ vars, False]
The full sortPoly:
sortPoly[poly_, vars_] := Module[{x, exp},
exp[term_] := Count[FreeQ[term, #] & /@ vars, False];
Sort[List @@ poly, exp[#1] <= exp[#2] &]
]
Now sortPoly[f, {x,y}] returns
{2, 5 x, 7 x^2, 5 x^3, x^4, 4 y, 10 y^2, 3 y^3, y^4, 16 x y, 9 x^2 y,
4 x^3 y, 15 x y^2, 6 x^2 y^2, 4 x y^3}
- Follow-Ups:
- Re: Re: ordering of multivariate polynomial terms
- From: Andrzej Kozlowski <akoz@mimuw.edu.pl>
- Re: Re: ordering of multivariate polynomial terms