Question

Which programming language or a library is able to process infinite series (like geometric or harmonic)? It perhaps must have a database of some well-known series and automatically give proper values in case of convergence, and maybe generate an exception in case of divergence.

For example, in Python it could look like:

sum  = 0
sign = -1.0
for i in range(1,Infinity,2):
     sign = -sign
     sum += sign / i

then, sum must be math.pi/4 without doing any computations in the loop (because it's a well-known sum).

Was it helpful?

Solution

You need something that can do a symbolic computation like Mathematica. You can also consider quering wolframaplha: sum((-1)^i*1/i, i, 1 , inf)

OTHER TIPS

Most functional languages which evaluate lazily can simulate the processing of infinite series. Of course, on a finite computer it is not possible to process infinite series, as I am sure you are aware. Off the top of my head, I guess Mathematica can do most of what you might want, I suspect that Maple can too, maybe Sage and other computer-algebra systems and I'd be surprised if you can't find a Haskell implementation that suits you.

EDIT to clarify for OP: I do not propose generating infinite loops. Lazy evaluation allows you to write programs (or functions) which simulate infinite series, programs which themselves are finite in time and space. With such languages you can determine many of the properties, such as convergence, of the simulated infinite series with considerable accuracy and some degree of certainty. Try Mathematica or, if you don't have access to it, try Wolfram Alpha to see what one system can do for you.

One place to look might be the Wikipedia category of Computer Algebra Systems.

There are two tools available in Haskell for this beyond simply supporting infinite lists.

First there is a module that supports looking up sequences in OEIS. This can be applied to the first few terms of your series and can help you identify a series for which you don't know the closed form, etc. The other is the 'CReal' library of computable reals. If you have the ability to generate an ever improving bound on your value (i.e. by summing over the prefix, you can declare that as a computable real number which admits a partial ordering, etc. In many ways this gives you a value that you can use like the sum above.

However in general computing the equality of two streams requires an oracle for the halting problem, so no language will do what you want in full generality, though some computer algebra systems like Mathematica can try.

Maxima can calculate some infinite sums, but in this particular case it doesn't seem to find the answer :-s

(%i1) sum((-1)^k/(2*k), k, 1, inf), simpsum;
                                 inf
                                 ====       k
                                 \     (- 1)
                                  >    ------
                                 /       k
                                 ====
                                 k = 1
(%o1)                            ------------
                                      2

but for example, those work:

(%i2) sum(1/(k^2), k, 1, inf), simpsum;
                                        2
                                     %pi
(%o2)                                ----
                                      6

(%i3) sum((1/2^k), k, 1, inf), simpsum;
(%o3)                                  1

You can solve the series problem in Sage (a free Python-based math software system) exactly as follows:

sage: k = var('k'); sum((-1)^k/(2*k+1), k, 1, infinity)
1/4*pi - 1

Behind the scenes, this is really using Maxima (a component of Sage).

For Python check out SymPy - clone of Mathematica and Matlab.

There is also a heavier Python-based math-processing tool called Sage.

There is a library called mpmath(python), a module of sympy, which provides the series support for sympy( I believe it also backs sage).
More specifically, all of the series stuff can be found here: Series documentation

The C++ iRRAM library performs real arithmetic exactly. Among other things it can compute limits exactly using the limit function. The homepage for iRRAM is here. Check out the limit function in the documentation. Note that I'm not talking about arbitrary precision arithmetic. This is exact arithmetic, for a sensible definition of exact. Here's their code to compute e exactly, pulled from the example on their web site:

//---------------------------------------------------------------------
// Compute an approximation to e=2.71.. up to an error of 2^p
 REAL e_approx (int p)
{
  if ( p >= 2 ) return 0;

  REAL y=1,z=2;
  int i=2;
  while ( !bound(y,p-1) ) {
    y=y/i;
    z=z+y;
    i+=1;
  }
  return z;
};

//---------------------------------------------------------------------
// Compute the exact value of  e=2.71.. 
REAL e()
{
  return limit(e_approx);
};

Clojure and Haskell off the top of my head.

Sorry I couldn't find a better link to haskell's sequences, if someone else has it, please let me know and I'll update.

I have worked in couple of Huge Data Series for Research purpose. I used Matlab for that. I didn't know it can/can't process Infinite Series.

But I think there is a possibility. U can try :)

This can be done in for instance sympy and sage (among open source alternatives) In the following, a few examples using sympy:

In [10]: summation(1/k**2,(k,1,oo)) Out[10]: 2 π ── 6

In [11]: summation(1/k**4, (k,1,oo)) Out[11]: 4 π ── 90

In [12]: summation( (-1)**k/k, (k,1,oo)) Out[12]: -log(2)

In [13]: summation( (-1)**(k+1)/k, (k,1,oo)) Out[13]: log(2)

Behind the scenes, this is using the theory for hypergeometric series, a nice introduction is the book "A=B" by Marko Petkovˇeks, Herbert S. Wilf and Doron Zeilberger which you can find by googling. ¿What is a hypergeometric series?

Everybody knows what an geometric series is: $X_1, x_2, x_3, \dots, x_k, \dots $ is geometric if the contecutive terms ratio $x_{k+1}/x_k$ is constant. It is hypergeometric if the consecutive terms ratio is a rational function in $k$! sympy can handle basically all infinite sums where this last condition is fulfilled, but only very few others.

Just install sympy on your computer. Then do the following code:

from sympy.abc import i, k, m, n, x
from sympy import Sum, factorial, oo, IndexedBase, Function
Sum((-1)**k/(2*k+1), (k, 0, oo)).doit()

Result will be: pi/4

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top