Skip to content

Commit ce0944a

Browse files
committed
feat: IsUniformGroup ↔ IsRightUniformGroup ∧ IsLeftUniformGroup (leanprover-community#30110)
1 parent e8ebb32 commit ce0944a

1 file changed

Lines changed: 82 additions & 2 deletions

File tree

  • Mathlib/Topology/Algebra/IsUniformGroup

Mathlib/Topology/Algebra/IsUniformGroup/Defs.lean

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ variable {α : Type*} {β : Type*}
160160
161161
`IsUniformGroup G` is equivalent to the fact that `G` is a topological group, and the uniformity
162162
coincides with **both** the associated left and right uniformities
163-
(this fact is not in Mathlib yet).
163+
(see `IsUniformGroup.isRightUniformGroup`, `IsUniformGroup.isLeftUniformGroup` and
164+
`IsUniformGroup.of_left_right`).
164165
165166
Since there are topological groups where these two uniformities do **not** coincide,
166167
not all topological groups admit a uniform group structure in this sense. This is however the
@@ -174,7 +175,8 @@ uniformly continuous.
174175
175176
`IsUniformAddGroup G` is equivalent to the fact that `G` is a topological additive group, and the
176177
uniformity coincides with **both** the associated left and right uniformities
177-
(this fact is not in Mathlib yet).
178+
(see `IsUniformAddGroup.isRightUniformAddGroup`, `IsUniformAddGroup.isLeftUniformAddGroup` and
179+
`IsUniformAddGroup.of_left_right`).
178180
179181
Since there are topological groups where these two uniformities do **not** coincide,
180182
not all topological groups admit a uniform group structure in this sense. This is however the
@@ -400,6 +402,84 @@ open MulOpposite
400402

401403
end
402404

405+
section OfLeftAndRight
406+
407+
variable [UniformSpace β] [Group β] [IsLeftUniformGroup β] [IsRightUniformGroup β]
408+
409+
open Prod (snd) in
410+
/-- Note: this assumes `[IsLeftUniformGroup β] [IsRightUniformGroup β]` instead of the more typical
411+
(and equivalent) `[IsUniformGroup β]` because this is used in the proof of said equivalence. -/
412+
@[to_additive /-- Note: this assumes `[IsLeftUniformAddGroup β] [IsRightUniformAddGroup β]`
413+
instead of the more typical (and equivalent) `[IsUniformAddGroup β]` because this is used
414+
in the proof of said equivalence. -/]
415+
theorem comap_conj_nhds_one :
416+
comap (fun gx : β × β ↦ gx.1 * gx.2 * gx.1⁻¹) (𝓝 1) = comap snd (𝓝 1) := by
417+
let dr : β × β → β := fun xy ↦ xy.2 * xy.1⁻¹
418+
let dl : β × β → β := fun xy ↦ xy.1⁻¹ * xy.2
419+
let conj : β × β → β := fun gx ↦ gx.1 * gx.2 * gx.1⁻¹
420+
let φ : β × β ≃ β × β := (Equiv.refl β).prodShear (fun b ↦ (Equiv.mulLeft b).symm)
421+
have conj_φ : conj ∘ φ = dr := by
422+
ext; simp [conj, φ, dr]
423+
have snd_φ : snd ∘ φ = dl := by
424+
ext; simp [φ, dl]
425+
rw [← (comap_injective φ.surjective).eq_iff, comap_comap, comap_comap, conj_φ, snd_φ,
426+
← uniformity_eq_comap_inv_mul_nhds_one, ← uniformity_eq_comap_mul_inv_nhds_one]
427+
428+
open Prod (snd) in
429+
/-- Note: this assumes `[IsLeftUniformGroup β] [IsRightUniformGroup β]` instead of the more typical
430+
(and equivalent) `[IsUniformGroup β]` because this is used in the proof of said equivalence. -/
431+
@[to_additive /-- Note: this assumes `[IsLeftUniformAddGroup β] [IsRightUniformAddGroup β]`
432+
instead of the more typical (and equivalent) `[IsUniformAddGroup β]` because this is used
433+
in the proof of said equivalence. -/]
434+
theorem tendsto_conj_nhds_one :
435+
Tendsto (fun gx : β × β ↦ gx.1 * gx.2 * gx.1⁻¹) (comap snd (𝓝 1)) (𝓝 1) := by
436+
rw [tendsto_iff_comap, comap_conj_nhds_one]
437+
438+
/-- Note: this assumes `[IsLeftUniformGroup β] [IsRightUniformGroup β]` instead of the more typical
439+
(and equivalent) `[IsUniformGroup β]` because this is used in the proof of said equivalence. -/
440+
@[to_additive /-- Note: this assumes `[IsLeftUniformAddGroup β] [IsRightUniformAddGroup β]`
441+
instead of the more typical (and equivalent) `[IsUniformAddGroup β]` because this is used
442+
in the proof of said equivalence. -/]
443+
theorem Filter.Tendsto.conj_nhds_one {ι : Type*} {l : Filter ι} {x : ι → β}
444+
(hx : Tendsto x l (𝓝 1)) (g : ι → β) :
445+
Tendsto (g * x * g⁻¹) l (𝓝 1) := by
446+
have : Tendsto (fun i ↦ (g i, x i)) l (comap Prod.snd (𝓝 1)) := by
447+
rwa [tendsto_comap_iff]
448+
-- `exact` works but is quite slow...
449+
convert tendsto_conj_nhds_one.comp this
450+
451+
theorem IsUniformGroup.of_left_right : IsUniformGroup β where
452+
uniformContinuous_div := by
453+
let φ : (β × β) × (β × β) → β := fun ⟨⟨x₁, x₂⟩, ⟨y₁, y₂⟩⟩ ↦ x₂ * y₂⁻¹ * y₁ * x₁⁻¹
454+
let ψ : (β × β) × (β × β) → β := fun ⟨⟨x₁, x₂⟩, ⟨y₁, y₂⟩⟩ ↦ (x₁⁻¹ * x₂) * (y₂⁻¹ * y₁)
455+
let g : (β × β) × (β × β) → β := fun ⟨⟨x₁, x₂⟩, ⟨y₁, y₂⟩⟩ ↦ x₁
456+
suffices Tendsto φ (𝓤 β ×ˢ 𝓤 β) (𝓝 1) by
457+
rw [UniformContinuous, uniformity_eq_comap_mul_inv_nhds_one β, tendsto_comap_iff,
458+
uniformity_prod_eq_prod, tendsto_map'_iff]
459+
simpa [Function.comp_def, div_eq_mul_inv, ← mul_assoc]
460+
have φ_ψ_conj : φ = g * ψ * g⁻¹ := by
461+
ext
462+
simp [φ, ψ, g, mul_assoc]
463+
have ψ_tendsto : Tendsto ψ (𝓤 β ×ˢ 𝓤 β) (𝓝 1) := by
464+
rw [← one_mul 1]
465+
refine .mul ?_ ?_
466+
· rw [uniformity_eq_comap_inv_mul_nhds_one]
467+
exact tendsto_comap.comp tendsto_fst
468+
· rw [uniformity_eq_comap_inv_mul_nhds_one_swapped]
469+
exact tendsto_comap.comp tendsto_snd
470+
exact φ_ψ_conj ▸ ψ_tendsto.conj_nhds_one g
471+
472+
theorem isUniformGroup_iff_left_right {γ : Type*} [Group γ] [UniformSpace γ] :
473+
IsUniformGroup γ ↔ IsLeftUniformGroup γ ∧ IsRightUniformGroup γ :=
474+
fun _ ↦ ⟨inferInstance, inferInstance⟩, fun ⟨_, _⟩ ↦ .of_left_right⟩
475+
476+
theorem eventually_forall_conj_nhds_one {p : α → Prop}
477+
(hp : ∀ᶠ x in 𝓝 1, p x) :
478+
∀ᶠ x in 𝓝 1, ∀ g, p (g * x * g⁻¹) := by
479+
simpa using tendsto_conj_nhds_one.eventually hp
480+
481+
end OfLeftAndRight
482+
403483
@[to_additive]
404484
theorem Filter.HasBasis.uniformity_of_nhds_one {ι} {p : ι → Prop} {U : ι → Set α}
405485
(h : (𝓝 (1 : α)).HasBasis p U) :

0 commit comments

Comments
 (0)