ProCGroups.ReidemeisterSchreier.Discrete.OpenSubgroups.FreeBasis

7 Theorems | 5 Definitions | 1 Abbreviation

Using the action groupoid and Schreier prefix tree, this module constructs a free basis indexed by complement edges and transports it to the canonical type of nontrivial Schreier pairs.

imports
Imported by

Declarations

noncomputable def FreeGroupBasis.actionGroupoidGeneratorTotalEquiv
    {ι G A : Type u} [Group G] [MulAction G A] (b : FreeGroupBasis ι G) :
    letI : IsFreeGroupoid (CategoryTheory.ActionCategory G A) :=
      FreeGroupBasis.actionGroupoidIsFree b
    Quiver.Total (IsFreeGroupoid.Generators (CategoryTheory.ActionCategory G A)) ≃ A × ι := by
  letI : IsFreeGroupoid (CategoryTheory.ActionCategory G A) :=
    FreeGroupBasis.actionGroupoidIsFree b
  refine
    { toFun := fun e => (e.left.back, e.hom.1)
      invFun := fun ai =>
        { left := show IsFreeGroupoid.Generators (CategoryTheory.ActionCategory G A) from
            ((ai.1 : A) : CategoryTheory.ActionCategory G A)
          right := show IsFreeGroupoid.Generators (CategoryTheory.ActionCategory G A) from
            ((b ai.2 • ai.1 : A) : CategoryTheory.ActionCategory G A)
          hom := ⟨ai.2, rfl⟩ }
      left_inv := ?_
      right_inv := ?_ }
  · intro e
    cases e with
    | mk left right hom =>
        cases left with
        | mk _ a =>
            cases right with
            | mk _ a' =>
                cases hom with
                | mk i hi =>
                    dsimp
                    cases hi
                    rfl
  · intro ai
    rfl

The total generator arrows in the action groupoid attached to a chosen free basis are indexed by a pair consisting of a vertex and a basis element.

noncomputable abbrev schreierComplementEdges
    {X : Type u} [DecidableEq X] {L : Subgroup (FreeGroup X)} {T : Set (FreeGroup X)}
    (hT : IsRightSchreierTransversal (X := X) L T) : Type u := by
  letI := schreierTransversalRightCosetAction (X := X) hT
  letI : IsFreeGroupoid (CategoryTheory.ActionCategory (FreeGroup X) T) :=
    FreeGroupBasis.actionGroupoidIsFree (FreeGroup.inverseBasis X)
  exact
    ↥(((Quiver.wideSubquiverEquivSetTotal <|
      Quiver.wideSubquiverSymmetrify (schreierPrefixTree (X := X) hT))ᶜ :
        Set (Quiver.Total
          (IsFreeGroupoid.Generators (CategoryTheory.ActionCategory (FreeGroup X) T)))))

Complement edges of the symmetrized Schreier prefix tree. These are the canonical indexing objects for the Schreier free basis.

noncomputable def schreierComplementEdgesBasis
    {X : Type u} [DecidableEq X] {L : Subgroup (FreeGroup X)} {T : Set (FreeGroup X)}
    (hT : IsRightSchreierTransversal (X := X) L T) :
    FreeGroupBasis (schreierComplementEdges (X := X) hT) L := by
  letI := schreierTransversalRightCosetAction (X := X) hT
  letI : IsFreeGroupoid (CategoryTheory.ActionCategory (FreeGroup X) T) :=
    FreeGroupBasis.actionGroupoidIsFree (FreeGroup.inverseBasis X)
  exact
    (ReidemeisterSchreier.Groupoid.endBasis (schreierPrefixTree (X := X) hT)).map
      (schreierRootEndMulEquiv (X := X) hT)

The Schreier basis indexed by complement edges of the prefix tree.

noncomputable def schreierComplementEdgesEquivNontrivialPairs
    {X : Type u} [DecidableEq X] {L : Subgroup (FreeGroup X)} {T : Set (FreeGroup X)}
    (hT : IsRightSchreierTransversal (X := X) L T) :
    schreierComplementEdges (X := X) hT ≃ NontrivialSchreierPair (X := X) hT := by
  classical
  letI := schreierTransversalRightCosetAction (X := X) hT
  letI : IsFreeGroupoid (CategoryTheory.ActionCategory (FreeGroup X) T) :=
    FreeGroupBasis.actionGroupoidIsFree (FreeGroup.inverseBasis X)
  let C :
      Set (Quiver.Total
        (IsFreeGroupoid.Generators (CategoryTheory.ActionCategory (FreeGroup X) T))) :=
    ((Quiver.wideSubquiverEquivSetTotal <|
      Quiver.wideSubquiverSymmetrify (schreierPrefixTree (X := X) hT))ᶜ : Set _)
  change ↑C ≃ NontrivialSchreierPair (X := X) hT
  let eTotal :
      Quiver.Total (IsFreeGroupoid.Generators (CategoryTheory.ActionCategory (FreeGroup X) T)) ≃
        T × X :=
    FreeGroupBasis.actionGroupoidGeneratorTotalEquiv (FreeGroup.inverseBasis X)
  refine
    { toFun := fun i =>
        ⟨eTotal i.1, by
          intro hgen
          have hgen' :
              schreierGenerator (X := X) hT
                (((show T from CategoryTheory.ActionCategory.back i.1.left) : T) : FreeGroup X)
                i.1.hom.1 = 1 := by
            simpa [eTotal, FreeGroupBasis.actionGroupoidGeneratorTotalEquiv] using hgen
          exact i.2 (show i.1 ∈ Quiver.wideSubquiverEquivSetTotal
              (Quiver.wideSubquiverSymmetrify (schreierPrefixTree (X := X) hT)) from
            (schreierGenerator_eq_one_iff_mem_prefixTree (X := X) (hT := hT) (e := i.1.hom)).1
                hgen')⟩
      invFun := fun p =>
        let e := eTotal.symm p.1
        ⟨e, by
          intro he
          have hgen' :
              schreierGenerator (X := X) hT
                (((show T from CategoryTheory.ActionCategory.back e.left) : T) : FreeGroup X)
                e.hom.1 = 1 :=
            (schreierGenerator_eq_one_iff_mem_prefixTree (X := X) (hT := hT) (e := e.hom)).2
              (show e.hom ∈ Quiver.wideSubquiverSymmetrify (schreierPrefixTree (X := X) hT)
                  e.left e.right from he)
          have hgen'' :
              schreierGenerator (X := X) hT
                (((eTotal e).1 : T) : FreeGroup X) (eTotal e).2 = 1 := by
            simpa [eTotal, FreeGroupBasis.actionGroupoidGeneratorTotalEquiv] using hgen'
          rw [eTotal.apply_symm_apply p.1] at hgen''
          exact p.2 hgen''⟩
      left_inv := by
        intro i
        apply Subtype.ext
        simp only [Equiv.symm_apply_apply, eTotal]
      right_inv := by
        intro p
        apply Subtype.ext
        simp only [ne_eq, Equiv.apply_symm_apply, eTotal]}

Complement edges are equivalent to nontrivial Schreier pairs.

noncomputable def nontrivialSchreierPairBasis
    {X : Type u} [DecidableEq X] {L : Subgroup (FreeGroup X)} {T : Set (FreeGroup X)}
    (hT : IsRightSchreierTransversal (X := X) L T) :
    FreeGroupBasis (NontrivialSchreierPair (X := X) hT) L :=
  (schreierComplementEdgesBasis (X := X) hT).reindex
    (schreierComplementEdgesEquivNontrivialPairs (X := X) hT)

The Schreier free basis indexed by nontrivial Schreier pairs. This is the preferred Schreier-basis formulation; the classical value-set basis is a reindexing of this one.

noncomputable def nontrivialSchreierPairBasisEquiv
    {X : Type u} [DecidableEq X] {L : Subgroup (FreeGroup X)} {T : Set (FreeGroup X)}
    (hT : IsRightSchreierTransversal (X := X) L T) :
    FreeGroup (NontrivialSchreierPair (X := X) hT) ≃* L :=
  (nontrivialSchreierPairBasis (X := X) hT).repr.symm

The free group equivalence obtained directly from the preferred pair-indexed Schreier basis.

@[simp] theorem nontrivialSchreierPairBasisEquiv_of
    {X : Type u} [DecidableEq X] {L : Subgroup (FreeGroup X)} {T : Set (FreeGroup X)}
    (hT : IsRightSchreierTransversal (X := X) L T)
    (p : NontrivialSchreierPair (X := X) hT) :
    nontrivialSchreierPairBasisEquiv (X := X) hT (FreeGroup.of p) =
      nontrivialSchreierPairBasis (X := X) hT p

The preferred pair-indexed basis equivalence sends each free generator to its Schreier basis element.

Show Lean proof
theorem schreierGenerator_injective_of_nontrivial
    {X : Type u} [DecidableEq X] {L : Subgroup (FreeGroup X)} {T : Set (FreeGroup X)}
    (hT : IsRightSchreierTransversal (X := X) L T) :
    Function.Injective
      (nontrivialSchreierPairGenerator (X := X) hT)

The Schreier-generator map is injective on nontrivial Schreier pairs.

Show Lean proof
theorem natCard_schreierTransversal_eq_index
    {X : Type u} [DecidableEq X]
    {L : Subgroup (FreeGroup X)} {T : Set (FreeGroup X)}
    (hT : IsRightSchreierTransversal (X := X) L T) :
    Nat.card T = Nat.card (Quotient (QuotientGroup.rightRel L))

A right Schreier transversal has cardinality equal to the corresponding right-coset index.

Show Lean proof
theorem natCard_schreierComplementEdges_eq_rankTransform_direct
    {X : Type u} [DecidableEq X] [Finite X]
    {L : Subgroup (FreeGroup X)} {T : Set (FreeGroup X)}
    [Finite T]
    (hT : IsRightSchreierTransversal (X := X) L T) :
    Nat.card (schreierComplementEdges (X := X) hT) =
      _root_.ReidemeisterSchreier.Schreier.rankTransform (Nat.card X) (Nat.card T)

The direct combinatorial count of complement edges in the Schreier prefix tree: all labelled edges minus tree edges.

Show Lean proof
theorem natCard_nontrivialSchreierPairs_eq_rankTransform_direct
    {X : Type u} [DecidableEq X] [Finite X]
    {L : Subgroup (FreeGroup X)} {T : Set (FreeGroup X)}
    [Finite T]
    (hT : IsRightSchreierTransversal (X := X) L T) :
    Nat.card (NontrivialSchreierPair (X := X) hT) =
      _root_.ReidemeisterSchreier.Schreier.rankTransform (Nat.card X) (Nat.card T)

The preferred pair-indexed generator type has cardinality equal to the Schreier rank-transform count.

Show Lean proof
theorem natCard_nontrivialSchreierPairs_eq_rankTransform
    {X : Type u} [DecidableEq X] [Finite X]
    {L : Subgroup (FreeGroup X)} {T : Set (FreeGroup X)}
    [Finite (FreeGroup X ⧸ L)]
    (hT : IsRightSchreierTransversal (X := X) L T) :
    Nat.card (NontrivialSchreierPair (X := X) hT) =
      _root_.ReidemeisterSchreier.Schreier.rankTransform (Nat.card X) (Nat.card (FreeGroup X ⧸
          L))

The number of nontrivial Schreier pairs equals the Schreier rank-transform count, with the index written as the usual left-coset quotient.

Show Lean proof
theorem exists_freeBasis_subgroupOfFreeGroup_of_rankTransform
    {X : Type u} {L : Subgroup (FreeGroup X)} [Finite X] [Finite (FreeGroup X ⧸ L)] :
    ∃ Y : Type u, Nonempty (FreeGroupBasis Y L) ∧
      Nat.card Y = _root_.ReidemeisterSchreier.Schreier.rankTransform
        (Nat.card X) (Nat.card (FreeGroup X ⧸ L))

A finite-index subgroup of a free group admits a free basis of Schreier-transformed cardinality.

Show Lean proof