1
$\begingroup$

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?

$\endgroup$
3
  • 1
    $\begingroup$ 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? $\endgroup$
    – xzczd
    Commented Aug 5, 2020 at 2:16
  • $\begingroup$ @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 $\endgroup$
    – Jasmine
    Commented Aug 5, 2020 at 2:28
  • $\begingroup$ @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}]. $\endgroup$
    – bcegkmqs23
    Commented Aug 5, 2020 at 6:51

1 Answer 1

3
$\begingroup$

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]
$\endgroup$
2
  • $\begingroup$ My results are now as I am expecting. Great $\endgroup$
    – Jasmine
    Commented Aug 5, 2020 at 2:37
  • $\begingroup$ 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? $\endgroup$
    – Jasmine
    Commented Apr 27, 2021 at 20:34

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.