Transfinite Ordinal Arithmetic
A Rust library for performing arithmetic operations on transfinite ordinal numbers up to ε₀ (epsilon-zero), using Cantor Normal Form representation.
What Are Ordinal Numbers?
Ordinal numbers extend the natural numbers to describe the order type of well-ordered sets. While natural numbers (0, 1, 2, ...) work well for finite sequences, ordinals continue into the infinite:
- ω (omega) represents the order type of all natural numbers
- ω + 1 comes after all natural numbers, then one more
- ω · 2 represents two copies of the natural numbers placed end-to-end
- ω², ω^ω, and beyond represent increasingly large infinite ordinals
Unlike cardinal numbers (which measure "how many"), ordinals measure "what position" and preserve order information. Ordinal arithmetic has unique properties:
Addition and multiplication are NOT commutative:
1 + ω = ω(add one natural number to infinity, still get infinity)ω + 1 > ω(but infinity plus one is a distinct ordinal!)2 · ω = ω(two copies of infinity, each infinite, is still infinity)ω · 2 = ω + ω(infinity doubled is larger than infinity)
This library implements ordinals up to ε₀ (epsilon-zero), the first ordinal that satisfies ωε₀ = ε₀, which is the limit of the finite sequence: ω, ωω, ω(ωω), ...
Features
- Ordinal arithmetic: addition, multiplication, exponentiation
- Comparison and ordering of ordinals
- Cantor Normal Form representation for efficient computation
Quick Start
Add this to your Cargo.toml:
[]
= "0.2.0"
Basic Example
use Ordinal;
use Pow;
// Create finite ordinals
let zero = zero;
let five = new_finite;
// Create the first infinite ordinal
let omega = omega;
// Ordinal arithmetic
let omega_plus_five = omega.clone + five.clone;
let omega_times_two = omega.clone * new_finite;
let omega_squared = omega.clone.pow;
println!; // Prints: ω + 5
println!; // Prints: ω * 2
println!; // Prints: ω^2
Non-Commutativity Example
use Ordinal;
let one = one;
let omega = omega;
// Addition is NOT commutative
let one_plus_omega = one.clone + omega.clone;
let omega_plus_one = omega.clone + one.clone;
assert_eq!; // 1 + ω = ω
assert_ne!; // ω + 1 ≠ ω
println!; // Prints: ω
println!; // Prints: ω + 1
Key Concepts
Cantor Normal Form (CNF)
Every ordinal α < ε₀ can be uniquely written as:
α = ω^β₁·c₁ + ω^β₂·c₂ + ... + ω^βₙ·cₙ
where:
- β₁ > β₂ > ... > βₙ (exponents in strictly decreasing order)
- c₁, c₂, ..., cₙ are positive finite coefficients
- This is called the Cantor Normal Form
For example:
ω² + ω·3 + 7is in CNF42=ω⁰·42is in CNF (finite ordinals are CNF with exponent 0)ω^ω + ω² + 1is in CNF
This library represents transfinite ordinals internally using CNF, enabling efficient arithmetic operations.
Limit vs Successor Ordinals
- Limit ordinal: No immediate predecessor (e.g., ω, ω·2, ω²)
- Informally: "comes from below" via an infinite sequence
- Successor ordinal: Has an immediate predecessor α+1 (e.g., 1, 5, ω+1)
- Informally: "one step after" another ordinal
use Ordinal;
let omega = omega;
assert!; // ω is a limit
assert!;
let omega_plus_one = omega.successor;
assert!; // ω+1 is a successor
assert!;
This distinction matters for multiplication and exponentiation algorithms.
Ordinal Arithmetic Rules
| Operation | Property | Example |
|---|---|---|
| Addition | Not commutative | 1 + ω = ω, but ω + 1 ≠ ω |
| Addition | Associative | (α + β) + γ = α + (β + γ) |
| Multiplication | Not commutative | 2 · ω = ω, but ω · 2 = ω + ω |
| Multiplication | Associative | (α · β) · γ = α · (β · γ) |
| Exponentiation | Not commutative | 2^ω = ω, but ω^2 = ω · ω |
Examples
Building Complex Ordinals
use ;
// ω² (omega squared)
let omega_squared = new_transfinite.unwrap;
// ω² + ω·3 + 7
let complex = new_transfinite.unwrap;
println!; // Prints: ω^2 + ω * 3 + 7
Exponentiation
use Ordinal;
use Pow;
let omega = omega;
// ω^ω (omega to the omega)
let omega_omega = omega.clone.pow;
println!; // Prints: ω^ω
// ω^(ω^ω) (tower of omegas)
let tower = omega.clone.pow;
println!;
Comparison and Ordering
use Ordinal;
let five = new_finite;
let omega = omega;
let omega_plus_one = omega.successor;
// All finite ordinals are less than all transfinite ordinals
assert!;
assert!;
// Standard comparison operators work
assert!;
assert!;
API Overview
Core Types
Ordinal- Main ordinal number type (finite or transfinite)CnfTerm- A term in Cantor Normal Form (ω^exponent · multiplicity)OrdinalError- Error type for construction failuresResult<T>- Type alias forResult<T, OrdinalError>
Key Methods
Constructors:
Ordinal::zero(),Ordinal::one(),Ordinal::omega()Ordinal::new_finite(n)- Create finite ordinalOrdinal::new_transfinite(terms)- Create from CNF terms
Query Methods:
is_finite(),is_transfinite()is_limit(),is_successor()successor()- Get the next ordinal (α + 1)
Arithmetic (trait implementations):
Add(+) - Ordinal additionMul(*) - Ordinal multiplicationPow(.pow()) - Ordinal exponentiation
Comparison:
PartialOrd,Ord- Standard Rust ordering
See the API documentation for complete details.
Limitations
- Ordinals up to ε₀ only: Cannot represent ε₁, ε₂, or larger ordinals
- Finite coefficients: CNF multiplicities are limited to
u32(0 to 4,294,967,295) - No ordinal subtraction or division: Ordinal subtraction and division are not well-defined for all ordinals
Contributing
Contributions are welcome! See the issue tracker for planned improvements or bug reporting.
License
This project is licensed under either of:
- MIT License (LICENSE-MIT or http://opensource.org/licenses/MIT)
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
at your option.