# Dummy index automatic summing

https://mathematica.stackexchange.com/a/222410/73364 I have obtained the following code from the above link. But it is not working well with my situation. Can anyone help me out?

SumHeld /:
SyntaxInformation[
SumHeld] = {"LocalVariables" -> {"Table", {2, Infinity}}};

IndexUnify[HoldPattern@Plus[sums : SumHeld[_, __] ..]] :=
Plus @@ With[{targetIndices = List @@ #[[-1, 2 ;;, 1]],
sourceIndicesList = List @@@ #[[;; , 2 ;;, 1]]},
Function[{sum, sourceIndices},
sum /. Thread[
sourceIndices ->
Take[targetIndices, Length@sourceIndices]]] @@@
Transpose@{#, sourceIndicesList}] &@
SortBy[Flatten /@ {sums}, Length]

SumTogether[HoldPattern@Plus[sums : SumHeld[_, sameRanges__] ..]] :=
SumHeld[Plus @@ {sums}[[;; , 1]], sameRanges]
SumTogether[HoldPattern@Plus[sums : SumHeld[_, __] ..]] /;
UnsameQ @@ {sums}[[;; , 2 ;;]] :=
Plus @@ SumTogether@*Plus @@@ GatherBy[{sums}, Rest]


Here please see the below test case.

test = SumHeld[f[a, i], {a, 1, 5}, {i, 1, 5}] +
SumHeld[SumHeld[2*f[b, j], {b, 1, 5}], {j, 1, 5}] +
SumHeld[SumHeld[2*f[c, j], {c, 1, 5}], {j, 1, 5}]
% // IndexUnify
% // SumTogether


The output I am receiving is

$$\text{SumTogether}\left(\sum _{c=1}^5 \sum _{j=1}^5 f(c,j)+2 \sum _{c=1}^5 \sum _{j=1}^5 2 f(c,j)\right)$$

Here the issue is it's not simplifying further as $$\left(\sum _{c=1}^5 \sum _{j=1}^55f(c,j)\right)$$

Another question is when I have more than 2 summation signs as below:

test = SumHeld[f[a, i, j], {a, 1, 5}, {i, 1, 5}, {j, 1, 5}] +
SumHeld[SumHeld[2*f[b, j, i], {b, 1, 5}, {j, 1, 5}], {i, 1, 5}] +
SumHeld[SumHeld[2*f[c, j, i], {c, 1, 5}, {j, 1, 5}], {i, 1, 5}]
% // IndexUnify
% // SumTogether


Is the bracket I have placed correctly?

• 1. SumHeld[SumHeld[2*f[b, j]], {b, 1, 5}, {j, 1, 5}] should be SumHeld[SumHeld[2*f[b, j], {b, 1, 5}], {j, 1, 5}], right? 2. $$\left(\sum _{c=1}^5 \sum _{j=1}^53f(c,j)\right)$$ should be $$\left(\sum _{c=1}^5 \sum _{j=1}^55f(c,j)\right)$$, isn't it? Aug 5, 2020 at 2:16
• @xzczd You are correct. I have edited. But that is not affecting the output! Also if I have 4 summations, say i,j,k,l, how can I write the bracket. It's not working Aug 5, 2020 at 2:28
• @Jasmine In fact, you don't have to be confused with so many brakets. You can use the flat form as SumHeld[2*f[b, j], {b, 1, 5}, {j, 1, 5}] instead of the folded form SumHeld[SumHeld[2 f[b, j], {b, 1, 5}], {j, 1, 5}]. Aug 5, 2020 at 6:51

## 1 Answer

If you observe the definition of SumTogether carefully, you'll find it only works on SumHeld[…] with no coefficient. So we need to define a rule for SumHeld[…] with coefficient:

SumHeld /: c_?NumericQ SumHeld[rest_, range__] := SumHeld[c rest, range]

• My results are now as I am expecting. Great Aug 5, 2020 at 2:37
• I would like to know whether there are any other simple code to handle more than 50 sums. I meant it is difficult to write and give summation to each terms. Can I give summation all at a once? Apr 27, 2021 at 20:34