Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ensure fp groups for which Size successfully computes the order can also be enumerated (previously this could run out of memory) #5677

Merged
merged 3 commits into from
Apr 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion lib/grpfp.gd
Original file line number Diff line number Diff line change
Expand Up @@ -481,7 +481,7 @@ TCENUM:=GAPTCENUM;
## is an internal function which is called by the functions
## <Ref Oper="CosetTable"/>, <Ref Attr="CosetTableInWholeGroup"/>
## and others.
## It is, in fact, the proper working horse that performs a Todd-Coxeter
## It is, in fact, the workhorse that performs a Todd-Coxeter
## coset enumeration.
## <A>fgens</A> must be a set of free generators and <A>grels</A> a set
## of relators in these generators. <A>fsgens</A> are subgroup generators
Expand Down Expand Up @@ -1364,3 +1364,5 @@ DeclareGlobalFunction("MakeFpGroupToMonoidHomType1");

# used in homomorphisms
DeclareGlobalName("TRIVIAL_FP_GROUP");

DeclareAttribute("CyclicSubgroupFpGroup", IsFpGroup);
57 changes: 55 additions & 2 deletions lib/grpfp.gi
Original file line number Diff line number Diff line change
Expand Up @@ -1023,7 +1023,7 @@
#M CosetTableFromGensAndRels( <fgens>, <grels>, <fsgens> ) . . . . . . . . .
#M do a coset enumeration
##
## 'CosetTableFromGensAndRels' is the working horse for computing a coset
## 'CosetTableFromGensAndRels' is the workhorse for computing a coset
## table of H in G where G is a finitley presented group, H is a subgroup of
## G, and G is the whole group of H. It applies a Felsch strategy Todd-
## Coxeter coset enumeration. The expected parameters are
Expand Down Expand Up @@ -3790,15 +3790,26 @@
## enumerations with cumulatively bigger coset tables up to table size
## <maxtable>. It returns `fail' if no table could be found.
BindGlobal("FinIndexCyclicSubgroupGenerator",function(G,maxtable)
local fgens,grels,max,gens,t,Attempt,perms,short;
local fgens, grels, powers, max, gens, t, Attempt, perms, short;

fgens:=FreeGeneratorsOfFpGroup(G);
grels:=RelatorsOfFpGroup(G);

max:=ValueOption("max");
if max=fail then
max:=CosetTableDefaultMaxLimit;
fi;
max:=Minimum(max,maxtable);

powers := List(grels, ExtRepOfObj);
powers := Filtered(powers, x -> Length(x) = 2);
if not IsEmpty(powers) then
SortBy(powers, x -> x[2]);
if Last(powers)[2] > 10 then
max := Last(powers)[2];
fi;
fi;

# take the generators, most frequent first
gens:=GeneratorsOfGroup(G);
t:=MostFrequentGeneratorFpGroup(G);
Expand Down Expand Up @@ -3919,6 +3930,9 @@
RelatorsOfFpGroup(G),GeneratorsOfGroup(H),true,false:
cyclic:=true,limit:=1+max );
e:=NEWTC_CyclicSubgroupOrder(T);
SetCyclicSubgroupFpGroup(G, H);
# TODO is this correct?
SetAugmentedCosetTableMtcInWholeGroup(H, T);
if e=0 then
return infinity;
else
Expand Down Expand Up @@ -5507,6 +5521,45 @@
InstallMethod( Enumerator,"fp gp.", true,[IsSubgroupFpGroup and IsFinite],0,
G->RightTransversal(G,TrivialSubgroup(G)));

InstallMethod(Enumerator,
"for a finite subgroup of an f. p. group with known cyclic subgroup",
[IsSubgroupFpGroup and IsFinite and HasCyclicSubgroupFpGroup],
function(G)
local H, record;

H := CyclicSubgroupFpGroup(G);
if Size(H) = 1 then # Checking IsTrivial is slow
TryNextMethod();

Check warning on line 5532 in lib/grpfp.gi

View check run for this annotation

Codecov / codecov/patch

lib/grpfp.gi#L5532

Added line #L5532 was not covered by tests
fi;

record := rec(G_mod_H := RightTransversal(G, H),
H_mod_1 := RightTransversal(H, TrivialSubgroup(H)));

record.Length := enum -> Size(enum!.G_mod_H!.group);

record.NumberElement := function(enum, elt)
local n, r, q;
n := Size(enum!.G_mod_H!.subgroup);
q := PositionCanonical(enum!.G_mod_H, elt);
r := PositionCanonical(enum!.H_mod_1, elt * enum!.G_mod_H[q] ^ -1);
return (q - 1) * n + r;

Check warning on line 5545 in lib/grpfp.gi

View check run for this annotation

Codecov / codecov/patch

lib/grpfp.gi#L5542-L5545

Added lines #L5542 - L5545 were not covered by tests
end;

record.ElementNumber := function(enum, pos)
local n, r, q;
n := Size(enum!.G_mod_H!.subgroup);
r := RemInt(pos - 1, n) + 1;
q := QuoInt(pos - 1, n) + 1;
return enum!.H_mod_1[r] * enum!.G_mod_H[q];
end;

record.Membership := function(elt, enum)
return ElementsFamily(FamilyObj(enum)) = FamilyObj(elt);

Check warning on line 5557 in lib/grpfp.gi

View check run for this annotation

Codecov / codecov/patch

lib/grpfp.gi#L5557

Added line #L5557 was not covered by tests
end;

return EnumeratorByFunctions(G, record);
end);

InstallGlobalFunction(NewmanInfinityCriterion,function(G,p)
local GO,q,d,e,b,r,val,agemo,ngens;
if not IsPrimeInt(p) then
Expand Down
53 changes: 53 additions & 0 deletions tst/testbugfix/2024-03-16-FpGroups.tst
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
gap> F:=FreeGroup(2);; f1:=F.1;; f2:=F.2;;
gap> G := F / [ f2^100, f1^2, f2*f1*f2^-99*f1^-1 ];;
gap> Size(G);
200
gap> AsList(G);
[ <identity ...>, <[ [ 1, 1 ] ]|f2>, <[ [ 1, -1 ] ]|f2^-1>,
<[ [ 1, 2 ] ]|f2^2>, <[ [ 1, -2 ] ]|f2^-2>, <[ [ 1, 3 ] ]|f2^3>,
<[ [ 1, -3 ] ]|f2^-3>, <[ [ 1, 4 ] ]|f2^4>, <[ [ 1, -4 ] ]|f2^-4>,
<[ [ 1, 5 ] ]|f2^5>, <[ [ 1, -5 ] ]|f2^-5>, <[ [ 1, 6 ] ]|f2^6>,
<[ [ 1, -6 ] ]|f2^-6>, <[ [ 1, 7 ] ]|f2^7>, <[ [ 1, -7 ] ]|f2^-7>,
<[ [ 1, 8 ] ]|f2^8>, <[ [ 1, -8 ] ]|f2^-8>, <[ [ 1, 9 ] ]|f2^9>,
<[ [ 1, -9 ] ]|f2^-9>, <[ [ 1, 10 ] ]|f2^10>, <[ [ 1, -10 ] ]|f2^-10>,
<[ [ 1, 11 ] ]|f2^11>, <[ [ 1, -11 ] ]|f2^-11>, <[ [ 1, 12 ] ]|f2^12>,
<[ [ 1, -12 ] ]|f2^-12>, <[ [ 1, 13 ] ]|f2^13>, <[ [ 1, -13 ] ]|f2^-13>,
<[ [ 1, 14 ] ]|f2^14>, <[ [ 1, -14 ] ]|f2^-14>, <[ [ 1, 15 ] ]|f2^15>,
<[ [ 1, -15 ] ]|f2^-15>, <[ [ 1, 16 ] ]|f2^16>, <[ [ 1, -16 ] ]|f2^-16>,
<[ [ 1, 17 ] ]|f2^17>, <[ [ 1, -17 ] ]|f2^-17>, <[ [ 1, 18 ] ]|f2^18>,
<[ [ 1, -18 ] ]|f2^-18>, <[ [ 1, 19 ] ]|f2^19>, <[ [ 1, -19 ] ]|f2^-19>,
<[ [ 1, 20 ] ]|f2^20>, <[ [ 1, -20 ] ]|f2^-20>, <[ [ 1, 21 ] ]|f2^21>,
<[ [ 1, -21 ] ]|f2^-21>, <[ [ 1, 22 ] ]|f2^22>, <[ [ 1, -22 ] ]|f2^-22>,
<[ [ 1, 23 ] ]|f2^23>, <[ [ 1, -23 ] ]|f2^-23>, <[ [ 1, 24 ] ]|f2^24>,
<[ [ 1, -24 ] ]|f2^-24>, <[ [ 1, 25 ] ]|f2^25>, <[ [ 1, -25 ] ]|f2^-25>,
<[ [ 1, 26 ] ]|f2^26>, <[ [ 1, -26 ] ]|f2^-26>, <[ [ 1, 27 ] ]|f2^27>,
<[ [ 1, -27 ] ]|f2^-27>, <[ [ 1, 28 ] ]|f2^28>, <[ [ 1, -28 ] ]|f2^-28>,
<[ [ 1, 29 ] ]|f2^29>, <[ [ 1, -29 ] ]|f2^-29>, <[ [ 1, 30 ] ]|f2^30>,
<[ [ 1, -30 ] ]|f2^-30>, <[ [ 1, 31 ] ]|f2^31>, <[ [ 1, -31 ] ]|f2^-31>,
<[ [ 1, 32 ] ]|f2^32>, <[ [ 1, -32 ] ]|f2^-32>, <[ [ 1, 33 ] ]|f2^33>,
<[ [ 1, -33 ] ]|f2^-33>, <[ [ 1, 34 ] ]|f2^34>, <[ [ 1, -34 ] ]|f2^-34>,
<[ [ 1, 35 ] ]|f2^35>, <[ [ 1, -35 ] ]|f2^-35>, <[ [ 1, 36 ] ]|f2^36>,
<[ [ 1, -36 ] ]|f2^-36>, <[ [ 1, 37 ] ]|f2^37>, <[ [ 1, -37 ] ]|f2^-37>,
<[ [ 1, 38 ] ]|f2^38>, <[ [ 1, -38 ] ]|f2^-38>, <[ [ 1, 39 ] ]|f2^39>,
<[ [ 1, -39 ] ]|f2^-39>, <[ [ 1, 40 ] ]|f2^40>, <[ [ 1, -40 ] ]|f2^-40>,
<[ [ 1, 41 ] ]|f2^41>, <[ [ 1, -41 ] ]|f2^-41>, <[ [ 1, 42 ] ]|f2^42>,
<[ [ 1, -42 ] ]|f2^-42>, <[ [ 1, 43 ] ]|f2^43>, <[ [ 1, -43 ] ]|f2^-43>,
<[ [ 1, 44 ] ]|f2^44>, <[ [ 1, -44 ] ]|f2^-44>, <[ [ 1, 45 ] ]|f2^45>,
<[ [ 1, -45 ] ]|f2^-45>, <[ [ 1, 46 ] ]|f2^46>, <[ [ 1, -46 ] ]|f2^-46>,
<[ [ 1, 47 ] ]|f2^47>, <[ [ 1, -47 ] ]|f2^-47>, <[ [ 1, 48 ] ]|f2^48>,
<[ [ 1, -48 ] ]|f2^-48>, <[ [ 1, 49 ] ]|f2^49>, <[ [ 1, -49 ] ]|f2^-49>,
<[ [ 1, 50 ] ]|f2^50>, f1, f2*f1, f2^-1*f1, f2^2*f1, f2^-2*f1, f2^3*f1,
f2^-3*f1, f2^4*f1, f2^-4*f1, f2^5*f1, f2^-5*f1, f2^6*f1, f2^-6*f1, f2^7*f1,
f2^-7*f1, f2^8*f1, f2^-8*f1, f2^9*f1, f2^-9*f1, f2^10*f1, f2^-10*f1,
f2^11*f1, f2^-11*f1, f2^12*f1, f2^-12*f1, f2^13*f1, f2^-13*f1, f2^14*f1,
f2^-14*f1, f2^15*f1, f2^-15*f1, f2^16*f1, f2^-16*f1, f2^17*f1, f2^-17*f1,
f2^18*f1, f2^-18*f1, f2^19*f1, f2^-19*f1, f2^20*f1, f2^-20*f1, f2^21*f1,
f2^-21*f1, f2^22*f1, f2^-22*f1, f2^23*f1, f2^-23*f1, f2^24*f1, f2^-24*f1,
f2^25*f1, f2^-25*f1, f2^26*f1, f2^-26*f1, f2^27*f1, f2^-27*f1, f2^28*f1,
f2^-28*f1, f2^29*f1, f2^-29*f1, f2^30*f1, f2^-30*f1, f2^31*f1, f2^-31*f1,
f2^32*f1, f2^-32*f1, f2^33*f1, f2^-33*f1, f2^34*f1, f2^-34*f1, f2^35*f1,
f2^-35*f1, f2^36*f1, f2^-36*f1, f2^37*f1, f2^-37*f1, f2^38*f1, f2^-38*f1,
f2^39*f1, f2^-39*f1, f2^40*f1, f2^-40*f1, f2^41*f1, f2^-41*f1, f2^42*f1,
f2^-42*f1, f2^43*f1, f2^-43*f1, f2^44*f1, f2^-44*f1, f2^45*f1, f2^-45*f1,
f2^46*f1, f2^-46*f1, f2^47*f1, f2^-47*f1, f2^48*f1, f2^-48*f1, f2^49*f1,
f2^-49*f1, f2^50*f1 ]
Loading