1 | initial version |
Sage
's implementation of sum
is incorrect in this case :
sage: sum((1+r)^i, i, 1, n)
((r + 1)^(n + 1) - r - 1)/r
which is incorrect if r==0
.
Compare this with sympy
's implementation of summation
:
>>> x, n, r, i = symbols("x, n, r, i")
>>> x*summation((1+r)**i, (i, 1, n))
x*Piecewise((n, Eq(r + 1, 1)), (-(r - (r + 1)**(n + 1) + 1)/r, True))
Interestingly, Mathematica
falls in the same trap as sage
:
In[2]:= InputForm[Sum[(1+r)^i, {i, 1, n}]]
Out[2]//InputForm= ((1 + r)*(-1 + (1 + r)^n))/r
The workaround is to use the algorithm="sympy"
optional argument of sum
:
sage: sum((1+r)^i, i, 1, n, algorithm="sympy")
cases(((r + 1 == 1, n), (1, ((r + 1)^(n + 1) - r - 1)/r)))
sage: f(x,n,r,i)=x*sum((1+r)^i,i,1,n, algorithm="sympy")
sage: f
(x, n, r, i) |--> x*cases(((r + 1 == 1, n), (1, ((r + 1)^(n + 1) - r - 1)/r)))
sage: f(1, 30, 0)
30
sage: f(1, 30, 0.0)
30
HTH,
2 | No.2 Revision |
Sage
's implementation of sum
is incorrect in this case :
sage: sum((1+r)^i, i, 1, n)
((r + 1)^(n + 1) - r - 1)/r
which is incorrect if r==0
.
Compare this with sympy
's implementation of summation
:
>>> x, n, r, i = symbols("x, n, r, i")
>>> x*summation((1+r)**i, (i, 1, n))
x*Piecewise((n, Eq(r + 1, 1)), (-(r - (r + 1)**(n + 1) + 1)/r, True))
Interestingly, Mathematica
falls in the same trap as sage
:
In[2]:= InputForm[Sum[(1+r)^i, {i, 1, n}]]
Out[2]//InputForm= ((1 + r)*(-1 + (1 + r)^n))/r
The workaround is to use the algorithm="sympy"
optional argument of sum
:
sage: sum((1+r)^i, i, 1, n, algorithm="sympy")
cases(((r + 1 == 1, n), (1, ((r + 1)^(n + 1) - r - 1)/r)))
sage: f(x,n,r,i)=x*sum((1+r)^i,i,1,n, algorithm="sympy")
sage: f
(x, n, r, i) |--> x*cases(((r + 1 == 1, n), (1, ((r + 1)^(n + 1) - r - 1)/r)))
sage: f(1, 30, 0)
30
sage: f(1, 30, 0.0)
30
HTH,
EDIT : This seems to be previously unreported, and is now Trac#31418.