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

84 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.GroupAction.Basic
namespace Rubin
variable {G α β : Type _} [Group G]
variable [MulAction G α]
theorem smul_congr (g : G) {x y : α} (h : x = y) : g • x = g • y :=
congr_arg ((· • ·) g) h
#align smul_congr Rubin.smul_congr
theorem smul_eq_iff_inv_smul_eq {x : α} {g : G} : g • x = x ↔ g⁻¹ • x = x :=
⟨fun h => (smul_congr g⁻¹ h).symm.trans (inv_smul_smul g x), fun h =>
(smul_congr g h).symm.trans (smul_inv_smul g x)⟩
#align smul_eq_iff_inv_smul_eq Rubin.smul_eq_iff_inv_smul_eq
theorem smul_pow_eq_of_smul_eq {x : α} {g : G} (n : ) :
g • x = x → g ^ n • x = x := by
induction n with
| zero => simp only [pow_zero, one_smul, eq_self_iff_true, imp_true_iff]
| succ n n_ih =>
intro h
nth_rw 2 [← (smul_congr g (n_ih h)).trans h]
rw [← mul_smul, ← pow_succ]
#align smul_pow_eq_of_smul_eq Rubin.smul_pow_eq_of_smul_eq
theorem smul_zpow_eq_of_smul_eq {x : α} {g : G} (n : ) :
g • x = x → g ^ n • x = x := by
intro h
cases n with
| ofNat n => let res := smul_pow_eq_of_smul_eq n h; simp; exact res
| negSucc n =>
let res :=
smul_eq_iff_inv_smul_eq.mp (smul_pow_eq_of_smul_eq (1 + n) h);
simp
rw [add_comm]
exact res
#align smul_zpow_eq_of_smul_eq Rubin.smul_zpow_eq_of_smul_eq
-- TODO: turn this into a structure?
def is_equivariant (G : Type _) {β : Type _} [Group G] [MulAction G α]
[MulAction G β] (f : α → β) :=
∀ g : G, ∀ x : α, f (g • x) = g • f x
#align is_equivariant Rubin.is_equivariant
lemma disjoint_not_mem {α : Type _} {U V : Set α} (disj: Disjoint U V) :
∀ {x : α}, x ∈ U → x ∉ V :=
by
intro x x_in_U x_in_V
apply disj <;> try simp
· exact Set.singleton_subset_iff.mpr x_in_U
· rw [Set.singleton_subset_iff]
exact x_in_V
· rfl
lemma disjoint_not_mem₂ {α : Type _} {U V : Set α} (disj: Disjoint U V) :
∀ {x : α}, x ∈ V → x ∉ U := disjoint_not_mem disj.symm
lemma fixes_inv {G α : Type _} [Group G] [MulAction G α] {g : G} {x : α}:
g • x = x ↔ g⁻¹ • x = x :=
by
constructor
{
intro h
nth_rw 1 [<-h]
rw [<-mul_smul, mul_left_inv, one_smul]
}
{
intro h
nth_rw 1 [<-h]
rw [<-mul_smul, mul_right_inv, one_smul]
}
lemma exists_smul_ne {G : Type _} (α : Type _) [Group G] [MulAction G α] [h_f : FaithfulSMul G α]
{f g : G} (f_ne_g : f ≠ g) : ∃ (x : α), f • x ≠ g • x :=
by
by_contra h
rw [Classical.not_exists_not] at h
apply f_ne_g
apply h_f.eq_of_smul_eq_smul
exact h
end Rubin