Hatcher §1.1: the circle , the covering , and the loops
DefinitionHatcher_CircleThis bundle fixes the objects of Hatcher's subsection "The Fundamental Group of the Circle" (Section 1.1, pp. 29–30), in the book-wide namespace Hatcher.
The circle is realised as the unit circle of (Mathlib's Circle), so the point is and Hatcher's basepoint is .
circleCoveris Hatcher's map ,
together with the facts that is continuous, , and for every integer (so is visible as the integers).
-
omegaLoopN nis, for , Hatcher's loop on , packaged as a MathlibPathfrom to in (continuity and both endpoint equations included). -
omegaLoopis Hatcher's loop , again as aPathfrom to ; the lemmaomegaLoopN_onerecords . -
omegaClassis the homotopy class , as an element of Mathlib'sFundamentalGroup Circle 1.
These are the data in terms of which Theorem 1.7 ( is infinite cyclic generated by ) and its supporting lifting lemmas are stated; later missions in the series reuse them.
Formalization Note Hatcher's is replaced by the unit circle in , which Mathlib equips with its topology, group structure and the covering map Circle.exp; Hatcher's is Circle.exp precomposed with . FundamentalGroup Circle 1 is Mathlib's fundamental group, i.e. the endomorphism group of the point in the fundamental groupoid.
import Mathlib
/-!
Hatcher, *Algebraic Topology*, Section 1.1, "The Fundamental Group of the Circle" (pp. 29-30).
The circle `S¹ ⊆ ℝ²` is realised as `Circle`, the unit circle in `ℂ`, so a point
`(cos θ, sin θ) ∈ ℝ²` is `e^{iθ} ∈ ℂ` and the basepoint `(1, 0)` is `1 : Circle`.
-/
namespace Hatcher
open Real
/-- Hatcher's map `p : ℝ → S¹`, `p(s) = (cos 2πs, sin 2πs)`, i.e. `p(s) = e^{2πis}`. -/
noncomputable def circleCover (s : ℝ) : Circle := Circle.exp (2 * π * s)
theorem continuous_circleCover : Continuous circleCover :=
Circle.exp.continuous.comp (continuous_const.mul continuous_id)
@[simp] theorem circleCover_zero : circleCover 0 = 1 := by
simp [circleCover]
@[simp] theorem circleCover_intCast (n : ℤ) : circleCover n = 1 := by
simp [circleCover, Circle.exp_two_pi_mul_int]
/-- Hatcher's loop `ω_n(s) = (cos 2πns, sin 2πns)`, `n ∈ ℤ`, based at `(1, 0)`. -/
noncomputable def omegaLoopN (n : ℤ) : Path (1 : Circle) 1 where
toFun s := circleCover (n * s)
continuous_toFun := continuous_circleCover.comp (continuous_const.mul continuous_subtype_val)
source' := by simp
target' := by simp
/-- Hatcher's loop `ω(s) = (cos 2πs, sin 2πs)` based at `(1, 0)`; it is `ω_1`. -/
noncomputable def omegaLoop : Path (1 : Circle) 1 where
toFun s := circleCover s
continuous_toFun := continuous_circleCover.comp continuous_subtype_val
source' := by simp
target' := by simpa using circleCover_intCast 1
@[simp] theorem omegaLoopN_apply (n : ℤ) (s : unitInterval) : omegaLoopN n s = circleCover (n * s) := rfl
@[simp] theorem omegaLoop_apply (s : unitInterval) : omegaLoop s = circleCover s := rfl
theorem omegaLoopN_one : omegaLoopN 1 = omegaLoop := by
ext s; simp
/-- The homotopy class `[ω] ∈ π₁(S¹, (1, 0))`, as an element of Mathlib's `FundamentalGroup Circle 1`. -/
noncomputable def omegaClass : FundamentalGroup Circle 1 := FundamentalGroup.fromPath ⟦omegaLoop⟧
end Hatcher
Read-back
What the Lean code literally says, in plain math · claude-fable-5-1
Read-back: Def_Hatcher_Circle bundle
All declarations live in a namespace called Hatcher and depend only on Mathlib. Throughout, the following Mathlib notions are used and are expanded here once so that each paragraph below can refer back to them.
- The circle.
Circleis the type of complex numbers of norm one, (formally, the metric sphere in of radius centred at ), carrying the subspace topology from and the multiplicative commutative group structure inherited from ; its identity element is the complex number . - The exponential onto the circle.
Circle.expis the continuous map , (formally the complex number together with a proof that it has norm one). - The unit interval.
unitInterval, written below, is the subset of the reals, viewed as a topological space with the subspace topology. An element is, when used in a real-number expression, silently replaced by its underlying real number. - Paths. For points of a topological space , a
Path x yis a continuous map together with proofs that and . A path from to is a loop based at . - Path homotopy and its quotient. Two paths from to are homotopic (
Path.Homotopic) if there exists a continuous map with , for all , and , for all (endpoints fixed throughout). This is an equivalence relation, andPath.Homotopic.Quotient x yis the set of equivalence classes. The bracket (written⟦γ⟧in the code) denotes the equivalence class of the path in this quotient. - Fundamental group.
FundamentalGroup X xis defined as the set of endomorphisms of the object in Mathlib's fundamental groupoid of ; concretely its underlying set is exactlyPath.Homotopic.Quotient x x, the set of homotopy classes of loops based at . Its group structure is: identity the class of the constant loop at ; product the class of the concatenation "first traverse , then " (note the order); inverse the class of the reversed loop.FundamentalGroup.fromPathis the mapPath.Homotopic.Quotient x x → FundamentalGroup X xthat sends a homotopy class of loops to itself regarded as an element of the fundamental group (it is definitionally the identity; it only changes the type label).
The Lean symbol π here is the real number (from the Real namespace, which is opened).
circleCover (definition)
For every real number , this defines an element of the circle by
Here is the real product and is the map described above. This is a total function with no restrictions on (it is marked noncomputable, which has no mathematical content).
continuous_circleCover (theorem)
Asserts that the function , , is continuous, where has its usual topology and has the subspace topology from . There are no hypotheses.
circleCover_zero (theorem)
Asserts the single equation
i.e. , where is the real number zero and is the identity element of the group (the complex number ). No hypotheses.
circleCover_intCast (theorem)
For every integer , asserts
where on the left is regarded as a real number (via the canonical inclusion ), so the claim is in for every integer , including and negative . No further hypotheses.
omegaLoopN (definition)
For every integer , this defines a loop in based at , i.e. an element of Path (1 : Circle) 1, denoted here . Its underlying function is
where is the real product of (cast to ) with the real number underlying . The definition packages, in addition to this function:
- a proof that is continuous on ;
- a proof that (the start point is the identity element of );
- a proof that (the end point is the identity element of ).
Note that is allowed, in which case is the constant loop at ; negative are also allowed.
omegaLoop (definition)
Defines a loop in based at (an element of Path (1 : Circle) 1), denoted here , whose underlying function is
where is used via its underlying real number. Packaged with it are proofs that this function is continuous on , that , and that (the last obtained from circleCover_intCast with ). Note that is defined directly and not as ; the relationship between the two is a separate theorem below.
omegaLoopN_apply (theorem)
For every integer and every point , asserts
where is the loop defined by omegaLoopN evaluated at . This holds by definition (the proof is rfl); the statement records how the loop evaluates pointwise.
omegaLoop_apply (theorem)
For every point , asserts
where is the loop defined by omegaLoop. Again this holds by definition.
omegaLoopN_one (theorem)
Asserts the equality of loops
i.e. the loop omegaLoopN 1 (with underlying function , where is the integer one cast to ) is equal, as an element of Path (1 : Circle) 1, to the loop omegaLoop (with underlying function ). Equality of paths here means equality of the underlying functions at every point (the endpoint proofs carry no data). No hypotheses.
omegaClass (definition)
Defines an element of the fundamental group of at the basepoint , i.e. of FundamentalGroup Circle 1, by
where is the homotopy class (relative to the fixed endpoints ) of the loop in the quotient Path.Homotopic.Quotient 1 1, and re-labels that class as an element of the group FundamentalGroup Circle 1 (whose elements are exactly such classes, with product "concatenate, second factor first", identity the class of the constant loop at , and inverse given by reversal). Nothing is asserted about this element (for instance, no claim is made that it generates the group, that it is non-trivial, or that it has infinite order); the declaration only names it.
Confirmed by the mission captain (proposal self-audit).