Skip to content

Commit 490e8bc

Browse files
kim-emclaude
andcommitted
feat: auxiliary lemmas for Artin and braid groups
Add small lemmas to existing files, in preparation for the Artin groups and braid groups PRs: - `Commute.mul_pow_eq_one`: for commuting elements with `a ^ m = 1` and `b ^ m = 1` - `Equiv.Perm.swap_conjugate`: braid relation for adjacent transpositions - `Equiv.Perm.swap_mul_swap_comm_of_disjoint`: disjoint transpositions commute - `@[grind =]` attributes on `Perm.mul_apply`, `Perm.one_apply` - `Perm.pow_add_one_apply` - `Subgroup.normalClosure_singleton_one` - `FreeGroup.ofList` and associated lemmas - `FreeGroup.freeGroupUnitMulEquivInt` - `PresentedGroup.instUniqueOfIsEmpty` - `CoxeterMatrix.Aₙ_adjacent`, `CoxeterMatrix.Aₙ_far` Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 6eec119 commit 490e8bc

6 files changed

Lines changed: 86 additions & 0 deletions

File tree

Mathlib/Algebra/Group/Commute/Defs.lean

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,13 @@ theorem pow_pow_self (a : M) (m n : ℕ) : Commute (a ^ m) (a ^ n) :=
164164
| 0 => by rw [pow_zero, pow_zero, pow_zero, one_mul]
165165
| n + 1 => by simp only [pow_succ', h.mul_pow n, ← mul_assoc, (h.pow_left n).right_comm]
166166

167+
/-- For commuting elements satisfying `a ^ m = 1` and `b ^ m = 1`, we have `(a * b) ^ m = 1`. -/
168+
@[to_additive /-- For commuting elements satisfying `m • a = 0` and `m • b = 0`,
169+
we have `m • (a + b) = 0`. -/]
170+
theorem mul_pow_eq_one (h : Commute a b) {m : ℕ} (ha : a ^ m = 1) (hb : b ^ m = 1) :
171+
(a * b) ^ m = 1 := by
172+
rw [h.mul_pow, ha, hb, one_mul]
173+
167174
end Monoid
168175

169176
section DivisionMonoid

Mathlib/Algebra/Group/End.lean

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,27 @@ def equivUnitsEnd : Perm α ≃* Units (Function.End α) where
9898
def _root_.MonoidHom.toHomPerm {G : Type*} [Group G] (f : G →* Function.End α) : G →* Perm α :=
9999
equivUnitsEnd.symm.toMonoidHom.comp f.toHomUnits
100100

101+
@[grind =]
101102
theorem mul_apply (f g : Perm α) (x) : (f * g) x = f (g x) :=
102103
rfl
103104

105+
@[grind =]
104106
theorem one_apply (x) : (1 : Perm α) x = x :=
105107
rfl
106108

109+
@[grind =]
110+
theorem pow_add_one_apply (f : Perm α) (n : ℕ) (x : α) :
111+
(f ^ (n + 1)) x = (f^n) (f x) := by
112+
rfl
113+
114+
@[deprecated symm_apply_apply (since := "2025-08-16")]
115+
theorem inv_apply_self (f : Perm α) (x) : f⁻¹ (f x) = x :=
116+
f.symm_apply_apply x
117+
118+
@[deprecated apply_symm_apply (since := "2025-08-16")]
119+
theorem apply_inv_self (f : Perm α) (x) : f (f⁻¹ x) = x :=
120+
f.apply_symm_apply x
121+
107122
theorem one_def : (1 : Perm α) = Equiv.refl α :=
108123
rfl
109124

@@ -575,6 +590,19 @@ theorem swap_mul_swap_mul_swap {x y z : α} (hxy : x ≠ y) (hxz : x ≠ z) :
575590
nth_rewrite 3 [← swap_inv]
576591
rw [← swap_apply_apply, swap_apply_left, swap_apply_of_ne_of_ne hxy hxz, swap_comm]
577592

593+
/-- Conjugating `swap b c` by `swap a b` equals conjugating `swap a b` by `swap b c`.
594+
This is also known as the braid relation for adjacent transpositions. -/
595+
theorem swap_conjugate {a b c : α} (hab : a ≠ b) (hbc : b ≠ c) :
596+
swap a b * swap b c * swap a b = swap b c * swap a b * swap b c := by
597+
grind
598+
599+
/-- Disjoint transpositions commute: if `{a, b}` and `{c, d}` are disjoint,
600+
then `swap a b` and `swap c d` commute. -/
601+
theorem swap_mul_swap_comm_of_disjoint {a b c d : α}
602+
(hac : a ≠ c) (had : a ≠ d) (hbc : b ≠ c) (hbd : b ≠ d) :
603+
swap a b * swap c d = swap c d * swap a b := by
604+
grind
605+
578606
end Swap
579607

580608
section Group

Mathlib/Algebra/Group/Subgroup/Basic.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,10 @@ theorem normalClosure_closure_eq_normalClosure {s : Set G} :
550550
lemma normalClosure_empty : normalClosure (∅ : Set G) = (⊥ : Subgroup G) := by
551551
rw [← normalClosure_closure_eq_normalClosure, closure_empty, normalClosure_eq_self]
552552

553+
@[simp]
554+
theorem normalClosure_singleton_one : normalClosure ({1} : Set G) = ⊥ :=
555+
le_antisymm (normalClosure_le_normal (by simp)) bot_le
556+
553557
/-- The normal core of a subgroup `H` is the largest normal subgroup of `G` contained in `H`,
554558
as shown by `Subgroup.normalCore_eq_iSup`. -/
555559
@[to_additive /-- The normal core of an additive subgroup `H` is the largest normal additive

Mathlib/GroupTheory/Coxeter/Matrix.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,16 @@ protected def A : CoxeterMatrix (Fin n) where
114114

115115
@[deprecated (since := "2026-03-25")] alias Aₙ := CoxeterMatrix.A
116116

117+
theorem Aₙ_adjacent (n : ℕ) (i j : Fin n) (h : (i : ℕ) + 1 = j ∨ (j : ℕ) + 1 = i) :
118+
(Aₙ n) i j = 3 := by
119+
simp only [Aₙ, Fin.ext_iff, Matrix.of_apply]
120+
grind
121+
122+
theorem Aₙ_far (n : ℕ) (i j : Fin n) (h1 : i ≠ j) (h2 : (i : ℕ) + 1 ≠ j)
123+
(h3 : (j : ℕ) + 1 ≠ i) : (Aₙ n) i j = 2 := by
124+
simp only [Aₙ, Matrix.of_apply]
125+
grind
126+
117127
/-- The Coxeter matrix of type Bₙ.
118128
119129
The corresponding Coxeter-Dynkin diagram is:

Mathlib/GroupTheory/FreeGroup/Basic.lean

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -908,6 +908,35 @@ theorem sum.map_inv : sum x⁻¹ = -sum x :=
908908

909909
end Sum
910910

911+
section OfList
912+
913+
variable {α : Type*}
914+
915+
/-- Convert a list of generators to an element of the free group by taking the product of `of`
916+
applied to each element. -/
917+
@[to_additive /-- Convert a list of generators to an element of the additive free group by taking
918+
the sum of `of` applied to each element. -/]
919+
def ofList (l : List α) : FreeGroup α := (l.map of).prod
920+
921+
@[to_additive (attr := simp)]
922+
theorem ofList_nil : ofList ([] : List α) = 1 := rfl
923+
924+
@[to_additive (attr := simp)]
925+
theorem ofList_singleton (x : α) : ofList [x] = of x := by simp [ofList]
926+
927+
@[to_additive]
928+
theorem ofList_cons (x : α) (l : List α) : ofList (x :: l) = of x * ofList l := by simp [ofList]
929+
930+
@[to_additive]
931+
theorem ofList_concat (l : List α) (x : α) : ofList (l.concat x) = ofList l * of x := by
932+
simp [ofList]
933+
934+
@[to_additive]
935+
theorem ofList_append (l₁ l₂ : List α) : ofList (l₁ ++ l₂) = ofList l₁ * ofList l₂ := by
936+
simp [ofList]
937+
938+
end OfList
939+
911940
/-- The bijection between the free group on the empty type, and a type with one element. -/
912941
@[to_additive
913942
(attr := deprecated "Use `Equiv.ofUnique (FreeGroup Empty) Unit` instead,

Mathlib/GroupTheory/PresentedGroup.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,4 +163,12 @@ end ToGroup
163163
instance (rels : Set (FreeGroup α)) : Inhabited (PresentedGroup rels) :=
164164
1
165165

166+
/-- A presented group with no generators is trivial. -/
167+
instance instUniqueOfIsEmpty [IsEmpty α] (rels : Set (FreeGroup α)) :
168+
Unique (PresentedGroup rels) where
169+
default := 1
170+
uniq x := by
171+
induction x using PresentedGroup.induction_on with
172+
| _ z => exact congrArg _ (Unique.eq_default z)
173+
166174
end PresentedGroup

0 commit comments

Comments
 (0)