Predict next number from a series

Solution 1:

Nowadays, the #1 method for predicting the next number from a sequence (assuming the sequence has come up in a "natural" way) is to look it up in the Online Encyclopedia of Integer Sequences. In his 1973 book, A Handbook of Integer Sequences, Sloane gives some suggestions as to what to do if your sequence is not in the Encyclopedia/Handbook. These include,

  1. Add or subtract 1 or 2 from all the terms, and try looking it up again;

  2. Multiply all the terms by 2, or divide by any common factor, and try looking it up again;

  3. Look for a recurrence.

Sloane elaborates on this last suggestion. He mentions the method of differences, where you replace the sequence $a_0,a_1,\dots$ with $a_1-a_0,a_2-a_1,\dots$ and, if necessary, repeat the differencing, until you get something with an obvious pattern. Of course, then you have to know what to do with a recurrence once you have one, but that's another story.

Sloane also says that if a sequence is close to a known sequence, you can try subtracting off the known sequence, and then dealing with the residual by one of the above methods.

If the ratios $a_{n+1}/a_n$ seem to be close to a recognizable sequence $r_n$, then look at the sequence given by $a_{n+1}-r_na_n$.

Factoring the numbers in a sequence, or in a sequence close to the given sequence, will often give a clue as to what is going on.

For examples of all these principles (and others that I haven't mentioned) in operation, I refer you to the Handbook.

Solution 2:

One possibility is to use Maple's gfun package to guess a generating function. See http://algo.inria.fr/libraries/papers/gfun.html

Solution 3:

As for the software, from Christian Krattenthaler's home page:

If you need to guess sequences of numbers very often, then my Mathematica "guessing machine" RATE (which has now become part of Neil Sloane's Encyclopedia of Integer Sequences) may be useful for you. The Maple implementation by François Béraud and Bruno Gauthier is called GUESS. A Maxima implementation, DEVINE, written by Martin Rubey, is also available. The Axiom guessing package Guess, also written by Martin Rubey, is even more powerful as its range of detected formulas is larger.

For the hyperlinks to packages go to the page itslef. As for the Guess package it is present in FriCAS too and there were changes to it during the past year.

Solution 4:

Since release 1.0 of the Sympy module, you can also use the sympy.concrete.guess submodule (written by myself for the project); have a glance at the docstring documentation at https://raw.githubusercontent.com/sympy/sympy/master/sympy/concrete/guess.py where you will find various examples.

For instance:

>>> from sympy.concrete.guess import guess_generating_function as ggf
>>> ggf([k+1 for k in range(12)], types=['ogf', 'lgf', 'hlgf'])
{'hlgf': 1/(-x + 1), 'lgf': 1/(x + 1), 'ogf': 1/(x**2 - 2*x + 1)}

>>> from sympy import sympify
>>> l = sympify("[3/2, 11/2, 0, -121/2, -363/2, 121]")
>>> ggf(l)
{'ogf': (x + 3/2)/(11*x**2 - 3*x + 1)}

>>> from sympy import fibonacci
>>> ggf([fibonacci(k) for k in range(5, 15)], types=['ogf'])
{'ogf': (3*x + 5)/(-x**2 - x + 1)}

>>> from sympy import simplify, factorial
>>> ggf([factorial(k) for k in range(12)], types=['ogf', 'egf', 'lgf'])
{'egf': 1/(-x + 1)}

>>> ggf([k+1 for k in range(12)], types=['egf'])
{'egf': (x + 1)*exp(x), 'lgdegf': (x + 2)/(x + 1)}

N-th root of a rational function can also be detected (below is an example
coming from the sequence A108626 from http://oeis.org).
The greatest n-th root to be tested is specified as maxsqrtn (default 2).

>>> ggf([1, 2, 5, 14, 41, 124, 383, 1200, 3799, 12122, 38919])['ogf']
sqrt(1/(x**4 + 2*x**2 - 4*x + 1))

Note however that the module is rather oriented toward the detection of generating functions (and not direct formulas).