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

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.

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