2
$\begingroup$

Suppose I have a polynomial $$P(x,\,y)=a^5+b^2x+c\,y+d\,x^2+e\,x+f^3y+g\,y^2+h\,x^2$$ and I want to collect it in terms of main variables $x,\,y$ to get $$P(x,\,y)=a^5+(b^2+e)x+(c+f^3)y+(d+h)x^2+g\,y^2$$ How do I use Collect or similar commands to perform the task?

Input

P == a^5 + b^2*x + c*y + d*x^2 + e*x + f^3*y + g*y^2 + h*x^2

Output wanted

P(x, y) = a^5 + (b^2 + e)*x + (c +f^3)*y + (d + h)*x^2 + g*y^2 

A substantial example

 Collect[b^4 m^4 - 2 a^2 b^2 m^2 n^2 + a^4 n^4 - 4 b^3 m^4 R + 
4 a^2 b m^2 n^2 R + 4 a b^2 m^2 n^2 R - 4 a^3 n^4 R + 
4 b^2 m^4 R^2 - 8 a b m^2 n^2 R^2 + 4 a^2 n^4 R^2 + 2 b^2 m^4 S - 
2 a^2 m^2 n^2 S - 2 b^2 m^2 n^2 S + 2 a^2 n^4 S - 4 b m^4 R S + 
4 a m^2 n^2 R S + 4 b m^2 n^2 R S - 4 a n^4 R S + m^4 S^2 - 
2 m^2 n^2 S^2 + n^4 S^2 - 2 b^2 c^2 m^2 T^2 - 2 a^2 c^2 n^2 T^2 + 
4 b c^2 m^2 R T^2 + 4 a c^2 n^2 R T^2 - 2 c^2 m^2 S T^2 - 
2 c^2 n^2 S T^2 + c^4 T^4, {R, S}]

results in

b^4 m^4 - 2 a^2 b^2 m^2 n^2 + a^4 n^4 + 
(4 b^2 m^4 - 8 a b m^2 n^2 + 4 a^2 n^4) R^2 + 
(m^4 -2 m^2 n^2 + n^4) S^2 - 
2 b^2 c^2 m^2 T^2 - 2 a^2 c^2 n^2 T^2 + c^4 T^4 + 
S (2 b^2 m^4 - 2 a^2 m^2 n^2 - 2 b^2 m^2 n^2 + 2 a^2 n^4 - 
   2 c^2 m^2 T^2 - 2 c^2 n^2 T^2) + 
R ( -4 b^3 m^4 + 4 a^2 b m^2 n^2 + 4 a b^2 m^2 n^2 - 4 a^3 n^4 + 
       (-4 b m^4 + 4 a m^2 n^2 + 4 b m^2 n^2 - 4 a n^4) S + 
    4 b c^2 m^2 T^2 + 4 a c^2 n^2 T^2   )

Note several issues:

1) The last term appears as $R (A+BS+C)$ instead of $(A+C)R+BRS$

2) One would expect a standard form, for example $AR^2+BRS+CS^2+DR+ES+F$, for the outcome but the result does not seem to follow a discernible order.

3) The constant term , the one without $R$ or $S$, is split.

$\endgroup$
6
  • 1
    $\begingroup$ What's wrong with Collect[P, {x, y}]? $\endgroup$ May 20, 2017 at 14:29
  • $\begingroup$ @J.M. How do you prevent it from doing partial factorization, as in writing $x(2x+3y)$ instead of $2x^2+3xy$. $\endgroup$
    – Maesumi
    May 20, 2017 at 20:49
  • $\begingroup$ When I evaluate Collect[a^5 + b^2*x + c*y + d*x^2 + e*x + f^3*y + g*y^2 + h*x^2, {x, y}], I get the result you ask for and none of the additional factoring you allude to in your comment. $\endgroup$
    – m_goldberg
    May 20, 2017 at 22:40
  • 1
    $\begingroup$ Judging by your comment, you have a weak example in that there are no "mixed" terms having factors of both $x$ and $y$. $\endgroup$
    – Michael E2
    May 20, 2017 at 22:45
  • 1
    $\begingroup$ @m_goldberg an example showing partial factorization is provided $\endgroup$
    – Maesumi
    May 21, 2017 at 16:41

2 Answers 2

9
$\begingroup$

You can use the third argument of Collect to bind the coefficients in something like Hold. Afterwards, release the hold or replace wrapper by Identity.

ReleaseHold@
 Expand@Collect[poly =
   b^4 m^4 - 2 a^2 b^2 m^2 n^2 + a^4 n^4 - 4 b^3 m^4 R + 
    4 a^2 b m^2 n^2 R + 4 a b^2 m^2 n^2 R - 4 a^3 n^4 R + 
    4 b^2 m^4 R^2 - 8 a b m^2 n^2 R^2 + 4 a^2 n^4 R^2 + 2 b^2 m^4 S - 
    2 a^2 m^2 n^2 S - 2 b^2 m^2 n^2 S + 2 a^2 n^4 S - 4 b m^4 R S + 
    4 a m^2 n^2 R S + 4 b m^2 n^2 R S - 4 a n^4 R S + m^4 S^2 - 
    2 m^2 n^2 S^2 + n^4 S^2 - 2 b^2 c^2 m^2 T^2 - 2 a^2 c^2 n^2 T^2 + 
    4 b c^2 m^2 R T^2 + 4 a c^2 n^2 R T^2 - 2 c^2 m^2 S T^2 - 
    2 c^2 n^2 S T^2 + c^4 T^4,
   {R, S}, Hold]
(*
  b^4 m^4 - 2 a^2 b^2 m^2 n^2 + a^4 n^4 +
   (4 b^2 m^4 - 8 a b m^2 n^2 + 4 a^2 n^4) R^2 +
   (-4 b m^4 + 4 a m^2 n^2 + 4 b m^2 n^2 - 4 a n^4) R S +
   (m^4 - 2 m^2 n^2 + n^4) S^2 -
   2 b^2 c^2 m^2 T^2 - 2 a^2 c^2 n^2 T^2 + c^4 T^4 + 
   S (2 b^2 m^4 - 2 a^2 m^2 n^2 - 2 b^2 m^2 n^2 + 2 a^2 n^4 - 
      2 c^2 m^2 T^2 - 2 c^2 n^2 T^2) + 
   R (-4 b^3 m^4 + 4 a^2 b m^2 n^2 + 4 a b^2 m^2 n^2 - 4 a^3 n^4 + 
      4 b c^2 m^2 T^2 + 4 a c^2 n^2 T^2)
*)

Other wrappers can be fun:

Expand@Collect[poly, {R, S}, Style[#, Red] &]

Mathematica graphics

To get a usable expression, execute this:

% /. Style -> (# &)

Defer makes for nice output that can be copied as input without further processing.

Expand@Collect[poly, {R, S}, Defer]

Mathematica graphics

$\endgroup$
1
  • $\begingroup$ You seem to have n=2 somewhere. +1 $\endgroup$
    – jjc385
    May 21, 2017 at 19:12
3
$\begingroup$

This is your polynomial:

p = b^4 m^4 - 2 a^2 b^2 m^2 n^2 + a^4 n^4 - 4 b^3 m^4 R + 
   4 a^2 b m^2 n^2 R + 4 a b^2 m^2 n^2 R - 4 a^3 n^4 R + 
   4 b^2 m^4 R^2 - 8 a b m^2 n^2 R^2 + 4 a^2 n^4 R^2 + 2 b^2 m^4 S - 
   2 a^2 m^2 n^2 S - 2 b^2 m^2 n^2 S + 2 a^2 n^4 S - 4 b m^4 R S + 
   4 a m^2 n^2 R S + 4 b m^2 n^2 R S - 4 a n^4 R S + m^4 S^2 - 
   2 m^2 n^2 S^2 + n^4 S^2 - 2 b^2 c^2 m^2 T^2 - 2 a^2 c^2 n^2 T^2 + 
   4 b c^2 m^2 R T^2 + 4 a c^2 n^2 R T^2 - 2 c^2 m^2 S T^2 - 
   2 c^2 n^2 S T^2 + c^4 T^4;

Try this:

lst = Drop[Flatten[Table[R^n*S^m, {n, 0, 2}, {m, 0, 2}], 1], 1]

(* {S, S^2, R, R S, R S^2, R^2, R^2 S, R^2 S^2}  *)

and then

Collect[p, lst]

(*  b^4 m^4 - 2 a^2 b^2 m^2 n^2 + 
 a^4 n^4 + (4 b^2 m^4 - 8 a b m^2 n^2 + 4 a^2 n^4) R^2 + (-4 b m^4 + 
    4 a m^2 n^2 + 4 b m^2 n^2 - 4 a n^4) R S + (m^4 - 2 m^2 n^2 + 
    n^4) S^2 - 2 b^2 c^2 m^2 T^2 - 2 a^2 c^2 n^2 T^2 + c^4 T^4 + 
 S (2 b^2 m^4 - 2 a^2 m^2 n^2 - 2 b^2 m^2 n^2 + 2 a^2 n^4 - 
    2 c^2 m^2 T^2 - 2 c^2 n^2 T^2) + 
 R (-4 b^3 m^4 + 4 a^2 b m^2 n^2 + 4 a b^2 m^2 n^2 - 4 a^3 n^4 + 
    4 b c^2 m^2 T^2 + 4 a c^2 n^2 T^2)  *)

To address your question in the comment

One may do as follows

p1 = p /. {R -> 0, S -> 0};
p2 = p - p1;
Collect[p2, lst] + Simplify[p1]

(* b^4 m^4 + (4 b^2 m^4 - 8 a b m^2 n^2 + 4 a^2 n^4) R^2 + (-4 b m^4 + 
    4 a m^2 n^2 + 4 b m^2 n^2 - 4 a n^4) R S + (m^4 - 2 m^2 n^2 + 
    n^4) S^2 + (a^2 n^2 - c^2 T^2)^2 - 2 b^2 m^2 (a^2 n^2 + c^2 T^2) +
  S (2 b^2 m^4 - 2 a^2 m^2 n^2 - 2 b^2 m^2 n^2 + 2 a^2 n^4 - 
    2 c^2 m^2 T^2 - 2 c^2 n^2 T^2) + 
 R (-4 b^3 m^4 + 4 a^2 b m^2 n^2 + 4 a b^2 m^2 n^2 - 4 a^3 n^4 + 
    4 b c^2 m^2 T^2 + 4 a c^2 n^2 T^2) *)

Have fun!

$\endgroup$
5
  • $\begingroup$ You can also use patterns {R, S, S^_, R^_, S*R, S^_*R^_} for the second argument, and it extends to arbitrary degree. (I tried this first, but left one or two out, I think, and it didn't work. Instead of finding my error, I thought it didn't. +1) $\endgroup$
    – Michael E2
    May 22, 2017 at 10:49
  • $\begingroup$ It looks like the coefficient of $R^0S^0$, i.e. the constant term, is split into two pieces. $\endgroup$
    – Maesumi
    May 22, 2017 at 13:43
  • $\begingroup$ @Maesumi Yes, It looks so. $\endgroup$ May 22, 2017 at 13:44
  • $\begingroup$ @Maesumi It's the automatic sorting by Plus and a famous difficulty with Mathematica and "constant terms." You can't really avoid it. In my answer, the terms are wrapped in another function. You have to get rid of the wrapper before you can use the result algebraically, but then the terms get sorted automatically, since Plus is Orderless. $\endgroup$
    – Michael E2
    May 22, 2017 at 18:20
  • $\begingroup$ There is a way around. Have a look at the edit. $\endgroup$ May 22, 2017 at 19:33

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.