Represent extensions on cosets of a module hyperplane - #6545
Open
fingolfin wants to merge 1 commit into
Open
Conversation
Constructing a permutation representation for a group extension searched for larger and larger quotients of the extension, lifting through subgroup abelianizations. For a candidate subgroup of index i that rewrites the preimage on roughly i times the number of generators, so a group without small-index subgroups makes the search collapse: for L3(3) with its 7-dimensional GF(3) module the first usable subgroup has index 144, giving a presentation on some 2000 generators, and one extension takes over six minutes. A subspace of the module containing no nonzero submodule has trivial core in the extension -- a normal subgroup inside it is a submodule -- so the extension acts faithfully on its cosets, and a plain coset enumeration produces that action. For an irreducible module the subspace is a hyperplane and the degree is only prime * |G|. Use this whenever such a hyperplane exists and its degree is manageable, and reduce the degree afterwards; a larger codimension is not worth it, as the degree then grows by a factor of prime per codimension and the reduction costs more than the search. For the L3(3) example above, Extensions drops from about 3400 to 120 seconds while the resulting degrees get no worse. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #6545 +/- ##
==========================================
- Coverage 78.97% 78.97% -0.01%
==========================================
Files 684 683 -1
Lines 294201 294160 -41
Branches 8670 8651 -19
==========================================
- Hits 232359 232323 -36
- Misses 60030 60033 +3
+ Partials 1812 1804 -8 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
hulpke
reviewed
Aug 31, 2026
hulpke
left a comment
Contributor
There was a problem hiding this comment.
The fundamental problem lies differently, namely in the MaximalAbelianQuotient method. This should use abelian rewriting, but the corresponding method (commented out, line 1143 in ghomfp.gi) had problems and thus was not ready for prime time.
This approach here is producing an initially horribly large permutation degree, larger than |G|. Is that what we want?
hulpke
pushed a commit
to hulpke/gap
that referenced
this pull request
Sep 1, 2026
Re-enable method for MaximalAbelianQuotient (that had thrown up problems in the general context) for special use here. This blows the kludge of gap-system#6545 out of the water.
hulpke
pushed a commit
to hulpke/gap
that referenced
this pull request
Sep 1, 2026
Re-enable method for MaximalAbelianQuotient (that had thrown up problems in the general context) for special use here. This blows the kludge of gap-system#6545 out of the water.
hulpke
pushed a commit
to hulpke/gap
that referenced
this pull request
Sep 1, 2026
Re-enable method for MaximalAbelianQuotient (that had thrown up problems in the general context) for special use here. This blows the kludge of gap-system#6545 out of the water.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The problem
Extensions(G,M)for a non-solvableGspends nearly all its time inFpGroupCocycle, finding a permutation representation of the extension --not in
TwoCohomologyGeneric. Reported by Thomas Breuer forL3(3)withits 7-dimensional
GF(3)module, where thecohomolopackage is an orderof magnitude faster overall:
Breakdown on my machine:
TwoCohomologyGeneric0.4 s, then 373 s foreach of the eight non-split cocycles.
The search lifts the quotient
E -> Gstep by step, testing subgroups ofdescending index and using
LargerQuotientBySubgroupAbelianization. For acandidate of index
ithe preimage's presentation is rewritten on roughlyi * ngensgenerators.L3(3)has nothing usable below index 52; theattempt at index 144 with 16 generators produces a presentation on some
2000 generators, and everything downstream chokes on it.
The change
If a subspace
Uof the module contains no nonzero submodule, then itscore in the extension is trivial -- a normal subgroup contained in
Ulies in the module and hence is a submodule. So the extension acts
faithfully on the cosets of
U, and one coset enumeration produces thataction. For an irreducible module
Uis a hyperplane, of indexprime * |G|.Two new helpers,
ModuleCoreOfSubspaceandSubmoduleFreeSubspace, findsuch a subspace;
FpGroupCocycleuses it before falling back to theexisting search.
Guards, each of which measurement showed to be necessary:
degree by
prime, and the degree reduction afterwards then costs morethan the old search. On the reducible 10-dimensional
GF(5)module fromtst/testbugfix/2025-11-06-PermrepExtension.tst: old 1 s, new 170 s.10^5(EXTENSION_COSET_ENUMERATION_MAXDEG).trivial and the enumeration degenerates to the regular representation.
:cheapskips the fullSmallerDegreePermutationRepresentationafterwards. Without the option that reduction is worth its price here,
because the degree coming out of the module is far off the optimum.
Numbers
Extensionsfor the example above, and the tests that cover this code:Extensions(L3(3), M)NrConjugacyClassesof all ninetst/teststandard/twocohom.tsttst/testbugfix/2025-11-06-PermrepExtension.tsttst/testextra/grpperm.tstFor reference, the
cohomoloroute on the same machine costs about 200 sfor the nine extensions, so this also removes the gap that prompted the
report.
Test
tst/teststandard/twocohom.tstgains the reported example, built withoutAtlasRepfrom the tensor square of the natural module ofSL(3,3). Itconstructs one of the nine extensions rather than all nine, which keeps it
at about 15 seconds -- against some 370 seconds on master.
Verification
PCore(.,3)elementary abelian oforder
3^7, quotient of order 5616, and exactly one of them splits.cohomoloproduces(3 x 57, 6 x 49).
twocohom.tst,2025-11-06-PermrepExtension.tst,2026-08-02-TwoCohomologyGeneric.tstandtestextra/grpperm.tstpass.C2,S3,A5with trivial, regular and reduciblemodules) produce degrees identical to master.
Not addressed here
TwoCohomologyGenericderives from the confluentrewriting system has 9 generators for
L3(3)where 2 suffice.cohomolo's extension presentation has 9 generators against our 16, andthat alone is worth a factor of about 7 when the generic
IsomorphismPermGroupis used on either.SmallerDegreePermutationRepresentation,roughly 8 s per extension;
cohomolopays the same.TwoCohomologyGeneric(TrivialGroup(IsPermGroup), <module of dim >= 2>)errors with
MaximumList: <list> must contain at least one element.Pre-existing, unrelated, not touched here.
This pull request was prepared with AI assistance (Claude Opus 5); see the
Co-authored-bytrailer on the commit.