@@ -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
162162coincides 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
165166Since there are topological groups where these two uniformities do **not** coincide,
166167not 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
176177uniformity 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
179181Since there are topological groups where these two uniformities do **not** coincide,
180182not all topological groups admit a uniform group structure in this sense. This is however the
@@ -400,6 +402,84 @@ open MulOpposite
400402
401403end
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]
404484theorem Filter.HasBasis.uniformity_of_nhds_one {ι} {p : ι → Prop } {U : ι → Set α}
405485 (h : (𝓝 (1 : α)).HasBasis p U) :
0 commit comments