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/FaithfulAction.lean

78 lines
2.5 KiB

import Mathlib.GroupTheory.Commutator
import Mathlib.GroupTheory.GroupAction.Basic
import Rubin.Tactic
import Rubin.Support
import Rubin.RigidStabilizer
namespace Rubin
variable {G α: Type _}
variable [Group G]
variable [MulAction G α] [FaithfulSMul G α]
theorem faithful_moves_point {g : G} (h2 : ∀ x : α, g • x = x) : g = 1 := by
have h3 : ∀ x : α, g • x = (1 : G) • x := by group_action; apply h2
exact eq_of_smul_eq_smul h3
#align faithful_moves_point Rubin.faithful_moves_point
theorem faithful_moves_point' {g : G} (α : Type _) [MulAction G α] [FaithfulSMul G α] :
g ≠ 1 → ∃ x : α, g • x ≠ x := by
intro k
apply Classical.byContradiction; intro h
rewrite [Classical.not_exists_not] at h
exact k (faithful_moves_point h)
#align faithful_moves_point' Rubin.faithful_moves_point'
theorem faithful_rigid_stabilizer_moves_point {g : G} {U : Set α} :
g ∈ RigidStabilizer G U → g ≠ 1 → ∃ x ∈ U, g • x ≠ x :=
by
intro g_rigid g_ne_one
let ⟨x, xmoved⟩ := Rubin.faithful_moves_point' α g_ne_one
exact ⟨x, rigidStabilizer_support.mp g_rigid xmoved, xmoved⟩
#align faithful_rist_moves_point Rubin.faithful_rigid_stabilizer_moves_point
theorem ne_one_support_nonempty {g : G} : g ≠ 1 → (Support α g).Nonempty :=
by
intro h1
let ⟨x, h⟩ := Rubin.faithful_moves_point' α h1
use x
exact h
#align ne_one_support_nempty Rubin.ne_one_support_nonempty
theorem disjoint_commute {f g : G} :
Disjoint (Support α f) (Support α g) → Commute f g :=
by
intro hdisjoint
rw [← commutatorElement_eq_one_iff_commute]
apply Rubin.faithful_moves_point (α := α)
intro x
rw [commutatorElement_def, mul_smul, mul_smul, mul_smul]
by_cases hffixed: (x ∈ Support α f)
{
rename _ => hfmoved
rw [
smul_eq_iff_inv_smul_eq.mp (not_mem_support.mp (Set.disjoint_left.mp hdisjoint hfmoved)),
not_mem_support.mp
(Set.disjoint_left.mp hdisjoint (inv_smul_mem_support hfmoved)),
smul_inv_smul
]
}
by_cases hgfixed: (x ∈ Support α g)
· rename _ => hgmoved
rw [smul_eq_iff_inv_smul_eq.mp
(not_mem_support.mp <|
Set.disjoint_right.mp hdisjoint (inv_smul_mem_support hgmoved)),
smul_inv_smul, not_mem_support.mp hffixed]
· rw [
smul_eq_iff_inv_smul_eq.mp (not_mem_support.mp hgfixed),
smul_eq_iff_inv_smul_eq.mp (not_mem_support.mp hffixed),
not_mem_support.mp hgfixed,
not_mem_support.mp hffixed
]
#align disjoint_commute Rubin.disjoint_commute
end Rubin