%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%W  examples.tex        ACE appendix - examples          Alexander Hulpke
%W                                                      Joachim Neub"user
%W                                                            Greg Gamble
%%
%Y  Copyright (C) 2000  Centre for Discrete Mathematics and Computing
%Y                      Department of Information Tech. & Electrical Eng.
%Y                      University of Queensland, Australia.
%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Chapter{Examples}

In this chapter  we  collect  together  a  number  of  examples  which
illustrate the various ways in which the {\ACE} Package may  be  used,
and give some interactions with the `ACEExample' function. In a number
of cases, we have set the `InfoLevel' of `InfoACE' to 3, so  that  all
output from {\ACE} is displayed, prepended by ```\#I  '''. Recall that
to also see the commands directed *to* {\ACE} (behind a  ```ToACE> '''
prompt), you will need to set  the  `InfoACE'  level  to  4.  We  have
omitted the line

\beginexample
gap> LoadPackage("ace");
true

\endexample

which is,  of  course,  required  at  the  beginning  of  any  session
requiring {\ACE}.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Example where ACE is made the Standard Coset Enumerator}

If {\ACE} is made the standard coset enumerator, one simply  uses  the
method of passing arguments normally used  with  those  commands  that
invoke `CosetTableFromGensAndRels', but one is able to use all options
available via the {\ACE} interface. As an example  we  use  {\ACE}  to
compute the permutation representation of a  perfect  group  from  the
data library ({\GAP}'s perfect group library stores for each  group  a
presentation together with generators of a subgroup as  words  in  the
group generators such  that  the  permutation  representation  on  the
cosets  of  this  subgroup  will  be  a  (nice)  faithful  permutation
representation for the perfect group). The example we have  chosen  is
an extension of a group of order 16 by the  simple  alternating  group
$A_5$.

\beginexample
gap> TCENUM:=ACETCENUM;; # Make ACE the standard coset enumerator
gap> G := PerfectGroup(IsPermGroup, 16*60, 1   # Arguments ... as per usual
>                      : max := 50, mess := 10 # ... but we use ACE options
>                      );
A5 2^4
gap> GeneratorsOfGroup(G); # Just to show we indeed have a perm'n rep'n
[ (2,4)(3,5)(7,15)(8,14)(10,13)(12,16), (2,6,7)(3,11,12)(4,14,5)(8,9,13)(10,
    15,16), (1,2)(3,8)(4,9)(5,10)(6,7)(11,15)(12,14)(13,16), 
  (1,3)(2,8)(4,13)(5,6)(7,10)(9,16)(11,12)(14,15), 
  (1,4)(2,9)(3,13)(5,14)(6,15)(7,11)(8,16)(10,12), 
  (1,5)(2,10)(3,6)(4,14)(7,8)(9,12)(11,16)(13,15) ]
gap> Order(G);
960

\endexample

The call to `PerfectGroup' produced an output string  that  identifies
the group `G', but we didn't see  how  {\ACE}  became  involved  here.
Let's redo that part of the above  example  after  first  setting  the
`InfoLevel' of `InfoACE' to 3, so that we may get  to  glimpse  what's
going on behind the scenes.

\beginexample
gap> SetInfoLevel(InfoACE, 3); # Just to see what's going on behind the scenes
gap> # Recall that we did: TCENUM:=ACETCENUM;;
gap> G := PerfectGroup(IsPermGroup, 16*60, 1   # Arguments ... as per usual
>                      : max := 50, mess := 10 # ... but we use ACE options
>                      );
#I  ACE 3.001        Sun Sep 30 22:08:11 2001
#I  =========================================
#I  Host information:
#I    name = rigel
#I  ***
#I    #--- ACE 3.001: Run Parameters ---
#I  Group Name: G;
#I  Group Generators: abstuv;
#I  Group Relators: (a)^2, (s)^2, (t)^2, (u)^2, (v)^2, (b)^3, (st)^2, (uv)^2, 
#I    (su)^2, (sv)^2, (tu)^2, (tv)^2, asau, atav, auas, avat, Bvbu, Bsbvt, 
#I    Bubvu, Btbvuts, (ab)^5;
#I  Subgroup Name: H;
#I  Subgroup Generators: a, b;
#I  Wo:1000000; Max:50; Mess:10; Ti:-1; Ho:-1; Loop:0;
#I  As:0; Path:0; Row:1; Mend:0; No:21; Look:0; Com:10;
#I  C:0; R:0; Fi:11; PMod:3; PSiz:256; DMod:4; DSiz:1000;
#I    #---------------------------------
#I  SG: a=1 r=1 h=1 n=2; l=1 c=+0.00; m=1 t=1
#I  RD: a=11 r=1 h=1 n=12; l=2 c=+0.00; m=11 t=11
#I  RD: a=21 r=2 h=1 n=22; l=2 c=+0.00; m=21 t=21
#I  CC: a=29 r=4 h=1 n=31; l=2 c=+0.00; d=0
#I  CC: a=19 r=4 h=1 n=31; l=2 c=+0.00; d=0
#I  CC: a=19 r=6 h=1 n=36; l=2 c=+0.00; d=0
#I  INDEX = 16 (a=16 r=36 h=1 n=36; l=3 c=0.00; m=30 t=35)
#I  CO: a=16 r=17 h=1 n=17; c=+0.00
#I   coset ||      b      B      a      s      t      u      v
#I  -------+-------------------------------------------------
#I       1 ||      1      1      1      2      3      4      5
#I       2 ||     11     14      4      1      6      8      9
#I       3 ||     13     15      5      6      1     10     11
#I       4 ||      7      5      2      8     10      1      7
#I       5 ||      4      7      3      9     11      7      1
#I       6 ||      8     10      7      3      2     12     14
#I       7 ||      5      4      6     15     16      5      4
#I       8 ||     10      6      8      4     12      2     15
#I       9 ||     16     12     10      5     14     15      2
#I      10 ||      6      8      9     12      4      3     16
#I      11 ||     14      2     11     14      5     16      3
#I      12 ||      9     16     15     10      8      6     13
#I      13 ||     15      3     13     16     15     14     12
#I      14 ||      2     11     16     11      9     13      6
#I      15 ||      3     13     12      7     13      9      8
#I      16 ||     12      9     14     13      7     11     10
A5 2^4

\endexample

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Example of Using ACECosetTableFromGensAndRels}

The following example calls {\ACE} for up to 800 coset  numbers  (`max
:= 800') using Mendelsohn style relator processing (`mendelsohn')  and
sets progress messages to be printed every 500  iterations  (`messages
:=500'); we do ```SetInfoLevel(InfoACE, 3);''' so  that  we  may  see  these
messages.  The  value  of  `table',  i.e.~the  {\GAP}   coset   table,
immediately follows the last {\ACE}  message  (```\#I ''')  line,  but
both the coset table from {\ACE} and the {\GAP} coset table have  been
abbreviated. A  slightly  modified  version  of  this  example,  which
includes  the  `echo'  option  is  available  on-line  via  `table  :=
ACEExample("perf602p5");'. You may wish to peruse  the  notes  in  the
`ACEExample' index first, however, by executing `ACEExample();'. (Note
that the final table output here is `lenlex'  standardised.)

\beginexample
gap> SetInfoLevel(InfoACE, 3);     # So we can see the progress messages
gap> G := PerfectGroup(IsSubgroupFpGroup,2^5*60, 2);;# See previous example:
gap>                               # "Example where ACE is made the
gap>                               #  Standard Coset Enumerator"
gap> fgens := FreeGeneratorsOfFpGroup(G);;
gap> table := ACECosetTableFromGensAndRels(
>                 # arguments
>                 fgens, RelatorsOfFpGroup(G), fgens{[1]}
>                 # options
>                 : mendelsohn, max:=800, mess:=500);
#I  ACE 3.001        Sun Sep 30 22:10:10 2001
#I  =========================================
#I  Host information:
#I    name = rigel
#I  ***
#I    #--- ACE 3.001: Run Parameters ---
#I  Group Name: G;
#I  Group Generators: abstuvd;
#I  Group Relators: (s)^2, (t)^2, (u)^2, (v)^2, (d)^2, aad, (b)^3, (st)^2, 
#I    (uv)^2, (su)^2, (sv)^2, (tu)^2, (tv)^2, Asau, Atav, Auas, Avat, Bvbu, 
#I    dAda, dBdb, (ds)^2, (dt)^2, (du)^2, (dv)^2, Bubvu, Bsbdvt, Btbvuts, 
#I    (ab)^5;
#I  Subgroup Name: H;
#I  Subgroup Generators: a;
#I  Wo:1000000; Max:800; Mess:500; Ti:-1; Ho:-1; Loop:0;
#I  As:0; Path:0; Row:1; Mend:1; No:28; Look:0; Com:10;
#I  C:0; R:0; Fi:13; PMod:3; PSiz:256; DMod:4; DSiz:1000;
#I    #---------------------------------
#I  SG: a=1 r=1 h=1 n=2; l=1 c=+0.00; m=1 t=1
#I  RD: a=321 r=68 h=1 n=412; l=5 c=+0.00; m=327 t=411
#I  CC: a=435 r=162 h=1 n=719; l=9 c=+0.00; d=0
#I  CL: a=428 r=227 h=1 n=801; l=13 c=+0.00; m=473 t=800
#I  DD: a=428 r=227 h=1 n=801; l=14 c=+0.00; d=33
#I  CO: a=428 r=192 h=243 n=429; l=15 c=+0.00; m=473 t=800
#I  INDEX = 480 (a=480 r=210 h=484 n=484; l=18 c=0.00; m=480 t=855)
#I  CO: a=480 r=210 h=481 n=481; c=+0.00
#I   coset ||      a      A      b      B      s      t      u      v      d
#I  -------+---------------------------------------------------------------
#I       1 ||      1      1      7      6      2      3      4      5      1
#I       2 ||      4      4     22     36      1      8     10     11      2
... 476 lines omitted here ...
#I     479 ||    479    479    384    383    475    468    470    471    479
#I     480 ||    480    480    421    420    470    469    475    476    480
[ [ 1, 8, 13, 6, 7, 4, 5, 2, 34, 35, 32, 33, 3, 48, 49, 46, 47, 57, 59, 28, 
      21, 25, 62, 64, 22, 26, 66, 20, 67, 69, 74, 11, 12, 9, 10, 89, 65, 87, 
... 30 lines omitted here ...
      477, 438, 478, 446, 475, 479, 471, 473, 476, 469 ], 
  [ 1, 8, 13, 6, 7, 4, 5, 2, 34, 35, 32, 33, 3, 48, 49, 46, 47, 57, 59, 28, 
      21, 25, 62, 64, 22, 26, 66, 20, 67, 69, 74, 11, 12, 9, 10, 89, 65, 87, 
... 30 lines omitted here ...
      477, 438, 478, 446, 475, 479, 471, 473, 476, 469 ], 
... 363 lines omitted here ...
  [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 
      21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 
... 30 lines omitted here ...
      472, 473, 474, 475, 476, 477, 478, 479, 480 ] ]

\endexample

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Example of Using ACE Interactively (Using ACEStart)}

Now we illustrate a simple interactive process, with an enumeration of
an index 12 subgroup (isomorphic to $C_5$) within $A_5$. Observe  that
we  have  relied  on  the  default  level  of  messaging  from  {\ACE}
(`messages' = 0) which gives a result line (the  ```\#I  INDEX''' line
here) only, without parameter information. The result line is  visible
in the `Info'-ed component of the output  below  because  we  set  the
`InfoLevel' of `InfoACE' to a value of at least 2 (in fact we  set  it
to 3; doing ```SetInfoLevel(InfoACE, 2);''' would  make  *only*  the  result
line visible). We have however used the option `echo', so that we  can
see how the interface handled the arguments and options. On-line  try:
`SetInfoLevel(InfoACE, 3); ACEExample("A5-C5", ACEStart);' (this  is  nearly
equivalent to the sequence following, but the variables `F', `a', `b',
`G' are not accessible, being ``local'' to `ACEExample').

\beginexample
gap> SetInfoLevel(InfoACE, 3); # So we can see output from ACE binary
gap> F := FreeGroup("a","b");; a := F.1;;  b := F.2;;
gap> G := F / [a^2, b^3, (a*b)^5 ];
<fp group on the generators [ a, b ]>
gap> ACEStart(FreeGeneratorsOfFpGroup(G), RelatorsOfFpGroup(G), [a*b]
>          # Options
>          : echo, # Echo handled by GAP (not ACE)
>            enum := "A_5",  # Give the group G a meaningful name
>            subg := "C_5"); # Give the subgroup a meaningful name
ACEStart called with the following arguments:
 Group generators : [ a, b ]
 Group relators : [ a^2, b^3, a*b*a*b*a*b*a*b*a*b ]
 Subgroup generators : [ a*b ]
#I  ACE 3.001        Sun Sep 30 22:11:42 2001
#I  =========================================
#I  Host information:
#I    name = rigel
ACEStart called with the following options:
 echo := true (not passed to ACE)
 enum := A_5
 subg := C_5
#I  ***
#I  INDEX = 12 (a=12 r=16 h=1 n=16; l=3 c=0.00; m=14 t=15)
1

\endexample

The return value on the last line is an ``index'' that identifies  the
interactive process; we use this ``index'' with functions that need to
interact with the interactive {\ACE} process; we now demonstrate  this
with the interactive version of `ACEStats':

\beginexample
gap> ACEStats(1);
rec( index := 12, cputime := 0, cputimeUnits := "10^-2 seconds", 
  activecosets := 12, maxcosets := 14, totcosets := 15 )
gap> # Actually, we didn't need to pass an argument to ACEStats()
gap> # ... we could have relied on the default:
gap> ACEStats();
rec( index := 12, cputime := 0, cputimeUnits := "10^-2 seconds", 
  activecosets := 12, maxcosets := 14, totcosets := 15 )

\endexample

Similarly, we may use `ACECosetTable' with 0 or 1 arguments, which  is
the interactive version of `ACECosetTableFromGensAndRels',  and  which
returns a standard table.

\beginexample
gap> ACECosetTable(); # Interactive version of ACECosetTableFromGensAndRels()
#I  CO: a=12 r=13 h=1 n=13; c=+0.00
#I   coset ||      b      B      a
#I  -------+---------------------
#I       1 ||      3      2      2
#I       2 ||      1      3      1
#I       3 ||      2      1      4
#I       4 ||      8      5      3
#I       5 ||      4      8      6
#I       6 ||      9      7      5
#I       7 ||      6      9      8
#I       8 ||      5      4      7
#I       9 ||      7      6     10
#I      10 ||     12     11      9
#I      11 ||     10     12     12
#I      12 ||     11     10     11
[ [ 2, 1, 4, 3, 7, 8, 5, 6, 10, 9, 12, 11 ], 
  [ 2, 1, 4, 3, 7, 8, 5, 6, 10, 9, 12, 11 ], 
  [ 3, 1, 2, 5, 6, 4, 8, 9, 7, 11, 12, 10 ], 
  [ 2, 3, 1, 6, 4, 5, 9, 7, 8, 12, 10, 11 ] ]
gap> # To terminate the interactive process we do:
gap> ACEQuit(1); # Again, we could have omitted the 1
gap> # If we had more than one interactive process we could have
gap> # terminated them all in one go with:
gap> ACEQuitAll();

\endexample

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Fun with ACEExample}

First let's see the `ACEExample' index  (obtained  with  no  argument,
with  `"index"'  as  argument,  or  with  a  non-existent  example  as
argument):

\beginexample
gap> ACEExample();
#I                   ACEExample Index (Table of Contents)
#I                   ------------------------------------
#I  This table of possible examples is displayed when calling ACEExample 
#I  with no arguments, or with the argument: "index" (meant in the sense
#I  of `list'), or with a non-existent example name.
#I  
#I  The following ACE examples are available (in each case, for a subgroup
#I  H of a group G, the cosets of H in G are enumerated):
#I  
#I    Example          G                      H              strategy
#I    -------          -                      -              --------
#I    "A5"             A_5                    Id             default
#I    "A5-C5"          A_5                    C_5            default
#I    "C5-fel0"        C_5                    Id             felsch := 0
#I    "F27-purec"      F(2,7) = C_29          Id             purec
#I    "F27-fel0"       F(2,7) = C_29          Id             felsch := 0
#I    "F27-fel1"       F(2,7) = C_29          Id             felsch := 1
#I    "M12-hlt"        M_12 (Matthieu group)  Id             hlt
#I    "M12-fel1"       M_12 (Matthieu group)  Id             felsch := 1
#I    "SL219-hard"     SL(2,19)               ||G : H|| = 180  hard
#I    "perf602p5"      PerfectGroup(60*2^5,2) ||G : H|| = 480  default
#I  * "2p17-fel1"      ||G|| = 2^17             Id             felsch := 1
#I    "2p17-fel1a"     ||G|| = 2^17             ||G : H|| = 1    felsch := 1
#I    "2p17-2p3-fel1"  ||G|| = 2^17             ||G : H|| = 2^3  felsch := 1
#I    "2p17-2p14-fel1" ||G|| = 2^17             ||G : H|| = 2^14 felsch := 1
#I    "2p17-id-fel1"   ||G|| = 2^17             Id             felsch := 1
#I  * "2p18-fel1"      ||G|| = 2^18             ||G : H|| = 2    felsch := 1
#I  * "big-fel1"       ||G|| = 2^18.3           ||G : H|| = 6    felsch := 1
#I  * "big-hard"       ||G|| = 2^18.3           ||G : H|| = 6    hard
#I  
#I  Notes
#I  -----
#I  1. The example (first) argument of ACEExample() is a string; each
#I     example above is in double quotes to remind you to include them.
#I  2. By default, ACEExample applies ACEStats to the chosen example. You 
#I     may alter the ACE function used, by calling ACEExample with a 2nd 
#I     argument; choose from: ACECosetTableFromGensAndRels (or, equival-
#I     ently ACECosetTable), or ACEStart, e.g. `ACEExample("A5", ACEStart);'
#I  3. You may call ACEExample with additional ACE options (entered after a
#I     colon in the usual way for options), e.g. `ACEExample("A5" : hlt);' 
#I  4. Try the *-ed examples to explore how to modify options when an
#I     enumeration fails (just follow the instructions you get within the
#I     break-loop, or see Notes 2. and 3.).
#I  5. Try `SetInfoLevel(InfoACE, 3);' before calling ACEExample, to see the
#I     effect of setting the "mess" (= "messages") option.
#I  6. To suppress a long output, use a double semicolon (`;;') after the
#I     ACEExample command. (However, this does not suppress Info-ed output.)
#I  7. Also, try `SetInfoLevel(InfoACE, 2);' or `SetInfoLevel(InfoACE, 4);'
#I     before calling ACEExample.
gap> 

\endexample

Notice that the example we first met in Section~"Using ACE Directly to
Generate a Coset Table", the Fibonacci group F(2,7), is available  via
examples  `"F27-purec"',  `"F27-fel0"',  and  `"F27-fel1"'  (with  2nd
argument `ACECosetTableFromGensAndRels' to  produce  a  coset  table),
except that each of these enumerate the cosets of its trivial subgroup
(of index 29).  Let's  experiment  with  the  first  of  these  F(2,7)
examples; since this example uses the `messages' option, we  ought  to
set the `InfoLevel' of `InfoACE' to 3,  first,  but  since  the  coset
table is quite long, we will be content for the moment  with  applying
the default function `ACEStats' to the example.

Before exhibiting the example we list a few observations  that  should
be made. Observe that  the  first  group  of  `Info'  lines  list  the
commands that are executed; these lines are followed by the result  of
the `echo' option (see~"option echo"); which in turn are  followed  by
`Info' messages from {\ACE} courtesy of  the  non-zero  value  of  the
`messages'  option  (and  we  see  these  because  we  first  set  the
`InfoLevel' of `InfoACE'  to  3);  and  finally,  we  get  the  output
(record) of the `ACEStats' command.

Observe also that {\ACE} uses the same generators as  are input;  this
will always occur if you stick to single lowercase  letters  for  your
generator names. Note, also that capitalisation is used by {\ACE} as a
short-hand for inverses, e.g.~`C = c^-1' (see `Group Relators' in  the
{\ACE} ``Run Parameters'' block).

\beginexample
gap> SetInfoLevel(InfoACE, 3);
gap> ACEExample("F27-purec");
#I  # ACEExample "F27-purec" : enumeration of cosets of H in G,
#I  # where G = F(2,7) = C_29, H = Id, using purec strategy.
#I  #
#I  # F, G, a, b, c, d, e, x, y are local to ACEExample
#I  # We define F(2,7) on 7 generators
#I  F := FreeGroup("a","b","c","d","e", "x", "y"); 
#I       a := F.1;  b := F.2;  c := F.3;  d := F.4; 
#I       e := F.5;  x := F.6;  y := F.7;
#I  G := F / [a*b*c^-1, b*c*d^-1, c*d*e^-1, d*e*x^-1, 
#I            e*x*y^-1, x*y*a^-1, y*a*b^-1];
#I  ACEStats(
#I      FreeGeneratorsOfFpGroup(G), 
#I      RelatorsOfFpGroup(G), 
#I      [] # Generators of identity subgroup (empty list)
#I      # Options that don't affect the enumeration
#I      : echo, enum := "F(2,7), aka C_29", subg := "Id", 
#I      # Other options
#I      wo := "2M", mess := 25000, purec);
ACEStats called with the following arguments:
 Group generators : [ a, b, c, d, e, x, y ]
 Group relators : [ a*b*c^-1, b*c*d^-1, c*d*e^-1, d*e*x^-1, e*x*y^-1, 
  x*y*a^-1, y*a*b^-1 ]
 Subgroup generators : [  ]
#I  ACE 3.001        Sun Sep 30 22:16:08 2001
#I  =========================================
#I  Host information:
#I    name = rigel
ACEStats called with the following options:
 echo := true (not passed to ACE)
 enum := F(2,7), aka C_29
 subg := Id
 wo := 2M
 mess := 25000
 purec (no value, passed to ACE via option: pure c)
#I  ***
#I    #--- ACE 3.001: Run Parameters ---
#I  Group Name: F(2,7), aka C_29;
#I  Group Generators: abcdexy;
#I  Group Relators: abC, bcD, cdE, deX, exY, xyA, yaB;
#I  Subgroup Name: Id;
#I  Subgroup Generators: ;
#I  Wo:2M; Max:142855; Mess:25000; Ti:-1; Ho:-1; Loop:0;
#I  As:0; Path:0; Row:0; Mend:0; No:0; Look:0; Com:100;
#I  C:1000; R:0; Fi:1; PMod:0; PSiz:256; DMod:4; DSiz:1000;
#I    #---------------------------------
#I  DD: a=5290 r=1 h=1050 n=5291; l=8 c=+0.00; d=2
#I  CD: a=10410 r=1 h=2149 n=10411; l=13 c=+0.01; m=10410 t=10410
#I  DD: a=15428 r=1 h=3267 n=15429; l=18 c=+0.01; d=0
#I  DD: a=20430 r=1 h=4386 n=20431; l=23 c=+0.02; d=1
#I  DD: a=25397 r=1 h=5519 n=25399; l=28 c=+0.01; d=1
#I  CD: a=30313 r=1 h=6648 n=30316; l=33 c=+0.01; m=30313 t=30315
#I  DS: a=32517 r=1 h=7326 n=33240; l=36 c=+0.01; s=2000 d=997 c=4
#I  DS: a=31872 r=1 h=7326 n=33240; l=36 c=+0.00; s=4000 d=1948 c=53
#I  DS: a=29077 r=1 h=7326 n=33240; l=36 c=+0.00; s=8000 d=3460 c=541
#I  DS: a=23433 r=1 h=7326 n=33240; l=36 c=+0.01; s=16000 d=5940 c=2061
#I  DS: a=4163 r=1 h=7326 n=33240; l=36 c=+0.03; s=32000 d=447 c=15554
#I  INDEX = 29 (a=29 r=1 h=33240 n=33240; l=37 c=0.15; m=33237 t=33239)
rec( index := 29, cputime := 15, cputimeUnits := "10^-2 seconds", 
  activecosets := 29, maxcosets := 33237, totcosets := 33239 )

\endexample

Now let's see that we  can  add  some  new  options,  even  ones  that
over-ride the example's options; but first we'll reduce the  output  a
bit by setting the `InfoLevel' of `InfoACE' to 2 and since we are  not
going to observe any progress messages from {\ACE} with that `InfoACE'
level  we'll  set  `messages  :=  0';  also  we'll  use  the  function
`ACECosetTableFromGensAndRels' and so it's like  our  first  encounter
with F(2,7) we'll add the subgroup generator `c'  via  `sg  :=  ["c"]'
(see "option sg"). Observe that `"c"' is a string not a  {\GAP}  group
generator; to convert a list of {\GAP}  words  <sgens>  in  generators
<fgens>, suitable for  an  assignment  of  the  `sg'  option  use  the
construction: `ToACEWords(<fgens>, <sgens>)' (see~"ToACEWords").  Note
again that if  only  single  lowercase  letter  strings  are  used  to
identify the {\GAP} group generators, the same  strings  are  used  to
identify those generators in {\ACE}. (It's actually fortunate that  we
could pass the value of `sg' as a string here, since the generators of
each `ACEExample'  example  are  *local*  variables  and  so  are  not
accessible, though  we  could  call  `ACEExample'  with  2nd  argument
`ACEStart' and use `ACEGroupGenerators' to  get  at  them.)  For  good
measure, we also change the string identifying the subgroup (since  it
will no longer be the trivial group), via the `subgroup'  option  (see
"option subgroup").

In considering the example following, observe that in the `Info' block
all the original example options are listed along with our new options
`sg := [ "c" ], messages := 0' after the tag  ```\#  User  Options'''.
Following the `Info' block there is a block  due  to  `echo';  in  its
listing of the options first up there is `aceexampleoptions'  alerting
us that we passed some `ACEExample' options; observe also that in this
block `subg := Id' and `mess := 25000' disappear (they are over-ridden
by `subgroup := "\< c >", messages := 0', but the quotes for the value
of `subgroup' are not visible); note that we don't  have  to  use  the
same abbreviations for options to over-ride them.  Also  observe  that
our new options are *last*.

\beginexample
gap> SetInfoLevel(InfoACE, 2);
gap> ACEExample("F27-purec", ACECosetTableFromGensAndRels
>               : sg := ["c"], subgroup := "< c >", messages := 0);
#I  # ACEExample "F27-purec" : enumeration of cosets of H in G,
#I  # where G = F(2,7) = C_29, H = Id, using purec strategy.
#I  #
#I  # F, G, a, b, c, d, e, x, y are local to ACEExample
#I  # We define F(2,7) on 7 generators
#I  F := FreeGroup("a","b","c","d","e", "x", "y"); 
#I       a := F.1;  b := F.2;  c := F.3;  d := F.4; 
#I       e := F.5;  x := F.6;  y := F.7;
#I  G := F / [a*b*c^-1, b*c*d^-1, c*d*e^-1, d*e*x^-1, 
#I            e*x*y^-1, x*y*a^-1, y*a*b^-1];
#I  ACECosetTableFromGensAndRels(
#I      FreeGeneratorsOfFpGroup(G), 
#I      RelatorsOfFpGroup(G), 
#I      [] # Generators of identity subgroup (empty list)
#I      # Options that don't affect the enumeration
#I      : echo, enum := "F(2,7), aka C_29", subg := "Id", 
#I      # Other options
#I      wo := "2M", mess := 25000, purec, 
#I      # User Options
#I        sg := [ "c" ],
#I        subgroup := "< c >",
#I        messages := 0);
ACECosetTableFromGensAndRels called with the following arguments:
 Group generators : [ a, b, c, d, e, x, y ]
 Group relators : [ a*b*c^-1, b*c*d^-1, c*d*e^-1, d*e*x^-1, e*x*y^-1, 
  x*y*a^-1, y*a*b^-1 ]
 Subgroup generators : [  ]
ACECosetTableFromGensAndRels called with the following options:
 aceexampleoptions := true (inserted by ACEExample, not passed to ACE)
 echo := true (not passed to ACE)
 enum := F(2,7), aka C_29
 wo := 2M
 purec (no value, passed to ACE via option: pure c)
 sg := [ "c" ] (brackets are not passed to ACE)
 subgroup := < c >
 messages := 0
#I  INDEX = 1 (a=1 r=2 h=2 n=2; l=4 c=0.00; m=332 t=332)
[ [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], 
  [ 1 ], [ 1 ], [ 1 ], [ 1 ] ]

\endexample

\atindex{break-loop}{@\noexpand`break'-loop}\indextt{OnBreak}
Now following on from our last example we shall  demonstrate  how  one
can recover from a `break'-loop (see Section~"Using  ACE  Directly  to
Generate a Coset Table"). To force the `break'-loop we pass `max := 2'
(see~"option  max"),  while  using  the  {\ACE}   interface   function
`ACECosetTableFromGensAndRels' with `ACEExample'; in this way,  {\ACE}
will not be able to complete  the  enumeration,  and  hence  enters  a
`break'-loop when it tries to provide a complete  coset  table.  While
we're at it we'll pass the `hlt' (see~"option  hlt")  strategy  option
(which will over-ride `purec'). (The `InfoACE' level is still  2.)  To
avoid getting a trace-back during the `break'-loop (which can  look  a
little   scary   to   the   unitiated)   we   will    set    `OnBreak'
(see~"ref:OnBreak") as follows:

\beginexample
gap> NormalOnBreak := OnBreak;; # Save the old value to restore it later
gap> OnBreak := function() Where(0); end;;

\endexample

Note that there are  some  ``user-input''  comments  inserted  at  the
`brk>' prompt.

\beginexample
gap> ACEExample("F27-purec", ACECosetTableFromGensAndRels
>               : sg := ["c"], subgroup := "< c >", max := 2, hlt);
#I  # ACEExample "F27-purec" : enumeration of cosets of H in G,
#I  # where G = F(2,7) = C_29, H = Id, using purec strategy.
#I  #
#I  # F, G, a, b, c, d, e, x, y are local to ACEExample
#I  # We define F(2,7) on 7 generators
#I  F := FreeGroup("a","b","c","d","e", "x", "y"); 
#I       a := F.1;  b := F.2;  c := F.3;  d := F.4; 
#I       e := F.5;  x := F.6;  y := F.7;
#I  G := F / [a*b*c^-1, b*c*d^-1, c*d*e^-1, d*e*x^-1, 
#I            e*x*y^-1, x*y*a^-1, y*a*b^-1];
#I  ACECosetTableFromGensAndRels(
#I      FreeGeneratorsOfFpGroup(G), 
#I      RelatorsOfFpGroup(G), 
#I      [] # Generators of identity subgroup (empty list)
#I      # Options that don't affect the enumeration
#I      : echo, enum := "F(2,7), aka C_29", subg := "Id", 
#I      # Other options
#I      wo := "2M", mess := 25000, purec, 
#I      # User Options
#I        sg := [ "c" ],
#I        subgroup := "< c >",
#I        max := 2,
#I        hlt := true);
ACECosetTableFromGensAndRels called with the following arguments:
 Group generators : [ a, b, c, d, e, x, y ]
 Group relators : [ a*b*c^-1, b*c*d^-1, c*d*e^-1, d*e*x^-1, e*x*y^-1, 
  x*y*a^-1, y*a*b^-1 ]
 Subgroup generators : [  ]
ACECosetTableFromGensAndRels called with the following options:
 aceexampleoptions := true (inserted by ACEExample, not passed to ACE)
 echo := true (not passed to ACE)
 enum := F(2,7), aka C_29
 wo := 2M
 mess := 25000
 purec (no value, passed to ACE via option: pure c)
 sg := [ "c" ] (brackets are not passed to ACE)
 subgroup := < c >
 max := 2
 hlt (no value)
#I  OVERFLOW (a=2 r=1 h=1 n=3; l=4 c=0.00; m=2 t=2)
Error, no coset table ...
 the `ACE' coset enumeration failed with the result:
 OVERFLOW (a=2 r=1 h=1 n=3; l=4 c=0.00; m=2 t=2)
Entering break read-eval-print loop ...
 try relaxing any restrictive options
 e.g. try the `hard' strategy or increasing `workspace'
 type: '?strategy options' for info on strategies
 type: '?options for ACE' for info on options
 type: 'DisplayACEOptions();' to see current ACE options;
 type: 'SetACEOptions(:<option1> := <value1>, ...);'
 to set <option1> to <value1> etc.
 (i.e. pass options after the ':' in the usual way)
 ... and then, type: 'return;' to continue.
 Otherwise, type: 'quit;' to quit to outer loop.
brk> # Let's give ACE enough coset numbers to work with ...
brk> # and while we're at it see the effect of 'echo := 2' :
brk> SetACEOptions(: max := 0, echo := 2);
brk> # Let's check what the options are now:
brk> DisplayACEOptions();
rec(
  enum := "F(2,7), aka C_29",
  wo := "2M",
  mess := 25000,
  purec := true,
  sg := [ "c" ],
  subgroup := "< c >",
  hlt := true,
  max := 0,
  echo := 2 )

brk> # That's ok ... so now we 'return;' to escape the break-loop
brk> return;
ACECosetTableFromGensAndRels called with the following arguments:
 Group generators : [ a, b, c, d, e, x, y ]
 Group relators : [ a*b*c^-1, b*c*d^-1, c*d*e^-1, d*e*x^-1, e*x*y^-1, 
  x*y*a^-1, y*a*b^-1 ]
 Subgroup generators : [  ]
ACECosetTableFromGensAndRels called with the following options:
 enum := F(2,7), aka C_29
 wo := 2M
 mess := 25000
 purec (no value, passed to ACE via option: pure c)
 sg := [ "c" ] (brackets are not passed to ACE)
 subgroup := < c >
 hlt (no value)
 max := 0
 echo := 2 (not passed to ACE)
Other options set via ACE defaults:
 asis := 0
 compaction := 10
 ct := 0
 dmode := 0
 dsize := 1000
 fill := 1
 hole := -1
 lookahead := 1
 loop := 0
 mendelsohn := 0
 no := 0
 path := 0
 pmode := 0
 psize := 256
 row := 1
 rt := 1000
 time := -1
#I  INDEX = 1 (a=1 r=2 h=2 n=2; l=3 c=0.00; m=2049 t=3127)
[ [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], 
  [ 1 ], [ 1 ], [ 1 ], [ 1 ] ]

\endexample

Observe that  `purec'  did  *not*  disappear  from  the  option  list;
nevertheless, it *is* over-ridden by the `hlt' option (at  the  {\ACE}
level). Observe the  ```Other options set via ACE defaults''' list  of
options  that  has  resulted  from  having  the  `echo  :=  2'  option
(see~"option echo"). Observe, also, that  `hlt'  is  nowhere  near  as
good, here, as  `purec'  (refer  to  Section~"Using  ACE  Directly  to
Generate  a  Coset  Table"):  whereas  `purec'  completed   the   same
enumeration with a total number of coset numbers  of  332,  the  `hlt'
strategy required 3127.

Before we finish this section, let us say something about the examples
listed when one calls `ACEExample' with no arguments that have  a  `*'
beside them; these are examples for which  the  enumeration  fails  to
complete. The first such example  listed  is  `"2p17-fel1"',  where  a
group of order $2^{17}$ is enumerated over the identity subgroup  with
the `felsch := 1' strategy. The enumeration  fails  after  defining  a
total number of 416664 coset numbers. (In fact, the enumeration can be
made to succeed by simply increasing `workspace' to `"4700k"', but  in
doing so a total of  783255  coset  numbers  are  defined.)  With  the
example `"2p17-fel1a"' the same group is again enumerated, again  with
the `felsch := 1' strategy, but this time over the  group  itself  and
after tweaking a few options, to see how well we  can  do.  The  other
`"2p17-<XXX>"' examples are again enumerations of the same  group  but
over smaller and smaller subgroups, until we once again enumerate over
the identity subgroup but far more efficiently this time (only needing
to define a total of 550659 coset numbers, which can be achieved  with
`workspace' set to `"3300k"').

The other `*'-ed examples enumerate overgroups of the group  of  order
$2^{17}$ of the `"2p17-<XXX>"' examples. It's recommended that you try
these with second argument `ACECosetTableFromGensAndRels' so that  you
enter a `break'-loop, where you  can  experiment  with  modifying  the
options using `SetACEOptions'. The example `"2p18-fel1"' can  be  made
to succeed with `hard, mend, workspace := "10M"'; why don't you see if
you can do better! There  are  no  hints  for  the  other  two  `*'-ed
examples; they are exercises for you to try.

Let's now restore the original value of `OnBreak':

\beginexample
gap> OnBreak := NormalOnBreak;;

\endexample

Of course, running `ACEExample' with  `ACEStart'  as  second  argument
opens up far more flexibility. Try it! Have fun!  Play  with  as  many
options as you can. 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Using ACEReadResearchExample}

\indextt{PGRelFind}
Without an argument, the function `ACEReadResearchExample'  reads  the
file `"pgrelfind.g"' in the  `res-examples'  directory  which  defines
{\GAP} functions such as `PGRelFind', that were used in  \cite{CHHR01}
to show that the group $L_3(5)$ has deficiency 0.
%display{nonhtml}
%
%*Some background*
%enddisplay

The *deficiency* of a finite presentation $\{X \mid R\}$ of  a  finite
group $G$ is $|R| - |X|$, and the *deficiency* of the group $G$ is the
minimum of the deficiencies of all finite presentations of $G$.

%display{nonhtml}
%The following result (with a  constructive  proof)  is  Lemma  2.2  in
%\cite{CHHR01}.
%
%*Lemma*
%Let $G$ be a simple group with trivial Schur multiplier.  Suppose  $G$
%has a presentation of the form
%$$
%P = \{ a, b \mid a^2=1, b^p=1, w(a,b)=1\}
%$$
%with $p$ prime. Then $G$ has deficiency zero.
%
%Prior to the paper \cite{CHHR01} there remained just two simple groups
%with trivial Schur multiplier of order less than one  million,  namely
%$L_3(5)$ and $PSp_4(4)$, that had not been shown  to  have  deficiency
%zero. Using `TranslatePresentation' and `PGRelFind' the  question  for
%$L_3(5)$ is now settled, but whether $PSp_4(4)$ has  deficiency  0  is
%still open.
%
%We now sketch the method used in \cite{CHHR01} to show that  a  simple
%group $G$ with trivial Schur multiplier (in particular, $L_3(5)$)  has
%deficiency 0. We start with a known two-generator presentation of  the
%group  $G$,  on   say   $x$   and   $y$.   Then   an   invocation   of
%`TranslatePresentation' (which uses Tietze transformations) translates
%the presentation into a presentation on two new generators $a$ and $b$
%say, having several relators but for which the first two relators  are
%of form $a^2$ and $b^p$ for some prime $p$.  Finally,  `PGRelFind'  is
%invoked to find a presentation on the generators $a$ and $b$ found  by
%`TranslatePresentation' that contains $a^2$ and  $b^p$  and  just  one
%more relator. If the search by  `PGRelFind'  is  successful  then  the
%Lemma shows the group has deficiency zero.
%
%*Some details (what the file `pgrelfind.g' defines)*
%enddisplay

Let us now invoke `ACEReadResearchExample' with no arguments:

\beginexample
gap> ACEReadResearchExample();
#I  The following are now defined:
#I  
#I  Functions:
#I    PGRelFind, ClassesGenPairs, TranslatePresentation,
#I    IsACEResExampleOK
#I  Variables:
#I    ACEResExample, ALLRELS, newrels, F, a, b, newF, x, y,
#I    L2_8, L2_16, L3_3s, U3_3s, M11, M12, L2_32,
#I    U3_4s, J1s, L3_5s, PSp4_4s, presentations
#I  
#I  Also:
#I  
#I  TCENUM = ACETCENUM  (Todd-Coxeter Enumerator is now ACE)
#I  
#I  For an example of their application, you might like to try:
#I  gap> ACEReadResearchExample("doL28.g" : optex := [1,2,4,5,8]);
#I  (the output is 65 lines followed by a 'gap> ' prompt)
#I  
#I  For information type: ?Using ACEReadResearchExample
gap> 

\endexample

%display{nontext}
The output (`Info'-ed at `InfoACE' level 1) states that a number of new
functions are defined. During a  {\GAP}  session,  you  can  find  out
details of these functions by typing:

\begintt
gap> ?Using ACEReadResearchExample
\endtt

%enddisplay
%display{nonhtml}
%The output (`Info'-ed at `InfoACE' level 1) states  that  a  number  of
%functions and variables have been defined, which we will now describe.
%
%\>PGRelFind( <fgens>, <rels>, <sgens> ) F
%
%For the perfect *simple*  group  $S  =  \langle  <fgens>  \mid  <rels>
%\rangle$ with subgroup $\langle <sgens> \rangle$ where each element of
%the list <sgens> is a word  in  the  generators  <fgens>,  `PGRelFind'
%tries to find  a  third  relator  such  that  together  with  the  two
%order-defining relators of <fgens> a presentation on three relators is
%determined, and if successful returns a record with fields  `fgens  :=
%<fgens>', `rels' set to the new 3-relator list found,  and  `sgens  :=
%<sgens>'. <fgens> should be a list of two generators of a free  group,
%say `[<a>, <b>]';  <rels>  should  contain  words  in  the  generators
%<fgens>,  the  first  of  which  should  determine  that  <a>  is   an
%involution, and the second should determine that <b> is of  order  <p>
%for some prime <p>. The  subgroup  $\langle  <sgens>  \rangle$  should
%ideally  be  a  maximal  subgroup  of  $\langle  <fgens>  \mid  <rels>
%\rangle$. It turns out that one only needs to test for  relators  that
%are the products of an odd number of bi-syllables of form  $<a><b>^k$,
%for some integer $k$ in the range $1,\ldots,<p> - 1$. We will use  the
%term *bi-syllabic length* to mean the number of bi-syllables  of  form
%$<a><b>^k$ in such a relator. Furthermore, each relator we test can be
%assumed to have the prefix (which we  subsequently  call  the  <head>)
%$<a><b><a><b><a><b>^{-1}$ if <p> is 3, or $<a><b>$ otherwise.
%
%Each relator tested is of form `<head> *  <middle>  *  <tail>',  where
%each of <head>, <middle>, <tail> is a  word  of  integral  bi-syllabic
%length. Moreover,
%
%\beginlist%unordered
%
%\item{--} <head> is fixed (as mentioned above); 
%
%\item{--} all <tail>s of the opposite parity bi-syllabic length up  to
%a  maximum  prescribed  length  are  pre-computed  (since  <head>   is
%generally of odd bi-syllabic length, <tail>s  are  generally  of  even
%bi-syllabic length); and
%
%\item{--} the bi-syllabic length of  the  <middle>s  is  always  even,
%starting from an initial minimum <middle>  length  and  increasing  in
%steps of `<granularity> + 2', where <granularity> is defined to be the
%difference of the maximum and minimum bi-syllabic lengths of a  <tail>
%(see below).
%
%\endlist
%
%Since the <tail>s in general are not all of the  same  length,  it  is
%possible when a search is successful that the first relator  found  is
%not the  shortest.  Hence  searching  continues  until  a  relator  of
%shortest length can be guaranteed.
%
%To provide some user control  of  the  algorithm,  `PGRelFind'  has  a
%number of options (entered after the arguments and after  a  colon  in
%the usual way):
%
%\beginitems
%
%\quad`head := <head>' & 
%Redefines <head> which by default is `<a>*<b>*<a>*<b>*<a>/<b>' if  the
%order of <b> is 3, or `<a>*<b>' otherwise, where <a> and  <b>  are  as
%defined above; <head> must  be  a  word  consisting  of  `<a>*<b>^<k>'
%bi-syllables for integers <k>.
%
%\quad`Nrandom := <nOrFunc>' & 
%Sets the number of <middle>s to be generated  for  each  length  of  a
%<middle>; <nOrFunc> may be a non-negative integer or a single-argument
%function that returns a positive integer.
%
%&
%Each <middle> may be generated sequentially or randomly. If `<nOrFunc>
%=  0'  then  <middle>s   are   generated   sequentially   (and   hence
%exhaustively), as they are by default.  If  <nOrFunc>  is  a  positive
%integer then, for each bi-syllabic length  of  a  <middle>,  <nOrFunc>
%``random'' <middle>s are generated. If <nOrFunc> is a  single-argument
%function then  for  each  bi-syllabic length  <len>  of  a  <middle>,
%`<nOrFunc>(<len>)' ``random'' <middle>s are generated.
%
%\quad`ACEworkspace := <workspace>' & 
%Sets the option `workspace' used by {\ACE} to <workspace> when running
%the index check of the large subgroup. If the index is  right,  {\ACE}
%is set to use  `2*<workspace>'  to  check  the  index  of  the  cyclic
%subgroup $\langle <b> \rangle$. By  default,  <workspace>  is  set  to
%`10^6', which is too small for many  of  the  `do<XXX>.g'  files  (see
%below). Of course, groups for which {\ACE} overflows the workspace are
%indistinguishable from infinite groups, and one can't easily  be  sure
%whether a relator wasn't found because the workspace was too small  or
%because there wasn't one to be found.
%
%\quad`Ntails := <Ntails>' & 
%Sets the approximate number of <tail>s generated to  <Ntails>;  it  is
%used to set `maxTailLength' (described next); <Ntails> must a positive
%integer. The default behaviour is given by `<Ntails> = 2048'.
%
%\quad`maxTailLength := <len>' & 
%Sets the *intended* maximum bi-syllabic length of a <tail>  to  <len>;
%<len> must be a positive integer.
%
%&
%The default behaviour is given by `<len> = LogInt(<Ntails>, <orderb> -
%1)', where  <orderb>  is  the  order  of  <b>.  The  *actual*  maximum
%bi-syllabic length of a <tail> may be set 1 less, in order that it has
%the same parity as the minimum bi-syllabic length of a <tail>.
%
%\quad`minMiddleLength := <len>' & 
%Sets the minimum bi-syllabic length of a <middle> (which,  by  default
%is 0) to <len>; <len> should be a non-negative even integer.
%
%\quad`maxMiddleLength := <len>' & 
%Sets the *intended* maximum bi-syllabic length of a <middle> to <len>;
%<len> should be a positive integer.
%
%&
%The default behaviour is given by `<len> = 30'. The  *actual*  maximum
%bi-syllabic length of a <middle> is adjusted downwards  by  the  least
%amount necessary to ensure that the  difference  of  the  minimum  and
%maximum  bi-syllabic lengths  of   a   <middle>   is   divisible   by
%`<granularity> + 2'. (Recall that <granularity> is the  difference  of
%the maximum and minimum bi-syllabic lengths of a <tail>.)
%
%\enditems
%
%Please note that the relators tested are saved in the lists  `ALLRELS'
%and `newrels' (see~"ALLRELS").
%
%\>ClassesGenPairs( <G>, <orderx>, <ordery> ) F
%
%finds, and returns as a list of 2-element lists,  generator  pairs  of
%elements for the group <G> of  orders  <orderx>  and  <ordery>,  where
%<orderx> and <ordery> are positive integers.
%
%\>TranslatePresentation( <fgens>, <rels>, <sgens>, <newgens> ) F
%
%finds a new presentation, in terms of the  generators  <newgens>,  for
%the *simple* group $S = \langle <fgens>  \mid  <rels>  \rangle$,  with
%subgroup generated by <sgens>; <fgens> should  be  a  *pair*  of  free
%group generators; <rels>, <sgens> and <newgens>  should  be  lists  of
%words in <fgens>. Furthermore, <newgens>  should  be  a  list  of  two
%words, the first of which should be of even order and  the  second  of
%odd prime order in the group $S$. The idea is that,  by  using  Tietze
%transformations, the variables `x' and `y' (see~"x") are  assigned  to
%the words of <newgens>, which make up the new <fgens>, and <rels>  and
%<sgens>   are   written    in    terms    of    the    new    <fgens>,
%`TranslatePresentation' returns a record with fields  `fgens',  `rels'
%and `sgens' that are  the  new  values  of  <fgens>,  and  <rels>  and
%<sgens>, respectively.
%
%\>IsACEResExampleOK() F
%
%does a number of integrity  checks  and  tries  to  give  an  accurate
%diagnosis if something is wrong, returning  `true'  if  everything  is
%``OK''   and   `false'    otherwise.    It    is    called    whenever
%`ACEReadResearchExample' is executed and is not  intended  for  direct
%usage by users.
%
%\>`ACEResExample' V
%
%is initially set to  a  record  with  one  field  `filename'  whenever
%`ACEReadResearchExample' is executed and the value set to  that  field
%is the name of the file read by `ACEReadResearchExample'; other fields
%are set as the need arises. Essentially, it is  used  as  a  temporary
%variable store when `ACEReadResearchExample' reads a `do<XXX>.g' file.
%
%\>`ALLRELS' V
%\>`newrels' V
%
%are initially set to null lists. Each  time  `PGRelFind'  is  executed
%these each ``third'' relator tested is appended to `ALLRELS' and  each
%relator that is satisfied by the group  defined  by  the  <fgens>  and
%<rels> arguments  of  `PGRelFind'  (see~"PGRelFind")  is  appended  to
%`newrels'. The user should normally reset these  lists  back  to  null
%lists between invocations of `PGRelFind'.
%
%\>`F' V
%\>`a' V
%\>`b' V
%
%are the free group `F' and its two generators `a' and `b', used in the
%presentations described below.
%
%\>`newF' V
%\>`x' V
%\>`y' V
%
%are the free group `newF' and its two  generators  `x'  and  `y';  the
%record field `fgens' returned by `TranslatePresentation' is  the  list
%`[x, y]' (see~"TranslatePresentation").
%
%\>`L2_8' V
%\>`L2_16' V
%\>`L3_3s' V
%\>`U3_3s' V
%\>`M11' V
%\>`M12' V
%\>`L2_32' V
%\>`U3_4s' V
%\>`J1s' V
%\>`L3_5s' V
%\>`PSp4_4s' V
%
%contain  presentations  for  the  perfect  simple   groups   $L_2(8)$,
%$L_2(16)$, $L_3(3)$, $U_3(3)$, $M_{11}$, $M_{12}$, $L_2(32)$, $U_3(4)$,
%$J_1$, $L_3(5)$ and $PSp_4(4)$, respectively. Those with names  ending
%in `s'contain lists of records (the `s' is meant to suggest ``plural''),
%and those with no `s' are just single records, where each record has the
%following fields:
%
%\beginitems
%
%\quad`source' & 
%a citation giving the source from which the presentation was obtained,
%where `CCN85', `CMY79' and `CR84' indicate \cite{CCN85},  \cite{CMY79}
%and \cite{CR84}, respectively, and `Bray' indicates the website
%\URL{http://www.cix.co.uk/~vicarage/};
%
%\quad`rels' & 
%the relators of the group in terms  of  the  generators  `a'  and  `b'
%defined above (see~"a"); and
%
%\quad`sgens' & 
%the generators of a large (usually maximal) subgroup of the group,  in
%terms of the generators `a' and `b'.
%
%\enditems
%
%\>`presentations' V
%
%is a record whose fields are the names of the  presentation  variables
%of~"M11",     and     whose     values     are     the      variables,
%e.g.~`presentations.L2_16' is the same object as `L2_16'.
%
%*The `do<XXX>.g' files*
%
%Each `do<XXX>.g' file (other than the generic `doGrp.g')  had  a  name
%that is formed  by  taking  one  of  the  fields  of  `presentations',
%removing any  underscore  or  `s',  prepending  `"do"'  and  appending
%`".g"'; also, each requires that you run
%
%\beginexample
%gap> ACEReadResearchExample();
%\endexample
%
%first to define the functions described above. If  you  forget,  never
%mind~\dots~you will be reminded.
%
%Many of the outputs are fairly lengthy and you may wish to use `LogTo'
%(see~"ref:LogTo") in order to peruse the  output  at  leisure,  later.
%Also, for many of the larger groups  one  needs  to  be  able  to  set
%`ACEworkspace' larger than `10^6', but how  large?  The  investigation
%showing that $L_3(5)$ has deficiency 0 was run on an SGI  Origin  2000
%with 6.4 Gb of RAM and with `ACEworkspace' set to `10^8',  to  find  a
%``third'' relator of 23 bisyllables. It turns  out  however  that  one
%need  only  set  `ACEworkspace   :=   5   *   10^6'   to   find   that
%relator~\dots~one can be very knowledgeable in hindsight! In the  list
%below we give values for `ACEworkspace' that will succeed  in  finding
%the  shortest  ``third''  relator  that  we  found,  when  the  method
%succeeded. (Of course, `PGRelFind' runs a lot faster if the  workspace
%given to {\ACE} is kept small.)
%
%Recall `ACEReadResearchExample' expects a filename (i.e.~a string), or
%no argument; here are the *filenames* of the `do<XXX>.g' provided:
%
%\beginitems
%
%\quad`"doGrp.g"' &
%This allows the user to experiment with any of the  groups  that  have
%data in the `presentations' record. The user *must* supply a value for
%the following option:
%
%\qquad`grp := <presField>' &
%<presField> must be the  name  (i.e.~a  string)  of  a  field  in  the
%`presentations' record (this selects the group  to  be  investigated);
%and, possibly one or both of the following options:
%
%\qquad`n := <n>' &
%If <presField>, above, ends in `s'  then  the  user  *must*  supply  a
%positive integer <n> for `n', which indicates that the <n>th record of
%`presentations.(<presField>)' is desired.
%
%\qquad`newgens := <wordlist>' &
%<wordlist> must be a list of two words in the generators `a'  and  `b'
%which are  to  be  the  words  used  for  the  <newgens>  argument  of
%`TranslatePresentation'    (see~"TranslatePresentation"    for     the
%conditions they must satisfy). If `newgens' is  not  supplied,  it  is
%assumed that `TranslatePresentation'  is  not  needed,  i.e.~that  the
%generators `a' and `b' are already an involution and an element of odd
%prime order, respectively, and that  `PGRelFind'  may  be  immediately
%applied.
%
%&
%The user may also supply `PGRelFind' options, though unlike `grp'  and
%`newgens', they will not be directly observable in the output. 
%An example using both sets of options is given below.
%
%\quad`"doL28.g"' &
%This provides a nice small example. You  may  supply  any  `PGRelFind'
%options you wish, and/or you may use the following  option  which  has
%been specifically  designed  to  help  you  get  acquainted  with  the
%`PGRelFind' options (only the equivalent of the `optex'  options  will
%be explicitly observable in the output).
%
%\qquad`optex := <val>' &
%<val>  may  be  an  integer  or  a  list  of  integers  in  the  range
%$1,\ldots,8$. The output  of  `ACEReadResearchExample();'  suggests  a
%combination that is 65 lines long. Most of the  possible  choices  for
%`optex' give an output of the order of 100 to 200 lines,  which  isn't
%too bad if you have say an `xterm' window with the capacity to  scroll
%back.
%
%\quad`"doL216.g"' &
%As is the case with the remaining  `do<XXX>.g'  files,  there  are  no
%options other than those for `PGRelFind'.  It  is  sufficient  to  set
%`ACEworkspace := 2 * 10^4'.
%
%\quad`"doL33.g"' &
%It is sufficient to set `ACEworkspace := 2 * 10^4'.
%
%\quad`"doU33.g"' &
%Though   $U_3(3)$   is   known   to    have    deficiency    0,    the
%`TranslatePresentation'-`PGRelFind' method does not appear to be  able
%to demonstrate it.
%
%\quad`"doM11.g"' &
%`ACEworkspace' needs to be set to at least `6 * 10^6'.
%
%\quad`"doL232.g"' &
%It is sufficient to set `ACEworkspace := 5 * 10^4'.
%
%\quad`"doU34.g"' &
%It is sufficient to set `ACEworkspace := 5 * 10^4'.
%
%\quad`"doJ1.g"' &
%`ACEworkspace' needs to be set to at least `5 * 10^6'.
%
%\quad`"doL35.g"' &
%`ACEworkspace' needs to be set to at least `5 * 10^6'.
%
%\quad`"doPSp44.g"' &
%We were unable to determine whether $PSp_4(4)$ has deficiency  0,  via
%the `TranslatePresentation'-`PGRelFind' method.
%
%\enditems
%
%The following example shows that you can use both the options peculiar
%to  the  file  `doGrp.g'  and  the   options   of   `PGRelFind'   when
%`ACEReadResearchExample'   is   called   with   argument    (filename)
%`"doGrp.g"'.
%
%\beginexample
%gap> ACEReadResearchExample("doGrp.g"
%>                           : grp := "L2_8", newgens := [a^3*b, a^2*b],
%>                             head := x*y*x*y*x*y^-1*x*y*x*y);
%# IsACEResExampleOK() sets ACEResExample.grp     from options grp, n
%#                          ACEResExample.newgens from option  newgens
%gap> ACEResExample.G := TranslatePresentation([a, b],
%>                                             ACEResExample.grp.rels,
%>                                             ACEResExample.grp.sgens,
%>                                             ACEResExample.newgens);
%#I  there are 4 generators and 6 relators of total length 45
%#I  there are 2 generators and 4 relators of total length 55
%rec(
%  fgens := [ x, y ],
%  rels := [ x^2, y^3, y^-1*x*y^-1*x*y^-1*x*y^-1*x*y^-1*x*y^-1*x*y^-1*x, 
%      x*y^-1*x*y*x*y^-1*x*y*x*y^-1*x*y*x*y^-1*x*y*x*y*x*y^-1*x*y*x*y^
%        -1*x*y*x*y^-1*x*y*x*y^-1*x*y*x*y ],
%  sgens := [ x*y^-1 ] )
%gap> ACEResExample.Gn := PGRelFind(ACEResExample.G.fgens,
%>                                  ACEResExample.G.rels,
%>                                  ACEResExample.G.sgens);
%GroupOrder=504 SubgroupIndex=72
%#bisyllables in head = 5 head: x*y*x*y*x*y^-1*x*y*x*y
%Max #bisyllables in tail = 10 (granularity = 10)
%#bisyllables in middle = 0
%Candidate relator: x*y*x*y*x*y^-1*x*y*x*y*x*y^-1*x*y^-1*x*y*x*y*x*y*x*y^
%-1*x*y^-1*x*y^-1*x*y*x*y^-1
% #bisyllables = 15 (#bisyllables in tail = 10) #words tested: 1
%ACEStats:
%  index=72 cputime=10 ms maxcosets=98 totcosets=121
%Large subgroup index OK
%ACEStats for cyclic subgroup:
%  index=168 cputime=10 ms maxcosets=170 totcosets=232
%Cyclic subgroup index OK
%Success! ... new relator: 
%   x*y*x*y*x*y^-1*x*y*x*y*x*y^-1*x*y^-1*x*y*x*y*x*y*x*y^-1*x*y^-1*x*y^
%-1*x*y*x*y^-1
%... continuing (there may be a shorter relator).
%Candidate relator: x*y*x*y*x*y^-1*x*y*x*y*x*y^-1*x*y*x*y^-1*x*y^-1*x*y^
%-1*x*y*x*y*x*y*x*y^-1*x*y^-1
% #bisyllables = 15 (#bisyllables in tail = 10) #words tested: 1
%ACEStats:
%  index=72 cputime=10 ms maxcosets=102 totcosets=123
%Large subgroup index OK
%ACEStats for cyclic subgroup:
%  index=168 cputime=0 ms maxcosets=170 totcosets=236
%Cyclic subgroup index OK
%Success! ... new relator: 
%   x*y*x*y*x*y^-1*x*y*x*y*x*y^-1*x*y*x*y^-1*x*y^-1*x*y^-1*x*y*x*y*x*y*x*y^
%-1*x*y^-1
%... continuing (there may be a shorter relator).
%Middles of length 0 exhausted.
%Relator found of length 15, is shortest.
%rec(
%  gens := [ x, y ],
%  rels := 
%   [ x^2, y^3, x*y*x*y*x*y^-1*x*y*x*y*x*y^-1*x*y*x*y^-1*x*y^-1*x*y^-1*x*y*x*y*\
%x*y*x*y^-1*x*y^-1 ],
%  sgens := [ x*y^-1 ] )
%gap> 
%\endexample
%
%The following 
%
%\beginexample
%gap> ACEReadResearchExample("doGrp.g" : grp := "L3_3s", n := 1);
%\endexample
%
%is essentially equivalent to
%
%\beginexample
%gap> ACEReadResearchExample("doL33.g");
%\endexample
%
%Observe that the option `n' is needed because `grp' selects a list  of
%records (as indicated by the trailing `s' of `"L3_3s"'). Also, observe
%that the `newgens' option  was  not  used  since  we  already  have  a
%presentation where the generators `a' and `b' are an involution and of
%odd prime order, respectively. 
%enddisplay

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%E
