Tables and Sums and real Results

The world is full of surprises. The iterators in Table and Sum are of the form { i, imin, imax } and obviously it is assumed, that strictly imax > imin. Entries not fullfilling this conditions seem to be suppressed. That is most important in tables and sums with e.g. two indices, one being a function of the other.

Look at

In[55]:= Table[{i, j}, {i, 2, 9}, {j, 0, 5 - i}]

Out[55]= {{{2, 0}, {2, 1}, {2, 2}, {2, 3}}, {{3, 0}, {3, 1}, {3, 
   2}}, {{4, 0}, {4, 1}}, {{5, 0}}, {}, {}, {}, {}}

with four “empty” results.

What I expected was

In[56]:= tt = 
 Flatten[Table[{i, j}, {i, 2, 9}, {j, Min[0, 5 - i], Max[0, 5 - i]}], 
  1]

Out[56]= {{2, 0}, {2, 1}, {2, 2}, {2, 3}, {3, 0}, {3, 1}, {3, 2}, {4, 
  0}, {4, 1}, {5, 0}, {6, -1}, {6, 0}, {7, -2}, {7, -1}, {7, 
  0}, {8, -3}, {8, -2}, {8, -1}, {8, 
  0}, {9, -4}, {9, -3}, {9, -2}, {9, -1}, {9, 0}}

Accordingly double-sums have to be considered with caution. Change Table to Sum:

 In[64]:= Sum[{i, j}, {i, 2, 9}, {j, 0, 5 - i}]
    
    Out[64]= {30, 10}

while the correct result should read

In[58]:= Total[tt]

Out[58]= {140, -10}

To avoid negative indices, you might try

In[4]:= Table[{i, j}, {i, 2, 9}, {j, 0, (5 - i) Boole[i <= 5]}]

Out[4]= {{{2, 0}, {2, 1}, {2, 2}, {2, 3}}, {{3, 0}, {3, 1}, {3, 
   2}}, {{4, 0}, {4, 1}}, {{5, 0}}, {{6, 0}}, {{7, 0}}, {{8, 0}}, {{9,
    0}}}

yep - thanks. But I wanted to have these negative indices. The point is, if you program the sum without care you have good chances to get wrong results.

Sum and Table do exactly the same thing

In[1]:= Table[{i, j}, {i, 2, 9}, {j, 0, 5 - i}]
Out[1]= {{{2, 0}, {2, 1}, {2, 2}, {2, 3}}, {{3, 0}, {3, 1}, {3, 2}}, {{4, 0}, {4, 1}}, {{5, 0}}, {}, {}, {}, {}}

if j_{max} < j_{min} the element is skipped. Now for Sum in symbolic form

In[7]:= Sum[{f[i], g[j]}, {i, 2, 9}, {j, 0, 5 - i}]
Out[7]= {4 f[2] + 3 f[3] + 2 f[4] + f[5], 4 g[0] + 3 g[1] + 2 g[2] + g[3]}

In[8]:= (* {f,g} *)
{4 2 + 3 3 + 2 4 + 5, 4 0 + 3 1 + 2 2 + 3}
Out[8]= {30, 10}

The iterator step is by default 1 and with that step one cannot reach -1 starting from 0.
If in

Table[{i, j}, {i, 2, 9}, {j, 0, 5 - i}]

j should step down too one takes that into account by typing

In[11]:= Table[{i, j}, {i, 2, 9}, {j, 0, 5 - i, Sign[5 - i]}]
Out[11]= {{{2, 0}, {2, 1}, {2, 2}, {2, 3}}, 
          {{3, 0}, {3, 1}, {3, 2}}, 
          {{4, 0}, {4, 1}},
          {{5, 0}}, 
          {{6, 0}, {6, -1}}, 
          {{7, 0}, {7, -1}, {7, -2}}, 
          {{8, 0}, {8, -1}, {8, -2}, {8, -3}}, 
          {{9, 0}, {9, -1}, {9, -2}, {9, -3}, {9, -4}}}

which fits to the expectations

In[15]:= Plus @@@ Transpose[Flatten[Table[{i, j}, {i, 2, 9}, {j, 0, 5 - i, Sign[5 - i]}], 1]]
Out[15]= {140, -10}

And, yes

In[16]:= Sum[{i, j}, {i, 2, 9}, {j, 0, 5 - i, Sign[5 - i]}]
Out[16]= {140, -10}

And yes

If you program … without care

you do not program, but merely type. It is the same thing as the infamous wrong proof in mathematics.