home *** CD-ROM | disk | FTP | other *** search
/ Math Solutions 1995 October / Math_Solutions_CD-ROM_Walnut_Creek_October_1995.iso / pc / mac / discrete / doc / fpgrp.tex < prev    next >
Encoding:
Text File  |  1993-05-05  |  82.2 KB  |  1,731 lines

  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. %%
  3. %A  fpgrp.tex                   GAP documentation            Martin Schoenert
  4. %%
  5. %A  @(#)$Id: fpgrp.tex,v 3.6 1993/02/19 10:48:42 gap Exp $
  6. %%
  7. %Y  Copyright 1990-1992,  Lehrstuhl D fuer Mathematik,  RWTH Aachen,  Germany
  8. %%
  9. %%  This file describes finitely presented groups and  their  implementation.
  10. %%
  11. %H  $Log: fpgrp.tex,v $
  12. %H  Revision 3.6  1993/02/19  10:48:42  gap
  13. %H  adjustments in line length and spelling
  14. %H
  15. %H  Revision 3.5  1993/02/12  11:59:20  felsch
  16. %H  examples adjusted to line length 72
  17. %H
  18. %H  Revision 3.4  1993/02/11  17:46:09  martin
  19. %H  changed '@' to '&'
  20. %H
  21. %H  Revision 3.3  1993/02/02  14:59:29  felsch
  22. %H  examples fixed
  23. %H
  24. %H  Revision 3.2  1993/01/22  19:31:45  felsch
  25. %H  added RRS, MTC, and Tietze
  26. %H
  27. %H  Revision 3.1  1992/04/06  17:06:14  martin
  28. %H  initial revision under RCS
  29. %H
  30. %%
  31. \Chapter{Finitely Presented Groups}
  32.  
  33. A *finitely presented  group* is a group generated by a set  of *abstract
  34. generators*  subject  to  a  set  of  *relations* that  these  generators
  35. satisfy.  Each group can be represented as finitely presented group.
  36.  
  37. A  finitely presented  group is constructed as follows.  First create the
  38. abstract  generators with 'AbstractGenerator' (see  "AbstractGenerator").
  39. Then create the free group  generated by  those abstract generators  with
  40. 'Group' (see "Group").  Finally add the relations to the group.
  41.  
  42. |    gap> a := AbstractGenerator( "a" );
  43.     a
  44.     gap> b := AbstractGenerator( "b" );
  45.     b
  46.     gap> a5 := Group( a, b );
  47.     Group( a, b )
  48.     gap> a5.relators := [ a^2, b^3, (a*b)^5 ];
  49.     [ a^2, b^3, a*b*a*b*a*b*a*b*a*b ]
  50.     gap> Size( a5 );
  51.     60 |
  52.  
  53. Note  that the relations are entered as *relators*, i.e., as words in the
  54. abstract generators.  To  enter  an equation use the  quotient  operator,
  55. i.e., for the relation $a^b = ab$ you have to enter 'a\^b/(a\*b)'.
  56.  
  57. Alternatively you can use 'FreeGroup' (see "FreeGroup").
  58.  
  59. |    gap> a5 := FreeGroup( 2, "a5" );
  60.     Group( a5.1, a5.2 )
  61.     gap> a5.relators := [ a5.1^2, a5.2^3, (a5.1*a5.2)^5 ];
  62.     [ a5.1^2, a5.2^3, a5.1*a5.2*a5.1*a5.2*a5.1*a5.2*a5.1*a5.2*a5.1*a5.2 ]
  63.     gap> Size( a5 );
  64.     60 |
  65.  
  66. After you have  performed  *any* computation  with  a finitely  presented
  67. group you must  *not* change its relators any more.  If you want to use a
  68. different set of relators make a new group.
  69.  
  70. The  elements of  a  finitely presented  group are  words.  There  is one
  71. fundamental  problem  with  this.  Different words  can correspond to the
  72. same element in  a finitely presented  group.   For example in  the group
  73. 'a5'  defined  above,  'a'  and 'a\^3'  are  actually  the  same element.
  74. However,  'a' is not equal to  'a\^3' (in the  sense  that 'a  = a\^3' is
  75. 'false').   This  leads  to the  following  anomaly{\:}  'a\^3 in  a5' is
  76. 'true',  but 'a\^3 in Elements(a5)' is  'false'.   *Some  set  and  group
  77. functions  will not work correctly because of  this problem*.  You should
  78. therefore only use the functions mentioned in "Set Functions for Finitely
  79. Presented Groups" and "Group Functions for Finitely Presented Groups".
  80.  
  81. The first section in this chapter describes the function 'FreeGroup' that
  82. creates a free group (see "FreeGroup").  The next sections describe which
  83. set theoretic and group functions are implemented specially  for finitely
  84. presented  groups  and  how they  work  (see "Set  Functions for Finitely
  85. Presented Groups"  and  "Group Functions for Finitely Presented Groups").
  86. The next section describes the basic function 'CosetTableFpGroup' that is
  87. used  by  most   other  functions  for  finitely  presented  groups  (see
  88. "CosetTableFpGroup").  The next section describes how  you can compute  a
  89. permutation  group that is  a  homomorphic image of a finitely  presented
  90. group (see  "OperationCosetsFpGroup").  The final section  describes  the
  91. function that finds all subgroups of  a finitely presented group of small
  92. index (see "LowIndexSubgroupsFpGroup").
  93.  
  94. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  95. \Section{FreeGroup}
  96.  
  97. 'FreeGroup( <n> )' \\
  98. 'FreeGroup( <n>, <string> )'
  99.  
  100. 'FreeGroup' returns the free group on <n> generators.  The generators are
  101. displayed   as   '<string>.1',  '<string>.2',  ...,  '<string>.<n>'.   If
  102. <string> is missing it defaults to '\"f\"'.  If <string> is  the name  of
  103. the variable that you use to refer to  the group  returned by 'FreeGroup'
  104. you can also enter the generators as '<string>.<i>'.
  105.  
  106. |    gap> a5 := FreeGroup( 2, "a5" );
  107.     Group( a5.1, a5.2 )
  108.     gap> a5.relators := [ a5.1^2, a5.2^3, (a5.1*a5.2)^5 ];
  109.     [ a5.1^2, a5.2^3, a5.1*a5.2*a5.1*a5.2*a5.1*a5.2*a5.1*a5.2*a5.1*a5.2 ]
  110.     gap> Size( a5 );
  111.     60 |
  112.  
  113. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  114. \Section{Set Functions for Finitely Presented Groups}
  115. \index{Size!for finitely presented groups}
  116. \index{in!for finitely presented groups}
  117. \index{Elements!for finitely presented groups}
  118. \index{Intersection!for finitely presented groups}
  119.  
  120. Finitely  presented  groups  are  domains,  thus  in  principle  all  set
  121. theoretic  functions  are applicable to  them  (see  chapter  "Domains").
  122. However because words that are not equal may denote the same element of a
  123. finitely presented group  many  of them will  not work  correctly.   This
  124. sections  describes  which   set  theoretic  functions   are  implemented
  125. specially for finitely presented  groups and  how they work.   You should
  126. *not*  use the  set  theoretic functions  that are not mentioned  in this
  127. section.
  128.  
  129. The  general  information that  enables {\GAP} to  work  with a  finitely
  130. presented  group  <G>  is  a  *coset  table*  (see  "CosetTableFpGroup").
  131. Basically a coset table is the permutation representation of the finitely
  132. presented group on the cosets of a  subgroup (which need  not be faithful
  133. if the subgroup has a  nontrivial core).  Most of the functions below use
  134. the regular representation of <G>, i.e., the coset table  of <G> over the
  135. trivial subgroup.  Such  a coset  table is computed  by a  method  called
  136. *coset enumeration*.
  137.  
  138. \vspace{5mm} 'Size( <G> )'
  139.  
  140. The size is simply the degree of the regular representation of <G>.
  141.  
  142. \vspace{5mm}
  143. '<w> in <G>'
  144.  
  145. A word <w> lies  in a parent  group <G> if  all its letters are among the
  146. generators of <G>.
  147.  
  148. \vspace{5mm}
  149. '<w> in <H>'
  150.  
  151. To test whether a word <w> lies in a subgroup <H> of a finitely presented
  152. group <G>, {\GAP}  computes the  coset table of <G> over  <H>.   Then  it
  153. tests whether the permutation one gets by replacing each generator of <G>
  154. in <w> with the corresponding permutation is trivial.
  155.  
  156. \vspace{5mm}
  157. 'Elements( <G> )'
  158.  
  159. The elements of a finitely presented  group are computed by computing the
  160. regular representation of <G>.  Then for  each  point <p> {\GAP} adds the
  161. smallest word <w> that, when viewed  as a permutation, takes  1 to <p> to
  162. the set of elements.  Note that this implies  that each word in  the  set
  163. returned is the smallest word that denotes an element of <G>.
  164.  
  165. \vspace{5mm}
  166. 'Elements( <H> )'
  167.  
  168. The elements  of  a  subgroup <H> of a  finitely presented group  <G> are
  169. computed by computing the elements of <G> and returning those that lie in
  170. <H>.
  171.  
  172. \vspace{5mm}
  173. 'Intersection( <H1>, <H2> )'
  174.  
  175. The intersection of two subgroups <H1> and  <H2>  of a finitely presented
  176. group <G> is computed as follows.  First {\GAP} computes the coset tables
  177. of <G> over <H1> and <H2>.  Then it computes the tensor product  of those
  178. two permutation representations.  The coset table of the  intersection is
  179. the   transitive   constituent   of   1  in   this  tensored  permutation
  180. representation.  Finally {\GAP} computes a set of Schreier generators for
  181. the  intersection  by  performing  another coset  enumeration  using  the
  182. already complete  coset  table.   The intersection  is  returned  as  the
  183. subgroup generated by those Schreier generators.
  184.  
  185. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  186. \Section{Group Functions for Finitely Presented Groups}
  187. \index{Order!for finitely presented groups}
  188. \index{Index!for finitely presented groups}
  189. \index{Normalizer!for finitely presented groups}
  190. \index{CommutatorFactorGroup!for finitely presented groups}
  191. \index{AbelianInvariants!for finitely presented groups}
  192.  
  193. Finitely presented groups  are after  all groups, thus  in  principle all
  194. group functions are  applicable  to them (see chapter "Groups").  However
  195. because  words  that are  not  equal  may denote  the same element  of  a
  196. finitely presented group many of  them  will  not  work correctly.   This
  197. sections describes which group  functions are implemented  specially  for
  198. finitely  presented groups and how they  work.  You should *not* use  the
  199. group functions that are not mentioned in this section.
  200.  
  201. The  general  information that  enables {\GAP} to  work  with a  finitely
  202. presented  group  <G>  is  a  *coset  table*  (see  "CosetTableFpGroup").
  203. Basically a coset table is the permutation representation of the finitely
  204. presented group on the cosets of a  subgroup (which need  not be faithful
  205. if the subgroup has a  nontrivial core).  Most of the functions below use
  206. the regular representation of <G>, i.e., the coset table  of <G> over the
  207. trivial subgroup.  Such  a coset  table is computed  by a  method  called
  208. *coset enumeration*.
  209.  
  210. \vspace{5mm}
  211. 'Order( <G>, <g> )'
  212.  
  213. The  order of an  element <g> is computed by translating the element into
  214. the  regular  permutation representation and computing the order of  this
  215. permutation (which is the length of the cycle of 1).
  216.  
  217. \vspace{5mm}
  218. 'Index( <G>, <H> )'
  219.  
  220. The index of  a subgroup <H> in a  finitely presented group <G> is simply
  221. the  degree of  the  permutation  representation of the group  <G> on the
  222. cosets of <H>.
  223.  
  224. \vspace{5mm}
  225. 'Normalizer( <G>, <H> )'
  226.  
  227. The normalizer of a subgroup <H> of a finitely presented group <G> is the
  228. union of those cosets of <H> in <G> that are fixed by all  the generators
  229. of <H> when  viewed as permutations in  the permutation representation of
  230. <G> on the  cosets  of <H>.   The normalizer is returned as the  subgroup
  231. generated by the generators of <H> and representatives of such cosets.
  232.  
  233. \vspace{5mm}
  234. 'CommutatorFactorGroup( <G> )'
  235.  
  236. The commutator factor group of a finitely presented group <G> is returned
  237. as a  new finitely presented group.  The relations of this group are  the
  238. relations  of <G> plus  the  commutator of all the pairs of generators of
  239. <G>.
  240.  
  241. \vspace{5mm}
  242. 'AbelianInvariants( <G> )'
  243.  
  244. The abelian invariants  of  a  abelian finitely presented group  (e.g., a
  245. commutator  factor group of an arbitrary  finitely presented  group)  are
  246. computed by  building the relation matrix of  <G> and  transforming  this
  247. matrix    to    diagonal   form    with   'ElementaryDivisorsMat'    (see
  248. "ElementaryDivisorsMat").
  249.  
  250. The following  functions  are  not  implemented  specially  for  finitely
  251. presented groups,  but  they work  nevertheless.   However,  you probably
  252. should not use them for larger finitely presented groups.
  253.  
  254. 'Core( <G>, <U> )' \\
  255. 'SylowSubgroup( <G>, <p> )' \\
  256. 'FittingSubgroup( <G> )'
  257.  
  258. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  259. \Section{CosetTableFpGroup}
  260.  
  261. 'CosetTableFpGroup( <G>, <H> )'
  262.  
  263. 'CosetTableFpGroup' returns the  coset  table of the  finitely  presented
  264. group <G> on the cosets of the subgroup <H>.
  265.  
  266. Basically a coset table is the permutation representation of the finitely
  267. presented group on the cosets of a subgroup  (which need  not be faithful
  268. if the subgroup has a nontrivial  core).  Most  of  the set theoretic and
  269. group functions use the regular  representation of <G>, i.e.,  the  coset
  270. table of <G> over the trivial subgroup.
  271.  
  272. The coset table is  returned as a list of  lists.   For each generator of
  273. <G> and  its inverse the table  contains  a generator list.   A generator
  274. list is simply a list of integers.  If <l> is the  generator list for the
  275. generator <g> and '<l>[<i>] = <j>' then generator <g> takes the coset <i>
  276. to the coset <j> by multiplication from the  right.  Thus the permutation
  277. representation of  <G>  on  the  cosets of <H>  is  obtained by  applying
  278. 'PermList' to each  generator list (see "PermList").   The coset table is
  279. standardized,  i.e., the cosets are  sorted with  respect to the smallest
  280. word that lies in each coset.
  281.  
  282. |    gap> a5 := FreeGroup( 2, "a5" );
  283.     Group( a5.1, a5.2 )
  284.     gap> a5.relators := [ a5.1^2, a5.2^3, (a5.1*a5.2)^5 ];
  285.     [ a5.1^2, a5.2^3, a5.1*a5.2*a5.1*a5.2*a5.1*a5.2*a5.1*a5.2*a5.1*a5.2 ]
  286.     gap> CosetTableFpGroup( a5,
  287.     >            Subgroup( a5, [ a5.1, a5.2*a5.1*a5.2*a5.1*a5.2^-1 ] ) );
  288.     [ [ 1, 3, 2, 5, 4 ],
  289.       [ 1, 3, 2, 5, 4 ],    # inverse of above, 'a5.1' is an involution
  290.       [ 2, 4, 3, 1, 5 ],
  291.       [ 4, 1, 3, 2, 5 ] ]   # inverse of above
  292.     gap> List( last, PermList );
  293.     [ (2,3)(4,5), (2,3)(4,5), (1,2,4), (1,4,2) ] |
  294.  
  295. The coset  table is  computed by a method called *coset enumeration*.   A
  296. *Felsch strategy* is used to decide how to define new cosets.
  297.  
  298. The  variable  'CosetTableFpGroupDefaultLimit'  determines  for  how many
  299. cosets   the  table  has   initially   room.   'CosetTableFpGroup'   will
  300. automatically  extend this table if need arises, but this is an expensive
  301. operation.  Thus  you  should  set 'CosetTableFpGroupDefaultLimit' to the
  302. number of cosets that  you expect will be  needed at most.   However  you
  303. should not set it too  high, otherwise too much space will be used by the
  304. coset table.
  305.  
  306. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  307. \Section{OperationCosetsFpGroup}
  308.  
  309. 'OperationCosetsFpGroup( <G>, <H> )'
  310.  
  311. 'OperationCosetsFpGroup'  returns the  permutation  representation of the
  312. finitely  presented group <G>  on  the  cosets of  the subgroup  <H> as a
  313. permutation group.  Note that this permutation representation is faithful
  314. if and only if <H> has a trivial core in <G>.
  315.  
  316. |    gap> a5 := FreeGroup( 2, "a5" );
  317.     Group( a5.1, a5.2 )
  318.     gap> a5.relators := [ a5.1^2, a5.2^3, (a5.1*a5.2)^5 ];
  319.     [ a5.1^2, a5.2^3, a5.1*a5.2*a5.1*a5.2*a5.1*a5.2*a5.1*a5.2*a5.1*a5.2 ]
  320.     gap> OperationCosetsFpGroup( a5,
  321.     >            Subgroup( a5, [ a5.1, a5.2*a5.1*a5.2*a5.1*a5.2^-1 ] ) );
  322.     Group( (2,3)(4,5), (1,2,4) )
  323.     gap> Size( last );
  324.     60 |
  325.  
  326. 'OperationCosetsFpGroup'   simply  calls   'CosetTableFpGroup',   applies
  327. 'PermList' to each  row  of the table, and returns the group generated by
  328. those permutations (see "CosetTableFpGroup", "PermList").
  329.  
  330. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  331. \Section{LowIndexSubgroupsFpGroup}
  332.  
  333. 'LowIndexSubgroupsFpGroup( <G>, <H>, <index> )'
  334.  
  335. 'LowIndexSubgroupsFpGroup'  returns a  list  of  representatives  of  the
  336. conjugacy classes of  subgroups of the finitely presented  group <G> that
  337. contain the subgroup <H> of <H> and that have index less than or equal to
  338. <index>.
  339.  
  340. |    gap> a5 := FreeGroup( 2, "a5" );; a5.name := "a5";;
  341.     gap> a5.relators := [ a5.1^2, a5.2^3, ( a5.1*a5.2 )^5 ];;
  342.     gap> s := LowIndexSubgroupsFpGroup( a5, TrivialSubgroup( a5 ), 12 );
  343.     [ a5, Subgroup( a5, [ a5.1, a5.2*a5.1*a5.2^-1 ] ), 
  344.       Subgroup( a5, [ a5.1, a5.2*a5.1*a5.2*a5.1^-1*a5.2^-1 ] ), 
  345.       Subgroup( a5, [ a5.1, a5.2*a5.1*a5.2*a5.1*a5.2^-1*a5.1^-1*a5.2^-1 
  346.          ] ), Subgroup( a5, [ a5.2*a5.1^-1 ] ) ]
  347.     gap> List( s, h -> Index( a5, h ) );
  348.     [ 1, 6, 5, 10, 12 ]    # the indices of the subgroups
  349.     gap> List( s, h -> Index( a5, Normalizer( a5, h ) ) );
  350.     [ 1, 6, 5, 10, 6 ]    # the lengths of the conjugacy classes |
  351.  
  352. 'LowIndexSubgroupsFpGroup'  systematically  constructs  all   permutation
  353. representations of <G>.  How large you  can choose <index> depends on the
  354. presentation  of  <G>,  but  you  should  be  careful.   Usually the time
  355. required grows exponentially with <index>.
  356.  
  357. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  358. \Section{Presentation Records}%
  359.  
  360. In  {\GAP}, *finitely presented  groups*  are  distinguished  from *group
  361. presentations* which are {\GAP} objects of their own and which are stored
  362. in *presentation  records*.  The reason  is that very often presentations
  363. have to be changed (e.g. simplified) by Tietze transformations, but since
  364. in  these new  generators  and relators are introduced, all  words in the
  365. generators of a finitely presented group would also have to be changed if
  366. such  a  Tietze  transformation  were  applied to  the presentation of  a
  367. finitely presented group.  Therefore, in {\GAP} the presentation defining
  368. a finitely presented group is never changed; changes are only allowed for
  369. group presentations  which  are  not  considered  to  define a particular
  370. group.
  371.  
  372. {\GAP}  offers a bundle of commands to perform  Tietze transformations on
  373. finite   group    presentations    (see    "SimplifiedFpGroup",   "Tietze
  374. Transformations").  In  order  to speed  up the respective routines,  the
  375. relators in such a presentation record are  not represented  by  ordinary
  376. {\GAP} words, but by lists of positive or negative generator numbers.
  377.  
  378. The term \"*Tietze  record*\"  will  sometimes  be  used as  an alias for
  379. \"*presentation record*\".  It  occurs, in particular, in  certain  error
  380. messages.  \index{Tietze record}
  381.  
  382. The following  two  commands can be used to create a presentation  record
  383. from a  finitely presented group  or, vice  versa, to  create a  finitely
  384. presented group from a presentation.
  385.  
  386. \vspace{5mm}
  387. 'PresentationFpGroup( <G> )'
  388. \index{PresentationFpGroup} \\
  389. 'PresentationFpGroup( <G>, <printlevel> )'
  390.  
  391. 'PresentationFpGroup' returns a presentation record containing a copy  of
  392. the  presentation of the given finitely presented group  <G> on the  same
  393. set of generators.
  394.  
  395. The  optional <printlevel> parameter can be used to restrict or to extend
  396. the amount  of  output provided by  Tietze  transformation  commands when
  397. being applied to the created presentation record.  The default value 1 is
  398. designed  for  interactive  use  and  implies  explicit  messages  to  be
  399. displayed  by most of  these  commands.   A <printlevel> value of  0 will
  400. suppress these messages, whereas a <printlevel>  value of 2  will enforce
  401. some additional output.
  402.  
  403. \vspace{5mm}
  404. 'FpGroupPresentation( <P> )'
  405. \index{FpGroupPresentation}
  406.  
  407. 'FpGroupPresentation' returns a  finitely presented group defined  by the
  408. presentation in the given presentation record <P>.
  409.  
  410. If some presentation record <P>, say, contains a large presentation, then
  411. it  would  be nasty  to  wait for  the end of an  unintentionally started
  412. printout of all of its components (or, more precisely, of  its  component
  413. '<P>.tietze' which contains  the essential lists).   Therefore,  whenever
  414. you use the standard print  facilities  to display a presentation record,
  415. {\GAP}  will  provide just  one line of text  containing  the  number  of
  416. generators, the number of relators, and the total length of all relators.
  417. Of course, you may use the 'RecFields' and 'PrintRec' commands to display
  418. all components of <P>.
  419.  
  420. In  addition, you may  use  the  following commands to extract and  print
  421. different amounts of information from a presentation record.
  422.  
  423. \vspace{5mm}
  424. 'TzPrintStatus( <P> )'
  425. \index{TzPrintStatus}
  426.  
  427. 'TzPrintStatus'  prints the current  state of a presentation record  <P>,
  428. i.e., the number of generators,  the  number of relators, and  the  total
  429. length of all relators.
  430.  
  431. If  you are working  interactively,  you can get the same  information by
  432. just typing '<P>;'
  433.  
  434. \vspace{5mm}
  435. 'TzPrintGenerators( <P> )'
  436. \index{TzPrintGenerators} \\
  437. 'TzPrintGenerators( <P>, <list> )'
  438.  
  439. 'TzPrintGenerators'   prints  the  current  list  of   generators  of   a
  440. presentation record <P>, providing for each generator its name, the total
  441. number of its  occurrences in the relators,  and,  if  that generator  is
  442. known to be an involution, an appropriate message.
  443.  
  444. If a  list  <list> has  been  specified as  second argument,  then  it is
  445. expected to be  a list of the position  numbers  of  the generators to be
  446. printed.  <list> need not be sorted and  may  contain duplicate elements.
  447. The generators are printed in  the order in which and  as often as  their
  448. numbers occur in <list>.  Position  numbers out of range (with respect to
  449. the list of generators) will be ignored.
  450.  
  451. \vspace{5mm}
  452. 'TzPrintRelators( <P> )'
  453. \index{TzPrintRelators} \\
  454. 'TzPrintRelators( <P>, <list> )'
  455.  
  456. 'TzPrintRelators' prints the current list of relators  of  a presentation
  457. record <P>.
  458.  
  459. If  a  list  <list>  has been specified  as  second argument, then it  is
  460. expected  to  be a list  of the position numbers  of the  relators  to be
  461. printed.  <list> need  not be sorted  and may contain duplicate elements.
  462. The relators are printed in  the order  in  which  and as often  as their
  463. numbers occur in <list>.  Position numbers out of range  (with respect to
  464. the list of relators) will be ignored.
  465.  
  466. \vspace{5mm}
  467. 'TzPrintPresentation( <P> )'
  468. \index{TzPrintPresentation}
  469.  
  470. 'TzPrintPresentation' prints the current lists of generators and relators
  471. and the current state of a presentation record <P>.  In fact, the command
  472.  
  473. |    TzPrintPresentation( P ) |
  474.  
  475. is an abbreviation of the command sequence
  476.  
  477. |    Print( "generators:\n" ); TzPrintGenerators( P );
  478.     Print( "relators:\n" ); TzPrintRelators( P );
  479.     TzPrintStatus( P ); |
  480.  
  481. \vspace{5mm}
  482. 'TzPrint( <P> )'
  483. \index{TzPrint} \\
  484. 'TzPrint( <P>, <list> )'
  485.  
  486. 'TzPrint' provides a  kind of  *fast print out* for a presentation record
  487. <P>.
  488.  
  489. Remember that  in order to  speed up  the Tietze transformation routines,
  490. each relator in a presentation record  <P> is internally represented by a
  491. list of positive or negative generator  numbers, i.e., each factor of the
  492. proper  {\GAP}  word  is  represented  by  the  position  number  of  the
  493. corresponding  generator with respect to the current list of  generators,
  494. or by the respective negative  number, if  the factor is the inverse of a
  495. generator which  is not known to be an involution.   In  contrast  to the
  496. commands  'TzPrintRelators'  and  'TzPrintPresentation'  described above,
  497. 'TzPrint' does not  convert these lists back to the corresponding  {\GAP}
  498. words.
  499.  
  500. 'TzPrint' prints the  current  list  of  generators,  and  then  for each
  501. relator its length and its internal representation as a list  of positive
  502. or negative generator numbers.
  503.  
  504. If  a  list  <list> has been specified  as  second  argument, then it  is
  505. expected to  be a list of  the position  numbers of the  relators  to  be
  506. printed.  <list> need not be sorted  and may contain  duplicate elements.
  507. The relators are printed  in the order  in which and  as  often  as their
  508. numbers occur in <list>.  Position numbers out  of range (with respect to
  509. the list of relators) will be ignored.
  510.  
  511. There are  three more  print commands for presentation records  which are
  512. convenient  in  the  context  of  the interactive  Tietze  transformation
  513. commands\:
  514.  
  515. \vspace{5mm}
  516. 'TzPrintLengths( <P> )'
  517.  
  518. See "Tietze Transformations".
  519.  
  520. \vspace{5mm}
  521. 'TzPrintPairs( <P> )' \\
  522. 'TzPrintPairs( <P>, <n> )'
  523.  
  524. See "Tietze Transformations".
  525.  
  526. \vspace{5mm}
  527. 'TzPrintOptions( <P> )'
  528.  
  529. See "Tietze Transformations".
  530.  
  531. \vspace{5mm}
  532. 'Save( <file>, <P>, <name> )'
  533. \index{Save!for presentation records}
  534.  
  535. 'Save' writes the  presentation  record  <P> to the file <file> in such a
  536. way that the file can be read by {\GAP}.  This allows you, in particular,
  537. to restart a computation with  the current  presentation not only in  the
  538. present, but also  in a later  {\GAP} session.  Then, when you  read  the
  539. file, a copy of <P> will be  assigned to  the variable  specified by  the
  540. argument <name> in the current call of the 'Save' command.
  541.  
  542. Example.
  543.  
  544. |    gap> a := AbstractGenerator("a");; b := AbstractGenerator("b");;
  545.     gap> G := Group( [ a, b ], IdWord );;
  546.     gap> G.relators :=
  547.     >    [ a^2, b^7, Comm(a,a^b), Comm(a,a^(b^2))*(a^b)^-1 ];;
  548.     gap> P := PresentationFpGroup( G );
  549.     << presentation with 2 gens and 4 rels of total length 30 >>
  550.     gap> TzPrintGenerators( P );
  551.     &I  1.  a   11 occurrences   involution
  552.     &I  2.  b   19 occurrences
  553.     gap> TzPrintRelators( P );
  554.     &I  1. a^2
  555.     &I  2. b^7
  556.     &I  3. a*b^-1*a*b*a*b^-1*a*b
  557.     &I  4. a*b^-2*a*b^2*a*b^-2*a*b*a*b
  558.     gap> TzPrint( P );
  559.     &I  generators: [ a, b ]
  560.     &I  relators:
  561.     &I  1.  2  [ 1, 1 ]
  562.     &I  2.  7  [ 2, 2, 2, 2, 2, 2, 2 ]
  563.     &I  3.  8  [ 1, -2, 1, 2, 1, -2, 1, 2 ]
  564.     &I  4.  13  [ 1, -2, -2, 1, 2, 2, 1, -2, -2, 1, 2, 1, 2 ]
  565.     gap> TzPrintStatus( P );
  566.     &I  there are 2 generators and 4 relators of total length 30
  567.     gap> Save( "checkpoint", P, "P0" );
  568.     gap> Read( "checkpoint" );
  569.     &I  presentation record P0 read from file
  570.     gap> P0;
  571.     << presentation with 2 gens and 4 rels of total length 30 >> |
  572.  
  573. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  574. \Section{Changing Presentations}%
  575.  
  576. The  commands  described  in  this section  can be  used  to  change  the
  577. presentation in a presentation record.   Note that, in general, they will
  578. change the  isomorphism  type  of the  group defined by the presentation.
  579. Hence,  though they  sometimes  are  called  as  subroutines  by Tiet\-ze
  580. transformation     commands    like    'TzSubstitute'    (see     "Tietze
  581. Transformations"),   they   do  *not*   perform   Tietze  transformations
  582. themselves.
  583.  
  584. \vspace{5mm}
  585. 'AddGenerator( <P> )'
  586. \index{AddGenerator} \\
  587. 'AddGenerator( <P>, <generator> )'
  588.  
  589. 'AddGenerator' adds a new generator to the list of generators.
  590.  
  591. If you don\'t specify a second argument, then  'AddGenerator' will define
  592. a  new  abstract  generator  '\_x<i>'  and save  it  in a  new  component
  593. '<P>.<i>' of  the  given  presentation  record  where  <i>  is the  least
  594. positive  integer which  has  not  yet  been used as a  generator number.
  595. Though this  new generator will be printed as '\_x<i>',  you will have to
  596. use the external variable '<P>.<i>' if you want to access it.
  597.  
  598. If you  specify a second  argument, then <generator> must be  an abstract
  599. generator which does  not yet occur in the presentation.   'AddGenerator'
  600. will add it to the presentation and save  it in a new component '<P>.<i>'
  601. in the same way as described for \_x<i> above.
  602.  
  603. \vspace{5mm}
  604. 'AddRelator( <P>, <word> )'
  605. \index{AddRelator}
  606.  
  607. 'AddRelator' adds  the word <word> to the list of  relators.  <word> must
  608. be a word in the generators of the given presentation.
  609.  
  610. \vspace{5mm}
  611. 'RemoveRelator( <P>, <n> )'
  612. \index{RemoveRelator}
  613.  
  614. 'RemoveRelator'  removes the <n>th relator and  then resorts the  list of
  615. relators in the given presentation record <P>.
  616.  
  617. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  618. \Section{Subgroup Presentations}
  619.  
  620. 'PresentationSubgroupRrs( <G>, <H> )'
  621. \index{PresentationSubgroupRrs} \\
  622. 'PresentationSubgroupRrs( <G>, <H>, <string> )'
  623.  
  624. 'PresentationSubgroupRrs'    returns   a    presentation   record    (see
  625. "Presentation Records") containing a presentation for the subgroup <H> of
  626. the    finitely   presented   group   <G>.    It   uses    the    Reduced
  627. Reidemeister-Schreier method to construct this presentation.
  628. \index{Reduced Reidemeister-Schreier}
  629.  
  630. The   generators  in  the  resulting  presentation  will   be   named  by
  631. '<string>1', '<string>2', ..., the default string is '\"\_x\"'.
  632.  
  633. The Reduced  Reidemeister-Schreier algorithm is  a  modification  of  the
  634. Reidemeister-Schreier algorithm of George  Havas  \cite{Hav74b}.   It was
  635. proposed by Joachim Neub{\accent127u}ser and first implemented in 1986 by
  636. Andrea Lucchini and Volkmar Felsch in the SPAS system \cite{Spa89}.  Like
  637. George  Havas{\'}  Reidemeister-Schreier  algorithm,  it  needs only  the
  638. presentation of  <G> and a  coset table  of  <H>  in <G>  to construct  a
  639. presentation of <H>.
  640.  
  641. Whenever you call  the 'PresentationSubgroupRrs' command, it checks first
  642. whether a  coset table  of <H> in <G> has already been computed and saved
  643. in the subgroup  record of <H> by a  preceding call  of some  appropriate
  644. command like 'CosetTableFpGroup'  (see "CosetTableFpGroup"), 'Index' (see
  645. "Index"), or 'LowIndexSubgroupsFpGroup' (see "LowIndexSubgroupsFpGroup").
  646. Only  if the  coset table is not yet available, is  it now constructed by
  647. 'PresentationSubgroupRrs'  which   calls  'CosetTableFpGroup'  for   this
  648. purpose.  In  this  case,  of  course, a set  of  generators  of  <H>  is
  649. required, but they will not be used any more in the subsequent steps.
  650.  
  651. Next,  a  set of generators of <H> is  determined  by  reconstructing the
  652. coset table and introducing in  that process as many  Schreier generators
  653. of <H> in  <G> as are needed  to do a  Felsch  strategy coset enumeration
  654. without  any  coincidences.  (In  general,  though  containing  redundant
  655. generators,  this set will be  much smaller  than the set of all Schreier
  656. generators.   That\'s   why   we   call    the   method   the   *Reduced*
  657. Reidemeister-Schreier.)
  658.  
  659. After having constructed this set of *primary subgroup generators* , say,
  660. the coset table is extended to an *augmented coset table* which describes
  661. the  action of the  group generators  on  coset representatives, i.e., on
  662. elements  instead of cosets.  For  this purpose,  suitable words  in  the
  663. (primary) subgroup generators have to  be associated  to  the coset table
  664. entries.  In order to keep the lengths of these words short, additional
  665. *secondary  subgroup  generators*  are  introduced  as  abbreviations  of
  666. subwords. Their number may be large.
  667. \index{primary subgroup generators}
  668. \index{secondary subgroup generators}
  669. \index{augmented coset table}
  670.  
  671. Finally, a  Reidemeister  rewriting  process  is  used  to  get  defining
  672. relators for <H> from the relators of <G>.  As the resulting presentation
  673. of  <H>  is  a  presentation on  primary *and*  secondary generators,  in
  674. general   you  will   have   to   simplify   it   by  appropriate  Tietze
  675. transformations  (see  "Tietze  Transformations") or  by the 'DecodeTree'
  676. command  (see  "DecodeTree") before  you can use  it.   Therefore  it  is
  677. returned in the form of a presentation record.
  678.  
  679. Compared  with  the  Modified  Todd-Coxeter method described  below,  the
  680. Reduced Rei\-de\-mei\-ster-Schreier method (as well as Havas{\'} original
  681. Reidemeister-Schreier program) has the advantage that it does not require
  682. generators of <H>  to be given if  a coset table of <H> in  <G> is known.
  683. This  provides  a  possibility to compute  a  presentation  of the normal
  684. closure  of a  given  subgroup  (see  the  'PresentationNormalClosureRrs'
  685. command below).
  686.  
  687. A few examples are given in section "Tietze Transformations".
  688.  
  689. \vspace{5mm}
  690. 'PresentationSubgroupMtc( <G>, <H> )'
  691. \index{PresentationSubgroupMtc} \\
  692. 'PresentationSubgroupMtc( <G>, <H>, <string> )' \\
  693. 'PresentationSubgroupMtc( <G>, <H>, <printlevel> )' \\
  694. 'PresentationSubgroupMtc( <G>, <H>, <string>, <printlevel> )'
  695.  
  696. 'PresentationSubgroupMtc'    returns    a   presentation   record    (see
  697. "Presentation Records") containing a presentation for the subgroup <H> of
  698. the  finitely  presented  group  <G>.  It  uses a  Modified  Todd-Coxeter
  699. method to construct this presentation.
  700. \index{Modified Todd-Coxeter}
  701.  
  702. The  generators  in   the   resulting  presentation  will  be  named   by
  703. '<string>1', '<string>2', ..., the default string is '\"\_x\"'.
  704.  
  705. The optional <printlevel> parameter can be used to restrict  or to extend
  706. the amount of  output provided by the 'PresentationSubgroupMtc'  command.
  707. In particular, by specifying the <printlevel> parameter to be  0, you can
  708. suppress the output of  the 'DecodeTree' command which is called  by  the
  709. 'PresentationSubgroupMtc'  command (see  below).  The  default  value  of
  710. <printlevel> is 1.
  711.  
  712. The  so  called  Modified  Todd-Coxeter  method was proposed, in slightly
  713. different forms, by Nathan S.~Mendelsohn and William O.~J.~Moser in 1966.
  714. Moser\'s  method  was proved by  Michael J.~Beetham and Colin M.~Campbell
  715. (see \cite{BC76}).  Another  proof  for a  special version  was  given by
  716. D.~H.~McLain (see  \cite{McL77}).  It  was generalized  to cover  a broad
  717. spectrum  of different versions (see the  survey \cite{Neu82}).  Moser\'s
  718. method was implemented by Harvey A.~Campbell (see \cite{Cam71}.  Later, a
  719. Modified Todd-Coxeter program was  implemented in  St.~Andrews  by  David
  720. G.~Arrell, Sanjiv Manrai, and Michael  F.~Worboys (see \cite{AMW82})  and
  721. further  developed   by  David  G.~Arrel  and  Edmund  F.~Robertson  (see
  722. \cite{AR84}) and by Volkmar Felsch in the SPAS system \cite{Spa89}.
  723.  
  724. The  'Modified Todd-Coxeter'  method  performs  an enumeration  of  coset
  725. representatives.   It  proceeds like an  ordinary  coset enumeration (see
  726. 'CosetTableFpGroup' "CosetTableFpGroup"), but as  the product of  a coset
  727. representative by  a group  generator or its inverse need not be a  coset
  728. representative itself, the Modified Todd-Coxeter has to store a  kind  of
  729. correction element for each coset table entry.   Hence it builds  up a so
  730. called *augmented coset table* of <H>  in <G> consisting  of the ordinary
  731. coset table and a second  table in parallel which contains the associated
  732. subgroup elements.
  733. \index{augmented coset table}
  734.  
  735. Theoretically, these subgroup elements could be expressed as words in the
  736. given  generators of  <H>, but  in  general  these  words tend to  become
  737. unmanageable because of their  enormous  lengths.   Therefore,  a  highly
  738. redundant list of subgroup generators is built up starting from the given
  739. (\"*primary*\") generators of <H> and adding additional (\"*secondary*\")
  740. generators which are defined as abbreviations of suitable words of length
  741. two in the preceding generators such that each of  the subgroup  elements
  742. in the augmented coset table can be expressed as a word of length at most
  743. one in the resulting (primary *and* secondary) subgroup generators.
  744. \index{primary subgroup generators}
  745. \index{secondary subgroup generators}
  746.  
  747. Then  a  rewriting  process (which is essentially a kind of  Reidemeister
  748. rewriting process) is used to  get  relators  for  <H>  from the defining
  749. relators of <G>.
  750.  
  751. The resulting presentation involves  all  the  primary, but not  all  the
  752. secondary generators of <H>.   In fact, it contains only those  secondary
  753. generators which  explicitly occur in the augmented  coset table.  If  we
  754. extended this presentation by those  secondary generators which  are  not
  755. yet contained in it as additional generators,  and by the  definitions of
  756. all  secondary   generators  as  additional  relators,  we  would  get  a
  757. presentation of <H>, but, in general, we would end up with a large number
  758. of generators and relators.
  759.  
  760. On the other hand, if  we  avoid this extension, the current presentation
  761. will not necessarily define <H> although  we have used the same rewriting
  762. process  which  in  the  case of  the  'SubgroupPresentationRrs'  command
  763. computes a defining set of relators for <H> from an augmented coset table
  764. and defining relators  of <G>.  The different behaviour here is caused by
  765. the fact that coincidences may have occurred in the Modified Todd-Coxeter
  766. coset enumeration.
  767.  
  768. To  overcome  this problem  without  extending  the presentation  by  all
  769. secondary generators, the  'SubgroupPresentationMtc' command  applies the
  770. so called  *tree decoding*  algorithm  which provides  a  more economical
  771. approach.   The reader is  strongly recommended to carefully read section
  772. "DecodeTree"  where this algorithm is  described in more detail.  Here we
  773. will  only  mention  that  this  procedure  adds  many  fewer  additional
  774. generators  and relators  in a  process  which  in  fact  eliminates  all
  775. secondary generators from  the presentation and hence finally  provides a
  776. presentation  of  <H>  on  the  primary,  i.e.,  the   originally  given,
  777. generators   of  <H>.   This   is   a   remarkable   advantage   of   the
  778. 'SubgroupPresentationMtc'       command       compared       to       the
  779. 'SubgroupPresentationRrs'  command.   But note that, for  some particular
  780. subgroup <H>, the  Reduced Reidemeister-Schreier method might quite  well
  781. produce a more concise presentation.
  782.  
  783. The  resulting  presentation  is  returned in  the form of a presentation
  784. record.  Though  the  tree  decoding  routine already involves a  lot  of
  785. Tietze transformations, we recommend that you try to further simplify the
  786. presentation   by   appropriate  Tietze   transformations  (see   "Tietze
  787. Transformations").
  788.  
  789. An example is given in section "DecodeTree".
  790.  
  791. \vspace{5mm}
  792. 'PresentationSubgroup( <G>, <H> )'
  793. \index{PresentationSubgroup} \\
  794. 'PresentationSubgroup( <G>, <H>, <string> )'
  795.  
  796. 'PresentationSubgroup' returns a presentation record  (see  "Presentation
  797. Records") containing a presentation for the subgroup  <H> of the finitely
  798. presented group <G>.
  799.  
  800. The current {\GAP} implementation offers a choice between  two  different
  801. methods  for  constructing  subgroup presentations,  namely  the  Reduced
  802. Reidemeister-Schreier  and the  Modified Todd-Coxeter procedure.  You can
  803. specify either of  them by calling the commands 'PresentationSubgroupRrs'
  804. or 'PresentationSubgroupMtc', respectively.  Further methods may be added
  805. in a later {\GAP}  version.  If, in some concrete application, you don\'t
  806. care   for    the    method   to   be   selected,   you   may   use   the
  807. 'PresentationSubgroup' command  as  a kind  of default  command.   In the
  808. present  installation,  it will  call  the Reduced  Reidemeister-Schreier
  809. method, i.e., it is identical with the 'PresentationSubgroupRrs' command.
  810.  
  811. A few examples are given in section "Tietze Transformations".
  812.  
  813. \vspace{5mm}
  814. 'PresentationNormalClosureRrs( <G>, <H> )'
  815. \index{PresentationNormalClosureRrs} \\
  816. 'PresentationNormalClosureRrs( <G>, <H>, <string> )'
  817.  
  818. 'PresentationNormalClosureRrs'   returns  a  presentation   record   (see
  819. "Presentation Records") containing a presentation for the normal  closure
  820. of  the  subgroup <H> of the finitely presented group  <G>.  It  uses the
  821. Reduced Reidemeister-Schreier  method  to  construct  this  presentation.
  822. This  provides a possibility  to  compute  a presentation  for  a  normal
  823. subgroup  for  which   only  \"normal  subgroup  generators\",   but  not
  824. necessarily a full set of generators are known.
  825.  
  826. The   generators  in   the  resulting   presentation  will  be  named  by
  827. '<string>1', '<string>2', ..., the default string is '\"\_x\"'.
  828.  
  829. 'PresentationNormalClosureRrs'  first  establishes an  intermediate group
  830. record for the factor group of <G> by the normal closure <N>, say, of <H>
  831. in <G>.  Then it performs a coset enumeration of  the trivial subgroup in
  832. that factor group.  The resulting coset table  can be considered as coset
  833. table  of  <N> in <G>, hence  a presentation for <N> can  be  constructed
  834. using the  Reduced  Reidemeister-Schreier algorithm as  described for the
  835. 'PresentationSubgroupRrs' command.
  836.  
  837. \vspace{5mm}
  838. 'PresentationNormalClosure( <G>, <H> )'
  839. \index{PresentationNormalClosure} \\
  840. 'PresentationNormalClosure( <G>, <H>, <string> )'
  841.  
  842. 'PresentationNormalClosure'   returns    a   presentation   record   (see
  843. "Presentation Records") containing a presentation for the  normal closure
  844. of the subgroup <H> of the finitely presented group <G>.  This provides a
  845. possibility  to  compute  a presentation for a normal subgroup for  which
  846. only  \"normal  subgroup generators\", but not necessarily a full  set of
  847. generators are known.
  848.  
  849. If,  in  a  later  release,  {\GAP}  offers  different  methods  for  the
  850. construction      of     normal     closure      presentations,      then
  851. 'PresentationNormalClosure' will call one of these  procedures as a  kind
  852. of    default    method.     At    present,    however,    the    Reduced
  853. Reidemeister-Schreier  algorithm  is  the only  one implemented  so  far.
  854. Therefore,  at   present   the  'PresentationNormalClosure'   command  is
  855. identical  with  the   'PresentationNormalClosureRrs'  command  described
  856. above.
  857.  
  858. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  859. \Section{SimplifiedFpGroup}
  860.  
  861. 'SimplifiedFpGroup( <G> )'
  862.  
  863. 'SimplifiedFpGroup'  applies  Tietze  transformations  to a  copy of  the
  864. presentation of the given finitely presented group <G> in order to reduce
  865. it with respect to  the number of generators, the number of relators, and
  866. the relator lengths.
  867.  
  868. 'SimplifiedFpGroup' returns the resulting finitely presented group (which
  869. is isomorphic to <G>).
  870.  
  871. |    gap> G := FreeGroup( 6, "G" );
  872.     Group( G.1, G.2, G.3, G.4, G.5, G.6 )
  873.     gap> G.relators := [ G.1^2, G.2^2, G.4*G.6^-1, G.5^2, G.6^2,
  874.     >         G.1*G.2^-1*G.3, G.1*G.5*G.3^-1, G.2*G.4^-1*G.3,
  875.     >         G.3*G.4*G.5^-1, G.1*G.6*G.3^-2, G.3^4 ];;
  876.     gap> H := SimplifiedFpGroup( G );
  877.     Group( G.1, G.3 )
  878.     gap> H.relators;
  879.     [ G.1^2, G.1*G.3^-1*G.1*G.3^-1, G.3^4 ] |
  880.  
  881. In fact, the command
  882.  
  883. |    H := SimplifiedFpGroup( G ); |
  884.  
  885. is an abbreviation of the command sequence
  886.  
  887. |    P := PresentationFpGroup( G, 0 );;
  888.     SimplifyPresentation( P );
  889.     H := FpGroupPresentation( P );
  890.     Unbind( P ); |
  891.  
  892. which applies  a rather simple-minded strategy of  Tietze transformations
  893. to the intermediate presentation record <P> (see "Presentation Records").
  894. If for  some  concrete group the resulting presentation  is unsatisfying,
  895. then  you  should  try  a  more  sophisticated,  interactive  use of  the
  896. available Tietze transformation commands (see "Tietze Transformations").
  897.  
  898. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  899. \Section{Tietze Transformations}%
  900.  
  901. The {\GAP} commands being described in this section can be used to modify
  902. a group presentation in a presentation record by Tietze transformations.
  903.  
  904. In general, the aim of such modifications will be to *simplify* the given
  905. presentation, i.e., to reduce the number of generators and the number  of
  906. relators without increasing too much the sum of all relator lengths which
  907. we  will  call the *total length* of the  presentation.  Depending on the
  908. concrete  presentation under  investigation  one may end up  with a nice,
  909. short presentation or with a very huge one.
  910. \index{total length of a presentation}
  911.  
  912. Unfortunately there  is  no algorithm which could be  applied to find the
  913. shortest presentation which  can  be  obtained  by Tietze transformations
  914. from a  given one.  Therefore, what  {\GAP}  offers  are some lower-level
  915. Tietze  transformation  commands  and,  in  addition,  some  higher-level
  916. commands which apply the lower-level ones in  a kind of  default strategy
  917. which of course cannot be the optimal choice for all presentations.
  918.  
  919. The  design  of  these commands  follows closely the  concept of the  ANU
  920. Tietze transformation program designed by George Havas \cite{Hav69} which
  921. has been  available  from Canberra  since  1977 in a  stand-alone version
  922. implemented by Peter  Kenne and  James Richardson and later on revised by
  923. Edmund F.~Robertson (see \cite{HKRR84}, \cite{Rob88}).
  924.  
  925. \vspace{5mm} In this section, we first describe the higher-level commands
  926. 'SimplifyPresentation', 'TzGo',  and  'TzGoGo' (the  first two  of  these
  927. commands are identical).
  928.  
  929. Then  we  describe  the  lower-level commands  'TzEliminate', 'TzSearch',
  930. 'TzSearchEqual', and  'TzFindCyclicJoins'.  They  are the bricks of which
  931. the preceding higher-level commands have been composed.  You may use them
  932. to  try  alternative  strategies,  but  if  you  are  satisfied  by   the
  933. performance of 'TzGo' and 'TzGoGo', then you don\'t need them.
  934.  
  935. Some  of  the Tietze transformation commands listed so far  may eliminate
  936. generators and hence change the given presentation to a presentation on a
  937. subset  of  the  given set of generators, but they all do *not* introduce
  938. new generators.  However,  sometimes you will need to  substitute certain
  939. words as new generators in order to improve your presentation.  Therefore
  940. {\GAP}     offers     the     two     commands     'TzSubstitute'     and
  941. 'TzSubstituteCyclicJoins' which introduce new generators.  These commands
  942. will be described next.
  943.  
  944. Subsequently we describe  some print  commands,  namely 'TzPrintLengths',
  945. 'TzPrintPairs',  and 'TzPrintOptions', which are useful if  you  run  the
  946. Tietze transformations interactively.
  947.  
  948. At the end of this section  we list  the *Tietze  options* and give their
  949. default  values.  These  are  parameters which essentially influence  the
  950. performance  of  the commands mentioned  above.   However, they  are  not
  951. specified as  arguments of function  calls.  Instead, they are associated
  952. to the  presentation  records{\:} Each presentation record keeps  its own
  953. set of Tietze option values in the form of ordinary record components.
  954.  
  955. \vspace{5mm}
  956. 'SimplifyPresentation( <P> )'
  957. \index{SimplifyPresentation} \\
  958. 'TzGo( <P> )'
  959. \index{TzGo}
  960.  
  961. 'SimplifyPresentation'  performs Tietze transformations on a presentation
  962. <P>.   It  is perhaps  the  most  convenient  of  the interactive  Tietze
  963. transformation commands.  It offers  a kind of default strategy which, in
  964. general,  saves you from explicitly  calling the lower-level commands  it
  965. involves.
  966.  
  967. Roughly  speaking,  'SimplifyPresentation'  consists  of  a  loop  over a
  968. procedure which  involves two  phases{\:} In the *search phase* it  calls
  969. 'TzSearch' and 'TzSearchEqual'  described  below which  try to reduce the
  970. relator lengths  by  substituting  common  subwords  of relators,  in the
  971. *elimination phase*  it calls the command  'TzEliminate'  described below
  972. (or, more  precisely, a subroutine of 'TzEliminate' in order to save some
  973. administrative overhead) which tries to eliminate generators that can  be
  974. expressed as words in the remaining generators.
  975.  
  976. If 'SimplifyPresentation' succeeds in reducing the number of  generators,
  977. the  number of  relators,  or the total length of all  relators, then  it
  978. displays the  new  status before returning (provided that you did not set
  979. the print level to zero).  However, it does not provide any output if all
  980. these three  values  have remained unchanged, even if the 'TzSearchEqual'
  981. command involved has changed the presentation such  that  another call of
  982. 'SimplifyPresentation' might provide further  progress.  Hence, in such a
  983. case it makes sense  to repeat the call of the command for  several times
  984. (or to call instead the 'TzGoGo' command which we will describe next).
  985.  
  986. As an example  we  compute  a presentation of a  subgroup of index 408 in
  987. $PSL(2,17)$.
  988.  
  989. |    gap> a := AbstractGenerator( "a" );; b := AbstractGenerator( "b" );;
  990.     gap> G := Group( [ a, b ], IdWord );;
  991.     gap> G.relators := [ a^9, b^2, (a*b)^4, (a^2*b)^3 ];;
  992.     gap> H := Subgroup( G, [ (a*b)^2, (a^-1*b)^2 ] );;
  993.     gap> Index( G, H );
  994.     408
  995.     gap> P := PresentationSubgroup( G, H );
  996.     << presentation with 8 gens and 36 rels of total length 111 >>
  997.     gap> P.printLevel := 2;;
  998.     gap> SimplifyPresentation( P );
  999.     &I  there are 4 generators and 8 relators of total length 21
  1000.     &I  there are 4 generators and 7 relators of total length 18
  1001.     &I  eliminating _x4 = _x3^-1*_x2^-1
  1002.     &I  eliminating _x1 = _x3^-1*_x2
  1003.     &I  there are 2 generators and 5 relators of total length 18
  1004.     &I  there are 2 generators and 4 relators of total length 13
  1005.     &I  there are 2 generators and 3 relators of total length 9
  1006.     gap> TzPrintRelators( P );
  1007.     &I  1. _x3^2
  1008.     &I  2. _x2^3
  1009.     &I  3. _x3*_x2*_x3*_x2 |
  1010.  
  1011. Note that the number  of loops over the two phases as well  as the number
  1012. of  subword   searches  or  generator  eliminations  in  each  phase  are
  1013. determined by a set of option parameters which may  heavily influence the
  1014. resulting presentation and the computing time (see Tietze options below).
  1015.  
  1016. 'TzGo' is just another name  for the  'SimplifyPresentation' command.  It
  1017. has  been introduced for  the convenience  of those {\GAP} users  who are
  1018. used to  that  name from the *go* option of the ANU Tietze transformation
  1019. stand-alone program or from the *go* command in SPAS.
  1020.  
  1021. \vspace{5mm}
  1022. 'TzGoGo( <P> )'
  1023. \index{TzGoGo}
  1024.  
  1025. 'TzGoGo'  performs  Tietze  transformations  on  a presentation  <P>.  It
  1026. repeatedly   calls  the  'TzGo'  command  until  neither  the  number  of
  1027. generators  nor  the number  of relators  nor  the total  length  of  all
  1028. relators have changed during five consecutive calls of 'TzGo'.
  1029.  
  1030. This  may  remarkably  save  you  time  and effort  if you  handle  small
  1031. presentations, however it may  lead  to  annoyingly  long  and  fruitless
  1032. waiting times in case of large presentations.
  1033.  
  1034. \vspace{5mm}
  1035. 'TzEliminate( <P> )'
  1036. \index{TzEliminate} \\
  1037. 'TzEliminate( <P>, <gen> )' \\
  1038. 'TzEliminate( <P>, <n> )'
  1039.  
  1040. 'TzEliminate' tries to eliminate a generator from a  presentation <P> via
  1041. Tietze transformations.
  1042.  
  1043. Any  relator which  contains  some generator just  once  can be  used  to
  1044. substitute that generator by a word in the remaining generators.  If such
  1045. generators and relators exist, then 'TzEliminate' chooses a generator for
  1046. which  the product of  its number  of occurrences and  the length  of the
  1047. substituting word is minimal, and  then it eliminates this generator from
  1048. the  presentation, provided  that  the  resulting  total  length  of  the
  1049. relators  does   not  exceed  the  associated  Tietze  option   parameter
  1050. '<P>.spaceLimit'.   The default value of '<P>.spaceLimit'  is 'infinity',
  1051. but you may alter it appropriately (see Tietze options below).
  1052.  
  1053. If you specify a generator <gen> as  second argument, then  'TzEliminate'
  1054. only tries to eliminate that generator.
  1055.  
  1056. If you  specify an  integer  <n>  as second argument,  then 'TzEliminate'
  1057. tries  to   eliminate   up  to   <n>  generators.  Note  that  the  calls
  1058. 'TzEliminate( <P> )' and 'TzEliminate( <P>, 1 )' are equivalent.
  1059.  
  1060. \vspace{5mm}
  1061. 'TzSearch( <P> )'
  1062. \index{TzSearch}
  1063.  
  1064. 'TzSearch'  performs Tietze transformations  on  a  presentation <P>.  It
  1065. tries to reduce the relator lengths by  substituting  common  subwords of
  1066. relators by shorter words.
  1067.  
  1068. The idea is to find pairs of relators $r_1$ and $r_2$ of length $l_1$ and
  1069. $l_2$, respectively, such that $l_1 \le l_2$ and $r_1$ and $r_2$ coincide
  1070. (possibly  after inverting or conjugating one of  them)  in some  maximal
  1071. subword $w$, say, of length  greater than $l_1/2$, and then to substitute
  1072. each copy of $w$ in $r_2$ by the inverse complement of $w$ in $r_1$.
  1073.  
  1074. Two of the  Tietze option parameters which  are listed at the end of this
  1075. section may  strongly  influence the performance and  the results of  the
  1076. 'TzSearch'  command.   These  are   the  parameters  '<P>.saveLimit'  and
  1077. '<P>.searchSimultaneous'.  The first of them has the following effect.
  1078.  
  1079. When TzSearch  has  finished  its main  loop over  all relators, then, in
  1080. general, there are  relators which  have  changed  and  hence  should  be
  1081. handled  again in  another run  through  the  whole  procedure.  However,
  1082. experience shows that it really does  not pay  to continue this way until
  1083. no more relators change.  Therefore, 'TzSearch' starts a new loop only if
  1084. the loop just finished has reduced the total length of the relators by at
  1085. least '<P>.saveLimit' per cent.
  1086.  
  1087. The default value of '<P>.saveLimit' is 10.
  1088.  
  1089. To understand the  effect of  the parameter '<P>.searchSimultaneous',  we
  1090. have to look in more detail at how 'TzSearch' proceeds.
  1091.  
  1092. First,  it sorts  the  list of  relators by increasing lengths.   Then it
  1093. performs a loop  over this list.  In each step  of this loop, the current
  1094. relator  is treated as *short  relator* $r_1$, and a subroutine is called
  1095. which  loops  over  the  succeeding  relators,  treating  them  as  *long
  1096. relators*   $r_2$   and  performing   the   respective   comparisons  and
  1097. substitutions.
  1098.  
  1099. As  this  subroutine performs a  very  expensive  process,  it  has  been
  1100. implemented  as a C routine in the  {\GAP} kernel.  For the given relator
  1101. $r_1$ of  length $l_1$,  say,  it  first  determines  the  *minimal match
  1102. length*  $l$  which  is  $l_1/2+1$,  if  $l_1$  is  even, or $(l_1+1)/2$,
  1103. otherwise.  Then it builds  up a hash list for all subwords of length $l$
  1104. occurring in the conjugates of  $r_1$ or $r_1^{-1}$, and finally it loops
  1105. over all long  relators  $r_2$ and  compares the  hash  values  of  their
  1106. subwords of length $l$ against this list.  A comparison of subwords which
  1107. is much more expensive is only done if a hash match has been found.
  1108.  
  1109. To improve  the efficiency  of this  process  we  allow the subroutine to
  1110. handle several short relators simultaneously provided that they  have the
  1111. same  minimal  match  length.   If,  for example,  it  handles  $n$ short
  1112. relators simultaneously,  then you save  $n  -  1$ loops  over  the  long
  1113. relators $r_2$,  but  you  pay  for  it by  additional fruitless  subword
  1114. comparisons.  In general, you will not get the best performance by always
  1115. choosing the maximal  possible number of  short  relators  to  be handled
  1116. simultaneously.  In fact, the optimal choice of the number will depend on
  1117. the concrete presentation under investigation.  You can use the parameter
  1118. '<P>.searchSimultaneous' to prescribe  an upper  bound for the  number of
  1119. short relators to be handled simultaneously.
  1120.  
  1121. The default value of '<P>.searchSimultaneous' is 20.
  1122.  
  1123. \vspace{5mm}
  1124. 'TzSearchEqual( <P> )'
  1125. \index{TzSearchEqual}
  1126.  
  1127. 'TzSearchEqual'  performs Tietze transformations on a  presentation  <P>.
  1128. It tries to alter relators by substituting common subwords of relators by
  1129. subwords of equal length.
  1130.  
  1131. The idea is to find pairs of relators $r_1$ and $r_2$ of length $l_1$ and
  1132. $l_2$, respectively, such that $l_1$ is  even, $l_1  \le l_2$, and  $r_1$
  1133. and $r_2$ coincide (possibly after inverting or conjugating one  of them)
  1134. in some maximal subword $w$, say, of length at least $l_1/2$.  Let $l$ be
  1135. the  length of  $w$.   Then, if  $l > l_1/2$,  the pair is  handled as in
  1136. 'TzSearch'.  Otherwise, if $l  = l_1/2$, then 'TzSearchEqual' substitutes
  1137. each copy of $w$ in $r_2$ by the inverse complement of $w$ in $r_1$.
  1138.  
  1139. The  Tietze  option   parameter   '<P>.searchSimultaneous'  is   used  by
  1140. 'TzSearchEqual' in the same way as described for 'TzSearch'.
  1141.  
  1142. However, 'TzSearchEqual' does  not use the  parameter '<P>.saveLimit'{\:}
  1143. The loop over the relators is executed exactly once.
  1144.  
  1145. \vspace{5mm}
  1146. 'TzFindCyclicJoins( <P> )'
  1147. \index{TzFindCyclicJoins}
  1148.  
  1149. 'TzFindCyclicJoins' performs  Tietze transformations  on  a  presentation
  1150. <P>.  It searches  for pairs of generators which generate the same cyclic
  1151. subgroup and eliminates  one of  the two generators of each such pair  it
  1152. finds.
  1153.  
  1154. More precisely{\:}  'TzFindCyclicJoins'  searches for pairs of generators
  1155. $a$  and  $b$ such that (possibly  after inverting  or  conjugating  some
  1156. relators)  the set of relators  contains the  commutator $[a,b]$, a power
  1157. $a^n$, and  a  product  of the form $a^s b^t$ with $s$ prime to $n$.  For
  1158. each  such  pair, 'TzFindCyclicJoins'  uses  the  Euclidian algorithm  to
  1159. express $a$ as a power of $b$, and then it eliminates $a$.
  1160.  
  1161. \vspace{5mm}
  1162. 'TzSubstitute( <P> )'
  1163. \index{TzSubstitute} \\
  1164. 'TzSubstitute( <P>, <n> )' \\
  1165. 'TzSubstitute( <P>, <n>, <eliminate> )'
  1166.  
  1167. 'TzSubstitute' performs Tietze  transformations  on  a  presentation <P>.
  1168. Basically, it  substitutes  a  squarefree  word  of  length  2  as  a new
  1169. generator and then eliminates a  generator  from  the extended  generator
  1170. list.  We will describe this process in more detail.
  1171.  
  1172. The  parameters  <n>  and  <eliminate>  are  optional.   If  you  specify
  1173. arguments  for them, then <n>  is expected to be a  positive integer, and
  1174. <eliminate> is expected to be 0, 1, or 2.  The default values are $n = 1$
  1175. and $eliminate = 0$.
  1176.  
  1177. 'TzSubstitute'   first  determines  the  <n>  most  frequently  occurring
  1178. squarefree  relator subwords  of  length  2 and sorts  them by decreasing
  1179. numbers of occurrences.  Let $ab$ be the <n>th word in that list, and let
  1180. <i> be the smallest  positive integer  which has not  yet  been used as a
  1181. generator number.  Then 'TzSubstitute' defines a new  generator '<P>.<i>'
  1182. (see  'AddGenerator' for  details), adds it to  the presentation together
  1183. with a new relator $P.i^{-1}ab$, and  replaces all occurrences of $ab$ in
  1184. the given relators by '<P>.<i>'.
  1185.  
  1186. Finally,  it eliminates some generator  from  the  extended presentation.
  1187. The  choice  of that  generator  depends  on  the  actual  value  of  the
  1188. <eliminate> parameter\:
  1189.  
  1190. If <eliminate> is zero, then the generator to be eliminated is  chosen as
  1191. by the  'TzEliminate' command.  This means  that in this case it may well
  1192. happen that  it is the generator '<P>.<i>' just introduced which  is  now
  1193. deleted  again  so  that  you do  not  get  any  remarkable  progress  in
  1194. transforming  your  presentation.   On  the other  hand,  this  procedure
  1195. guaranties that the total length of the relators will not be increased by
  1196. a call of 'TzSubstitute' with $eliminate = 0$.
  1197.  
  1198. Otherwise,  if <eliminate> is 1 or 2, then  'TzSubstitute' eliminates the
  1199. respective factor of the  substituted word $ab$, i.e., $a$ for $eliminate
  1200. =  1$ or  $b$ for $eliminate = 2$.  In this case, it may well happen that
  1201. the  total  length  of  the  relators  increases,  but  sometimes such an
  1202. intermediate  extension  is  the  only  way to  finally  reduce  a  given
  1203. presentation.
  1204.  
  1205. In order to decide which arguments might be appropriate for the next call
  1206. of 'TzSubstitute', often it  is helpful to print out a  list of the  most
  1207. frequently occurring squarefree  relator subwords of  length 2.  You  may
  1208. use the 'TzPrintPairs' command described below to do this.
  1209.  
  1210. As an example we handle a subgroup of index 266 in the Janko group $J_1$.
  1211.  
  1212. |    gap> a := AbstractGenerator("a");; b := AbstractGenerator("b");;
  1213.     gap> J1 := Group ( [ a, b ], IdWord );;
  1214.     gap> J1.relators := [ a^2, b^3, (a*b)^7,
  1215.     >    Comm(a,b)^10, Comm(a,b^-1*(a*b)^2)^6 ];;
  1216.     gap> H := Subgroup ( J1, [ a, b^(a*b*(a*b^-1)^2) ] );;
  1217.     gap> P := PresentationSubgroup( J1, H );
  1218.     << presentation with 23 gens and 82 rels of total length 530 >>
  1219.     gap> TzGoGo( P );
  1220.     &I  there are 3 generators and 47 relators of total length 1368
  1221.     &I  there are 2 generators and 46 relators of total length 3773
  1222.     &I  there are 2 generators and 46 relators of total length 2570
  1223.     gap> TzGoGo( P );
  1224.     &I  there are 2 generators and 46 relators of total length 2568
  1225.     gap> TzGoGo( P );
  1226.     gap> & We do not get any more progress without substituting a new
  1227.     gap> & generator
  1228.     gap> TzSubstitute( P );
  1229.     &I  substituting new generator _x28 defined by _x6*_x23^-1
  1230.     &I  eliminating _x28 = _x6*_x23^-1
  1231.     gap> & GAP cannot substitute a new generator without extending the
  1232.     gap> & total length, so we have to explicitly ask for it
  1233.     gap> TzPrintPairs( P );
  1234.     &I  1.  504  occurrences of  _x6 * _x23^-1
  1235.     &I  2.  504  occurrences of  _x6^-1 * _x23
  1236.     &I  3.  448  occurrences of  _x6 * _x23
  1237.     &I  4.  448  occurrences of  _x6^-1 * _x23^-1
  1238.     gap> TzSubstitute( P, 2, 1 );
  1239.     &I  substituting new generator _x29 defined by _x6^-1*_x23
  1240.     &I  eliminating _x6 = _x23*_x29^-1
  1241.     &I  there are 2 generators and 46 relators of total length 2867
  1242.     gap> TzGoGo( P );
  1243.     &I  there are 2 generators and 45 relators of total length 2417
  1244.     &I  there are 2 generators and 45 relators of total length 2122
  1245.     gap> TzSubstitute( P, 1, 2 );
  1246.     &I  substituting new generator _x30 defined by _x23*_x29^-1
  1247.     &I  eliminating _x29 = _x30^-1*_x23
  1248.     &I  there are 2 generators and 45 relators of total length 2192
  1249.     gap> TzGoGo( P );
  1250.     &I  there are 2 generators and 42 relators of total length 1637
  1251.     &I  there are 2 generators and 40 relators of total length 1286
  1252.     &I  there are 2 generators and 36 relators of total length 807
  1253.     &I  there are 2 generators and 32 relators of total length 625
  1254.     &I  there are 2 generators and 22 relators of total length 369
  1255.     &I  there are 2 generators and 18 relators of total length 213
  1256.     &I  there are 2 generators and 13 relators of total length 141
  1257.     &I  there are 2 generators and 12 relators of total length 121
  1258.     &I  there are 2 generators and 10 relators of total length 101
  1259.     gap> TzPrintPairs( P );
  1260.     &I  1.  19  occurrences of  _x23 * _x30^-1
  1261.     &I  2.  19  occurrences of  _x23^-1 * _x30
  1262.     &I  3.  14  occurrences of  _x23 * _x30
  1263.     &I  4.  14  occurrences of  _x23^-1 * _x30^-1
  1264.     gap> & If we save a copy of the current presentation, then later we
  1265.     gap> & will be able to restart the computation from the current state
  1266.     gap> P1 := Copy( P );;
  1267.     gap> & Just for demonstration, let's make an inconvenient choice
  1268.     gap> TzSubstitute( P, 3, 1 );
  1269.     &I  substituting new generator _x31 defined by _x23*_x30
  1270.     &I  eliminating _x23 = _x31*_x30^-1
  1271.     &I  there are 2 generators and 10 relators of total length 122
  1272.     gap> TzGoGo( P );
  1273.     &I  there are 2 generators and 9 relators of total length 105
  1274.     gap> & The presentation is worse than the one we have saved, so let's
  1275.     gap> & restart from that one again
  1276.     gap> P := Copy( P1 );
  1277.     << presentation with 2 gens and 10 rels of total length 101 >>
  1278.     gap> TzSubstitute( P, 2, 1);
  1279.     &I  substituting new generator _x31 defined by _x23^-1*_x30
  1280.     &I  eliminating _x23 = _x30*_x31^-1
  1281.     &I  there are 2 generators and 10 relators of total length 107
  1282.     gap> TzGoGo( P );
  1283.     &I  there are 2 generators and 9 relators of total length 84
  1284.     &I  there are 2 generators and 8 relators of total length 75
  1285.     gap> TzSubstitute( P, 2, 1);
  1286.     &I  substituting new generator _x32 defined by _x30^-1*_x31
  1287.     &I  eliminating _x30 = _x31*_x32^-1
  1288.     &I  there are 2 generators and 8 relators of total length 71
  1289.     gap> TzGoGo( P );
  1290.     &I  there are 2 generators and 7 relators of total length 56
  1291.     &I  there are 2 generators and 5 relators of total length 36
  1292.     gap> TzPrintRelators( P );
  1293.     &I  1. _x32^5
  1294.     &I  2. _x31^5
  1295.     &I  3. _x31^-1*_x32^-1*_x31^-1*_x32^-1*_x31^-1*_x32^-1
  1296.     &I  4. _x31*_x32*_x31^-1*_x32*_x31^-1*_x32*_x31*_x32^-2
  1297.     &I  5. _x31^-1*_x32^2*_x31*_x32^-1*_x31^2*_x32^-1*_x31*_x32^2 |
  1298.  
  1299. As shown in the preceding example, you can use the 'Copy' command to save
  1300. a copy of a presentation record and to restart from it  again if you want
  1301. to try an alternative strategy.  However, this copy will be lost as  soon
  1302. as you finish your current {\GAP} session.  If you use the 'Save' command
  1303. (see "Presentation Records") instead,  then you get a permanent copy on a
  1304. file which you can read in again in a later session.
  1305.  
  1306. \vspace{5mm}
  1307. 'TzSubstituteCyclicJoins( <P> )'
  1308. \index{TzSubstituteCyclicJoins}
  1309.  
  1310. 'TzSubstituteCyclicJoins'    performs   Tietze   transformations   on   a
  1311. presentation <P>.  It tries to find pairs of generators $a$ and $b$, say,
  1312. for which among  the  relators (possibly after  inverting  or conjugating
  1313. some of them) there are the commutator $[a,b]$ and powers $a^m$ and $b^n$
  1314. with mutually  prime exponents  $m$ and  $n$.   For each  such  pair,  it
  1315. substitutes the product $ab$  as  a new generator, and then it eliminates
  1316. the generators $a$ and $b$.
  1317.  
  1318. \vspace{5mm}
  1319. 'TzPrintLengths( <P> )'
  1320. \index{TzPrintLengths}
  1321.  
  1322. 'TzPrintLengths' prints  the list of  the lengths  of all relators of the
  1323. given presentation <P>.
  1324.  
  1325. \vspace{5mm}
  1326. 'TzPrintPairs( <P> )'
  1327. \index{TzPrintPairs} \\
  1328. 'TzPrintPairs( <P>, <n> )'
  1329.  
  1330. 'TzPrintPairs' determines  in  the  given presentation  <P>  the <n> most
  1331. frequently occurring squarefree relator subwords  of length  2 and prints
  1332. them together with their numbers of  occurrences.   The  default value of
  1333. <n> is 10.  A value $n = 0$ is interpreted as 'infinity'.
  1334.  
  1335. This  list is a  useful piece of information  in the context of using the
  1336. 'TzSubstitute' command described above.
  1337.  
  1338. \vspace{5mm}
  1339. 'TzPrintOptions( <P> )'
  1340. \index{TzPrintOptions}
  1341.  
  1342. Several  of  the  Tietze  transformation  commands  described  above  are
  1343. controlled by  certain parameters, the *Tietze options*, which often have
  1344. a  tremendous  influence on their performance and  results.   However, in
  1345. each application of the  commands, an appropriate choice of these  option
  1346. parameters  will depend on the concrete presentation under investigation.
  1347. Therefore we have implemented the Tietze options in such  a way that they
  1348. are associated to the presentation records{\:}  Each  presentation record
  1349. keeps its own  set  of  Tietze option parameters in the form of  ordinary
  1350. record components.   In  particular, you may alter the  value  of any  of
  1351. these  Tietze  options by  just assigning  a  new value to the respective
  1352. record component.  \index{Tietze options}
  1353.  
  1354. 'TzPrintOptions'  prints the Tietze  option components of  the  specified
  1355. presentation <P>.
  1356.  
  1357. \vspace{5mm}
  1358. The Tietze options have the following meaning.
  1359.  
  1360. 'eliminationsLimit': \\
  1361.         Whenever the elimination  phase of  the 'TzGo' command is entered
  1362.         for  a  presentation  <P>,   then  it   will  eliminate  at  most
  1363.         '<P>.eliminationsLimit' generators (except for further ones which
  1364.         have  turned  out  to   be  trivial).  Hence  you  may  use   the
  1365.         'eliminationsLimit' parameter as a break criterion for the 'TzGo'
  1366.         command.  Note, however, that it  is ignored by the 'TzEliminate'
  1367.         command.  The default value of 'eliminationsLimit' is 100.
  1368.  
  1369. 'expandLimit': \\
  1370.         Whenever the routine for eliminating  more than  1  generators is
  1371.         called for a presentation <P> by the 'TzEliminate' command or the
  1372.         elimination phase of the 'TzGo' command, then it saves the  given
  1373.         total  length of the  relators,  and  subsequently it checks  the
  1374.         current total length against  its value before  each elimination.
  1375.         If the total length  has increased to more than '<P>.expandLimit'
  1376.         per cent of its original value, then the  routine returns instead
  1377.         of   eliminating  another  generator.   Hence  you  may  use  the
  1378.         'expandLimit' parameter  as a  break  criterion  for  the  'TzGo'
  1379.         command.  The default value of 'expandLimit' is 150.
  1380.  
  1381. 'generatorsLimit': \\
  1382.         Whenever the elimination  phase of the  'TzGo' command is entered
  1383.         for  a  presentation  <P>  with  $n$  generators,  then  it  will
  1384.         eliminate at most $n - $'<P>.generatorsLimit'  generators (except
  1385.         for generators which turn out to  be trivial).  Hence you may use
  1386.         the  'generatorsLimit'  parameter  as  a break  criterion for the
  1387.         'TzGo' command.  The default value of 'generatorsLimit' is 0.
  1388.  
  1389. 'lengthLimit': \\
  1390.         The  Tietze  transformation  commands  will  never  eliminate   a
  1391.         generator of a presentation  <P>,  if  they  cannot  exclude  the
  1392.         possibility  that  the  resulting total  length  of  the relators
  1393.         exceeds  the value of  '<P>.lengthLimit'.  The default  value  of
  1394.         'lengthLimit' is 'infinity'.
  1395.  
  1396. 'loopLimit': \\
  1397.         Whenever the 'TzGo'  command  is called  for a  presentation <P>,
  1398.         then  it  will  loop  over  at  most '<P>.loopLimit' of its basic
  1399.         steps.  Hence you  may  use the  'loopLimit' parameter as a break
  1400.         criterion  for   the  'TzGo'   command.  The   default  value  of
  1401.         'loopLimit' is 'infinity'.
  1402.  
  1403. 'printLevel': \\
  1404.         Whenever   Tietze  transformation  commands  are  called  for   a
  1405.         presentation <P> with  '<P>.printLevel'  $=  0$,  they  will  not
  1406.         provide any output except for error messages. If '<P>.printLevel'
  1407.         $=  1$, they will display some  reasonable amount of output which
  1408.         allows you to watch the progress of the computation and to decide
  1409.         about your next commands. In the case '<P>.printLevel' $= 2$, you
  1410.         will  get  a much more  generous amount  of output.  Finally,  if
  1411.         '<P>.printLevel' $= 3$, various messages on internal details will
  1412.         be added.  The default value of 'printLevel' is 1.
  1413.  
  1414. 'saveLimit': \\
  1415.         Whenever the  'TzSearch' command has finished its main loop  over
  1416.         all relators of a presentation <P>, then it checks whether during
  1417.         this loop the total length of the relators has been reduced by at
  1418.         least  '<P>.saveLimit'  per  cent.  If  this is  the  case,  then
  1419.         'TzSearch' repeats its procedure instead of returning.  Hence you
  1420.         may use the 'saveLimit' parameter  as a  break  criterion for the
  1421.         'TzSearch' command  and, in  particular,  for the search phase of
  1422.         the 'TzGo' command.  The default value of 'saveLimit' is 10.
  1423.  
  1424. 'searchSimultaneous': \\
  1425.         Whenever the 'TzSearch'  or the 'TzSearchEqual' command is called
  1426.         for  a  presentation  <P>,  then it is  allowed  to handle  up to
  1427.         '<P>.searchSimultaneously' short relators simultaneously (see for
  1428.         the description of the 'TzSearch' command for more details).  The
  1429.         choice of this parameter may heavily influence the performance as
  1430.         well  as  the result of the  'TzSearch'  and  the 'TzSearchEqual'
  1431.         commands and  hence also  of  the  search  phase  of  the  'TzGo'
  1432.         command.  The default value of 'searchSimultaneous' is 20.
  1433.  
  1434. \vspace{5mm} As soon as  a presentation record has been defined, you  may
  1435. alter any of its Tietze option parameters at any time by just assigning a
  1436. new value to the respective component.
  1437.  
  1438. To demonstrate  the  effect of the 'eliminationsLimit' parameter, we will
  1439. give  an example in which we handle a subgroup of index 240 in a group of
  1440. order 40320  given by  a presentation  due  to B.~H.  Neumann.   First we
  1441. construct a presentation of the subgroup, and  then  we  apply  to it the
  1442. 'TzGoGo'   command  for  different   values  of  the  'eliminationsLimit'
  1443. parameter (including the default value 100).  In  fact, we also alter the
  1444. 'printLevel' parameter, but this  is only done in order to suppress  most
  1445. of  the output.   In all  cases the  resulting  presentations  cannot  be
  1446. improved any more by applying the 'TzGoGo'  command again, i.e., they are
  1447. the best results which we can get without substituting new generators.
  1448.  
  1449. |    gap> a := AbstractGenerator( "a" );;
  1450.     gap> b := AbstractGenerator( "b" );;
  1451.     gap> c := AbstractGenerator( "c" );;
  1452.     gap> G := Group( [ a, b, c ], IdWord );;
  1453.     gap> G.relators := [ a^3, b^3, c^3, (a*b)^5, (a^-1*b)^5, (a*c)^4,
  1454.     >       (a*c^-1)^4, a*b^-1*a*b*c^-1*a*c*a*c^-1, (b*c)^3, (b^-1*c)^4 ];;
  1455.     gap> H := Subgroup( G, [ a, c ] );;
  1456.     gap> P := PresentationSubgroup( G, H );
  1457.     << presentation with 224 gens and 593 rels of total length 2769 >>
  1458.     gap> for i in [ 28, 29, 30, 94, 100 ] do
  1459.     >       Pi := Copy( P );
  1460.     >       Pi.eliminationsLimit := i;
  1461.     >       Print( "&I  eliminationsLimit set to ", i, "\n" );
  1462.     >       Pi.printLevel := 0;
  1463.     >       TzGoGo( Pi );
  1464.     >       TzPrintStatus( Pi );
  1465.     >    od;
  1466.     &I  eliminationsLimit set to 28
  1467.     &I  there are 2 generators and 95 relators of total length 10817
  1468.     &I  eliminationsLimit set to 29
  1469.     &I  there are 2 generators and 5 relators of total length 35
  1470.     &I  eliminationsLimit set to 30
  1471.     &I  there are 3 generators and 98 relators of total length 2928
  1472.     &I  eliminationsLimit set to 94
  1473.     &I  there are 4 generators and 78 relators of total length 1667
  1474.     &I  eliminationsLimit set to 100
  1475.     &I  there are 3 generators and 90 relators of total length 3289 |
  1476.  
  1477. Similarly,  we  demonstrate the influence of the 'saveLimit' parameter by
  1478. just continuing the  preceding example  for some  different values of the
  1479. 'saveLimit' parameter  (including  its  default  value  10),  but without
  1480. changing the 'eliminationsLimit'  parameter which keeps its default value
  1481. 100.
  1482.  
  1483. |    gap> for i in [ 9, 10, 11, 12, 15 ] do
  1484.     >       Pi := Copy( P );
  1485.     >       Pi.saveLimit := i;
  1486.     >       Print( "&I  saveLimit set to ", i, "\n" );
  1487.     >       Pi.printLevel := 0;
  1488.     >       TzGoGo( Pi );
  1489.     >       TzPrintStatus( Pi );
  1490.     >    od;
  1491.     &I  saveLimit set to 9
  1492.     &I  there are 3 generators and 97 relators of total length 5545
  1493.     &I  saveLimit set to 10
  1494.     &I  there are 3 generators and 90 relators of total length 3289
  1495.     &I  saveLimit set to 11
  1496.     &I  there are 3 generators and 103 relators of total length 3936
  1497.     &I  saveLimit set to 12
  1498.     &I  there are 2 generators and 4 relators of total length 21
  1499.     &I  saveLimit set to 15
  1500.     &I  there are 3 generators and 143 relators of total length 18326 |
  1501.  
  1502. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1503. \Section{DecodeTree}%
  1504.  
  1505. 'DecodeTree( <P> )'
  1506. \index{tree decoding}
  1507.  
  1508. 'DecodeTree' eliminates the secondary generators  from a presentation <P>
  1509. constructed by  the Modified Todd-Coxeter (see 'PresentationSubgroupMtc')
  1510. or      the      Reduced     Reidemeister-Schreier     procedure     (see
  1511. 'PresentationSubgroupRrs', 'PresentationNormalClosureRrs').  It is called
  1512. automatically by the 'PresentationSubgroupMtc'  command where it  reduces
  1513. <P> to a presentation on the given subgroup generators.
  1514. \index{secondary subgroup generators}
  1515.  
  1516. In order to explain the effect of this command  we  need to insert  a few
  1517. remarks  on  the  subgroup  presentation commands  described  in  section
  1518. "Subgroup  Presentations".  All these  commands have  the common property
  1519. that in the process  of  constructing a presentation for a given subgroup
  1520. <H>  of  a finitely  presented  group  <G> they  first build up a  highly
  1521. redundant  list of generators  of  <H>  which consists of an (in  general
  1522. small) list of  \"primary\" generators, followed by an (in general large)
  1523. list  of \"secondary\" \  generators,  and then  construct a presentation
  1524. $P_0$, say, *on a sublist of these generators* by rewriting  the defining
  1525. relators  of <G>.  This  sublist  contains all primary, but, at  least in
  1526. general, by far not all secondary generators.
  1527. \index{primary subgroup generators}
  1528.  
  1529. The role of the primary generators depends on  the concrete choice of the
  1530. subgroup presentation command.  If  the  Modified  Todd-Coxeter method is
  1531. used, they are just the given generators of <H>, whereas  in  the case of
  1532. the Reduced Reidemeister-Schreier algorithm they are  constructed  by the
  1533. program.
  1534.  
  1535. Each of  the secondary generators is defined  by a  word of length two in
  1536. the preceding  generators and their inverses.  By historical reasons, the
  1537. list  of these  definitions is  called  the  *subgroup  generators  tree*
  1538. though in fact it is not a tree but rather a kind of bush.
  1539. \index{subgroup generators tree}
  1540.  
  1541. Now we have to distinguish two cases.  If  $P_0$ has been constructed  by
  1542. the Reduced Rei\-de\-mei\-ster-Schreier routines, it is a presentation of
  1543. <H>.   However, if  the Modified Todd-Coxeter  routines  have  been  used
  1544. instead, then  the relators in $P_0$ are valid relators  of <H>, but they
  1545. do not necessarily  define <H>.  We handle these cases in turn,  starting
  1546. with the latter one.
  1547.  
  1548. Also in the  case  of the Modified Todd-Coxeter method,  we could  easily
  1549. extend  $P_0$ to a presentation of <H> by adding to it  all the secondary
  1550. generators which are not yet contained in it and all the definitions from
  1551. the generators tree as additional generators and relators.  Then we could
  1552. recursively eliminate all secondary generators by Tietze  transformations
  1553. using the  new relators.  However,  this  procedure  turns out to  be too
  1554. inefficient to be of interest.
  1555.  
  1556. Instead, we  use the  so called *tree decoding* procedure which  has been
  1557. developed  in  St.~Andrews by  David  G.~Arrell,  Sanjiv  Manrai,  Edmund
  1558. F.~Robertson, and Michael F.~Wor\-boys  (see \cite{AMW82},  \cite{AR84}).
  1559. It proceeds as follows.
  1560.  
  1561. Starting  from $P = P_0$,  it runs  through a number of steps in each  of
  1562. which it eliminates the current \"last\" \ generator (with respect to the
  1563. list of  all primary and secondary  generators).  If the  last  generator
  1564. <g>, say, is a primary generator, then the procedure finishes.  Otherwise
  1565. it checks whether there is a  relator  in  the current presentation which
  1566. can be used to substitute <g> by a Tietze transformation.  If so, this is
  1567. done.  Otherwise, and only  then, the  tree definition of <g> is added to
  1568. <P>  as  a new  relator,  and the generators involved  are  added as  new
  1569. generators if they have not yet been contained in <P>.  Subsequently, <g>
  1570. is eliminated.
  1571.  
  1572. Note that the extension of <P> by  one or two new  generators is *not*  a
  1573. Tietze  transformation.  In general, it will change the  isomorphism type
  1574. of the group  defined by  <P>.  However,  it is a remarkable  property of
  1575. this  procedure, that  at  the  end,  i.e.,  as  soon  as  all  secondary
  1576. generators have been eliminated, it  provides a  presentation  $P = P_1$,
  1577. say, which defines  a  group  isomorphic to <H>.   In  fact,  it is  this
  1578. presentation  which is returned by  the 'DecodeTree' command and hence by
  1579. the 'PresentationSubgroupMtc' command.
  1580.  
  1581. If, in the other case, the presentation $P_0$ has been constructed by the
  1582. Reduced   Reidemeister-Schreier   algorithm,  then  $P_0$   itself  is  a
  1583. presentation  of <H>, and the corresponding subgroup presentation command
  1584. ('PresentationSubgroupRrs'   or    'PresentationNormalClosureRrs')   just
  1585. returns $P_0$.
  1586.  
  1587. As  mentioned in section  "Subgroup Presentations", we  recommend further
  1588. simplifying this  presentation  before using it.  The standard  way to do
  1589. this is to start from $P_0$ and to apply suitable Tietze transformations,
  1590. e.g.,  by calling the 'TzGo' or  'TzGoGo' commands.  This is probably the
  1591. most efficient approach, but  you will end up with a presentation on some
  1592. unpredictable set of generators.   As an alternative, {\GAP}  offers  you
  1593. the  'DecodeTree' command  which you can use to  eliminate all  secondary
  1594. generators (provided that there are no space or time problems).  For this
  1595. purpose,  the  subgroup presentation  commands  do  not only  return  the
  1596. resulting  presentation, but also the tree (together with some associated
  1597. lists)  as  a  kind  of  side  result in  a component  '<P>.tree' of  the
  1598. resulting presentation record <P>.
  1599.  
  1600. Note,  however, that  the tree decoding  routines will not work correctly
  1601. any  more  on  a presentation  from which  generators have  already  been
  1602. eliminated  by  Tietze transformations.  Therefore, to prevent  you  from
  1603. getting wrong  results by calling  the  'DecodeTree'  command in  such  a
  1604. situation, {\GAP}  will automatically remove the subgroup generators tree
  1605. from  a  presentation  record  as  soon  as  one  of  the  generators  is
  1606. substituted by a Tietze transformation.
  1607.  
  1608. Nevertheless,  a certain misuse of  the command is still possible, and we
  1609. want to explicitly warn you from this.   The reason  is  that the  Tietze
  1610. option parameters described in  section "Tietze Transformations" apply to
  1611. the 'DecodeTree' command as well.  Hence, in case of inadequate values of
  1612. these  parameters,  it may  happen  that the  'DecodeTree' routine  stops
  1613. before all  the secondary generators  have vanished.  In this case {\GAP}
  1614. will  display  an  appropriate  warning.   Then  you  should  change  the
  1615. respective   parameters   and  continue  the  process   by  calling   the
  1616. 'DecodeTree'  command  again.   Otherwise,  if  you  would  apply  Tietze
  1617. transformations,  it  might  happen  because  of the convention described
  1618. above that  the  tree  is  removed  and  that you end  up  with  a  wrong
  1619. presentation.
  1620.  
  1621. After  a successful run of  the 'DecodeTree' command  it is convenient to
  1622. further   simplify  the   resulting   presentation  by  suitable   Tietze
  1623. transformations.
  1624.  
  1625. As an example of an explicit call of the 'DecodeTree' command we  compute
  1626. two presentations  of  a  subgroup  of  order  $384$  in a group of order
  1627. $6912$.   In  both  cases  we   use   the  Reduced  Reidemeister-Schreier
  1628. algorithm, but  in the first run we just apply the Tietze transformations
  1629. offered by the 'TzGoGo' command with  its default  parameters, whereas in
  1630. the second run we call the 'DecodeTree' command before.
  1631.  
  1632. |    gap> a := AbstractGenerator( "a" );; b := AbstractGenerator( "b" );;
  1633.     gap> G := Group( [ a, b ], IdWord );;
  1634.     gap> G.relators := [
  1635.     >      a*b^2*a^-1*b^-1*a^3*b^-1, b*a^2*b^-1*a^-1*b^3*a^-1 ];;
  1636.     gap> H := Subgroup( G, [ Comm(a^-1,b^-1), Comm(a^-1,b), Comm(a,b) ] );;
  1637.     gap> &
  1638.     gap> & We use the Reduced Reidemeister Schreier method and default
  1639.     gap> & Tietze transformations to get a presentation for H.
  1640.     gap> P := PresentationSubgroupRrs( G, H );
  1641.     << presentation with 18 gens and 35 rels of total length 169 >>
  1642.     gap> TzGoGo( P );
  1643.     &I  there are 3 generators and 20 relators of total length 488
  1644.     &I  there are 3 generators and 20 relators of total length 466
  1645.     gap> & We end up with 20 relators of total length 466.
  1646.     gap> &
  1647.     gap> & Now we repeat the procedure, but we call the tree decoding
  1648.     gap> & algorithm before doing the Tietze transformations.
  1649.     gap> P := PresentationSubgroupRrs( G, H );
  1650.     << presentation with 18 gens and 35 rels of total length 169 >>
  1651.     gap> DecodeTree( P );
  1652.     &I  there are 9 generators and 26 relators of total length 185
  1653.     &I  there are 6 generators and 23 relators of total length 213
  1654.     &I  there are 3 generators and 20 relators of total length 252
  1655.     &I  there are 3 generators and 20 relators of total length 244
  1656.     gap> TzGoGo( P );
  1657.     &I  there are 3 generators and 19 relators of total length 168
  1658.     &I  there are 3 generators and 17 relators of total length 138
  1659.     &I  there are 3 generators and 15 relators of total length 114
  1660.     &I  there are 3 generators and 13 relators of total length 96
  1661.     &I  there are 3 generators and 12 relators of total length 84
  1662.     gap> & This time we end up with a shorter presentation. |
  1663.  
  1664. As  an  example  of   an   implicit   call   of   the   command  via  the
  1665. 'PresentationSubgroupMtc' command  we handle a subgroup of index 240 in a
  1666. group of order 40320 given by a presentation due to B.~H.~Neumann.
  1667.  
  1668. |    gap> a := AbstractGenerator( "a" );;
  1669.     gap> b := AbstractGenerator( "b" );;
  1670.     gap> c := AbstractGenerator( "c" );;
  1671.     gap> G := Group( [ a, b, c ], IdWord );;
  1672.     gap> G.relators := [ a^3, b^3, c^3, (a*b)^5, (a^-1*b)^5, (a*c)^4,
  1673.     >       (a*c^-1)^4, a*b^-1*a*b*c^-1*a*c*a*c^-1, (b*c)^3, (b^-1*c)^4 ];;
  1674.     gap> H := Subgroup( G, [ a, c ] );;
  1675.     gap> InfoFpGroup1 := Print;;
  1676.     gap> P := PresentationSubgroupMtc( G, H );;
  1677.     &I  index is 240
  1678.     &I  MTC defined 2 primary and 4472 secondary subgroup generators
  1679.     &I  there are 246 generators and 617 relators of total length 2893
  1680.     &I  calling DecodeTree
  1681.     &I  there are 114 generators and 380 relators of total length 1829
  1682.     &I  there are 72 generators and 293 relators of total length 1849
  1683.     &I  there are 47 generators and 252 relators of total length 2062
  1684.     &I  there are 36 generators and 214 relators of total length 2341
  1685.     &I  there are 25 generators and 188 relators of total length 2957
  1686.     &I  there are 20 generators and 170 relators of total length 3313
  1687.     &I  there are 20 generators and 158 relators of total length 4155
  1688.     &I  there are 21 generators and 155 relators of total length 6088
  1689.     &I  there are 24 generators and 155 relators of total length 9014
  1690.     &I  there are 27 generators and 155 relators of total length 13812
  1691.     &I  there are 31 generators and 155 relators of total length 20654
  1692.     &I  there are 36 generators and 155 relators of total length 32444
  1693.     &I  there are 39 generators and 155 relators of total length 51121
  1694.     &I  there are 42 generators and 155 relators of total length 74713
  1695.     &I  there are 40 generators and 153 relators of total length 85251
  1696.     &I  there are 12 generators and 140 relators of total length 29401
  1697.     &I  there are 7 generators and 131 relators of total length 18067
  1698.     &I  there are 4 generators and 122 relators of total length 20325
  1699.     &I  there are 2 generators and 115 relators of total length 21588
  1700.     &I  there are 2 generators and 114 relators of total length 16370
  1701.     gap> TzGoGo( P );
  1702.     &I  there are 2 generators and 112 relators of total length 13126
  1703.     &I  there are 2 generators and 99 relators of total length 7572
  1704.     &I  there are 2 generators and 62 relators of total length 3384
  1705.     &I  there are 2 generators and 24 relators of total length 1506
  1706.     &I  there are 2 generators and 20 relators of total length 1000
  1707.     &I  there are 2 generators and 13 relators of total length 494
  1708.     &I  there are 2 generators and 10 relators of total length 314
  1709.     &I  there are 2 generators and 9 relators of total length 252
  1710.     &I  there are 2 generators and 8 relators of total length 192
  1711.     &I  there are 2 generators and 7 relators of total length 92
  1712.     &I  there are 2 generators and 6 relators of total length 52
  1713.     gap> TzPrintGenerators( P );
  1714.     &I  1.  _x1   26 occurrences
  1715.     &I  2.  _x2   26 occurrences |
  1716.  
  1717. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1718. %%
  1719. %E  Emacs . . . . . . . . . . . . . . . . . . . . . local Emacs variables
  1720. %%
  1721. %%  Local Variables:
  1722. %%  mode:               outline
  1723. %%  outline-regexp:     "\\\\Chapter\\|\\\\Section"
  1724. %%  fill-column:        73
  1725. %%  eval:               (hide-body)
  1726. %%  End:
  1727. %%
  1728.  
  1729.  
  1730.  
  1731.