ProCGroups.Generation.Convergence

8 Theorem | 1 Definition

This module supplies the topological part of the construction. It checks continuity and stagewise neighborhood properties so that the completed object inherits the required topology.

import
Imported by

Declarations

theorem ConvergesToOne.image_of_continuous_pointed
    {H : Type v} [Group H] [TopologicalSpace H]
    (hG : IsProfiniteGroup G) {f : G → H} (hf : Continuous f) (hf1 : f 1 = 1)
    {X : Set G} (hX : ConvergesToOne (G := G) X) :
    ConvergesToOne (G := H) (f '' X)

A continuous map between topological groups that sends \(1\) to \(1\) carries convergent sets to convergent sets, provided the source is profinite.

Show proof
theorem ConvergesToOne.mono {X Y : Set G}
    (hX : ConvergesToOne (G := G) X) (hYX : Y ⊆ X) :
    ConvergesToOne (G := G) Y

Passing to a subset preserves convergence to \(1\).

Show proof
theorem ConvergesToOne.union_finite {X F : Set G}
    (hX : ConvergesToOne (G := G) X) (hF : F.Finite) :
    ConvergesToOne (G := G) (X ∪ F)

Finite enlargements preserve convergence to \(1\).

Show proof
theorem ConvergesToOne.union_finite_iff {X F : Set G}
    (hF : F.Finite) :
    ConvergesToOne (G := G) (X ∪ F) ↔ ConvergesToOne (G := G) X

Convergence to \(1\) is preserved and reflected by the indicated finite union, insertion, or continuous equivalence operation.

Show proof
theorem ConvergesToOne.insert_iff {X : Set G} {x : G} :
    ConvergesToOne (G := G) (Set.insert x X) ↔ ConvergesToOne (G := G) X

Convergence to \(1\) is preserved and reflected by the indicated finite union, insertion, or continuous equivalence operation.

Show proof
theorem ConvergesToOne.union_one_iff {X : Set G} :
    ConvergesToOne (G := G) (X ∪ ({1} : Set G)) ↔ ConvergesToOne (G := G) X

Convergence to \(1\) is preserved and reflected by the indicated finite union, insertion, or continuous equivalence operation.

Show proof
theorem closure_generatorsConvergingToOne (hG : IsProfiniteGroup G) {X : Set G}
    (hX : ConvergesToOne (G := G) X) :
    IsDiscrete (X \ {1}) ∧
      (Set.Infinite X → closure X = X ∪ ({1} : Set G))

A set converging to \(1\) is discrete away from \(1\), and if it is infinite its closure is obtained by adjoining the unique possible limit point \(1\).

Show proof
theorem ConvergesToOne.isClosed_of_one_mem (hG : IsProfiniteGroup G) {X : Set G}
    (hX : ConvergesToOne (G := G) X) (h1 : (1 : G) ∈ X) :
    IsClosed X

A convergent set containing its only possible limit point \(1\) is closed.

Show proof
noncomputable def closure_generatorsConvergingToOne_homeomorph_onePoint
    (hG : IsProfiniteGroup G) {X : Set G}
    (hX : ConvergesToOne (G := G) X) (hXinfinite : X.Infinite) (h1X : (1 : G) ∉ X) :
    OnePoint X ≃ₜ closure X := by
  classical
  letI : T2Space G := IsProfiniteGroup.t2Space hG
  rcases closure_generatorsConvergingToOne (G := G) hG hX with ⟨hdisc, hclosure⟩
  have hdiff : X \ ({1} : Set G) = X := by
    ext x
    by_cases hx : x = 1
    · simp only [h1X, not_false_eq_true, diff_singleton_eq_self, hx]
    · simp only [mem_diff, mem_singleton_iff, hx, not_false_eq_true, and_true]
  have hdiscX : IsDiscrete X := by
    simpa [hdiff] using hdisc
  letI : DiscreteTopology X := (isDiscrete_iff_discreteTopology).1 hdiscX
  have h1closure : (1 : G) ∈ closure X := by
    have : (1 : G) ∈ X ∪ ({1} : Set G) := by simp only [union_singleton, mem_insert_iff, true_or]
    rw [hclosure hXinfinite]
    simp only [union_singleton, mem_insert_iff, true_or]
  let toClosure : OnePoint X → closure X
    | OnePoint.infty => ⟨1, h1closure⟩
    | (x : X) => ⟨x.1, subset_closure x.2⟩
  let fromClosure : closure X → OnePoint X := fun y =>
    if hy : (y : G) = 1 then
      OnePoint.infty
    else
      OnePoint.some ⟨(y : G), by
        have hy' : (y : G) ∈ X ∪ ({1} : Set G) := by
          simpa [hclosure hXinfinite] using y.2
        rcases hy' with hyX | hy1
        · exact hyX
        · exact False.elim (hy hy1)⟩
  have hleft : Function.LeftInverse fromClosure toClosure := by
    intro z
    refine OnePoint.rec ?_ ?_ z
    · simp only [↓reduceDIte, fromClosure, toClosure]
    · intro x
      have hx1 : (x : G) ≠ 1 := by
        intro hx1
        exact h1X (hx1 ▸ x.2)
      simp only [hx1, ↓reduceDIte, Subtype.coe_eta, fromClosure, toClosure]
  have hright : Function.RightInverse fromClosure toClosure := by
    intro y
    by_cases hy : (y : G) = 1
    · apply Subtype.ext
      simp only [hy, ↓reduceDIte, toClosure, fromClosure]
    · apply Subtype.ext
      simp only [hy, ↓reduceDIte, Subtype.coe_eta, toClosure, fromClosure]
  let e : OnePoint X ≃ closure X :=
    { toFun := toClosure
      invFun := fromClosure
      left_inv := hleft
      right_inv := hright }
  have hcont : Continuous e := by
    rw [OnePoint.continuous_iff_from_discrete]
    rw [tendsto_subtype_rng]
    change Filter.Tendsto (fun x : X => ((toClosure (x : OnePoint X) : closure X) : G))
      Filter.cofinite
      (𝓝 (((toClosure OnePoint.infty : closure X) : G)))
    change Filter.Tendsto (fun x : X => (x : G)) Filter.cofinite (𝓝 (1 : G))
    letI : CompactSpace G := IsProfiniteGroup.compactSpace hG
    letI : TotallyDisconnectedSpace G := IsProfiniteGroup.totallyDisconnectedSpace hG
    rw [Filter.tendsto_def]
    intro s hs
    rcases mem_nhds_iff.mp hs with ⟨W, hWs, hWopen, h1W⟩
    rcases exists_openNormalSubgroup_sub_open_nhds_of_one (G := G) hWopen h1W with ⟨U, hUW⟩
    have hfinite : (X \ (U : Set G)).Finite := hX U.toOpenSubgroup
    have hcof : ∀ᶠ x : X in Filter.cofinite, (x : G) ∈ (U : Set G) := by
      let f : X ↪ G := ⟨Subtype.val, Subtype.val_injective⟩
      have hpre : {x : X | (x : G) ∉ (U : Set G)}.Finite := by
        simpa [f, Set.preimage] using hfinite.preimage_embedding f
      exact Filter.eventually_cofinite.2 hpre
    exact hcof.mono fun x hx => hWs (hUW hx)
  exact hcont.homeoOfBijectiveCompactToT2 e.bijective

If \(X\) is infinite, converges to \(1\), and does not contain \(1\), then \(closure X\) is homeomorphic to the one-point compactification of the discrete space \(X\).