You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rubin-lean4/Rubin/RigidStabilizerBasis.lean

270 lines
8.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/-
This file describes [`RigidStabilizerBasis`], which are all non-trivial subgroups of `G` constructed
by finite intersections of `RigidStabilizer G (RegularSupport α g)`.
-/
import Mathlib.Topology.Basic
import Mathlib.Topology.Homeomorph
import Rubin.RegularSupport
import Rubin.RigidStabilizer
namespace Rubin
variable {G α : Type _}
variable [Group G]
variable [MulAction G α]
variable [TopologicalSpace α]
/--
Finite intersections of rigid stabilizers of regular supports
(which are equivalent to the rigid stabilizers of finite intersections of regular supports).
-/
def RigidStabilizerInter₀ {G: Type _} (α : Type _) [Group G] [MulAction G α] [TopologicalSpace α]
(S : Finset G) : Subgroup G :=
⨅ (g ∈ S), RigidStabilizer G (RegularSupport α g)
theorem RigidStabilizerInter₀.eq_sInter (S : Finset G) :
RigidStabilizerInter₀ α S = RigidStabilizer G (⋂ g ∈ S, (RegularSupport α g)) :=
by
have img_eq : ⋂ g ∈ S, RegularSupport α g = ⋂₀ ((fun g : G => RegularSupport α g) '' S) :=
by simp only [Set.sInter_image, Finset.mem_coe]
rw [img_eq]
rw [rigidStabilizer_sInter]
unfold RigidStabilizerInter₀
ext x
repeat rw [Subgroup.mem_iInf]
constructor
· intro H T
rw [Subgroup.mem_iInf]
intro T_in_img
simp at T_in_img
let ⟨g, ⟨g_in_S, T_eq⟩⟩ := T_in_img
specialize H g
rw [Subgroup.mem_iInf] at H
rw [<-T_eq]
apply H; assumption
· intro H g
rw [Subgroup.mem_iInf]
intro g_in_S
specialize H (RegularSupport α g)
rw [Subgroup.mem_iInf] at H
simp at H
apply H g <;> tauto
/--
A predecessor structure to [`RigidStabilizerBasis`], where equality is defined on the choice of
group elements who regular support's rigid stabilizer get intersected upon.
--/
structure RigidStabilizerBasis₀ (G α : Type _) [Group G] [MulAction G α] [TopologicalSpace α] where
seed : Finset G
val_ne_bot : RigidStabilizerInter₀ α seed ≠ ⊥
def RigidStabilizerBasis₀.val (B : RigidStabilizerBasis₀ G α) : Subgroup G :=
RigidStabilizerInter₀ α B.seed
theorem RigidStabilizerBasis₀.val_def (B : RigidStabilizerBasis₀ G α) : B.val = RigidStabilizerInter₀ α B.seed := rfl
/--
The set of all non-trivial subgroups of `G` constructed
by finite intersections of `RigidStabilizer G (RegularSupport α g)`.
--/
def RigidStabilizerBasis (G α : Type _) [Group G] [MulAction G α] [TopologicalSpace α] : Set (Subgroup G) :=
{ H.val | H : RigidStabilizerBasis₀ G α }
theorem RigidStabilizerBasis.mem_iff (H : Subgroup G) :
H ∈ RigidStabilizerBasis G α ↔ ∃ B : RigidStabilizerBasis₀ G α, B.val = H := by rfl
theorem RigidStabilizerBasis.mem_iff' (H : Subgroup G)
(H_ne_bot : H ≠ ⊥) :
H ∈ RigidStabilizerBasis G α ↔ ∃ seed : Finset G, RigidStabilizerInter₀ α seed = H :=
by
rw [mem_iff]
constructor
· intro ⟨B, B_eq⟩
use B.seed
rw [RigidStabilizerBasis₀.val_def] at B_eq
exact B_eq
· intro ⟨seed, seed_eq⟩
let B := RigidStabilizerInter₀ α seed
have val_ne_bot : B ≠ ⊥ := by
unfold_let
rw [seed_eq]
exact H_ne_bot
use ⟨seed, val_ne_bot⟩
rw [<-seed_eq]
rfl
def RigidStabilizerBasis.asSets (G α : Type _) [Group G] [MulAction G α] [TopologicalSpace α] : Set (Set G) :=
{ (H.val : Set G) | H : RigidStabilizerBasis₀ G α }
theorem RigidStabilizerBasis.mem_asSets_iff (S : Set G) :
S ∈ RigidStabilizerBasis.asSets G α ↔ ∃ H ∈ RigidStabilizerBasis G α, H.carrier = S :=
by
unfold asSets RigidStabilizerBasis
simp
rfl
theorem RigidStabilizerBasis.mem_iff_asSets (H : Subgroup G) :
H ∈ RigidStabilizerBasis G α ↔ (H : Set G) ∈ RigidStabilizerBasis.asSets G α :=
by
unfold asSets RigidStabilizerBasis
simp
variable [ContinuousMulAction G α]
lemma RigidStabilizerBasis.smulImage_mem₀ {H : Subgroup G} (H_in_ristBasis : H ∈ RigidStabilizerBasis G α)
(f : G) : ((fun g => f * g * f⁻¹) '' H.carrier) ∈ RigidStabilizerBasis.asSets G α :=
by
have G_decidable : DecidableEq G := Classical.decEq _
rw [mem_iff] at H_in_ristBasis
let ⟨seed, H_eq⟩ := H_in_ristBasis
rw [mem_asSets_iff]
let new_seed := Finset.image (fun g => f * g * f⁻¹) seed.seed
have new_seed_ne_bot : RigidStabilizerInter₀ α new_seed ≠ ⊥ := by
rw [RigidStabilizerInter₀.eq_sInter]
unfold_let
simp [<-regularSupport_smulImage]
rw [<-ne_eq]
rw [<-smulImage_iInter_fin]
have val_ne_bot := seed.val_ne_bot
rw [Subgroup.ne_bot_iff_exists_ne_one] at val_ne_bot
let ⟨⟨g, g_in_ristInter⟩, g_ne_one⟩ := val_ne_bot
simp at g_ne_one
have fgf_in_ristInter₂ : f * g * f⁻¹ ∈ RigidStabilizer G (f •'' ⋂ x ∈ seed.seed, RegularSupport α x) := by
rw [rigidStabilizer_smulImage]
group
rw [RigidStabilizerInter₀.eq_sInter] at g_in_ristInter
exact g_in_ristInter
have fgf_ne_one : f * g * f⁻¹ ≠ 1 := by
intro h₁
have h₂ := congr_arg (fun x => x * f) h₁
group at h₂
have h₃ := congr_arg (fun x => f⁻¹ * x) h₂
group at h₃
exact g_ne_one h₃
rw [Subgroup.ne_bot_iff_exists_ne_one]
use ⟨f * g * f⁻¹, fgf_in_ristInter₂⟩
simp
rw [<-ne_eq]
exact fgf_ne_one
use RigidStabilizerInter₀ α new_seed
apply And.intro
exact ⟨⟨new_seed, new_seed_ne_bot⟩, rfl⟩
rw [RigidStabilizerInter₀.eq_sInter]
unfold_let
simp [<-regularSupport_smulImage]
rw [<-smulImage_iInter_fin]
ext x
simp only [Subsemigroup.mem_carrier, Submonoid.mem_toSubsemigroup,
Subgroup.mem_toSubmonoid, Set.mem_image]
rw [rigidStabilizer_smulImage]
rw [<-H_eq, RigidStabilizerBasis₀.val_def, RigidStabilizerInter₀.eq_sInter]
constructor
· intro fxf_mem
use f⁻¹ * x * f
constructor
· exact fxf_mem
· group
· intro ⟨y, ⟨y_in_H, y_conj⟩⟩
rw [<-y_conj]
group
exact y_in_H
def RigidStabilizerBasisMul (G α : Type _) [Group G] [MulAction G α] [TopologicalSpace α]
[ContinuousMulAction G α] (f : G) (H : Subgroup G)
: Subgroup G
where
carrier := (fun g => f * g * f⁻¹) '' H.carrier
mul_mem' := by
intro a b a_mem b_mem
simp at a_mem
simp at b_mem
let ⟨a', a'_in_H, a'_eq⟩ := a_mem
let ⟨b', b'_in_H, b'_eq⟩ := b_mem
use a' * b'
constructor
· apply Subsemigroup.mul_mem' <;> simp <;> assumption
· simp
rw [<-a'_eq, <-b'_eq]
group
one_mem' := by
simp
use 1
constructor
exact Subgroup.one_mem H
group
inv_mem' := by
simp
intro g g_in_H
use g⁻¹
constructor
exact Subgroup.inv_mem H g_in_H
rw [mul_assoc]
theorem RigidStabilizerBasisMul_mem (f : G) {H : Subgroup G} (H_in_basis : H ∈ RigidStabilizerBasis G α)
: RigidStabilizerBasisMul G α f H ∈ RigidStabilizerBasis G α :=
by
rw [RigidStabilizerBasis.mem_iff_asSets]
unfold RigidStabilizerBasisMul
simp
apply RigidStabilizerBasis.smulImage_mem₀
assumption
instance rigidStabilizerBasis_smul : SMul G (RigidStabilizerBasis G α) where
smul := fun g H => ⟨
RigidStabilizerBasisMul G α g H.val,
RigidStabilizerBasisMul_mem g H.prop
theorem RigidStabilizerBasis.smul_eq (g : G) {H: Subgroup G} (H_in_basis : H ∈ RigidStabilizerBasis G α) :
g • (⟨H, H_in_basis⟩ : RigidStabilizerBasis G α) = ⟨
RigidStabilizerBasisMul G α g H,
RigidStabilizerBasisMul_mem g H_in_basis
⟩ := rfl
theorem RigidStabilizerBasis.mem_smul (f g : G) {H: Subgroup G} (H_in_basis : H ∈ RigidStabilizerBasis G α):
f ∈ (g • (⟨H, H_in_basis⟩ : RigidStabilizerBasis G α)).val ↔ g⁻¹ * f * g ∈ H :=
by
rw [RigidStabilizerBasis.smul_eq]
simp
rw [<-Subgroup.mem_carrier]
unfold RigidStabilizerBasisMul
simp
constructor
· intro ⟨x, x_in_H, f_eq⟩
rw [<-f_eq]
group
exact x_in_H
· intro gfg_in_H
use g⁻¹ * f * g
constructor
assumption
group
instance rigidStabilizerBasis_mulAction : MulAction G (RigidStabilizerBasis G α) where
one_smul := by
intro ⟨H, H_in_ristBasis⟩
ext x
rw [RigidStabilizerBasis.mem_smul]
group
mul_smul := by
intro f g ⟨B, B_in_ristBasis⟩
ext x
repeat rw [RigidStabilizerBasis.mem_smul]
group
end Rubin