Re: Multiple sum with iterators that cannot equal

• To: mathgroup at smc.vnet.net
• Subject: [mg19396] Re: [mg19365] Multiple sum with iterators that cannot equal
• From: BobHanlon at aol.com
• Date: Mon, 23 Aug 1999 13:57:12 -0400
• Sender: owner-wri-mathgroup at wolfram.com

```Eric,

There are a couple of ways that you can do this.

g1[f_, n_Integer?Positive] :=
Sum[f[i, j], {j, n}, {i, n}] - Sum[f[i, i], {i, n}]

g2[f_, n_Integer?Positive] :=
Sum[(1 - KroneckerDelta[i, j ])*f[i, j], {j, n}, {i, n}]

g3[f_, n_Integer?Positive] :=
Sum[f[i, j], {j, n}, {i, j - 1}] + Sum[f[i, j], {j, n}, {i, j + 1, n}]

g4[f_, n_Integer?Positive] := Sum[If[i == j, 0, f[i, j]], {j, n}, {i, n}]

g1[h, 3]

h[1, 2] + h[1, 3] + h[2, 1] + h[2, 3] + h[3, 1] + h[3, 2]

n = 10;
g1[f, n] == g2[f, n] == g3[f, n] == g4[f, n]

True

n = 75;
Timing[#[f, n]][[1]] & /@ {g1, g2, g3, g4} // ColumnForm

0.48333333333266637*Second
0.683333333333394*Second
0.4000000000005457*Second
0.38333333333321207*Second

The use of the condition is as fast as any. Consequently, define a
conditional summation.

ClearAll[conditionalSum]

SetAttributes[conditionalSum, HoldFirst];

conditionalSum::usage =
"conditionalSum[condition, expression, {i, imin, imax}, {j, jmin, jmax}] \
sums the terms for which the condition is True.";

conditionalSum[cond_:True, expr_, {i_, imin_Integer:1, imax_Integer},
{j_, jmin_Integer:1, jmax_Integer}] :=
Sum[If[cond, expr, 0], {i, imin, imax}, {j, jmin, jmax}]

If no condition is specified, conditionalSum defaults to the normal Sum

n = 5;
conditionalSum[f[i, j], {j, n}, {i, n}] == Sum[f[i, j], {j, n}, {i, n}]

True

The specific case that you are interested in, i.e., i != j:

conditionalSum[i != j, f[i, j], {j, 3}, {i, 3}]

f[1, 2] + f[1, 3] + f[2, 1] + f[2, 3] + f[3, 1] + f[3, 2]

More complex conditions

n = 11;
conditionalSum[EvenQ[i] && OddQ[j], f[i, j], {j, n}, {i, 0, n}] ==
Sum[f[i, j], {j, 1, n, 2}, {i, 0, n, 2}]

True

conditionalSum[(i + j) > 3, f[i, j], {i, 5}, {j, 5}] ==
Sum[f[i, j], {i, 5}, {j, Max[1, 4 - i], 5}]

True

Bob Hanlon

In a message dated 8/21/99 4:36:00 AM, rspahr at worldnet.att.net writes:

>Using  multiple summmation signs with condition 'i "not
>equal" j', evaluation stops immediately as 'i' starts as
>1 as does 'j'.  My formula requires that the 'i's' and
>'j's' together:
>
>   Sum[Sum[f,{j,1,n}],{i,1,n}] ignore cases where i = j.
>
>   Or as copied from my notebook:
>
>\!\(\(\(\[Sum]\+\(i = 1\)\%n\[Sum]\+\(j = 1\)\%n\)\+\(i
>!= j\)\) \(w\_i\)
>    w\_j\)
>
>How do I solve this without some cumbersome loops.
>

```

• Prev by Date: RE: Magnitude of Vector