I am just reading Computability and Logic and it (or at least the old, 1980, edition I am reading) has a rather laboured explanation of Cantor’s 1891 proof of the non-enumerability of real numbers (the diagonal proof) so to reassure myself and because it is interesting I thought I’d set out a version here (closely modelled on that found in The Annotated Turing).

If you are already lost then – here’s what it’s about: it is a proof that the infinite number of real numbers (that is to say numbers with something after the decimal point eg 3.1) is a bigger infinity that the infinite number of integers – or if you want think in terms of fractions – the rational numbers. One – the infinite number of integers or rationals – is countable, the other is not.

This is a pretty mind-blowing proof and it is also fair to say that a minority of mathematicians have issues with Georg Cantor‘s theory of the continuum, but that is for another blog post, perhaps.

So here’s the example:

Let’s start setting out the real numbers that are less that one:

`0.00000000000.....`

0.10000000000......

0.20000000000......

0.30000000000......

0.40000000000......

0.50000000000......

0.60000000000......

0.70000000000......

0.80000000000.....

0.90000000000.....

0.01000000000.....

0.02000000000....

.....

0.11000000000.....

And so on. Now this looks like it might be enumerable (countable) by assigning an integer to element in the list- the first in the list is number 1, the second number 2 and so on. Hopefully you can see that this should, in theory, list all the numbers (except it doesn’t, as we will prove)

Bur let’s us take the number formed by the diagonal. In our case this is:

`0.`

**0**0000000000.....

0.1**0**000000000......

0.20**0**00000000......

0.300**0**0000000......

0.4000**0**000000......

0.50000**0**00000......

0.600000**0**0000......

0.7000000**0**000......

0.80000000**0**00.....

0.900000000**0**0.....

0.0100000000**0**.....

0.02000000000....

ie `0.0000000000.......`

And let’s add 1 to every digit, so we get `0.111111111111....:`

is this number in the list? We will now show you that it cannot be by checking off the numbers in the list one by one.

First of all, we can eliminate the first number in the list as a match, because its first digit is 0 and our number has 1 as the first digit. Then we can eliminate the second number in the list in the same way (ie it’s second digit does not match). In fact it is clearly the case that we can eliminate number *N* from the list because it will not match at digit *N*.

OK, you say, let’s fix that by adding this ‘new’ number to the list:

`0.11111111111......`

0.00000000000......

0.10000000000......

0.20000000000......

0.30000000000......

0.40000000000......

0.50000000000......

0.60000000000......

0.70000000000......

0.80000000000......

0.90000000000......

0.01000000000......

0.02000000000......

But let’s diagonalise that one:

`0.`

**1**11111111111.....

0.0**0**000000000......

0.10**0**00000000......

0.200**0**0000000......

0.3000**0**000000......

0.40000**0**00000......

0.500000**0**0000......

0.6000000**0**000......

0.70000000**0**00......

0.800000000**0**0......

0.9000000000**0**......

0.01000000000......

0.02000000000......

And we get `0.1000000000......`

Once again adding 1 to all the digits we get a new number `0.2111111111111....`

– which we can show in the same way does not exist in the original list (set)

###### Related Articles

- The importance of Turing’s findings (cartesianproduct.wordpress.com)
- Learning How to Add and Subtract Rational Numbers (brighthub.com)
- An infinite debate? (ask.metafilter.com)

[…] Then surely the standard diagonalisation argument applies? (i.e. take the diagonal and switch states of each member – and this string cannot be in the original set as it is guaranteed that for the member of the set, the with elements , will be different. (See blog on diagonalisation.) […]