ProCGroups.ReidemeisterSchreier.Schreier
This module formalizes Schreier generators and rewriting.
import
- Mathlib.Data.Nat.Basic
Definition
ReidemeisterSchreier.Schreier.rankTransform
def rankTransform (r i : ℕ) : ℕ :=
if r = 0 then 0 else 1 + i * (r - 1)The Schreier rank transform \(T(r,i)=1+i(r-1)\), with the rank-zero convention.
@[simp] theorem rankTransform_zero_left (i : ℕ) : rankTransform 0 i = 0Schreier's rank transform satisfies the displayed cardinal-arithmetic identity.
Show Lean proof
by
simp only [rankTransform, ↓reduceIte]
@[simp] theorem rankTransform_succ (r i : ℕ) : rankTransform (r + 1) i = 1 + i * rSchreier's rank transform satisfies the displayed cardinal-arithmetic identity.
Show Lean proof
by
simp only [rankTransform, Nat.add_eq_zero_iff, Nat.succ_ne_self, and_false, ↓reduceIte,
Nat.add_one_sub_one]
@[simp] theorem rankTransform_one_left (i : ℕ) : rankTransform 1 i = 1Schreier's rank transform satisfies the displayed cardinal-arithmetic identity.
Show Lean proof
by
simp only [rankTransform, Nat.succ_ne_self, ↓reduceIte, Nat.sub_self, Nat.mul_zero, Nat.add_zero]
theorem rankTransform_eq_one_add {r i : ℕ} (hr : r ≠ 0) :
rankTransform r i = 1 + i * (r - 1)For nonzero \(r\), the Schreier rank transform is \(1+i(r-1)\).
Show Lean proof
by
simp only [rankTransform, hr, ↓reduceIte]
theorem rankTransform_mul_index (r i j : ℕ) :
rankTransform (rankTransform r i) j = rankTransform r (i * j)Multiplying subgroup indices composes the Schreier rank transform.
Show Lean proof
by
cases r with
| zero =>
simp only [rankTransform, ↓reduceIte]
| succ r =>
simp only [rankTransform, Nat.add_eq_zero_iff, Nat.succ_ne_self, and_false, ↓reduceIte,
Nat.add_one_sub_one, false_and, Nat.add_sub_cancel_left, Nat.mul_left_comm, Nat.mul_comm]
theorem rankTransform_mono_left {r s i : ℕ} (hrs : r ≤ s) :
rankTransform r i ≤ rankTransform s iThe Schreier rank transform is monotone in the rank variable.
Show Lean proof
by
cases s with
| zero =>
have hr : r = 0 := Nat.eq_zero_of_le_zero hrs
subst hr
simp only [rankTransform_zero_left, le_refl]
| succ s =>
cases r with
| zero =>
simp only [rankTransform_zero_left, rankTransform_succ, Nat.zero_le]
| succ r =>
simpa only [rankTransform_succ] using
Nat.add_le_add_left (Nat.mul_le_mul_left i (Nat.succ_le_succ_iff.mp hrs)) 1