The Finite Improbability Calculator

by Wesley R. Elsberry

The Finite Improbability Calculator is a collection of routines to permit exploration of very small probabilities. Many antievolutionary arguments are based upon an argument from improbability: some phenomenon is so improbable that it must be due to an intelligent agent.


  1. Select an operation to perform from the list.
  2. Enter the parameters for the operation.
  3. Press the button for the operation.
  4. Results appear in a separate browser window. (You may need to turn off anti-popup services for this page.)


Change of base


Old Base
New Base

Return to Operations list



Enter a positive integer in the box:

Return to Operations list

Permutation and Combination


Total elements
Selected elements

Return to Operations list

Specified Anti-Information


Length of uncompressed string:

Length of program/input pair that produces the string:

Number of different symbols in strings:

Return to Operations list

Dembski's p_origin and M/N ratio


Perturbation tolerance:
Perturbation identity:
Number of symbols:
Length of string:

Page numbers refer to "No Free Lunch".

Return to Operations list

Dembski's p_local


Number of items in system (e.g., 50):
Number of copies of each item (e.g., 5):
Number of possible substitutions per item (e.g., 10):
Total number of items available (e.g., 4289):

Page numbers refer to "No Free Lunch".

Return to Operations list

Dembski's p_perturb


Number of subunits (N):
Different types of subunits (k):
Perturbation tolerance factor (q):
Perturbation identity factor (r):

Page numbers refer to "No Free Lunch".

Return to Operations list

Notes on calculations

Factorial:  The point here is to permit calculation of factorial(n) where n can be a large number, say the number of proteins which an organism codes for.  However, even a "double" floating-point number overflows at 1.7e308.  So factorials are calculated here using a logarithmic representation.  The Stirling approximation is used for very large n, and a logarithmic version of the classical iterative method is used for smaller n.  Stirling's approximation is taken as

            n! ~ n^n e^(-n) sqrt(2 * pi * n) (1 + 1/(12n))

Change of base: Calculated as 

            new exponent = (old_exponent * ln(oldbase)) / ln(newbase)

Permutation and combination: Uses the factorial function discussed above.

            permutations =  n! / (n - k)!

            combinations = n! / k!(n - k)!

Specified Anti-Information

Specified Anti-Information is an application of the "universal distribution" of Kirchherr et alia 1997, expounded in Elsberry and Shallit 2003. SAI is a framework intended as an alternative to Dembski's "design inference". The SAI of a bit string is defined as

SAI = max(0,|y| - C(y))

where |y| is the length of the bit string of interest and C(y) is the Kolmogorov complexity of y. Since C(y) is uncomputable, mostly we should speak of Known Specified Anti-Information, which is just the maximum SAI that can be established by application of known compression techniques.

SAI is defined for bit strings, but often we deal with strings based on a symbol set with cardinality > 2. It is straightforward to determine the length of a bit string needed to represent such a string, though, using the "change of base" function presented earlier. The second part of the SAI section permits SAI to be calculated for such strings.

Something to note here is the apparent difference in ease of application of SAI with the various measures introduced by Dembski.

porig approximation (as per NFL p.301):

            porig ~ symbols^(-length (perturbation_tolerance - perturbation_identity))

The discussion on page 301 implies that functional proteins may themselves be considered "discrete combinatorial objects" to which this formula would apply.  With a little exploration, then, one can verify that any functional protein of length 1153 or greater has an origination probability smaller than Dembski's "universal small probability".

plocal calculation (as per NFL p.293):

            plocal = (units in system * substitutions / total different units) (units in system * copies)

M/N ratio approximation (as per NFL p.297):

            M/N ratio ~ ((combinations(length, tolerance * length) * (symbols-1)(tolerance * length)) / (combinations(length, identity * length) * (symbols-1)(identity * length)))

There is a discrepancy between the result which Dembski reports for his example calculation of an M/N ratio on p.297 and what the Finite Improbability Calculator reports.  Plug in symbols=30, length=1000, tolerance=0.1, and identity=0.2 and the result comes out as 5.555117e-223, whereas Dembski reports 10^-288, or a factor of 10^-65 off.  Jeff Shallit noted this error in Dembski's text some time back.

DCO pperturb approximations (as per NFL pp.299 and 300):

            pperturb (p.299) ~ ((combinations(length, tolerance * length) / (combinations(length, identity * length)) * (symbols-1)(length * (tolerance - identity))

            pperturb (p.300) ~ (symbols)(length * (tolerance - identity))


Dembski, William A. 2002. No Free Lunch. Rowman & Littlefield Publishers.

Elsberry, Wesley R. and Jeffrey Shallit. 2003. Information Theory, Evolutionary Computation, and Dembski's "Complex Specified Information".

Kirchherr, W., M. Li, and P. Vitanyi. The miraculous universal distribution. Math. Intelligencer 19(4) (1997), 7-15.

The Finite Improbability Calculator was first coded in spring of 2002, following publication of William Dembski's book, "No Free Lunch". The original utilized a Perl CGI script. The FIC was ported to a PHP instantiation in January, 2004, with routines added for calculating Specified Anti-Information.

The name of this page was inspired by "The Hitchhiker's Guide to the Galaxy" by the late great Douglas Adams.