# Collect powers of variables and integers separately?

Let expr contain a sum of powers of x with some coefficients ci. The exponents of x can contain variables and/or integers. I would like to define a function MyCollect in Mathematica which would first collect all powers containing variables and would then collect all powers containing integers within the first collection. For example, such that if:

expr = c0 x^(a+b)+c1 x^(a+b+1)+c2 x^(a+b+2)+c3 x^(a+b+2)+c4 x^(a+b+2)+c5 x^(a)+c6 x^(a+1)+c7 x^(a+1)


the result would be:

MyCollect[expr]

x^(a)(c5 + x(c6+c7)) + x^(a+b)(c0 + x c1 + x^2(c2 + c3 + c4))


Is there a convenient way to do this? Thanks for any suggestion!

EDIT

Here is a second, more complicated example

expr = c0 x^(a+b)+c1 x^(a+b+1)+c2 x^(a+b+2)+c3 x^(2a+b+2)+c4 x^(a+b+2)+c5 x^(a)+c6 x^(a+1)+c7 x^(a+1)+c8 x^(a+c+1)+c9 x^(a+c)


Desired output of MyCollect[expr]:

x^(a)(c5 +x(c6+c7)) + x^(a+b)(c0 +x c1+x^2(c2+c4)) + x^(2a+b)(x^2 c3) + x^(a+c)(c9+x c8)


All unique combinations of powers involving variables are collected first, and then the remaining integer powers are collected at a second level, so to say.

Update: This matches the evaluated form of your desired output for each example:

fn = Collect[#, x^y_ /; FreeQ[y, _Integer], Apart] &;


Test:

expr1 = c0 x^(a + b) + c1 x^(a + b + 1) + c2 x^(a + b + 2) + c3 x^(a + b + 2) +
c4 x^(a + b + 2) + c5 x^(a) + c6 x^(a + 1) + c7 x^(a + 1);

target1 = x^(a) (c5 + x (c6 + c7)) + x^(a + b) (c0 + x c1 + x^2 (c2 + c3 + c4));

expr2 = c0 x^(a + b) + c1 x^(a + b + 1) + c2 x^(a + b + 2) + c3 x^(2 a + b + 2) +
c4 x^(a + b + 2) + c5 x^(a) + c6 x^(a + 1) + c7 x^(a + 1) + c8 x^(a + c + 1) +
c9 x^(a + c);

target2 = x^(a) (c5 + x (c6 + c7)) + x^(a + b) (c0 + x c1 + x^2 (c2 + c4)) +
x^(2 a + b) (x^2 c3) + x^(a + c) (c9 + x c8);

fn[expr1]

fn[expr2]

fn[expr1] === target1

fn[expr2] === target2

x^a (c5 + (c6 + c7) x) + x^(a + b) (c0 + c1 x + (c2 + c3 + c4) x^2)

c3 x^(2 + 2 a + b) + x^a (c5 + (c6 + c7) x) + x^(a + c) (c9 + c8 x) +
x^(a + b) (c0 + c1 x + (c2 + c4) x^2)

True

True

• Yes, it seems to do the right thing at least for the short example above. I'll have to test if it will still work accordingly in more complicated cases. But I see no reason why it should not. – Kagaratsch Oct 28 '14 at 0:25
• I just wonder what the syntax /@ means? – Kagaratsch Oct 28 '14 at 0:26
• Now I tried a slightly more complicated example and unfortunately the result was not correct. See my edit above. – Kagaratsch Oct 28 '14 at 0:33
• @Kagaratsch Please include the desired output for the second example. – Mr.Wizard Oct 28 '14 at 0:41
• /@ is a short for map[],you can search it in the "Help" document of Mathematic – user21730 Oct 28 '14 at 1:17