FenchelNielsenZomorrodian.Discrete.CompactFuchsian.FirstReduction.QuotientAndBasis

23 Theorem | 8 Definition | 1 Abbreviation

This module sets up the finite-stage and inverse-limit description of the construction. It records the stage maps, projections, and comparison lemmas used to pass back to the completed object.

import
Imported by

Declarations

noncomputable def firstReductionCanonicalSourceQuotientImage
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    (let σ :=
      firstReductionCanonicalSourceSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
     Fin σ.numPeriods → Multiplicative (ZMod p)) :=
  fun i =>
    if i.val = 0 then Multiplicative.ofAdd (1 : ZMod p)
    else if i.val = 1 then Multiplicative.ofAdd (-1 : ZMod p)
    else 1

Generator images for the first-reduction canonical source quotient.

theorem firstReductionCanonicalSourceQuotientImage_pow
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    let σ

The first-reduction source quotient image satisfies the prescribed power relation.

Show proof
theorem firstReductionCanonicalSourceQuotientImage_prod
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    let σ

The first-reduction source quotient image satisfies the prescribed product relation.

Show proof
noncomputable def firstReductionCanonicalSourceFreeQuotientHom
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    let σ :=
      firstReductionCanonicalSourceSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
    FreeGroup (FuchsianGenerator σ) →* Multiplicative (ZMod p) := by
  classical
  dsimp
  let σ :=
    firstReductionCanonicalSourceSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  exact
    FreeGroup.lift
      (ellipticQuotientGeneratorImage σ
        (firstReductionCanonicalSourceQuotientImage
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen))

The free-group homomorphism underlying the canonical first-reduction cyclic quotient.

@[simp 900] theorem firstReductionCanonicalSourceFreeQuotientHom_firstGenerator
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    firstReductionCanonicalSourceFreeQuotientHom
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
        (FreeGroup.of
          (FuchsianGenerator.elliptic
            (firstReductionCanonicalSourceZeroIndex
              m₁' m₂' tail hp hm₁' hm₂' htail hTailLen))) =
      Multiplicative.ofAdd (1 : ZMod p)

The canonical first-reduction source quotient homomorphism sends the distinguished generator to the standard generator of \(\mathrm{ZMod}\,p\).

Show proof
theorem firstReductionCanonicalSourceFreeQuotientHom_respects_relators
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    let σ

The canonical first-reduction source free quotient homomorphism sends every defining relator to the identity.

Show proof
noncomputable abbrev firstReductionCanonicalDistinguishedGenerator
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    FuchsianGenerator
      (firstReductionCanonicalSourceSignature
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen) :=
  FuchsianGenerator.elliptic
    (firstReductionCanonicalSourceZeroIndex
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen)

The distinguished generator used in the first-reduction canonical quotient.

noncomputable def firstReductionCanonicalSchreierTransversal
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
    let σ :=
      firstReductionCanonicalSourceSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
    Set (FreeGroup (FuchsianGenerator σ)) := by
  classical
  dsimp
  letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
  let σ :=
    firstReductionCanonicalSourceSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let φ :=
    firstReductionCanonicalSourceFreeQuotientHom
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let x : FuchsianGenerator σ :=
    firstReductionCanonicalDistinguishedGenerator
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  exact Set.range (cyclicQuotientRightRep φ (FreeGroup.of x))

The chosen Schreier representative is compatible with the quotient class and the induced right-coset action.

theorem firstReductionCanonicalSchreierTransversal_isRightSchreierTransversal
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    letI : NeZero p

The first-reduction canonical Schreier transversal is a right Schreier transversal.

Show proof
noncomputable def firstReductionCanonicalSchreierBasisEquiv
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
    let σ :=
      firstReductionCanonicalSourceSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
    letI : DecidableEq (FuchsianGenerator σ) := Classical.decEq _
    let φ :=
      firstReductionCanonicalSourceFreeQuotientHom
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
    let hT :=
      firstReductionCanonicalSchreierTransversal_isRightSchreierTransversal
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
    FreeGroup ↥(schreierGeneratorSet hT) ≃* φ.ker := by
  classical
  dsimp
  letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
  let σ :=
    firstReductionCanonicalSourceSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  letI : DecidableEq (FuchsianGenerator σ) := Classical.decEq _
  let φ :=
    firstReductionCanonicalSourceFreeQuotientHom
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let x : FuchsianGenerator σ :=
    firstReductionCanonicalDistinguishedGenerator
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  have hx : φ (FreeGroup.of x) = Multiplicative.ofAdd (1 : ZMod p) := by
    simp only [Lean.Elab.WF.paramLet, firstReductionCanonicalDistinguishedGenerator,
  firstReductionCanonicalSourceFreeQuotientHom_firstGenerator m₁' m₂' tail hp hm₁' hm₂' htail hTailLen, φ, x]
  simpa [firstReductionCanonicalSchreierTransversal, σ, φ, x] using
    freeGroupKernelSchreierBasisEquivOfCyclicQuotientGenerator φ x hx

The canonical first-reduction Schreier generator set gives a multiplicative equivalence from its free group to the kernel of the cyclic quotient homomorphism.

@[simp 900] theorem firstReductionCanonicalSchreierBasisEquiv_symm_apply
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    letI : NeZero p

The inverse Fenchel--Nielsen--Zomorrodian comparison is evaluated by the coordinate expression determined by the chosen Schreier basis.

Show proof
noncomputable def firstReductionCanonicalFirstPowerKernel
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
    let φ :=
      firstReductionCanonicalSourceFreeQuotientHom
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
    φ.ker := by
  classical
  dsimp
  letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
  let σ :=
    firstReductionCanonicalSourceSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let φ :=
    firstReductionCanonicalSourceFreeQuotientHom
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let x : FuchsianGenerator σ :=
    firstReductionCanonicalDistinguishedGenerator
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  refine ⟨(FreeGroup.of x) ^ p, ?_⟩
  rw [MonoidHom.mem_ker, map_pow]
  have hx : φ (FreeGroup.of x) = Multiplicative.ofAdd (1 : ZMod p) := by
    simp only [Lean.Elab.WF.paramLet, firstReductionCanonicalDistinguishedGenerator,
  firstReductionCanonicalSourceFreeQuotientHom_firstGenerator m₁' m₂' tail hp hm₁' hm₂' htail hTailLen, φ, x]
  rw [hx]
  apply (Multiplicative.toAdd : Multiplicative (ZMod p) ≃ ZMod p).injective
  simp only [toAdd_pow, toAdd_ofAdd, nsmul_eq_mul, CharP.cast_eq_zero, mul_one, toAdd_one]

The first-power kernel element in the first-reduction Schreier presentation is represented by the displayed canonical presentation element.

theorem firstReductionCanonicalFirstPowerKernel_coe
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    letI : NeZero p

The first-power kernel element in the first-reduction Schreier presentation is represented by the displayed canonical presentation element.

Show proof
noncomputable def firstReductionCanonicalSecondPowerKernel
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
    let φ :=
      firstReductionCanonicalSourceFreeQuotientHom
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
    φ.ker := by
  classical
  dsimp
  letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
  let σ :=
    firstReductionCanonicalSourceSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let φ :=
    firstReductionCanonicalSourceFreeQuotientHom
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let y : FuchsianGenerator σ :=
    FuchsianGenerator.elliptic
      (firstReductionCanonicalSourceOneIndex
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen)
  refine ⟨(FreeGroup.of y) ^ p, ?_⟩
  rw [MonoidHom.mem_ker, map_pow]
  have hy : φ (FreeGroup.of y) = Multiplicative.ofAdd (-1 : ZMod p) := by
    simp only [Lean.Elab.WF.paramLet, firstReductionCanonicalSourceFreeQuotientHom, id_eq,
  firstReductionCanonicalSourceOneIndex, FreeGroup.lift_apply_of, ellipticQuotientGeneratorImage,
  firstReductionCanonicalSourceQuotientImage, one_ne_zero, ↓reduceIte, ofAdd_neg, φ, y]
  rw [hy]
  apply (Multiplicative.toAdd : Multiplicative (ZMod p) ≃ ZMod p).injective
  simp only [ofAdd_neg, inv_pow, toAdd_inv, toAdd_pow, toAdd_ofAdd, nsmul_eq_mul, CharP.cast_eq_zero, mul_one,
  neg_zero, toAdd_one]

The second-power kernel element in the first-reduction Schreier presentation is represented by the displayed canonical presentation element.

noncomputable def firstReductionCanonicalSecondEdgeKernelElement
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (k : Fin p) :
    letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
    let φ :=
      firstReductionCanonicalSourceFreeQuotientHom
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
    φ.ker := by
  classical
  dsimp
  letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
  let σ :=
    firstReductionCanonicalSourceSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let φ :=
    firstReductionCanonicalSourceFreeQuotientHom
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let x : FuchsianGenerator σ :=
    firstReductionCanonicalDistinguishedGenerator
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let y : FuchsianGenerator σ :=
    FuchsianGenerator.elliptic
      (firstReductionCanonicalSourceOneIndex
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen)
  let r : ℕ := ((k.val : ZMod p) - 1).val
  refine ⟨(FreeGroup.of x) ^ k.val * FreeGroup.of y * ((FreeGroup.of x) ^ r)⁻¹, ?_⟩
  have hx : φ (FreeGroup.of x) = Multiplicative.ofAdd (1 : ZMod p) := by
    simp only [Lean.Elab.WF.paramLet, firstReductionCanonicalDistinguishedGenerator,
  firstReductionCanonicalSourceFreeQuotientHom_firstGenerator m₁' m₂' tail hp hm₁' hm₂' htail hTailLen, φ, x]
  have hy : φ (FreeGroup.of y) = Multiplicative.ofAdd (-1 : ZMod p) := by
    simp only [Lean.Elab.WF.paramLet, firstReductionCanonicalSourceFreeQuotientHom, id_eq,
  firstReductionCanonicalSourceOneIndex, FreeGroup.lift_apply_of, ellipticQuotientGeneratorImage,
  firstReductionCanonicalSourceQuotientImage, one_ne_zero, ↓reduceIte, ofAdd_neg, φ, y]
  rw [MonoidHom.mem_ker]
  rw [map_mul, map_inv, map_mul, map_pow, map_pow, hx, hy]
  apply (Multiplicative.toAdd : Multiplicative (ZMod p) ≃ ZMod p).injective
  simp only [ofAdd_neg, toAdd_mul, toAdd_pow, toAdd_ofAdd, nsmul_eq_mul, mul_one, toAdd_inv, ZMod.natCast_val,
  dvd_refl, ZMod.cast_sub, ZMod.cast_natCast, ZMod.cast_one, neg_sub, toAdd_one, r]
  ring

The first-reduction second-edge kernel element attached to an index.

theorem firstReductionCanonicalSecondEdgeKernelElement_zero_coe
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    letI : NeZero p

The zero first-reduction second-edge kernel element has the displayed representative.

Show proof
theorem firstReductionCanonicalSecondEdgeKernelElement_descending_coe
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (i : Fin (p - 1)) :
    letI : NeZero p

The descending representative of the first-reduction second-edge kernel element is the displayed group element.

Show proof
theorem firstReductionCanonicalSecondEdgeKernelElement_succ_coe
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (k : Fin (p - 1)) :
    letI : NeZero p

The successor first-reduction second-edge kernel element has the displayed representative.

Show proof
theorem firstReductionCanonicalSecondDescendingNamedCycle_eq_secondPowerKernel
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    letI : NeZero p

The descending product of the named second-edge kernel elements equals the first-reduction canonical second power-kernel element.

Show proof
theorem firstReductionCanonicalSecondDescendingNamedCycle_schreierWord_eq_secondPower
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    letI : NeZero p

Evaluating the first-reduction Schreier word through the chosen transversal gives the prescribed target word.

Show proof
noncomputable def firstReductionCanonicalTailKernelElement
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (j : Fin tailLen) (k : Fin p) :
    letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
    let φ :=
      firstReductionCanonicalSourceFreeQuotientHom
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
    φ.ker := by
  classical
  dsimp
  letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
  let σ :=
    firstReductionCanonicalSourceSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let φ :=
    firstReductionCanonicalSourceFreeQuotientHom
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let x : FuchsianGenerator σ :=
    firstReductionCanonicalDistinguishedGenerator
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let tailGen : Fin tailLen → FuchsianGenerator σ := fun j =>
    FuchsianGenerator.elliptic
      (firstReductionCanonicalSourceTailIndex
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen j)
  refine
    ⟨(FreeGroup.of x) ^ k.val * FreeGroup.of (tailGen j) *
        ((FreeGroup.of x) ^ k.val)⁻¹, ?_⟩
  have hx : φ (FreeGroup.of x) = Multiplicative.ofAdd (1 : ZMod p) := by
    simp only [Lean.Elab.WF.paramLet, firstReductionCanonicalDistinguishedGenerator,
  firstReductionCanonicalSourceFreeQuotientHom_firstGenerator m₁' m₂' tail hp hm₁' hm₂' htail hTailLen, φ, x]
  have htailMap : φ (FreeGroup.of (tailGen j)) = 1 := by
    change
      firstReductionCanonicalSourceFreeQuotientHom
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
          (FreeGroup.of
            (FuchsianGenerator.elliptic
              (firstReductionCanonicalSourceTailIndex
                m₁' m₂' tail hp hm₁' hm₂' htail hTailLen j))) = 1
    simp only [Lean.Elab.WF.paramLet, firstReductionCanonicalSourceFreeQuotientHom, id_eq,
  firstReductionCanonicalSourceTailIndex, FreeGroup.lift_apply_of, ellipticQuotientGeneratorImage,
  firstReductionCanonicalSourceQuotientImage, Nat.add_eq_zero_iff, OfNat.ofNat_ne_zero, false_and, ↓reduceIte,
  ofAdd_neg, ite_eq_right_iff, inv_eq_one, ofAdd_eq_one]
    omega
  rw [MonoidHom.mem_ker]
  change
    φ ((FreeGroup.of x) ^ k.val * FreeGroup.of (tailGen j) *
      ((FreeGroup.of x) ^ k.val)⁻¹) = 1
  simp only [Lean.Elab.WF.paramLet, map_mul, map_pow, hx, htailMap, mul_one, map_inv, mul_inv_cancel]

The tail kernel element in the first-reduction Schreier presentation is represented by the displayed canonical presentation element.

private theorem firstReductionCanonical_distinguished_schreierGenerator_eq_one_of_succ_lt
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    {k : ℕ} (hk : k + 1 < p) :
    letI : NeZero p

Evaluating the first-reduction Schreier word through the chosen transversal gives the prescribed target word.

Show proof
private theorem firstReductionCanonical_distinguished_schreierGenerator_wrap_eq
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    letI : NeZero p

Evaluating the first-reduction Schreier word through the chosen transversal gives the prescribed target word.

Show proof
theorem firstReductionCanonicalFirstPowerKernel_mem_schreierGeneratorSet
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    letI : NeZero p

The first-power kernel element is a Schreier generator in the canonical first-reduction Schreier generator set.

Show proof
private theorem firstReductionCanonical_second_schreierGenerator_eq
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (k : Fin p) :
    letI : NeZero p

Evaluating the first-reduction Schreier word through the chosen transversal gives the prescribed target word.

Show proof
theorem firstReductionCanonicalSecondEdgeKernelElement_mem_schreierGeneratorSet
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (k : Fin p) :
    letI : NeZero p

The second-edge kernel element is a Schreier generator in the canonical first-reduction Schreier generator set.

Show proof
theorem firstReductionCanonicalSecondEdgeKernelElement_inj
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    {k₁ k₂ : Fin p}
    (hEq :
      firstReductionCanonicalSecondEdgeKernelElement
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen k₁ =
        firstReductionCanonicalSecondEdgeKernelElement
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen k₂) :
    k₁ = k₂

The first-reduction second-edge kernel-element constructor is injective.

Show proof
private theorem firstReductionCanonical_tail_schreierGenerator_eq
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (j : Fin tailLen) (k : Fin p) :
    letI : NeZero p

Evaluating the first-reduction Schreier word through the chosen transversal gives the prescribed target word.

Show proof
theorem firstReductionCanonicalTailKernelElement_coe
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (j : Fin tailLen) (k : Fin p) :
    letI : NeZero p

The tail kernel element in the first-reduction Schreier presentation is represented by the displayed canonical presentation element.

Show proof
theorem firstReductionCanonicalTailKernelElement_inj
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    {j₁ j₂ : Fin tailLen} {k₁ k₂ : Fin p}
    (hEq :
      firstReductionCanonicalTailKernelElement
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen j₁ k₁ =
        firstReductionCanonicalTailKernelElement
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen j₂ k₂) :
    j₁ = j₂ ∧ k₁ = k₂

The injective comparison identifies the tail kernel element with its canonical first-reduction representative.

Show proof
theorem firstReductionCanonicalTailKernelElement_mem_schreierGeneratorSet
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (j : Fin tailLen) (k : Fin p) :
    letI : NeZero p

Each tail kernel element is a Schreier generator in the canonical first-reduction Schreier generator set.

Show proof
theorem firstReductionCanonical_schreierGeneratorSet_cases
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    letI : NeZero p

Case split for the first-reduction canonical Schreier generator set.

Show proof