FenchelNielsenZomorrodian.Discrete.CompactFuchsian.PeriodOne.QuotientAndBasis

19 Theorem | 10 Definition

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

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

The original first-reduction canonical periods agree with the target period data.

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

The original first-reduction source total relation equals the displayed target relation.

Show proof
noncomputable def originalFirstReductionPeriodOneQuotientImage
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods) :
    (let source :=
      originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
     Fin source.numPeriods → Multiplicative (ZMod p)) :=
  fun i =>
    match e.symm i with
    | .inl h => twoPeriods (Multiplicative.ofAdd (1 : ZMod p))
        (Multiplicative.ofAdd (-1 : ZMod p)) h
    | .inr _ => 1

The quotient image map used in the original first-reduction period-one case.

theorem originalFirstReductionPeriodOneQuotientImage_pow
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods)
    (hperiods :
      let source :=
        originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
      ∀ x : OriginalFirstReductionIndex tailLen,
        source.periods (e x) =
          originalFirstReductionPeriods (p := p) m₁' m₂' tail x) :
    let source

The quotient image of the period-one distinguished generator satisfies the prescribed power relation.

Show proof
theorem originalFirstReductionPeriodOneQuotientImage_prod
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods) :
    let source

The quotient images satisfy the prescribed product relation in the period-one quotient.

Show proof
noncomputable def originalFirstReductionPeriodOneFreeQuotientHom
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods) :
    let source :=
      originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
    FreeGroup (FuchsianGenerator source) →* Multiplicative (ZMod p) := by
  classical
  dsimp
  let source :=
    originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  exact
    FreeGroup.lift
      (ellipticQuotientGeneratorImage source
        (originalFirstReductionPeriodOneQuotientImage
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e))

The free-group homomorphism underlying the period-one cyclic quotient.

theorem originalFirstReductionPeriodOneFreeQuotientHom_respects_relators
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods)
    (hperiods :
      let source :=
        originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
      ∀ x : OriginalFirstReductionIndex tailLen,
        source.periods (e x) =
          originalFirstReductionPeriods (p := p) m₁' m₂' tail x) :
    let source

The original period-one first-reduction quotient homomorphism sends every source relator to the identity in the target quotient.

Show proof
theorem originalFirstReductionPeriodOneFreeQuotientHom_head_zero
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods) :
    originalFirstReductionPeriodOneFreeQuotientHom
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
        (FreeGroup.of (FuchsianGenerator.elliptic (e (.inl (0 : Fin 2))))) =
      Multiplicative.ofAdd (1 : ZMod p)

The period-one quotient homomorphism has the prescribed value on the head-zero generator.

Show proof
theorem originalFirstReductionPeriodOneFreeQuotientHom_head_one
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods) :
    originalFirstReductionPeriodOneFreeQuotientHom
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
        (FreeGroup.of (FuchsianGenerator.elliptic (e (.inl (1 : Fin 2))))) =
      Multiplicative.ofAdd (-1 : ZMod p)

The period-one quotient homomorphism has the prescribed value on the head-one generator.

Show proof
theorem originalFirstReductionPeriodOneFreeQuotientHom_tail
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods)
    (j : Fin tailLen) :
    originalFirstReductionPeriodOneFreeQuotientHom
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
        (FreeGroup.of (FuchsianGenerator.elliptic (e (.inr j)))) = 1

The period-one quotient homomorphism has the prescribed value on each tail generator.

Show proof
noncomputable def originalFirstReductionPeriodOneDistinguishedGenerator
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods) :
    let source :=
      originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
    FuchsianGenerator source := by
  classical
  dsimp
  exact FuchsianGenerator.elliptic (e (.inl (0 : Fin 2)))

The distinguished generator in the original first-reduction period-one quotient.

noncomputable def originalFirstReductionPeriodOneSchreierTransversal
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods) :
    letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
    let source :=
      originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
    Set (FreeGroup (FuchsianGenerator source)) := by
  classical
  dsimp
  letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
  let source :=
    originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let φ :=
    originalFirstReductionPeriodOneFreeQuotientHom
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  let x : FuchsianGenerator source :=
    originalFirstReductionPeriodOneDistinguishedGenerator
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  exact Set.range (cyclicQuotientRightRep φ (FreeGroup.of x))

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

theorem originalFirstReductionPeriodOneSchreierTransversal_isRightSchreierTransversal
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods) :
    letI : NeZero p

The period-one first-reduction Schreier transversal is a right Schreier transversal.

Show proof
noncomputable def originalFirstReductionPeriodOneSchreierBasisEquiv
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods) :
    letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
    let source :=
      originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
    letI : DecidableEq (FuchsianGenerator source) := Classical.decEq _
    let φ :=
      originalFirstReductionPeriodOneFreeQuotientHom
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
    let hT :=
      originalFirstReductionPeriodOneSchreierTransversal_isRightSchreierTransversal
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
    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 source :=
    originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  letI : DecidableEq (FuchsianGenerator source) := Classical.decEq _
  let φ :=
    originalFirstReductionPeriodOneFreeQuotientHom
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  let x : FuchsianGenerator source :=
    originalFirstReductionPeriodOneDistinguishedGenerator
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  have hx : φ (FreeGroup.of x) = Multiplicative.ofAdd (1 : ZMod p) := by
    simpa [φ, x, originalFirstReductionPeriodOneDistinguishedGenerator] using
      originalFirstReductionPeriodOneFreeQuotientHom_head_zero
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  exact freeGroupKernelSchreierBasisEquivOfCyclicQuotientGenerator φ x hx

The original period-one Schreier generator set gives a multiplicative equivalence from its free group to the kernel of the cyclic quotient homomorphism.

@[simp 900] theorem originalFirstReductionPeriodOneSchreierBasisEquiv_symm_apply
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods) :
    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 originalFirstReductionPeriodOneFirstPowerKernel
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods) :
    letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
    let φ :=
      originalFirstReductionPeriodOneFreeQuotientHom
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
    φ.ker := by
  classical
  dsimp
  letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
  let source :=
    originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let φ :=
    originalFirstReductionPeriodOneFreeQuotientHom
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  let x : FuchsianGenerator source :=
    originalFirstReductionPeriodOneDistinguishedGenerator
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  refine ⟨(FreeGroup.of x) ^ p, ?_⟩
  rw [MonoidHom.mem_ker]
  have hx : φ (FreeGroup.of x) = Multiplicative.ofAdd (1 : ZMod p) := by
    simpa [φ, x, originalFirstReductionPeriodOneDistinguishedGenerator] using
      originalFirstReductionPeriodOneFreeQuotientHom_head_zero
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  rw [map_pow, 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 original first-reduction period-one quotient.

noncomputable def originalFirstReductionPeriodOneSecondEdgeKernelElement
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods)
    (k : Fin p) :
    letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
    let φ :=
      originalFirstReductionPeriodOneFreeQuotientHom
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
    φ.ker := by
  classical
  dsimp
  letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
  let source :=
    originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let φ :=
    originalFirstReductionPeriodOneFreeQuotientHom
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  let x : FuchsianGenerator source :=
    originalFirstReductionPeriodOneDistinguishedGenerator
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  let y : FuchsianGenerator source := FuchsianGenerator.elliptic (e (.inl (1 : Fin 2)))
  let r : ℕ := ((k.val : ZMod p) - 1).val
  refine ⟨(FreeGroup.of x) ^ k.val * FreeGroup.of y * ((FreeGroup.of x) ^ r)⁻¹, ?_⟩
  rw [MonoidHom.mem_ker]
  have hx : φ (FreeGroup.of x) = Multiplicative.ofAdd (1 : ZMod p) := by
    simpa [φ, x, originalFirstReductionPeriodOneDistinguishedGenerator] using
      originalFirstReductionPeriodOneFreeQuotientHom_head_zero
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  have hy : φ (FreeGroup.of y) = Multiplicative.ofAdd (-1 : ZMod p) := by
    simpa [φ, y] using
      originalFirstReductionPeriodOneFreeQuotientHom_head_one
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  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 second-edge kernel element in the original first-reduction period-one quotient.

noncomputable def originalFirstReductionPeriodOneTailKernelElement
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods)
    (j : Fin tailLen) (k : Fin p) :
    letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
    let φ :=
      originalFirstReductionPeriodOneFreeQuotientHom
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
    φ.ker := by
  classical
  dsimp
  letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
  let source :=
    originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let φ :=
    originalFirstReductionPeriodOneFreeQuotientHom
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  let x : FuchsianGenerator source :=
    originalFirstReductionPeriodOneDistinguishedGenerator
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  let y : FuchsianGenerator source := FuchsianGenerator.elliptic (e (.inr j))
  refine ⟨(FreeGroup.of x) ^ k.val * FreeGroup.of y * ((FreeGroup.of x) ^ k.val)⁻¹, ?_⟩
  rw [MonoidHom.mem_ker]
  have hx : φ (FreeGroup.of x) = Multiplicative.ofAdd (1 : ZMod p) := by
    simpa [φ, x, originalFirstReductionPeriodOneDistinguishedGenerator] using
      originalFirstReductionPeriodOneFreeQuotientHom_head_zero
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  have hy : φ (FreeGroup.of y) = 1 := by
    simpa [φ, y] using
      originalFirstReductionPeriodOneFreeQuotientHom_tail
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e j
  change φ ((FreeGroup.of x) ^ k.val * FreeGroup.of y * ((FreeGroup.of x) ^ k.val)⁻¹) = 1
  simp only [Lean.Elab.WF.paramLet, map_mul, map_pow, hx, hy, mul_one, map_inv, mul_inv_cancel]

The tail kernel element in the original first-reduction period-one quotient.

noncomputable def originalFirstReductionPeriodOneSecondPowerKernel
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods) :
    letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
    let φ :=
      originalFirstReductionPeriodOneFreeQuotientHom
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
    φ.ker := by
  classical
  dsimp
  letI : NeZero p := ⟨Nat.ne_of_gt (lt_of_lt_of_le (by decide : 0 < 2) hp)⟩
  let source :=
    originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let φ :=
    originalFirstReductionPeriodOneFreeQuotientHom
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  let y : FuchsianGenerator source := FuchsianGenerator.elliptic (e (.inl (1 : Fin 2)))
  refine ⟨(FreeGroup.of y) ^ p, ?_⟩
  rw [MonoidHom.mem_ker]
  have hy : φ (FreeGroup.of y) = Multiplicative.ofAdd (-1 : ZMod p) := by
    simpa [φ, y] using
      originalFirstReductionPeriodOneFreeQuotientHom_head_one
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e
  rw [map_pow, 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 original first-reduction period-one quotient.

theorem originalFirstReductionPeriodOneFirstPowerKernel_coe
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods) :
    letI : NeZero p

The first power-kernel element has the displayed representative in the ambient period-one quotient.

Show proof
theorem originalFirstReductionPeriodOneSecondPowerKernel_coe
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods) :
    letI : NeZero p

The second power-kernel element has the displayed representative in the ambient period-one quotient.

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

The second-edge kernel element has the displayed representative in the ambient period-one quotient.

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

The tail kernel element has the displayed representative in the ambient period-one quotient.

Show proof
theorem originalFirstReductionPeriodOneSecondEdgeKernelElement_inj
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods)
    {k₁ k₂ : Fin p}
    (hEq :
      originalFirstReductionPeriodOneSecondEdgeKernelElement
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e k₁ =
        originalFirstReductionPeriodOneSecondEdgeKernelElement
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e k₂) :
    k₁ = k₂

The injective comparison identifies the second-edge kernel element with its quotient representative.

Show proof
theorem originalFirstReductionPeriodOneTailKernelElement_inj
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (e :
      OriginalFirstReductionIndex tailLen ≃
        Fin (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail
          hTailLen).numPeriods)
    {j₁ j₂ : Fin tailLen} {k₁ k₂ : Fin p}
    (hEq :
      originalFirstReductionPeriodOneTailKernelElement
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e j₁ k₁ =
        originalFirstReductionPeriodOneTailKernelElement
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e j₂ k₂) :
    j₁ = j₂ ∧ k₁ = k₂

The injective comparison identifies the tail kernel element with its quotient representative.

Show proof
noncomputable def originalFirstReductionPeriodOneQuotientHom
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    FuchsianPresentedGroup
        (originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen) →*
      Multiplicative (ZMod p) := by
  classical
  let source :=
    originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
  let e : OriginalFirstReductionIndex tailLen ≃ Fin source.numPeriods := by
    simpa [source, originalFirstReductionSignature] using
    originalFirstReductionOrderedIndexEquiv tailLen
  have hperiods :
      ∀ x : OriginalFirstReductionIndex tailLen,
        source.periods (e x) =
          originalFirstReductionPeriods (p := p) m₁' m₂' tail x := by
    intro x
    simpa [source, e] using
      originalFirstReduction_canonical_periods_eq
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen x
  exact
    PresentedGroup.toGroup (rels := relators source)
      (f := ellipticQuotientGeneratorImage source
        (originalFirstReductionPeriodOneQuotientImage
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e))
      (by
        simpa [originalFirstReductionPeriodOneFreeQuotientHom, source] using
          originalFirstReductionPeriodOneFreeQuotientHom_respects_relators
            m₁' m₂' tail hp hm₁' hm₂' htail hTailLen e hperiods)

The quotient homomorphism induced by the period-one cyclic quotient construction.

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

The period-one quotient homomorphism has the prescribed value on the head-zero generator.

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

The period-one quotient homomorphism has the prescribed value on the head-one generator.

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

The period-one quotient homomorphism has the prescribed value on each tail generator.

Show proof