8
$\begingroup$

I defined a function in Mathematica. It is a function of n, so f[n_]:=, but in the definition, I used a sum, $\sum_{k=0}^n$. So, the $k$ is just an index variable for the sum and no $k$ shows up in the final answer. As I was using this function I tried evaluating f[k-1] and got a weird answer, 0. I finally figured out that Mathematica was trying to do the sum $\sum_{k=0}^{k-1}$, or so I guess. So, my question is, is there a way to make the $k$ local so that this error never occurs? My fix for now was to change $k$ to $index$ and I will probably not use f[index] at any point.

$\endgroup$
11
  • $\begingroup$ I tried to reproduce your result, but no luck. Could you post your function? What version are you using? $\endgroup$
    – Calle
    Mar 24, 2011 at 21:29
  • $\begingroup$ Just about anything will do... g[n_]:=$\sum_{k=0}^n \binom{n}{k}$ and then g[k-1] will yield 0 in Version 7. $\endgroup$
    – GeoffDS
    Mar 24, 2011 at 21:45
  • $\begingroup$ Huh, yeah. In version 8 too. But g[n_]:= $\sum_{k=0}^n k^2$ works fine. $\endgroup$
    – Calle
    Mar 24, 2011 at 21:52
  • 1
    $\begingroup$ @Numth @Calle @whuber: Mathematica make the summation index local using Block. In this way $k$ has a local value for the Sum function. However, $k$ is still $k$ so that g[k-1] translates into Sum[Binomial[k-1,k],{k,0,k-1}] which will evaluate to 0 (because Binomial[k-1,k]=0). What you want is that the summation index gets a different name and therefore you need Module. With Module the g[k-1] is effectively translated into Sum[Binomial[k-1,k$],{k$,0,k-1}]. $\endgroup$
    – Fabian
    Mar 24, 2011 at 22:32
  • 1
    $\begingroup$ @Numth Thank you. I double-checked and was able to reproduce your results. (a) After quitting all kernels and re-evaluating the definition of g, I obtain zero for g[k-1]. (b) After issuing Remove[k], I get the correct result. (c) Protecting g with either Block or Module makes it work correctly. Clearly, then, the help statement is not entirely correct. $\endgroup$
    – whuber
    Mar 25, 2011 at 2:52

3 Answers 3

7
$\begingroup$

The function you are looking for is called Module. You can define it as

f[n_] := Module[{k}, Sum[a[k], {k,0,n}]]

so that the evaluation f[k-1] is possible.

$\endgroup$
1
  • $\begingroup$ That is perfect, thanks! $\endgroup$
    – GeoffDS
    Mar 24, 2011 at 21:35
7
$\begingroup$

Block might be better than Module -- when you use recursion, a local variable defined in Module will be shared across stack frames, Block will have a separate version of the variable in each call

$\endgroup$
4
  • $\begingroup$ @Bulatov: but Block will not work for the OP's problem... $\endgroup$
    – Fabian
    Mar 25, 2011 at 5:50
  • $\begingroup$ @Fabian Why not? I tried your snippet in Mathematica 8 and replacing Module with Block makes no difference $\endgroup$ Mar 25, 2011 at 17:31
  • $\begingroup$ defining g[n_]:=Block[{k},Sum[Binomial[n,k],{k,0,n}] and then executing g[k-1] gives a result different from 0? (then they must have changed something going to version 8) $\endgroup$
    – Fabian
    Mar 25, 2011 at 18:22
  • 1
    $\begingroup$ @Fabian I was too hasty, you are right, it doesn't work for that example, another approach might be to use Unique $\endgroup$ Mar 25, 2011 at 19:49
3
$\begingroup$

An alternative to Module or Block is to use Formal Symbols. This allows for the cleanest code.

One may still run into trouble depending on how you choose to use Formal symbols elsewhere, but if you never use \[FormalK] in the argument to f you are safe.

$\endgroup$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .