FenchelNielsenZomorrodian.Discrete.CompactFuchsian.FirstReduction.Signatures

20 Theorem | 11 Definition | 1 Abbreviation

This module studies signatures for fenchel nielsen zomorrodian. The first-reduction source signature has the displayed periods, index set, and total relation. The finite product over concatenated blocks factors as the product of the blockwise finite products.

import
Imported by

Declarations

noncomputable abbrev firstReductionSourceSignature
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 0 < m₁') (hm₂' : 0 < m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    FuchsianSignature :=
  originalFirstReductionSignature m₁' m₂' tail hp hm₁' hm₂' htail hTailLen

The first-reduction source signature has the displayed periods, index set, and total relation.

theorem list_prod_ofFn_mul_blocks {α : Type*} [Monoid α] {p n : ℕ}
    (f : Fin (p * n) → α) :
    (List.ofFn f).prod =
      (List.ofFn (fun k : Fin p =>
        (List.ofFn (fun j : Fin n =>
          f ⟨k.val * n + j.val, by
            calc
              k.val * n + j.val < (k.val + 1) * n := by
                calc
                  k.val * n + j.val < k.val * n + n :=
                    Nat.add_lt_add_left j.isLt _
                  _ = (k.val + 1) * n := by rw [Nat.add_mul, one_mul]
              _ ≤ p * n := Nat.mul_le_mul_right n (Nat.succ_le_of_lt k.isLt)⟩)).prod)).prod

The finite product over concatenated blocks factors as the product of the blockwise finite products.

Show proof
def firstReductionCanonicalSourcePeriod
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ) (i : Fin (2 + tailLen)) : ℕ :=
  if h0 : i.val = 0 then
    p * m₁'
  else if h1 : i.val = 1 then
    p * m₂'
  else
    tail ⟨i.val - 2, by omega⟩
@[local simp]

The period function of the first-reduction canonical source signature.

theorem firstReductionCanonicalSourcePeriod_zero
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ) :
    firstReductionCanonicalSourcePeriod (tailLen := tailLen) (p := p) m₁' m₂' tail
        ⟨0, by omega⟩ = p * m₁'

The zero-index period of the first-reduction canonical source signature.

Show proof
theorem firstReductionCanonicalSourcePeriod_one
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ) :
    firstReductionCanonicalSourcePeriod (tailLen := tailLen) (p := p) m₁' m₂' tail
        ⟨1, by omega⟩ = p * m₂'

The first distinguished period of the first-reduction canonical source signature.

Show proof
theorem firstReductionCanonicalSourcePeriod_tail
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ) (j : Fin tailLen) :
    firstReductionCanonicalSourcePeriod (tailLen := tailLen) (p := p) m₁' m₂' tail
        ⟨2 + j.val, by omega⟩ = tail j

A tail period of the first-reduction canonical source signature.

Show proof
def firstReductionCanonicalSourceSignature
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    FuchsianSignature where
  orbitGenus := 0
  numCusps := 0
  numPeriods := 2 + tailLen
  periods := firstReductionCanonicalSourcePeriod (tailLen := tailLen) (p := p) m₁' m₂' tail
  period_ge_two := by
    intro i
    unfold firstReductionCanonicalSourcePeriod
    by_cases h0 : i.val = 0
    · rw [dif_pos h0]
      exact le_trans hp (Nat.le_mul_of_pos_right p (lt_of_lt_of_le (by decide) hm₁'))
    · by_cases h1 : i.val = 1
      · rw [dif_neg h0, dif_pos h1]
        exact le_trans hp (Nat.le_mul_of_pos_right p (lt_of_lt_of_le (by decide) hm₂'))
      · rw [dif_neg h0, dif_neg h1]
        exact htail ⟨i.val - 2, by omega⟩
  numCusps_eq_zero := rfl
  numPeriods_ge_three := by omega

The first-reduction source signature has the displayed periods, index set, and total relation.

def firstReductionCanonicalSourceZeroIndex
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    Fin
      (firstReductionCanonicalSourceSignature
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen).numPeriods :=
  ⟨0, by simp only [firstReductionCanonicalSourceSignature, add_pos_iff, Nat.ofNat_pos, true_or]⟩

The zero source index in the first-reduction canonical signature is the zero-index constructor.

def firstReductionCanonicalSourceOneIndex
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    Fin
      (firstReductionCanonicalSourceSignature
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen).numPeriods :=
  ⟨1, by simp only [firstReductionCanonicalSourceSignature]; omega⟩

The first distinguished source index in the first-reduction canonical signature is the one-index constructor.

def firstReductionCanonicalSourceTailIndex
    {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) :
    Fin
      (firstReductionCanonicalSourceSignature
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen).numPeriods :=
  ⟨2 + j.val, by
    simp only [firstReductionCanonicalSourceSignature, add_lt_add_iff_left, Fin.is_lt]⟩

The tail source index in the first-reduction canonical signature is the corresponding tail-index constructor.

@[simp 900] theorem firstReductionCanonicalSourceSignature_period_zero
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    (firstReductionCanonicalSourceSignature
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen).periods
        (firstReductionCanonicalSourceZeroIndex
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen) =
      p * m₁'

The first-reduction canonical source signature has the prescribed zero-index period.

Show proof
@[simp 900] theorem firstReductionCanonicalSourceSignature_period_one
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    (firstReductionCanonicalSourceSignature
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen).periods
        (firstReductionCanonicalSourceOneIndex
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen) =
      p * m₂'

The first-reduction canonical source signature has the prescribed first distinguished period.

Show proof
@[simp 900] theorem firstReductionCanonicalSourceSignature_period_tail
    {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) :
    (firstReductionCanonicalSourceSignature
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen).periods
        (firstReductionCanonicalSourceTailIndex
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen j) =
      tail j

The first-reduction canonical source signature has the prescribed tail period.

Show proof
theorem firstReductionCanonicalSource_totalRelation_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) :
    let σ

The first-reduction canonical source total relation equals the displayed product relation.

Show proof
def firstReductionCanonicalTargetPeriod
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ) (hTailLen : 0 < tailLen)
    (i : Fin (2 + p * tailLen)) : ℕ :=
  if i.val = 0 then
    m₁'
  else if i.val = 1 then
    m₂'
  else
    tail ⟨(i.val - 2) % tailLen, Nat.mod_lt _ hTailLen⟩
@[local simp]

The period function of the first-reduction canonical target signature.

theorem firstReductionCanonicalTargetPeriod_zero
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ) (hTailLen : 0 < tailLen) :
    firstReductionCanonicalTargetPeriod (tailLen := tailLen) (p := p) m₁' m₂' tail
        hTailLen ⟨0, by omega⟩ = m₁'

The zero-index period of the first-reduction canonical target signature.

Show proof
theorem firstReductionCanonicalTargetPeriod_one
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ) (hTailLen : 0 < tailLen) :
    firstReductionCanonicalTargetPeriod (tailLen := tailLen) (p := p) m₁' m₂' tail
        hTailLen ⟨1, by omega⟩ = m₂'

The first distinguished period of the first-reduction canonical target signature.

Show proof
theorem firstReductionCanonicalTargetPeriod_tail
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ) (hTailLen : 0 < tailLen)
    (k : Fin p) (j : Fin tailLen) :
    firstReductionCanonicalTargetPeriod (tailLen := tailLen) (p := p) m₁' m₂' tail
        hTailLen
        ⟨2 + k.val * tailLen + j.val, by
          have hblock : k.val * tailLen + j.val < (k.val + 1) * tailLen := by
            calc
              k.val * tailLen + j.val < k.val * tailLen + tailLen :=
                Nat.add_lt_add_left j.isLt _
              _ = (k.val + 1) * tailLen := by rw [Nat.add_mul, one_mul]
          have hle : (k.val + 1) * tailLen ≤ p * tailLen :=
            Nat.mul_le_mul_right tailLen (Nat.succ_le_of_lt k.isLt)
          have hmain : k.val * tailLen + j.val < p * tailLen :=
            lt_of_lt_of_le hblock hle
          omega⟩ = tail j

A tail period of the first-reduction canonical target signature.

Show proof
def firstReductionCanonicalTargetSignature
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    FuchsianSignature where
  orbitGenus := 0
  numCusps := 0
  numPeriods := 2 + p * tailLen
  periods :=
    firstReductionCanonicalTargetPeriod (tailLen := tailLen) (p := p) m₁' m₂' tail hTailLen
  period_ge_two := by
    intro i
    unfold firstReductionCanonicalTargetPeriod
    by_cases h0 : i.val = 0
    · rw [if_pos h0]
      exact hm₁'
    · by_cases h1 : i.val = 1
      · rw [if_neg h0, if_pos h1]
        exact hm₂'
      · rw [if_neg h0, if_neg h1]
        exact htail ⟨(i.val - 2) % tailLen, Nat.mod_lt _ hTailLen⟩
  numCusps_eq_zero := rfl
  numPeriods_ge_three := by
    have hp_pos : 0 < p := lt_of_lt_of_le (by decide : 0 < 2) hp
    nlinarith [Nat.mul_pos hp_pos hTailLen]

The first-reduction canonical target signature has the displayed periods, index set, and total relation.

def firstReductionCanonicalTargetZeroIndex
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    Fin
      (firstReductionCanonicalTargetSignature
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen).numPeriods :=
  ⟨0, by simp only [firstReductionCanonicalTargetSignature, add_pos_iff, Nat.ofNat_pos, CanonicallyOrderedAdd.mul_pos,
  true_or]⟩

The zero target index in the first-reduction canonical signature is the zero-index constructor.

def firstReductionCanonicalTargetOneIndex
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    Fin
      (firstReductionCanonicalTargetSignature
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen).numPeriods :=
  ⟨1, by
    have hp_pos : 0 < p := lt_of_lt_of_le (by decide : 0 < 2) hp
    have hprod : 0 < p * tailLen := Nat.mul_pos hp_pos hTailLen
    simp only [firstReductionCanonicalTargetSignature, gt_iff_lt]
    omega⟩

The first distinguished target index in the first-reduction canonical signature is the one-index constructor.

def firstReductionCanonicalTargetFlatTailIndex
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (r : Fin (p * tailLen)) :
    Fin
      (firstReductionCanonicalTargetSignature
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen).numPeriods :=
  ⟨2 + r.val, by
    simp only [firstReductionCanonicalTargetSignature, add_lt_add_iff_left, Fin.is_lt]⟩
@[local simp]

The flat-tail target index in the first-reduction canonical signature is the displayed block-tail index.

theorem firstReductionCanonicalTargetSignature_period_flatTail
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen)
    (r : Fin (p * tailLen)) :
    (firstReductionCanonicalTargetSignature
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen).periods
        (firstReductionCanonicalTargetFlatTailIndex
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen r) =
      tail ⟨r.val % tailLen, Nat.mod_lt _ hTailLen⟩

The first-reduction canonical target signature has the prescribed flat-tail period.

Show proof
def firstReductionCanonicalTargetTailIndex
    {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) (j : Fin tailLen) :
    Fin
      (firstReductionCanonicalTargetSignature
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen).numPeriods :=
  ⟨2 + k.val * tailLen + j.val, by
    have hblock : k.val * tailLen + j.val < (k.val + 1) * tailLen := by
      calc
        k.val * tailLen + j.val < k.val * tailLen + tailLen :=
          Nat.add_lt_add_left j.isLt _
        _ = (k.val + 1) * tailLen := by rw [Nat.add_mul, one_mul]
    have hle : (k.val + 1) * tailLen ≤ p * tailLen :=
      Nat.mul_le_mul_right tailLen (Nat.succ_le_of_lt k.isLt)
    have hmain : k.val * tailLen + j.val < p * tailLen :=
      lt_of_lt_of_le hblock hle
    simp only [firstReductionCanonicalTargetSignature, gt_iff_lt]
    omega⟩

The tail target index in the first-reduction canonical signature is the corresponding tail-index constructor.

theorem firstReductionCanonicalTargetIndex_eq_tailIndex_of_ne_zero_one
    {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
        (firstReductionCanonicalTargetSignature
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen).numPeriods)
    (h0 : i.val ≠ 0) (h1 : i.val ≠ 1) :
    let r : Fin (p * tailLen)

Away from the zero and one distinguished indices, the first-reduction canonical target index agrees with the corresponding tail index.

Show proof
@[simp 900] theorem firstReductionCanonicalTargetFlatTailIndex_block
    {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) (j : Fin tailLen) :
    firstReductionCanonicalTargetFlatTailIndex
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen
        ⟨k.val * tailLen + j.val, by
          have hblock : k.val * tailLen + j.val < (k.val + 1) * tailLen := by
            calc
              k.val * tailLen + j.val < k.val * tailLen + tailLen :=
                Nat.add_lt_add_left j.isLt _
              _ = (k.val + 1) * tailLen := by rw [Nat.add_mul, one_mul]
          have hle : (k.val + 1) * tailLen ≤ p * tailLen :=
            Nat.mul_le_mul_right tailLen (Nat.succ_le_of_lt k.isLt)
          exact lt_of_lt_of_le hblock hle⟩ =
      firstReductionCanonicalTargetTailIndex
        m₁' m₂' tail hp hm₁' hm₂' htail hTailLen k j

The flat-tail target index in the first-reduction canonical signature is the displayed block-tail index.

Show proof
private theorem firstReductionCanonicalTarget_flatTailProduct_eq_blocks
    {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 canonical flat-tail product equals the displayed product of blocks.

Show proof
private theorem firstReductionCanonicalTarget_totalRelation_eq_flat
    {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 canonical target total relation equals the displayed flattened product.

Show proof
theorem firstReductionCanonicalTarget_totalRelation_eq_blocks
    {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 canonical target total relation splits into the displayed block product.

Show proof
@[simp 900] theorem firstReductionCanonicalTargetSignature_period_zero
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    (firstReductionCanonicalTargetSignature
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen).periods
        (firstReductionCanonicalTargetZeroIndex
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen) =
      m₁'

The first-reduction canonical target signature has the prescribed zero-index period.

Show proof
@[simp 900] theorem firstReductionCanonicalTargetSignature_period_one
    {tailLen p : ℕ}
    (m₁' m₂' : ℕ) (tail : Fin tailLen → ℕ)
    (hp : 2 ≤ p) (hm₁' : 2 ≤ m₁') (hm₂' : 2 ≤ m₂')
    (htail : ∀ j, 2 ≤ tail j) (hTailLen : 0 < tailLen) :
    (firstReductionCanonicalTargetSignature
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen).periods
        (firstReductionCanonicalTargetOneIndex
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen) =
      m₂'

The first-reduction canonical target signature has the prescribed first distinguished period.

Show proof
@[simp 900] theorem firstReductionCanonicalTargetSignature_period_tail
    {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) (j : Fin tailLen) :
    (firstReductionCanonicalTargetSignature
      m₁' m₂' tail hp hm₁' hm₂' htail hTailLen).periods
        (firstReductionCanonicalTargetTailIndex
          m₁' m₂' tail hp hm₁' hm₂' htail hTailLen k j) =
      tail j

The first-reduction canonical target signature has the prescribed tail period.

Show proof