Documentation

TauCeti.GroupTheory.SpecificGroups.CFSG.Sporadic.Conway.One

A transcribed presentation of the first Conway group #

This file carries the Co₁ row of the sporadic presentation data required by milestone S1 of TauCetiRoadmap/CFSGStatement/README.md. It records presentation GPLTable.Co1.1 from Roderik Lindenbergh's Group Presentations Library as a TauCeti.GroupPresentation, together with the exact source, generator convention, transcription notes, expected counts, and decidable checks on the transcription.

The presentation uses the Coxeter graph encoded by

b4h3a3b5c3d3f4c3e4a, b4g4f, e6f6h.

All eight generators are involutions and every omitted edge has label two. Thus the graph contributes eight square relations, thirteen labeled-edge relations, and fifteen omitted-edge relations. The source then appends

a = (cf)²,  e = (bg)²,  b = (ef)³,  d = (bh)²,  d = (eah)³,
(adfh)³,  (baefg)³,  (cef)⁷,  (adefcefgh)³⁹.

An equality x = y in the source is the relator x⁻¹y. The complete presentation therefore has 45 relators, whose compiled words have 611 signed letters. The theorems below check both figures from the transcribed expressions.

The library identifies this record as a presentation of Co₁ originating in Praeger--Soicher, whose construction uses low-rank representations and graphs for sporadic groups. The stored data is a full presentation of the abstract group, not a semi-presentation for recognizing generators in an already constructed group. This file asserts no order, finiteness, simplicity, or identification result.

Independent source-to-Lean read-through #

An independent read-through used the bytes of gpl.g whose SHA-256 digest is 8b90a7a65317a585b5b74d015083bd2fa3db8a969c117a220d00d7e8773103c8. The exact source record is

presdef := [ "b4h3a3b5c3d3f4c3e4a,b4g4f,e6f6h", ,
    "a=(cf)^2,e=(bg)^2,b=(ef)^3,d=(bh)^2,d=(eah)^3,\
     (adfh)^3,(baefg)^3,(cef)^7,(adefcefgh)^(39)",,  ],

GetGenerators gives the decoder's first-occurrence order b,h,a,c,d,f,e,g; the Lean row instead uses the alphabetical order a,b,c,d,e,f,g,h. After that explicit renaming, DeCoxList and its calls to AddTrivialRelations and AddNonEdgeRelations give the same relation multiset recorded by co1Presentation_relatorLetters, regrouped by kind. Entries 1--8 are the eight generator squares; entries 9--21 are

(ab)^3,(ae)^4,(ah)^3,(bc)^5,(bg)^4,(bh)^4,(cd)^3,
(ce)^3,(cf)^4,(df)^3,(ef)^6,(fg)^4,(fh)^6;

and entries 22--36 are the exponent-two nonedges

ac,ad,af,ag, bd,be,bf, cg,ch, de,dg,dh, eg,eh, gh.

MakeWordList compiles an equality x = y as x⁻¹y. Entries 37--45 are therefore, in source order, a⁻¹(cf)², e⁻¹(bg)², b⁻¹(ef)³, d⁻¹(bh)², d⁻¹(eah)³, (adfh)³, (baefg)³, (cef)⁷, and (adefcefgh)³⁹. There is no change to any word or exponent and no dropped or duplicated relation, only the presentation-irrelevant renaming and regrouping just described. This closes the row's S1 source-to-Lean read-through.

The independent FiniteSimpleGroups comparison does not apply: at commit 7f09e33a9ceef6b59ce03e34cd4f0558c763e325, that development has sporadic constructions for Co₂ and Co₃ but not Co₁.

The row is a sealed definition, so it publishes an equation for each of its fields: the transcribed relator expressions with their generator indices written out and this file's three private relator lists concatenated, and the provenance a manifest row exists to record. Together with TauCeti.GroupPresentation.relators_def and TauCeti.GroupPresentation.mem_relatorSet_iff the first of those determines the compiled words and the relations defining the presented group, so a consumer reasons about the row without unfolding it.

These field equations and the decidable checks beside them follow the shape that the TauCeti.GroupTheory.SpecificGroups.CFSG.Sporadic.Janko modules established for a manifest row.

Main definitions and results #

References #

The Group Presentations Library finite presentation GPLTable.Co1.1 of the first Conway group Co₁ on generators a, b, c, d, e, f, g, and h.

The source describes this as a full presentation of the abstract group and identifies its origin as Praeger--Soicher. No structural property of the presented group is asserted here: this definition records only the cited generators and relations.

Generator order (starting at index zero): a, b, c, d, e, f, g, h.

Source: R. Lindenbergh, Group Presentations Library, version 1.0; presentation attributed there to C. E. Praeger and L. H. Soicher, Low Rank Representations and Graphs for Sporadic Groups, Cambridge University Press, 1997.

Source locator: GPLTable.Co1.1 in https://doris.tudelft.nl/~rlindenbergh/GPL/gpl.g; Praeger--Soicher, Chapter 4, doi:10.1017/CBO9780511526039.005

Generator convention: The source generators are indexed alphabetically in Lean: indices 0 through 7 are a,b,c,d,e,f,g,h. This is a relabeling of the GPL decoder's first-occurrence map b,h,a,c,d,f,e,g and preserves every named relation. A Coxeter path declares each node to be an involution, a labeled edge x-m-y declares (x*y)^m = 1, and an omitted edge declares (x*y)^2 =

  1. An equality x = y compiles to x^-1*y, and products are read left to right.

Transcription notes: Expand the paths b4h3a3b5c3d3f4c3e4a, b4g4f, and e6f6h to eight square relations, thirteen labeled-edge relations, and fifteen omitted-edge relations. Append the nine words in presdef[3], interpreting each equality as left-hand inverse times right-hand side, and reindex the named generators alphabetically. The expected relator count and total length are derived from this exact expansion. The module documentation records the completed itemized source-to-Lean read-through. FiniteSimpleGroups does not cover Co1, so its separate permutation-group comparison does not apply.

Instances For
    @[simp]

    The number of generators in the presentation of Co₁. The row's body is sealed, so this is what lets a consumer see that it is an eight-generator presentation.

    @[simp]
    theorem TauCeti.Sporadic.co1Presentation_transcribed :
    co1Presentation.transcribed = have y := have y := have y := [(Relator.gen ⟨3, co1Presentation_transcribed._proof_1⟩).inv.mul (((Relator.gen ⟨1, co1Presentation_transcribed._proof_2⟩).mul (Relator.gen ⟨7, co1Presentation_transcribed._proof_3⟩)).pow 2), (Relator.gen ⟨3, co1Presentation_transcribed._proof_1⟩).inv.mul ((((Relator.gen ⟨4, co1Presentation_transcribed._proof_4⟩).mul (Relator.gen ⟨0, co1Presentation_transcribed._proof_5⟩)).mul (Relator.gen ⟨7, co1Presentation_transcribed._proof_3⟩)).pow 3), ((((Relator.gen ⟨0, co1Presentation_transcribed._proof_5⟩).mul (Relator.gen ⟨3, co1Presentation_transcribed._proof_1⟩)).mul (Relator.gen ⟨5, co1Presentation_transcribed._proof_6⟩)).mul (Relator.gen ⟨7, co1Presentation_transcribed._proof_3⟩)).pow 3, (((((Relator.gen ⟨1, co1Presentation_transcribed._proof_2⟩).mul (Relator.gen ⟨0, co1Presentation_transcribed._proof_5⟩)).mul (Relator.gen ⟨4, co1Presentation_transcribed._proof_4⟩)).mul (Relator.gen ⟨5, co1Presentation_transcribed._proof_6⟩)).mul (Relator.gen ⟨6, co1Presentation_transcribed._proof_7⟩)).pow 3, (((Relator.gen ⟨2, co1Presentation_transcribed._proof_8⟩).mul (Relator.gen ⟨4, co1Presentation_transcribed._proof_4⟩)).mul (Relator.gen ⟨5, co1Presentation_transcribed._proof_6⟩)).pow 7, (((((((((Relator.gen ⟨0, co1Presentation_transcribed._proof_5⟩).mul (Relator.gen ⟨3, co1Presentation_transcribed._proof_1⟩)).mul (Relator.gen ⟨4, co1Presentation_transcribed._proof_4⟩)).mul (Relator.gen ⟨5, co1Presentation_transcribed._proof_6⟩)).mul (Relator.gen ⟨2, co1Presentation_transcribed._proof_8⟩)).mul (Relator.gen ⟨4, co1Presentation_transcribed._proof_4⟩)).mul (Relator.gen ⟨5, co1Presentation_transcribed._proof_6⟩)).mul (Relator.gen ⟨6, co1Presentation_transcribed._proof_7⟩)).mul (Relator.gen ⟨7, co1Presentation_transcribed._proof_3⟩)).pow 39]; ((Relator.gen ⟨4, co1Presentation_transcribed._proof_4⟩).mul (Relator.gen ⟨6, co1Presentation_transcribed._proof_7⟩)).pow 2 :: ((Relator.gen ⟨4, co1Presentation_transcribed._proof_4⟩).mul (Relator.gen ⟨7, co1Presentation_transcribed._proof_3⟩)).pow 2 :: ((Relator.gen ⟨6, co1Presentation_transcribed._proof_7⟩).mul (Relator.gen ⟨7, co1Presentation_transcribed._proof_3⟩)).pow 2 :: (Relator.gen ⟨0, co1Presentation_transcribed._proof_5⟩).inv.mul (((Relator.gen ⟨2, co1Presentation_transcribed._proof_8⟩).mul (Relator.gen ⟨5, co1Presentation_transcribed._proof_6⟩)).pow 2) :: (Relator.gen ⟨4, co1Presentation_transcribed._proof_4⟩).inv.mul (((Relator.gen ⟨1, co1Presentation_transcribed._proof_2⟩).mul (Relator.gen ⟨6, co1Presentation_transcribed._proof_7⟩)).pow 2) :: (Relator.gen ⟨1, co1Presentation_transcribed._proof_2⟩).inv.mul (((Relator.gen ⟨4, co1Presentation_transcribed._proof_4⟩).mul (Relator.gen ⟨5, co1Presentation_transcribed._proof_6⟩)).pow 3) :: y; have y := ((Relator.gen ⟨1, co1Presentation_transcribed._proof_2⟩).mul (Relator.gen ⟨5, co1Presentation_transcribed._proof_6⟩)).pow 2 :: ((Relator.gen ⟨2, co1Presentation_transcribed._proof_8⟩).mul (Relator.gen ⟨6, co1Presentation_transcribed._proof_7⟩)).pow 2 :: ((Relator.gen ⟨2, co1Presentation_transcribed._proof_8⟩).mul (Relator.gen ⟨7, co1Presentation_transcribed._proof_3⟩)).pow 2 :: ((Relator.gen ⟨3, co1Presentation_transcribed._proof_1⟩).mul (Relator.gen ⟨4, co1Presentation_transcribed._proof_4⟩)).pow 2 :: ((Relator.gen ⟨3, co1Presentation_transcribed._proof_1⟩).mul (Relator.gen ⟨6, co1Presentation_transcribed._proof_7⟩)).pow 2 :: ((Relator.gen ⟨3, co1Presentation_transcribed._proof_1⟩).mul (Relator.gen ⟨7, co1Presentation_transcribed._proof_3⟩)).pow 2 :: y; ((Relator.gen ⟨0, co1Presentation_transcribed._proof_5⟩).mul (Relator.gen ⟨3, co1Presentation_transcribed._proof_1⟩)).pow 2 :: ((Relator.gen ⟨0, co1Presentation_transcribed._proof_5⟩).mul (Relator.gen ⟨5, co1Presentation_transcribed._proof_6⟩)).pow 2 :: ((Relator.gen ⟨0, co1Presentation_transcribed._proof_5⟩).mul (Relator.gen ⟨6, co1Presentation_transcribed._proof_7⟩)).pow 2 :: ((Relator.gen ⟨1, co1Presentation_transcribed._proof_2⟩).mul (Relator.gen ⟨3, co1Presentation_transcribed._proof_1⟩)).pow 2 :: ((Relator.gen ⟨1, co1Presentation_transcribed._proof_2⟩).mul (Relator.gen ⟨4, co1Presentation_transcribed._proof_4⟩)).pow 2 :: y; have y := have y := ((Relator.gen ⟨2, co1Presentation_transcribed._proof_8⟩).mul (Relator.gen ⟨5, co1Presentation_transcribed._proof_6⟩)).pow 4 :: ((Relator.gen ⟨3, co1Presentation_transcribed._proof_1⟩).mul (Relator.gen ⟨5, co1Presentation_transcribed._proof_6⟩)).pow 3 :: ((Relator.gen ⟨4, co1Presentation_transcribed._proof_4⟩).mul (Relator.gen ⟨5, co1Presentation_transcribed._proof_6⟩)).pow 6 :: ((Relator.gen ⟨5, co1Presentation_transcribed._proof_6⟩).mul (Relator.gen ⟨6, co1Presentation_transcribed._proof_7⟩)).pow 4 :: ((Relator.gen ⟨5, co1Presentation_transcribed._proof_6⟩).mul (Relator.gen ⟨7, co1Presentation_transcribed._proof_3⟩)).pow 6 :: ((Relator.gen ⟨0, co1Presentation_transcribed._proof_5⟩).mul (Relator.gen ⟨2, co1Presentation_transcribed._proof_8⟩)).pow 2 :: y; ((Relator.gen ⟨1, co1Presentation_transcribed._proof_2⟩).mul (Relator.gen ⟨2, co1Presentation_transcribed._proof_8⟩)).pow 5 :: ((Relator.gen ⟨1, co1Presentation_transcribed._proof_2⟩).mul (Relator.gen ⟨6, co1Presentation_transcribed._proof_7⟩)).pow 4 :: ((Relator.gen ⟨1, co1Presentation_transcribed._proof_2⟩).mul (Relator.gen ⟨7, co1Presentation_transcribed._proof_3⟩)).pow 4 :: ((Relator.gen ⟨2, co1Presentation_transcribed._proof_8⟩).mul (Relator.gen ⟨3, co1Presentation_transcribed._proof_1⟩)).pow 3 :: ((Relator.gen ⟨2, co1Presentation_transcribed._proof_8⟩).mul (Relator.gen ⟨4, co1Presentation_transcribed._proof_4⟩)).pow 3 :: y; have y := (Relator.gen ⟨5, co1Presentation_transcribed._proof_6⟩).pow 2 :: (Relator.gen ⟨6, co1Presentation_transcribed._proof_7⟩).pow 2 :: (Relator.gen ⟨7, co1Presentation_transcribed._proof_3⟩).pow 2 :: ((Relator.gen ⟨0, co1Presentation_transcribed._proof_5⟩).mul (Relator.gen ⟨1, co1Presentation_transcribed._proof_2⟩)).pow 3 :: ((Relator.gen ⟨0, co1Presentation_transcribed._proof_5⟩).mul (Relator.gen ⟨4, co1Presentation_transcribed._proof_4⟩)).pow 4 :: ((Relator.gen ⟨0, co1Presentation_transcribed._proof_5⟩).mul (Relator.gen ⟨7, co1Presentation_transcribed._proof_3⟩)).pow 3 :: y; (Relator.gen ⟨0, co1Presentation_transcribed._proof_5⟩).pow 2 :: (Relator.gen ⟨1, co1Presentation_transcribed._proof_2⟩).pow 2 :: (Relator.gen ⟨2, co1Presentation_transcribed._proof_8⟩).pow 2 :: (Relator.gen ⟨3, co1Presentation_transcribed._proof_1⟩).pow 2 :: (Relator.gen ⟨4, co1Presentation_transcribed._proof_4⟩).pow 2 :: y

    The relator expressions transcribed for Co₁, with their generator indices written out and the three private relator lists of this file concatenated.

    The row's body is sealed, so this is the equation that characterizes it: with TauCeti.GroupPresentation.relators_def it determines the compiled words, and with TauCeti.GroupPresentation.mem_relatorSet_iff it determines the relations defining TauCeti.GroupPresentation.Group, so a consumer never has to unfold the row. Indices 0 through 7 are the involutions a through h, and the bounds come from TauCeti.Sporadic.co1Presentation_generatorCount.

    theorem TauCeti.Sporadic.co1Presentation_relatorLetters :
    co1Presentation.relatorLetters = have powWord := fun (w : List (ℕ × Bool)) (n : ℕ) => (List.replicate n w).flatten; have squareWords := List.map (fun (k : ℕ) => powWord [(k, true)] 2) (List.range 8); have edgeSpecs := [(0, 1, 3), (0, 4, 4), (0, 7, 3), (1, 2, 5), (1, 6, 4), (1, 7, 4), (2, 3, 3), (2, 4, 3), (2, 5, 4), (3, 5, 3), (4, 5, 6), (5, 6, 4), (5, 7, 6)]; have edgeWords := List.map (fun (x : ℕ × ℕ × ℕ) => match x with | (r, s, n) => powWord [(r, true), (s, true)] n) edgeSpecs; have nonedgePairs := [(0, 2), (0, 3), (0, 5), (0, 6), (1, 3), (1, 4), (1, 5), (2, 6), (2, 7), (3, 4), (3, 6), (3, 7), (4, 6), (4, 7), (6, 7)]; have nonedgeWords := List.map (fun (x : ℕ × ℕ) => match x with | (r, s) => powWord [(r, true), (s, true)] 2) nonedgePairs; squareWords ++ edgeWords ++ nonedgeWords ++ [[(0, false)] ++ powWord [(2, true), (5, true)] 2, [(4, false)] ++ powWord [(1, true), (6, true)] 2, [(1, false)] ++ powWord [(4, true), (5, true)] 3, [(3, false)] ++ powWord [(1, true), (7, true)] 2, [(3, false)] ++ powWord [(4, true), (0, true), (7, true)] 3, powWord [(0, true), (3, true), (5, true), (7, true)] 3, powWord [(1, true), (0, true), (4, true), (5, true), (6, true)] 3, powWord [(2, true), (4, true), (5, true)] 7, powWord [(0, true), (3, true), (4, true), (5, true), (2, true), (4, true), (5, true), (6, true), (7, true)] 39]

    The compiled relator words of Co₁, generated from the nodes, edges, nonedges, and nine additional words of GPLTable.Co1.1. A letter (i, true) is generator i, while (i, false) is its inverse.

    The relator count recorded for Co₁ agrees with the transcribed data.

    theorem TauCeti.Sporadic.co1Presentation_map_length_relators :
    List.map List.length co1Presentation.relators = have y := have y := have y := [5, 10, 12, 15, 21, 351]; 4 :: 4 :: 4 :: 5 :: 5 :: 7 :: y; have y := 4 :: 4 :: 4 :: 4 :: 4 :: 4 :: y; 4 :: 4 :: 4 :: 4 :: 4 :: y; have y := have y := 8 :: 6 :: 12 :: 8 :: 12 :: 4 :: y; 10 :: 8 :: 8 :: 6 :: 6 :: y; have y := 2 :: 2 :: 2 :: 6 :: 8 :: 6 :: y; 2 :: 2 :: 2 :: 2 :: 2 :: y

    The lengths of the forty-five compiled relator words for Co₁, in the order in which the three Coxeter paths and the nine trailing words are decoded.

    Reading the counts off one relator at a time is what lets a reviewer locate a discrepancy, rather than only observe one in the total of TauCeti.Sporadic.co1Presentation_totalLength, which sums exactly this list. The lengths are computed through TauCeti.Relator.length_toWord, which multiplies rather than repeats, so the thirty-ninth power at the end never has to be expanded.

    The compiled relators of the Co₁ presentation contain 611 signed letters in total: the sum of the per-relator lengths of TauCeti.Sporadic.co1Presentation_map_length_relators.

    Every compiled Co₁ relator is cyclically reduced, hence by FreeGroup.IsCyclicallyReduced.isReduced freely reduced, so the letter count recorded by TauCeti.Sporadic.co1Presentation_totalLength is comparable with a published presentation length, which is normally measured on freely reduced relators.