Reading: MCS 8.1

- \(ℝ\), \(2^ℕ\) are uncountable.
- Set of (finite) strings is countable.
Finite cardinality

**Claim:** The set of real numbers \(ℝ\) is uncountable.

**Proof:** in fact, we will show that the set of real numbers between 0 and 1 is uncountable; since this is a subset of \(ℝ\), the uncountability of \(ℝ\) follows immediately.

We proceed by contradiction. Suppose that \(ℝ\) were countable. Then there would exist a surjection \(f : ℕ → ℝ\). We could expand the digits of \(f\) in a table; for example, if \(f(0) = 0\), \(f(1) = 1/2\), \(f(2) = π - 3\), \(f(3) = φ - 1\), then the table would look as follows:

\(n\) | \(f(n)\) | digits of \(f(n)\) |
---|---|---|

0 | 0 | \(0.00000\cdots\) |

1 | 1/2 | \(0.50000\cdots\) |

2 | \(π - 3\) | \(0.14159\cdots\) |

3 | \(φ - 1\) | \(0.61803\cdots\) |

Given such a table, we can form a real number \(x_D\) that is not in the table by changing the \(i\)th digit of the \(i\)th number; perhaps by adding 5 (wrapping around, so that 7 + 5 = 2, for example).

In the example, \(x_D = 0.5565\cdots\).

Now \(x_D\) cannot be in the table, because \(x_D\) differs from \(f(i)\) in the \(i\)th digit. But this contradicts the fact that \(f\) is surjective, thus completing the proof.

**Note:** this technique is called diagonalization.

the existence different sizes of infinity is pretty neat.

diagonalization is used to prove that there are specifications with no program that implements them. One such problem is determining whether a program crashes or not. It would be nice to have a compiler that guarantees that your program never crashes. However, diagonalization can be used to show that no such program exists. We may discuss this more when we talk about computability; it is also discussed in MCS.

this proof is also quite closely related to notions of truth and provability, which we will discuss later in the course.

**Definition:** If \(X\) is a set and \(n \in ℕ\), the expression "|X| = n" means \(|X| = \{1,2,\dots,n\}\).

This matches the usual notion of the number of things in the set.

**Claim:** If \(|A| = a\) and \(|B| = b\), and if \(A\) and \(B\) are disjoint, then \(|A \cup B| = a + b\).

**Note:** This can be shortened to "\(|A \cup B| = |A| + |B|\), as long as you keep in mind that this equation only makes sense if \(|A|\) and \(|B|\) are numbers (i.e. if \(A\) and \(B\) are finite)

**Proof:** Since \(|A| = a\), there exists a bijection \(f : A → \{1,2,\dots,a\}\). Similarly, there exists \(g : B → \{1,2,\dots,b\}\). We can build a function \(h : A \cup B → \{1,2,\dots,a+b\}\) by defining \[h(x) := \left\{\begin{array}{ll} f(x), & \text{if $x \in A$} \\ g(x), & \text{if $x \in B$} \end{array}\right.\]

To complete the proof, we need to show that \(h\) is a bijection. We left this as an exercise. While you're doing the exercise, make sure you use the fact that \(A \cup B = \emptyset\).