3
$\begingroup$

I have following expression

$$-3 b_{\sigma _d}-3 b_{\sigma _v}-b-b_2+2 j-2 j_2-2 j_3+2 j_6+12$$

Mathematica input

12-b+2 j-Subscript[b, 2]-3 Subscript[b, Subscript[\[Sigma], d]]-3 Subscript[b, Subscript[\[Sigma], v]]-2 Subscript[j, 2]-2 Subscript[j, 3]+2 Subscript[j, 6]

I want to reorder this expression by partitioning the occuring symbols. Additionally, common factors of the partitions should be factored out:

Partition (given by user): $$\{\{j,j_2,j_3,j_6\},\{b,b_2,b_{\sigma_d},b_{\sigma _v}\}\}$$

The order should also be respected. The end result would look like $$2(j-j_2-j_3+j_6)-(b+b_2+3 b_{\sigma _d}+3 b_{\sigma _v})+12$$

I have considered FactorTerms[poly,{x_1,x_2,...] and Collect[expr,{x_1,x_2,...}] but was not successful to achieve this.

$\endgroup$

2 Answers 2

5
$\begingroup$
expr = 12 - b + 2 j - Subscript[b, 2] - 
 3 Subscript[b, Subscript[σ, d]] - 
 3 Subscript[b, Subscript[σ, v]] - 2 Subscript[j, 2] - 
 2 Subscript[j, 3] + 2 Subscript[j, 6]

Inactive[Plus] @@ 
  (Total /@ Join @@ 
     GatherBy[List @@ expr, MatchQ[_ (# | Subscript[#, _])] & /@ {j, b}])

TeXForm @ %

$\Large 12+\left(-3 b_{\sigma _d}-3 b_{\sigma _v}-b-b_2\right)+\left(2 j-2 j_2-2 j_3+2 j_6\right)$

Update:

ClearAll[f]
f[e_] := Row @ Flatten @ Append[Reverse @ Values @ 
   GroupBy[Transpose[{Coefficient[e, #], #}& @ Variables[e]] /.
      {a_, b_Symbol} :> {a, Subscript[b, 0]}, #[[2,1]]&, 
     Row[{# /. { 1 -> " + ", -1 -> " - "}, "(", HoldForm @ #2, ")"}]& @@ 
     FactorList[ Dot @@ Transpose[#]][[All, 1]]&],
      If[# < 0, {" - ", -#}, {" + ", #}]&[e /.
       (Alternatives@@Variables[e] -> 0)] /. {_, 0} -> Nothing] /.
    Subscript[a_, 0] -> a

Examples:

f @ expr 

enter image description here

System`Convert`CommonDump`templateBoxToDisplay = BoxForm`TemplateBoxToDisplayBoxes;

TeXForm @ f @ expr

$\Large 2(j-j_2-j_3+j_6)\text{ - }(b+b_2+3 b_{\sigma _d}+3 b_{\sigma _v})\text{ + }12$

f[- expr - 20] // TeXForm

$\Large -2(j-j_2-j_3+j_6)\text{ + }(b+b_2+3 b_{\sigma _d}+3 b_{\sigma _v})\text{ - }32$

Note: I used Carl's answer from this q/a to make TeXForm process Rows properly.

$\endgroup$
4
  • 1
    $\begingroup$ Thank you very much for your answer and update. Unfortunately, I can only upvote once as always. Sometimes I feel like I would like to upvote several times for an answer based on knowlege which I could not gain on my own in a reasonable amount of time. $\endgroup$
    – Hotschke
    Aug 11, 2019 at 12:55
  • $\begingroup$ A small improvement to f[e_] would be to not print + 0 if there is not a constant number. If you know this quickly, I again would appreciate your help. I am still dissecting your f. $\endgroup$
    – Hotschke
    Aug 13, 2019 at 13:41
  • 1
    $\begingroup$ @Hotschke, the updated version should remove +/- 0. $\endgroup$
    – kglr
    Aug 13, 2019 at 13:55
  • $\begingroup$ I was planning to use Switch[] but /. {_, 0} -> Nothing looks now like a quite easy fix. $\endgroup$
    – Hotschke
    Aug 13, 2019 at 14:18
0
$\begingroup$

A minor variant of the answer by kglr:

  • explicit partition $$\texttt{GatherBy}\left[\texttt{List}\text{@@}\text{expr},\left\{\texttt{MatchQ}\left[\_ \left(b\left|b_2\right|b_{\sigma _d}|b_{\sigma _v}\right)\right],\texttt{MatchQ}\left[\_ \left(j\left|j_2\right|j_3|j_6\right)\right]\right\}\right]$$
  • Added Factor[] which moves the common factor 2 of the j's in front of the parenthesis
  • Added Reverse[] to get desired order (+12 at the end)
  • Use Cases[lis, {Except[_List] ..}, -2] to remove intermediate lists created by GatherBy[list,{f_1,f_2,...}] (from How can I Flatten this List with Inner List of Lists?)
  • Prepending StandardForm for TeXForm seems to keep the order.
expr = 12 - b + 2 j - Subscript[b, 2] - 
 3 Subscript[b, Subscript[σ, d]] - 
 3 Subscript[b, Subscript[σ, v]] - 2 Subscript[j, 2] - 
 2 Subscript[j, 3] + 2 Subscript[j, 6]

p = {MatchQ[_ (j | Subscript[j, 2] | Subscript[j, 3] | Subscript[j, 
   6])], MatchQ[_ (b | Subscript[b, 2] | Subscript[b, 
   Subscript[\[Sigma], d]] | Subscript[b, Subscript[\[Sigma], 
   v]])]};

list = Reverse[Cases[GatherBy[List @@ expr, p], {Except[_List] ..}, -2]]

Inactive[Plus] @@ Factor /@ Total /@ list

TeXForm @ StandardForm @ %

$$2 \left(j-j_2-j_3+j_6\right)+\left(-b-b_2-3 b_{\sigma _d}-3 b_{\sigma _v}\right)+12$$

Remaining improvements would be

  • placing common minus sign of the b's in front of the parenthesis (in general the first symbol in partition should determine the factored sign).
    Why does Factor[-2 a - 2 b] gives -2 (a + b) but Factor[- a - b] again - a - b?
$\endgroup$

Your Answer

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

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