Back
In print settings: Save as PDF, turn headers and footers off, turn background graphics on.

Discrete Mathematics

Combinatorics, graph theory, and discrete structures.

Official Documentation

July 2026

Contents

Overview

  • Boolean Algebra
  • Combinatorics and Enumerative Analysis
  • Discrete Structures and Counting
  • Relations, Functions, and Morphisms
  • Graph Theory
  • Mathematical Induction and Well-Ordering
  • Information Theory
  • Recurrence Relations
  • Axiomatic Set Theory and the ZFC Framework

Overview

Section Detail

Boolean Algebra

Boolean Algebra

Boolean algebra is the algebraic structure that handles binary variables and logic operations. It is the mathematical foundation of digital circuit design.

Basic Operations

The primary operations are:

  • AND (\cdot or \land): 11=11 \cdot 1 = 1, else 00.
  • OR (++ or \lor): 0+0=00 + 0 = 0, else 11.
  • NOT (xˉ\bar{x} or ¬x\neg x): 1ˉ=0,0ˉ=1\bar{1} = 0, \bar{0} = 1.
python
1def boolean_table(func):
2 print("A | B | Result")
3 print("---------")
4 for a in [0, 1]:
5 for b in [0, 1]:
6 print(f"{a} | {b} | {func(a, b)}")
7 
8# XOR Implementation
9xor_func = lambda a, b: (a or b) and not (a and b)
10boolean_table(xor_func)

Algebraic Laws

  1. Idempotence: x+x=x,xx=xx + x = x, x \cdot x = x.
  2. De Morgan’s Laws: x+y=xˉyˉ\overline{x + y} = \bar{x} \cdot \bar{y} and xy=xˉ+yˉ\overline{x \cdot y} = \bar{x} + \bar{y}.
  3. Absorption: x+(xy)=xx + (x \cdot y) = x.
python
1def de_morgan_test(x, y):
2 lhs = not (x or y)
3 rhs = (not x) and (not y)
4 return lhs == rhs
5 
6print(f"De Morgan (0, 0): {de_morgan_test(0, 0)}")
7print(f"De Morgan (1, 0): {de_morgan_test(1, 0)}")
8print(f"De Morgan (1, 1): {de_morgan_test(1, 1)}")

Sum of Products (SOP) and Simplification

Every boolean function can be represented as a Sum of Products (canonical form). Simplification is typically done using Karnaugh Maps or the Quine-McCluskey algorithm.

What is the result of (A + B) * (A + C) according to distribution laws?

Which gate is considered 'Universal' because it can implement any other gate?

Section Detail

Combinatorics and Enumerative Analysis

Combinatorics and Enumerative Analysis

Combinatorics is the study of discrete structures. It determines the existence, count, and optimization of arrangements according to specific rules.

Fundamental Principles

  • Addition Principle: If events are mutually exclusive, sum the ways.
  • Multiplication Principle: If events occur in sequence, multiply the ways.

Permutations and Combinations

Permutations (P(n,k)P(n, k)): Choosing and ordering kk elements from nn. P(n,k)=n!(nk)!P(n, k) = \frac{n!}{(n-k)!}

Combinations ((nk)\binom{n}{k}): Choosing kk elements without regard to order. (nk)=n!k!(nk)!\binom{n}{k} = \frac{n!}{k!(n-k)!}

python
1import math
2 
3def nCr(n, r):
4 return math.comb(n, r)
5 
6def nPr(n, r):
7 return math.perm(n, r)
8 
9print(f"Combinations (10 choose 3): {nCr(10, 3)}")
10print(f"Permutations (10 permute 3): {nPr(10, 3)}")

Pascal’s Triangle and Binomial Expansion

The identity (nk)=(n1k1)+(n1k)\binom{n}{k} = \binom{n-1}{k-1} + \binom{n-1}{k} allows for recursive construction.

python
1def pascal_triangle(rows):
2 triangle = [[1]]
3 for i in range(1, rows):
4 row = [1]
5 for j in range(1, i):
6 row.append(triangle[i-1][j-1] + triangle[i-1][j])
7 row.append(1)
8 triangle.append(row)
9 return triangle
10 
11for row in pascal_triangle(6):
12 print(str(row).center(30))

Advanced Principles

  • Pigeonhole Principle: If n>mn > m items are put in mm boxes, one box has >1>1 item.
  • Inclusion-Exclusion: Corrects for overcounting in unions (AB=A+BAB|A \cup B| = |A| + |B| - |A \cap B|).

Which principle is best suited for counting the number of permutations where no element stays in its original position?

Stars and Bars: Multisets

Choosing kk items from nn types with repetition: (n+k1k)\binom{n+k-1}{k}.

python
1from itertools import combinations_with_replacement
2 
3# Choosing 2 items from {A, B, C} with repetition
4types = ['A', 'B', 'C']
5k = 2
6combos = list(combinations_with_replacement(types, k))
7print(f"Multisets of size {k} from {types}:")
8print(combos)
9print(f"Formula count: {nCr(len(types) + k - 1, k)}")

How many ways can you arrange 5 identical objects into 3 distinct bins (including empty bins)?

Section Detail

Discrete Structures and Counting

Discrete Structures and Counting

Combinatorics is the branch of mathematics dealing with combinations of objects belonging to finite sets. It is foundational for probability and computer science.

Permutations and Combinations

  • A permutation is an arrangement of objects in a specific order. The number of permutations of nn objects taken rr at a time is: P(n,r)=n!(nr)!P(n, r) = \frac{n!}{(n-r)!}
  • A combination is a selection of objects where order does not matter: C(n,r)=(nr)=n!r!(nr)!C(n, r) = \binom{n}{r} = \frac{n!}{r!(n-r)!}
python
1import math
2 
3def permutations(n, r):
4 return math.factorial(n) // math.factorial(n - r)
5 
6def combinations(n, r):
7 return math.factorial(n) // (math.factorial(r) * math.factorial(n - r))
8 
9print(f"Permutations of 5 pick 3: {permutations(5, 3)}") # 60
10print(f"Combinations of 5 pick 3: {combinations(5, 3)}") # 10

In how many ways can you arrange 3 distinct books on a shelf?

The Pigeonhole Principle

The pigeonhole principle states that if nn items are put into mm containers, with n>mn > m, then at least one container must contain more than one item. While simple, it is a powerful tool for proving existence.

If there are 13 people in a room, what is the minimum number of people who must share the same birth month?

Generating Functions

A generating function is a way of encoding an infinite sequence of numbers (an)(a_n) by treating them as the coefficients of a formal power series: G(x)=n=0anxnG(x) = \sum_{n=0}^{\infty} a_n x^n

python
1def get_fibonacci_coefficient(n):
2 """Sequence: 0, 1, 1, 2, 3, 5, ...
3 Generating function: x / (1 - x - x^2)"""
4 a, b = 0, 1
5 for _ in range(n):
6 a, b = b, a + b
7 return a
8 
9print(f"10th Fibonacci number: {get_fibonacci_coefficient(10)}")

Principle of Inclusion-Exclusion

For two sets AA and BB: AB=A+BAB|A \cup B| = |A| + |B| - |A \cap B| This generalizes to any number of sets, compensating for over-counting elements in intersections.

Section Detail

Relations, Functions, and Morphisms

Relations, Functions, and Morphisms

Mappings allow us to transition from static sets to dynamic interactions. They allow us to compare sets, group elements by shared properties, and transform data while preserving structure.

Binary Relations

A Binary Relation RR between sets AA and BB is a subset of the Cartesian product A×BA \times B. If (a,b)R(a, b) \in R, we write aRbaRb.

A relation RR on set AA can be:

  • Reflexive: aRaaRa.
  • Symmetric: aRb    bRaaRb \implies bRa.
  • Transitive: aRbbRc    aRcaRb \land bRc \implies aRc.
python
1def check_properties(elements, relation):
2 reflexive = all((e, e) in relation for e in elements)
3 symmetric = all((b, a) in relation for (a, b) in relation)
4 transitive = all((a, c) in relation
5 for (a, b1) in relation
6 for (b2, c) in relation if b1 == b2)
7 return {"Reflexive": reflexive, "Symmetric": symmetric, "Transitive": transitive}
8 
9S = {1, 2, 3}
10R = {(1, 1), (2, 2), (3, 3), (1, 2), (2, 1)}
11print(f"Set: {S}, Relation: {R}")
12print(f"Properties: {check_properties(S, R)}")

Equivalence Relations and Partitions

A relation that is reflexive, symmetric, and transitive is an Equivalence Relation. It partitions a set into disjoint Equivalence Classes.

python
1def get_equivalence_classes(elements, relation):
2 classes = []
3 seen = set()
4 for e in elements:
5 if e not in seen:
6 # Class [e] = {x | xRe}
7 cls = {x for x in elements if (x, e) in relation}
8 classes.append(cls)
9 seen.update(cls)
10 return classes
11 
12print(f"Equivalence Classes: {get_equivalence_classes(S, R)}")

Classification of Mappings

A function f:ABf: A \to B is a relation where every input has exactly one output.

  1. Injection (One-to-One): f(x)=f(y)    x=yf(x) = f(y) \implies x = y.
  2. Surjection (Onto): Range equals Codomain.
  3. Bijection: Both injective and surjective (invertible).
python
1def classify_function(domain, codomain, f_map):
2 # f_map is a dict {x: y}
3 injective = len(set(f_map.values())) == len(f_map)
4 surjective = set(f_map.values()) == codomain
5
6 if injective and surjective: return "Bijection"
7 if injective: return "Injection"
8 if surjective: return "Surjection"
9 return "General Function"
10 
11A = {1, 2, 3}
12B = {'a', 'b', 'c'}
13f = {1: 'a', 2: 'b', 3: 'c'}
14print(f"Function mapping: {f}")
15print(f"Classification: {classify_function(A, B, f)}")

Morphisms: Structural Preservation

In abstract algebra, we study functions that preserve operations:

  • Homomorphism: Preserves algebraic structure (f(ab)=f(a)f(b))(f(a \cdot b) = f(a) \cdot f(b)).
  • Isomorphism: A bijective homomorphism.

A relation that is reflexive, symmetric, and transitive is known as what?

Pre-images and Images

For a subset TBT \subseteq B, the Pre-image is f1(T)={xAf(x)T}f^{-1}(T) = \{x \in A \mid f(x) \in T\}.

If f: A -> B is an injection, and |A| = |B| is finite, what must f also be?

Section Detail

Graph Theory

Graph Theory: Structures and Connectivity

Graphs provide a formal framework for modeling relationships between discrete objects. A graph G=(V,E)G = (V, E) consists of a set of vertices VV and edges EE.

Fundamental Properties

  • Degree: The number of edges connected to a vertex.
  • Handshaking Lemma: vVdeg(v)=2E\sum_{v \in V} \text{deg}(v) = 2|E|.
python
1def get_degrees(adj_list):
2 return {node: len(neighbors) for node, neighbors in adj_list.items()}
3 
4# Adjacency List representation
5graph = {
6 'A': ['B', 'C'],
7 'B': ['A', 'D', 'E'],
8 'C': ['A', 'F'],
9 'D': ['B'],
10 'E': ['B', 'F'],
11 'F': ['C', 'E']
12}
13 
14degrees = get_degrees(graph)
15print(f"Degrees: {degrees}")
16print(f"Sum of degrees: {sum(degrees.values())}")
17print(f"Edges count (Sum/2): {sum(degrees.values()) // 2}")

Connectivity and Traversal

  • Connected: A path exists between every pair of vertices.
  • Cycle: A path that starts and ends at the same vertex.
python
1def find_path(graph, start, end, path=[]):
2 path = path + [start]
3 if start == end: return path
4 for node in graph[start]:
5 if node not in path:
6 newpath = find_path(graph, node, end, path)
7 if newpath: return newpath
8 return None
9 
10print(f"Path from A to F: {find_path(graph, 'A', 'F')}")

Planar Graphs and Euler’s Formula

A graph is planar if it can be drawn without edges crossing. For a connected planar graph: VE+F=2V - E + F = 2 where FF is the number of faces.

A connected graph with 6 vertices and 10 edges is planar. How many faces does it have?

Special Graphs: Trees and Bipartite Graphs

  • Tree: A connected graph with no cycles. A tree with nn vertices always has n1n-1 edges.
  • Bipartite: Vertices can be partitioned into two sets such that no edge exists within a set.
python
1def is_bipartite(graph):
2 color = {}
3 for node in graph:
4 if node not in color:
5 stack = [(node, 0)]
6 color[node] = 0
7 while stack:
8 u, c = stack.pop()
9 for v in graph[u]:
10 if v in color:
11 if color[v] == c: return False
12 else:
13 color[v] = 1 - c
14 stack.append((v, 1 - c))
15 return True
16 
17print(f"Is graph bipartite? {is_bipartite(graph)}")

Famous Theorems

  • Four Color Theorem: Any planar graph can be colored with 4 colors.
  • Kuratowski’s Theorem: A graph is planar iff it doesn’t contain K5K_5 or K3,3K_{3,3}.

What is a tree in graph theory?

Section Detail

Mathematical Induction and Well-Ordering

Mathematical Induction and Well-Ordering

Mathematical Induction is a method of proof used to establish the truth of an infinite set of statements indexed by natural numbers. Formal grounding lies in the structure of the natural numbers N\mathbb{N} and the Well-Ordering Principle.

The Principle of Mathematical Induction

To prove that P(n)P(n) is true for all nNn \in \mathbb{N}:

  1. Base Case: Demonstrate P(n0)P(n_0) is true.
  2. Inductive Step: Prove P(k)    P(k+1)P(k) \implies P(k+1) for all kn0k \ge n_0.
python
1def sum_iterative(n):
2 return sum(range(1, n + 1))
3 
4def sum_inductive_formula(n):
5 return (n * (n + 1)) // 2
6 
7n_test = 100
8print(f"Iterative Sum(100): {sum_iterative(n_test)}")
9print(f"Inductive Formula Value: {sum_inductive_formula(n_test)}")
10print(f"Match: {sum_iterative(n_test) == sum_inductive_formula(n_test)}")

Strong Induction

In Strong Induction, we assume P(m)P(m) is true for all n0mkn_0 \le m \le k to prove P(k+1)P(k+1). This is essential for structures like the Fibonacci sequence.

python
1# The Inductive Base: stored in a persistent structure
2cache = {0: 0, 1: 1}
3 
4def fibonacci(n):
5 # Strong induction: we use multiple previous values (n-1 and n-2)
6 if n not in cache:
7 cache[n] = fibonacci(n - 1) + fibonacci(n - 2)
8 return cache[n]
9 
10print(f"F(10) = {fibonacci(10)}")
11print(f"Current Inductive Cache: {[(k, cache[k]) for k in sorted(cache.keys())[:7]]}...")

The Well-Ordering Principle

The Well-Ordering Principle states that every non-empty subset of the natural numbers has a least element. This is logically equivalent to the principle of induction.

In the process of Mathematical Induction, what is the 'Inductive Hypothesis'?

Structural Induction

Induction extends to recursively defined structures like Trees.

  • Base Case: Property holds for leaves.
  • Recursive Step: If holds for children, it holds for parent.
python
1class Node:
2 def __init__(self, val, left=None, right=None):
3 self.val = val
4 self.left = left
5 self.right = right
6 
7def count_nodes(node):
8 if not node: return 0
9 # Structural induction: parent = 1 + left + right
10 return 1 + count_nodes(node.left) + count_nodes(node.right)
11 
12tree = Node(1, Node(2), Node(3, Node(4)))
13print(f"Total nodes in tree: {count_nodes(tree)}")

Can induction be used to prove properties for real numbers (uncountably infinite sets)?

Section Detail

Information Theory

Information Theory

Information theory is the mathematical study of the quantification, storage, and communication of information. It was founded by Claude Shannon in 1948.

Entropy

Entropy H(X)H(X) measures the uncertainty or surprise associated with a random variable XX. H(X)=iP(xi)logbP(xi)H(X) = -\sum_{i} P(x_i) \log_b P(x_i) Usually, b=2b=2 for bits (Shannon entropy).

python
1import math
2 
3def calculate_entropy(probabilities):
4 entropy = 0
5 for p in probabilities:
6 if p > 0:
7 entropy -= p * math.log2(p)
8 return entropy
9 
10# Fair coin
11print(f"Fair coin entropy: {calculate_entropy([0.5, 0.5])} bits")
12 
13# Biased coin (90% heads)
14print(f"Biased coin entropy: {calculate_entropy([0.9, 0.1]):.3f} bits")
15 
16# Single certain outcome
17print(f"Certain outcome entropy: {calculate_entropy([1.0])} bits")

Mutual Information and Kullback-Leibler Divergence

Kullback-Leibler (KL) Divergence, or relative entropy, measures the “distance” (though not a true metric) between two probability distributions PP and QQ: DKL(PQ)=xXP(x)log2(P(x)Q(x))D_{KL}(P || Q) = \sum_{x \in \mathcal{X}} P(x) \log_2 \left( \frac{P(x)}{Q(x)} \right)

It quantifies the information lost when QQ is used to approximate PP.

Mutual Information I(X;Y)I(X; Y) measures the reduction in uncertainty of XX given the knowledge of YY: I(X;Y)=xXyYP(x,y)log2(P(x,y)P(x)P(y))I(X; Y) = \sum_{x \in \mathcal{X}} \sum_{y \in \mathcal{Y}} P(x, y) \log_2 \left( \frac{P(x, y)}{P(x)P(y)} \right)

It is related to entropy by: I(X;Y)=H(X)H(XY)=H(X)+H(Y)H(X,Y)I(X; Y) = H(X) - H(X|Y) = H(X) + H(Y) - H(X, Y).

python
1import math
2 
3def kl_divergence(P, Q):
4 # D_KL(P || Q) - Sum P(x) log(P(x)/Q(x))
5 res = 0
6 for p, q in zip(P, Q):
7 if p > 0:
8 res += p * math.log2(p / q)
9 return res
10 
11P = [0.1, 0.9]
12Q = [0.5, 0.5]
13print(f"KL Divergence D_KL(P || Q): {kl_divergence(P, Q):.3f}")
14 
15def mutual_information(joint_prob, p_x, p_y):
16 # I(X;Y) = Sum P(x,y) log(P(x,y)/(P(x)P(y)))
17 mi = 0
18 for x in range(len(p_x)):
19 for y in range(len(p_y)):
20 pxy = joint_prob[x][y]
21 if pxy > 0:
22 mi += pxy * math.log2(pxy / (p_x[x] * p_y[y]))
23 return mi
24 
25# Example: X and Y are highly correlated
26px = [0.5, 0.5]
27py = [0.5, 0.5]
28joint = [[0.45, 0.05], [0.05, 0.45]]
29print(f"Mutual Information I(X; Y): {mutual_information(joint, px, py):.3f}")

Source Coding Theorem

Shannon’s Source Coding Theorem establishes that the minimum number of bits needed to represent a source is its entropy. Huffman Coding is a common algorithm to achieve this bound.

If a random variable has 4 equally likely outcomes, what is its entropy?

Channel Capacity

The Shannon-Hartley Theorem defines the maximum rate CC at which information can be transmitted over a noisy channel with bandwidth BB and signal-to-noise ratio S/NS/N: C=Blog2(1+S/N)C = B \log_2(1 + S/N)

What happens to entropy as outcomes become more predictable?

Section Detail

Recurrence Relations

Recurrence Relations

A recurrence relation defines a sequence where each term is a function of preceding terms. They are the discrete analogues of differential equations.

Classification

  1. Linear: Terms appear to the first power.
  2. Homogeneous: No constant terms or separate functions of nn.
  3. Order: The number of previous terms required.

Solving Linear Homogeneous Recurrences

For an=c1an1+c2an2a_n = c_1 a_{n-1} + c_2 a_{n-2}, we solve the Characteristic Equation: r2c1rc2=0r^2 - c_1 r - c_2 = 0

python
1import numpy as np
2 
3def solve_recurrence(c1, c2, a0, a1, n):
4 # Solves a_n = c1*a_{n-1} + c2*a_{n-2}
5 roots = np.roots([1, -c1, -c2])
6 r1, r2 = roots
7
8 # a_n = A*r1^n + B*r2^n
9 # a0 = A + B
10 # a1 = A*r1 + B*r2
11 A_mat = np.array([[1, 1], [r1, r2]])
12 B_vec = np.array([a0, a1])
13 A, B = np.linalg.solve(A_mat, B_vec)
14
15 return A * (r1**n) + B * (r2**n)
16 
17# Fibonacci example: a_n = 1*a_{n-1} + 1*a_{n-2}, a0=0, a1=1
18val = solve_recurrence(1, 1, 0, 1, 10)
19print(f"F(10) via Characteristic Equation: {round(val.real)}")

Binet’s Formula for Fibonacci

The closed-form solution for Fibonacci is: Fn=ϕnψn5,ϕ=1+52F_n = \frac{\phi^n - \psi^n}{\sqrt{5}}, \quad \phi = \frac{1+\sqrt{5}}{2}

python
1def binet_fib(n):
2 phi = (1 + 5**0.5) / 2
3 psi = (1 - 5**0.5) / 2
4 return round((phi**n - psi**n) / 5**0.5)
5 
6print(f"F(20) via Binet: {binet_fib(20)}")

Divide and Conquer: The Master Theorem

In CS, we often see T(n)=aT(n/b)+f(n)T(n) = aT(n/b) + f(n).

  • Merge Sort: T(n)=2T(n/2)+n    O(nlogn)T(n) = 2T(n/2) + n \implies O(n \log n).
  • Binary Search: T(n)=T(n/2)+1    O(logn)T(n) = T(n/2) + 1 \implies O(\log n).

What is the characteristic equation for the recurrence $a_n = 5a_{n-1} - 6a_{n-2}$?

Computational Methods: Matrix Exponentiation

For terms like F109F_{10^9}, floating point precision fails. We use the transformation matrix MM where MnM^n gives the nn-th term in O(logn)O(\log n) time.

python
1def matrix_mult(A, B):
2 C = [[0, 0], [0, 0]]
3 for i in range(2):
4 for j in range(2):
5 for k in range(2):
6 C[i][j] += A[i][k] * B[k][j]
7 return C
8 
9def matrix_pow(A, p):
10 res = [[1, 0], [0, 1]]
11 while p > 0:
12 if p % 2 == 1: res = matrix_mult(res, A)
13 A = matrix_mult(A, A)
14 p //= 2
15 return res
16 
17T = [[1, 1], [1, 0]]
18T_n = matrix_pow(T, 10)
19print(f"F(10) via Matrix Exponentiation: {T_n[0][1]}")

Which growth rate does Merge Sort follow based on its recurrence relation T(n) = 2T(n/2) + n?

Section Detail

Axiomatic Set Theory and the ZFC Framework

Axiomatic Set Theory and the ZFC Framework

Set theory is often called the “language of mathematics.” Virtually every mathematical object—numbers, functions, manifolds, operators—can be formally defined as a set.

Russell’s Paradox and the Necessity of Axioms

In Naive Set Theory, one could define a set through any property PP: S={xP(x)}S = \{x \mid P(x)\}. Bertrand Russell asked: if we define R={xxx}R = \{x \mid x \notin x\} (the set of all sets that do not contain themselves), does RR contain itself?

python
1class RussellSet:
2 def __contains__(self, item):
3 # A set that contains itself only if it DOES NOT contain itself
4 return not (item in item if hasattr(item, "__contains__") else False)
5 
6r = RussellSet()
7try:
8 print(f"Does r contain r? {r in r}")
9except RecursionError:
10 print("Infinite recursion: Russell's Paradox detected!")

The Axioms of ZFC

To resolve such paradoxes, the Zermelo-Fraenkel axioms with the Axiom of Choice (ZFC) were developed.

  1. Extensionality: Sets are equal if they have the same elements.
  2. Empty Set: \emptyset exists.
  3. Power Set: For any set xx, there exists a set P(x)\mathcal{P}(x) containing all subsets of xx.
python
1from itertools import chain, combinations
2 
3def power_set(iterable):
4 s = list(iterable)
5 return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
6 
7s = {1, 2, 3}
8ps = list(power_set(s))
9print(f"Set: {s}")
10print(f"Power Set size: {len(ps)}")
11print(f"Subsets: {ps}")

Constructing the Universe: The Von Neumann Hierarchy

Using these axioms, we can build the natural numbers N\mathbb{N}:

  • 0=0 = \emptyset
  • 1={0}={}1 = \{0\} = \{\emptyset\}
  • 2={0,1}={,{}}2 = \{0, 1\} = \{\emptyset, \{\emptyset\}\}
python
1def von_neumann_ordinal(n):
2 if n == 0:
3 return set()
4 prev = von_neumann_ordinal(n - 1)
5 # n = prev U {prev}
6 return prev | {frozenset(prev)}
7 
8for i in range(4):
9 print(f"{i}: {von_neumann_ordinal(i)}")

Ordinals and Cardinals

  • Ordinals: Describe the order type (position).
  • Cardinals: Describe the size (quantity). Two sets have the same cardinality if there exists a bijection between them.

Which axiom in ZFC was specifically introduced to resolve Russell's Paradox by restricting set construction to subsets of existing sets?

The Axiom of Choice (AC)

AC states that given a collection of non-empty sets, we can select one element from each. While intuitive, it leads to non-constructive results like the Banach-Tarski Paradox (decomposing a ball into two identical balls).

If |A| = n, what is the cardinality of the power set P(A)?