Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Suppose I've got this:

In[13]:= Expand[(a + b) (b + c) (c + a)]

Out[13]= a^2 b + a b^2 + a^2 c + 2 a b c + b^2 c + a c^2 + b c^2

And I want to collect only terms involving a^2. In other words, I want the following output:

a^2(b + c) + a b^2 + 2 a b c + b^2 c + a c^2 + b c^2

How can I do this? If I use the following:

Collect[%, a^2]

Then it simply groups terms into the highest power of a, even if the highest term is less than 2. So it results in this:

In[14]:= Collect[%, a^2]

Out[14]= b^2 c + b c^2 + a^2 (b + c) + a (b^2 + 2 b c + c^2)

Ideally, I would like to extend this further to collect all a^2, b^2, and c^2 in one expression. So that running my command would transform the original fully expanded expression into the following:

a^2(b + c) + b^2(a+c) + c^2(a+b) + 2 a b c

In a single command. It this possible?

share|improve this question
FYI (its not the answer to your question but...) another symmetric form would be given by SymmetricReduction[Expand[(a + b) (b + c) (c + a)] , {a, b, c}][[1]] – chris Nov 15 '12 at 9:32
Welcome to Mathematica.SE! I suggest the following: 1) As you receive help, try to give it too, by answering questions in your area of expertise. 2) Read the FAQs! 3) When you see good Q&A, vote them up by clicking the gray triangles, because the credibility of the system is based on the reputation gained by users sharing their knowledge. ALSO, remember to accept the answer, if any, that solves your problem, by clicking the checkmark sign` – Vitaliy Kaurov Nov 16 '12 at 2:14

Introducing dummy variables will do the job:

Collect[Expand[(a + b) (b + c) (c + a)]
  /. {a^2 -> x, b^2 -> y, c^2 -> z}, {x, y, z}]/. {x -> a^2, y -> b^2, z -> c^2}

2 a b c + (a + b) c^2 + b^2 (a + c) + a^2 (b + c)

If you will have more variables in the future, it probably makes sense to rewrite this:

P = {a, b, c}; Q = {x, y, z};
Collect[Expand[(a + b) (b + c) (c + a)] 
   /. MapThread[#1^2 -> #2 &, {P, Q}], Q] /. MapThread[#2 -> #1^2 &, {P, Q}]

2 a b c + (a + b) c^2 + b^2 (a + c) + a^2 (b + c)

share|improve this answer

How about Coefficient?

expr = Expand[(a + b) (b + c) (c + a)]
term = Coefficient[expr, a^2]*a^2 (* get the coefficient and multiply it with the variable *)
rest = (expr - term) // Expand (* expand the rest *)
term + rest
a^2 b + a b^2 + a^2 c + 2 a b c + b^2 c + a c^2 + b c^2

a^2 (b + c)

a b^2 + 2 a b c + b^2 c + a c^2 + b c^2

a b^2 + 2 a b c + b^2 c + a c^2 + b c^2 + a^2 (b + c)

The final line contains the a^2(b + c) term at the end.

share|improve this answer

Your first question is quite different from the second one. To address the first one you might do as follows:

pos = Position[Collect[expr, a], a^2*b_][[1, 1]]

this yields 3. Then

Collect[expr, a][[pos]]

yielding a^2 (b + c)

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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