// gettestwq.m : This program is analogous to gettestwords.m but is used for
// various quotient groups
// Compute the testwords for the 3-generator 5-group example,
// with normal closures of the generators having classes 4,4,1
d := 3; p := 5; cl := 2; // ngens; prime; class
P := pQuotientProcess( FreeGroup(d), p, cl : Exponent := p );
NextClass( ~P : Exponent := p, MaxOccurrence := [4,4,1] );
NextClass( ~P : Exponent := p, MaxOccurrence := [4,4,1] );
NextClass( ~P : Exponent := p, MaxOccurrence := [4,4,1] );
G := ExtractGroup(P); cl := pClass(P); lastg := pRanks(G)[cl];
wt3start := pRanks(G)[2]+1; wt2start := pRanks(G)[1]+1;
print "|B(3,5 : 5) mo441| = ", FactoredOrder(G);
G3 := sub< G | [ G.i : i in [wt3start..lastg] ] >; // G3 is gamma_3 of G
S := [ (a, G.i) : i in [wt2start..lastg] ] ; // S generates [a, gamma_2(G)]
extrasa := [];
for i := lastg to wt3start by -1 do
if G.i notin sub< G | S > then
Append( ~S, G.i ); Append( ~extrasa, G.i );
end if;
end for; //extrasa generates a complement for [a, gamma_2(G)] in gamma_3(G)
for i in [0..p-1] do
S := [ (a * (c,b)^i, G.k) : k in [wt2start..lastg] ] ;
if sub< G | S cat extrasa > ne G3 then
print i, "ARGGGHHHH!!!!!!";
end if;
end for;
S := [ (b, G.i) : i in [wt2start..lastg] ] ;
extrasb := [];
for i := lastg to wt3start by -1 do
if G.i notin sub< G | S > then
Append( ~S, G.i ); Append( ~extrasb, G.i );
end if;
end for;
for m in [0..p-1] do for i in [0..p-1] do
S := [ (a^m * b * (c,a)^i, G.k) : k in [wt2start..lastg] ] ;
if sub< G | S cat extrasb > ne G3 then
print m, i, "ARGGGHHHH!!!!!!";
end if;
end for; end for;
S := [ (c, G.i) : i in [ wt2start..lastg ] ] ;
extrasc := [];
for i := lastg to wt3start by -1 do
if G.i notin sub< G | S > then
Append( ~S, G.i ); Append( ~extrasc, G.i );
end if;
end for;
for m in [0..p-1] do for n in [0..p-1] do for i in [0..p-1] do
S := [ (a^m * b^n * c * (b,a)^i, G.k) : k in [wt2start..lastg] ] ;
if sub< G | S cat extrasc > ne G3 then
print m, n, i, "ARGGGHHHH!!!!!!";
end if;
end for; end for; end for;
Reverse(~extrasa); Reverse(~extrasb); Reverse(~extrasc);
//Compute first part of conjugacy class representatives
wts := [ PCClass(x) : x in extrasa ];
words := [];
for i in [0..4] do for j1 in [0..2] do for j2 in [0..2] do for j3 in [0..2] do
weight := 1 + 2*i + 3*(j1+j2+j3);
if weight gt 9 then continue; end if;
explen := 1 + i + j1+j2+j3;
if weight+5-explen gt 9 then continue; end if;
g := a * (c,b)^i * extrasa[1]^j1 * extrasa[2]^j2 * extrasa[3]^j3 ;
Append( ~words, g );
explen := explen+1;
for k in [4..#extrasa] do
if weight+wts[k] gt 9 then continue; end if;
if weight+wts[k]+5-explen gt 9 then continue; end if;
Append( ~words, g*extrasa[k] );
end for;
end for; end for; end for; end for;
//Compute second part of conjugacy class representatives
wts := [ PCClass(x) : x in extrasb ];
for m in [0..4] do for i in [0..4] do
for j1 in [0..2] do for j2 in [0..2] do for j3 in [0..2] do
weight := m + 1 + 2*i + 3*(j1+j2+j3);
if weight gt 9 then continue; end if;
explen := m + 1 + i + j1+j2+j3;
if weight+5-explen gt 9 then continue; end if;
g := a^m * b * (c,a)^i * extrasb[1]^j1 * extrasb[2]^j2 * extrasb[3]^j3 ;
Append(~words,g);
explen := explen+1;
for k in [4..#extrasb] do
if weight+wts[k] gt 9 then continue; end if;
if weight+wts[k]+5-explen gt 9 then continue; end if;
Append(~words,g*extrasb[k]);
end for;
end for; end for; end for; end for; end for;
//Compute third part of conjugacy class representatives
wts := [ PCClass(x) : x in extrasc ];
for m in [0..4] do for n in [0..4] do
if m+n eq 0 then continue; end if;
for i in [0..4] do for j1 in [0..2] do for j2 in [0..2] do
for j3 in [0..2] do for j4 in [0..2] do for j5 in [0..2] do
weight := m + n + 2*i + 3*(j1+j2+j3+j4+j5);
//Note that c does not contribute to the weight or exponent length.
if weight gt 9 then continue; end if;
explen := m + n + i + j1+j2+j3+j4+j5;
if weight+5-explen gt 9 then continue; end if;
g := a^m * b^n * c * (b,a)^i * extrasc[1]^j1 * extrasc[2]^j2
* extrasc[3]^j3 * extrasc[4]^j4 * extrasc[5]^j5;
Append( ~words, g );
explen := explen+1;
for k in [6..#extrasc] do
if weight+wts[k] gt 9 then continue; end if;
if weight+wts[k]+5-explen gt 9 then continue; end if;
Append( ~words, g*extrasc[k] );
end for;
end for; end for; end for; end for; end for; end for; end for; end for;
print #words, "testwords for B(3,5 : 5) mo441";
SetOutputFile( "twB35c5mo441" : Overwrite := true );
print "testwords := [";
for i in [1..#words-1] do print words[i],","; end for;
print words[#words],"];";
UnsetOutputFile();
// Compute the testwords for the 3-generator 5-group example
// with additional defining relators
F := FreeGroup(3);
Q := quo < F | (c,a,b), (c,b,b,b,a) >;
d := 3; p := 5; cl := 5; // ngens; prime; class
G := pQuotient( Q, p, cl : Exponent := p );
lastg := pRanks(G)[cl];
wt3start := pRanks(G)[2]+1; wt2start := pRanks(G)[1]+1;
print "|B(3,5 : 5) quotient| = ", FactoredOrder(G);
G3 := sub< G | [ G.i : i in [wt3start..lastg] ] >; // G3 is gamma_3 of G
S := [ (a, G.i) : i in [wt2start..lastg] ] ; // S = < [a, gamma_2(G)] >
extrasa := [];
for i := lastg to wt3start by -1 do
if G.i notin sub< G | S > then
Append( ~S, G.i ); Append( ~extrasa, G.i );
end if;
end for; //extrasa generates a complement for [a, gamma_2(G)] in gamma_3(G)
// Check that extrasa also generates a complement for
// [a * (c,b)^i, gamma_2(G)] in gamma_3(G)
for i in [0..p-1] do
S := [ (a * (c,b)^i, G.k) : k in [wt2start..lastg] ] ;
if sub< G | S cat extrasa > ne G3 then
print i, "ARGGGHHHH!!!!!!";
end if;
end for;
S := [ (b, G.i) : i in [wt2start..lastg] ] ;
extrasb := [];
for i := lastg to wt3start by -1 do
if G.i notin sub< G | S > then
Append( ~S, G.i ); Append( ~extrasb, G.i );
end if;
end for;
for m in [0..p-1] do for i in [0..p-1] do
S := [ (a^m * b * (c,a)^i, G.k) : k in [wt2start..lastg] ] ;
if sub< G | S cat extrasb > ne G3 then
print m, i, "ARGGGHHHH!!!!!!";
end if;
end for; end for;
//And now for c
S := [ (c, G.i) : i in [wt2start..lastg] ] ;
extrasc := [];
for i := lastg to wt3start by -1 do
if G.i notin sub< G | S > then
Append( ~S, G.i ); Append( ~extrasc, G.i );
end if;
end for;
for m in [0..p-1] do for n in [0..p-1] do for i in [0..p-1] do
S := [ (a^m * b^n * c * (b,a)^i, G.k) : k in [wt2start..lastg] ] ;
if sub< G | S cat extrasc > ne G3 then
print m, n, i, "ARGGGHHHH!!!!!!";
end if;
end for; end for; end for;
Reverse(~extrasa); Reverse(~extrasb); Reverse(~extrasc);
// Compute HVL09 conjugacy class representatives (3)
wts := [ PCClass(x) : x in extrasa ];
words := [];
for i in [0..4] do for j1 in [0..2] do for j2 in [0..2] do
for j3 in [0..2] do for j4 in [0..2] do for j5 in [0..2] do
weight := 1 + 2*i + 3*(j1+j2+j3+j4+j5);
if weight gt 9 then continue; end if;
explen := 1 + i + j1+j2+j3+j4+j5;
if weight+5-explen gt 9 then continue; end if;
g := a * (c,b)^i * extrasa[1]^j1 * extrasa[2]^j2 * extrasa[3]^j3
* extrasa[4]^j4 * extrasa[5]^j5;
Append( ~words, g );
explen := explen+1;
for k in [6..#extrasa] do
if weight+wts[k] gt 9 then continue; end if;
if weight+wts[k]+5-explen gt 9 then continue; end if;
Append( ~words, g*extrasa[k] );
end for;
end for; end for; end for; end for; end for; end for;
// Compute HVL09 conjugacy class representatives (4)
wts := [ PCClass(x) : x in extrasb ];
for m in [0..4] do for i in [0..4] do for j1 in [0..2] do for j2 in [0..2] do
for j3 in [0..2] do for j4 in [0..2] do for j5 in [0..2] do
weight := m + 1 + 2*i + 3*(j1+j2+j3+j4+j5);
if weight gt 9 then continue; end if;
explen := m + 1 + i + j1+j2+j3+j4+j5;
if weight+5-explen gt 9 then continue; end if;
g := a^m * b * (c,a)^i * extrasb[1]^j1 * extrasb[2]^j2 * extrasb[3]^j3
* extrasb[4]^j4 * extrasb[5]^j5;
Append( ~words, g );
explen := explen+1;
for k in [6..#extrasb] do
if weight+wts[k] gt 9 then continue; end if;
if weight+wts[k]+5-explen gt 9 then continue; end if;
Append( ~words, g*extrasb[k] );
end for;
end for; end for; end for; end for; end for; end for; end for;
// Compute HVL09 conjugacy class representatives (5)
wts := [ PCClass(x) : x in extrasc ];
for m in [0..4] do for n in [0..4] do
if m+n eq 0 then continue; end if;
for i in [0..4] do for j1 in [0..2] do for j2 in [0..2] do
for j3 in [0..2] do for j4 in [0..2] do for j5 in [0..2] do
weight := m + n + 2*i + 3*(j1+j2+j3+j4+j5);
//Note that c does not contribute to the weight or exponent length.
if weight gt 9 then continue; end if;
explen := m + n + i + j1+j2+j3+j4+j5;
if weight+5-explen gt 9 then continue; end if;
g := a^m * b^n * c * (b,a)^i * extrasc[1]^j1 * extrasc[2]^j2
* extrasc[3]^j3 * extrasc[4]^j4 * extrasc[5]^j5;
Append( ~words, g );
explen := explen+1;
for k in [6..#extrasc] do
if weight+wts[k] gt 9 then continue; end if;
if weight+wts[k]+5-explen gt 9 then continue; end if;
Append( ~words, g*extrasc[k] );
end for;
end for; end for; end for; end for; end for; end for; end for; end for;
print #words, "testwords for B(3,5 : 5) quotient";
SetOutputFile( "twB35c5q" : Overwrite := true );
print "testwords := [";
for i in [1..#words-1] do print words[i],","; end for;
print words[#words],"];";
UnsetOutputFile();
// Compute the testwords for the 3-generator 5-group example,
// with normal closures of the generators having classes 4,4,1
// and additional defining relators
F := FreeGroup(3);
Q := quo < F | (c,a,b), (c,b,b,b,a) >;
P := pQuotientProcess( Q, 5, 2 : Exponent := 5 );
NextClass( ~P : Exponent := p, MaxOccurrence := [4,4,1] );
NextClass( ~P : Exponent := p, MaxOccurrence := [4,4,1] );
NextClass( ~P : Exponent := p, MaxOccurrence := [4,4,1] );
G := ExtractGroup(P); cl := pClass(P); lastg := pRanks(G)[cl];
wt3start := pRanks(G)[2]+1; wt2start := pRanks(G)[1]+1;
print "|B(3,5 : 5) quotient mo441| = ", FactoredOrder(G);
G3 := sub< G | [ G.i : i in [ wt3start..lastg ] ] >; // G3 is gamma_3 of G
S := [ (a, G.i) : i in [wt2start..lastg] ] ; // S generates [a, gamma_2(G)]
extrasa := [];
for i := lastg to wt3start by -1 do
if G.i notin sub< G | S > then
Append( ~S, G.i ); Append( ~extrasa, G.i );
end if;
end for; //extrasa generates a complement for [a, gamma_2(G)] in gamma_3(G)
for i in [0..p-1] do
S := [ (a * (c,b)^i, G.k) : k in [wt2start..lastg] ] ;
if sub< G | S cat extrasa > ne G3 then
print i, "ARGGGHHHH!!!!!!";
end if;
end for;
S := [ (b, G.i) : i in [wt2start..lastg] ] ;
extrasb := [];
for i := lastg to wt3start by -1 do
if G.i notin sub< G | S > then
Append( ~S, G.i ); Append( ~extrasb, G.i );
end if;
end for;
for m in [0..p-1] do for i in [0..p-1] do
S := [ (a^m * b * (c,a)^i, G.k) : k in [wt2start..lastg] ] ;
if sub< G | S cat extrasb > ne G3 then
print m, i, "ARGGGHHHH!!!!!!";
end if;
end for; end for;
S := [ (c, G.i) : i in [ wt2start..lastg ] ] ;
extrasc := [];
for i := lastg to wt3start by -1 do
if G.i notin sub< G | S > then
Append( ~S, G.i ); Append( ~extrasc, G.i );
end if;
end for;
for m in [0..p-1] do for n in [0..p-1] do for i in [0..p-1] do
S := [ (a^m * b^n * c * (b,a)^i, G.k) : k in [wt2start..lastg] ] ;
if sub< G | S cat extrasc > ne G3 then
print m, n, i, "ARGGGHHHH!!!!!!";
end if;
end for; end for; end for;
Reverse(~extrasa); Reverse(~extrasb); Reverse(~extrasc);
//Compute first part of conjugacy class representatives
wts := [ PCClass(x) : x in extrasa ];
words := [];
for i in [0..4] do for j1 in [0..2] do for j2 in [0..2] do for j3 in [0..2] do
weight := 1 + 2*i + 3*(j1+j2+j3);
if weight gt 9 then continue; end if;
explen := 1 + i + j1+j2+j3;
if weight+5-explen gt 9 then continue; end if;
g := a * (c,b)^i * extrasa[1]^j1 * extrasa[2]^j2 * extrasa[3]^j3 ;
Append( ~words, g );
explen := explen+1;
for k in [4..#extrasa] do
if weight+wts[k] gt 9 then continue; end if;
if weight+wts[k]+5-explen gt 9 then continue; end if;
Append( ~words, g*extrasa[k] );
end for;
end for; end for; end for; end for;
//Compute second part of conjugacy class representatives
wts := [ PCClass(x) : x in extrasb ];
for m in [0..4] do for i in [0..4] do
for j1 in [0..2] do for j2 in [0..2] do for j3 in [0..2] do
weight := m + 1 + 2*i + 3*(j1+j2+j3);
if weight gt 9 then continue; end if;
explen := m + 1 + i + j1+j2+j3;
if weight+5-explen gt 9 then continue; end if;
g := a^m * b * (c,a)^i * extrasb[1]^j1 * extrasb[2]^j2 * extrasb[3]^j3 ;
Append(~words,g);
explen := explen+1;
for k in [4..#extrasb] do
if weight+wts[k] gt 9 then continue; end if;
if weight+wts[k]+5-explen gt 9 then continue; end if;
Append(~words,g*extrasb[k]);
end for;
end for; end for; end for; end for; end for;
//Compute third part of conjugacy class representatives
wts := [ PCClass(x) : x in extrasc ];
for m in [0..4] do for n in [0..4] do
if m+n eq 0 then continue; end if;
for i in [0..4] do for j1 in [0..2] do for j2 in [0..2] do
for j3 in [0..2] do for j4 in [0..2] do for j5 in [0..2] do
weight := m + n + 2*i + 3*(j1+j2+j3+j4+j5);
//Note that c does not contribute to the weight or exponent length.
if weight gt 9 then continue; end if;
explen := m + n + i + j1+j2+j3+j4+j5;
if weight+5-explen gt 9 then continue; end if;
g := a^m * b^n * c * (b,a)^i * extrasc[1]^j1 * extrasc[2]^j2
* extrasc[3]^j3 * extrasc[4]^j4 * extrasc[5]^j5;
Append( ~words, g );
explen := explen+1;
for k in [6..#extrasc] do
if weight+wts[k] gt 9 then continue; end if;
if weight+wts[k]+5-explen gt 9 then continue; end if;
Append( ~words, g*extrasc[k] );
end for;
end for; end for; end for; end for; end for; end for; end for; end for;
print #words, "testwords for B(3,5 : 5) quotient mo441";
SetOutputFile( "twB35c5qmo441" : Overwrite := true );
print "testwords := [";
for i in [1..#words-1] do print words[i],","; end for;
print words[#words],"];";
UnsetOutputFile();
// Compute the testwords for the 2-generator 7-group example
// with additional defining relators
// In this case we "hand select" complements!!!
F := FreeGroup(2);
Q := quo < F | (b,a,a,a,a,b),(b,a,a,a,a,a,b),(b,a,a,a,a,a,a,b),
(a,b,b,b,b,a),(a,b,b,b,b,b,a),(a,b,b,b,b,b,b,a) >;
d := 2; p := 7; cl := 8; // ngens; prime; class
G := pQuotient( Q, p, cl : Exponent := p );
print "|B(2,7 : 8) quotient| = ", FactoredOrder(G);
lastg := pRanks(G)[cl];
wt5start := pRanks(G)[4]+1; wt4start := pRanks(G)[3]+1;
G5 := sub< G | [ G.i : i in [ wt5start..lastg ] ] >; // G5 is gamma_5 of G
S := [ (a, G.i) : i in [wt4start..lastg] ] ; // S = < [a, gamma_4(G)] >
extrasa := [ G.38, G.37, G.35, G.33, G.31, G.27, G.26, G.21, G.20, G.18,
G.14, G.12, G.10 ];
//extrasa generates a complement for [a, gamma_4(G)] in gamma_5(G)
if sub< G | S cat extrasa > ne G5 then "FAIL 1"; end if;
if G.31 in sub< G | S > then "FAIL 1A"; end if;
// Confirm that this complement has the property claimed
for i in [0..p-1] do for j in [0..p-1] do
SS := [ (a * (b,a,b)^i * (b,a,b,b)^j, G.k) : k in [wt4start..lastg] ] ;
if sub< G | SS cat extrasa > ne G5 then
print i, j, "ARGGGHHHH!!!!!!";
end if;
end for; end for;
//Now do it for b
S := [ (b, G.i) : i in [wt4start..lastg] ] ;
extrasb :=
[ G.34, G.32, G.30, G.28, G.25, G.23, G.19, G.16, G.15, G.13, G.11, G.9 ];
if sub< G | S cat extrasb > ne G5 then "FAIL 2"; end if;
if G.32 in sub< G | S > then "FAIL 2A"; end if;
for m in [0..p-1] do for i in [0..p-1] do for j in [0..p-1] do
SS := [ (a^m * b * (b,a,a)^i * (b,a,a,a)^j, G.k) : k in [wt4start..lastg] ] ;
if sub< G | S cat extrasb > ne G5 then
print m, i, j, "ARGGGHHHH!!!!!!";
end if;
end for; end for; end for;
Reverse(~extrasa); Reverse(~extrasb); // We need extras in normal order
wts := [ PCClass(x) : x in extrasa ];
words := [];
for i in [0..p-1] do for j in [0..p-1] do
g := a * (b,a,b)^i * (b,a,b,b)^j;
weight := 1 + 3*i + 4*j;
explen := 1 + i + j;
//Apply Higman's Lemma
if weight gt 14 then continue; end if;
if explen gt 1 and explen lt 7 then
if weight+7-explen gt 14 then continue; end if;
end if;
Append( ~words, g );
explen := explen+1;
for k in [1..#extrasa] do
if weight+wts[k] gt 14 then continue; end if;
if weight+wts[k]+7-explen gt 14 then continue; end if;
Append( ~words, g*extrasa[k] );
end for;
end for; end for;
wts := [ PCClass(x) : x in extrasb ];
for m in [0..p-1] do for i in [0..p-1] do for j in [0..p-1] do
g := a^m * b * (b,a,a)^i * (b,a,a,a)^j;
weight := m + 1 + 3*i + 4*j;
explen := m + 1 + i + j;
if weight gt 14 then continue; end if;
if weight+7-explen gt 14 then continue; end if;
Append( ~words, g );
explen := explen+1;
for k in [1..#extrasb] do
if weight+wts[k] gt 14 then continue; end if;
if weight+wts[k]+7-explen gt 14 then continue; end if;
Append( ~words, g*extrasb[k] );
end for;
end for; end for; end for;
print #words, "testwords for B(2,7 : 8) quotient";
SetOutputFile( "twB27c8q" : Overwrite := true );
print "testwords := [";
for i in [1..#words-1] do print words[i], "," ; end for;
print words[#words], "];" ;
UnsetOutputFile();