1
$\begingroup$

Given a polynomial, lets say for example $f(x,y) = (1+x+y)^2 = 1+2x+x^2+2y+2xy+y^2$, I'd like to be able to order the terms of the polynomial by total degree, either in increasing or decreasing order (and if alphabetical order can be taken into account within terms of the same total order, then that would be great, but not necessary).

I'd like a function to take in $1+2x+x^2+2y+2xy+y^2$ and return $(1) + (2x + 2y) + (x^2 + 2xy + y^2)$, or in reverse order (and not necessarily with parenthesis, but that would be nice to work with.

I've tried various commands using Collect[], and MonomialList[], and while MonomialList[f(x,y),{x,y},"DegreeLexicographic"] gives a list of the terms in the order I want, I would like the full expression.

$\endgroup$
4
  • $\begingroup$ Total[MonomialList[f(x,y),{x,y},"DegreeLexicographic"] will sum the list. $\endgroup$
    – Derek H
    Aug 4, 2021 at 12:45
  • $\begingroup$ This is true, however, it doesn't retain the order of the terms from the list. $\endgroup$ Aug 4, 2021 at 12:50
  • 3
    $\begingroup$ Total[HoldForm /@ CoefficientList[f[t*x, t*y], t]] $\endgroup$
    – Bob Hanlon
    Aug 4, 2021 at 12:59
  • 3
    $\begingroup$ People here generally like users to post code as Mathematica code instead of just images or TeX, so they can copy-paste it. It makes it convenient for them and more likely you will get someone to help you. You may find the meta Q&A, How to copy code from Mathematica so it looks good on this site, helpful $\endgroup$
    – Michael E2
    Aug 6, 2021 at 3:26

2 Answers 2

1
$\begingroup$

To quote Bob Hanlon's comment as an answer:

Total[HoldForm /@ CoefficientList[f[t*x, t*y], t]]
$\endgroup$
1
$\begingroup$

Perhaps this?:

Collect[(1 + x + y)^2 /. v : x | y :> t*v, t, HoldForm] /. t -> 1

Or this, which works like MatrixForm:

gradedForm /: MakeBoxes[gradedForm[poly_], form_] :=
  Module[{t},
   With[{vars = Alternatives @@ Variables@poly},
    RowBox[
     Riffle[
      RowBox[{"(", MakeBoxes[#, form], ")"}] & /@ 
       CoefficientList[poly /. v : vars :> t*v, t],
      "+"]]
    ]];

(1 + x + y)^2 // gradedForm
(*  (1) + (2 x + 2 y) + (x^2 + 2 x y + y^2)  *)

The output can be copy-pasted as input, although if a variable is set equal to gradedForm[poly], the poly will remained wrapped in gradedForm, just like with MatrixForm.

$\endgroup$
1
  • $\begingroup$ If I want to use a form other than StandardForm, e.g. TeXForm, how would I pass the form argument? (leading also to understanding of how to include an order argument, w/ w/o parens argument, per the original question) $\endgroup$ Oct 20, 2022 at 10:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.