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

  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. %%
  3. %A  permgrp.tex                 GAP documentation                   Udo Polis
  4. %%
  5. %A  @(#)$Id: permgrp.tex,v 3.14 1993/02/12 14:20:47 felsch Exp $
  6. %%
  7. %Y  Copyright 1990-1992,  Lehrstuhl D fuer Mathematik,  RWTH Aachen,  Germany
  8. %%
  9. %%  This file describes those functions that deal with permutation groups
  10. %%
  11. %H  $Log: permgrp.tex,v $
  12. %H  Revision 3.14  1993/02/12  14:20:47  felsch
  13. %H  examples adjusted to line length 72
  14. %H
  15. %H  Revision 3.13  1993/02/10  21:19:21  martin
  16. %H  added the description of composition series
  17. %H
  18. %H  Revision 3.12  1993/02/02  12:49:44  felsch
  19. %H  long lines fixed
  20. %H
  21. %H  Revision 3.11  1993/02/02  10:55:03  felsch
  22. %H  examples fixed
  23. %H
  24. %H  Revision 3.10  1993/01/22  19:34:56  martin
  25. %H  fixed Heiko's stuff
  26. %H
  27. %H  Revision 3.9  1993/01/15  11:44:16  fceller
  28. %H  added Heiko's changes in soluble permgroup stuff
  29. %H
  30. %H  Revision 3.8  1992/12/02  10:12:06  fceller
  31. %H  added functions for solvable perm groups
  32. %H
  33. %H  Revision 3.7  1992/04/30  12:01:23  martin
  34. %H  changed a few sentences to avoid bold non-roman fonts
  35. %H
  36. %H  Revision 3.6  1992/04/07  19:40:47  martin
  37. %H  changed everything
  38. %H
  39. %H  Revision 3.5  1992/04/02  21:06:23  martin
  40. %H  changed *domain functions* to *set theoretic functions*
  41. %H
  42. %H  Revision 3.4  1992/03/25  15:37:32  martin
  43. %H  added new sections for group homomorphisms
  44. %H
  45. %H  Revision 3.3  1992/03/10  12:17:54  martin
  46. %H  added 'IsRegular' and 'IsSemiRegular'
  47. %H
  48. %H  Revision 3.2  1992/01/16  13:14:07  martin
  49. %H  added 'MakeStabChainStrongGenerators'
  50. %H
  51. %H  Revision 3.1  1992/01/15  14:09:18  martin
  52. %H  initial revision under RCS
  53. %H
  54. %%
  55. \hyphenation{orbit-point}
  56. \hyphenation{orbit-points}
  57. \hyphenation{base-point}
  58. \hyphenation{gen-er-a-tor}
  59. \hyphenation{gen-er-a-tors}
  60. \Chapter{Permutation Groups}
  61.  
  62. A permutation  group  is  a group of permutations  on a set  $\Omega$  of
  63. positive integers (see chapters "Groups" and "Permutations").
  64.  
  65. Our  standard example  in this chapter will  be  the symmetric  group  of
  66. degree 4, which is defined by the following {\GAP} statements.
  67.  
  68. |    gap> s4 := Group( (1,2), (1,2,3,4) );
  69.     Group( (1,2), (1,2,3,4) ) |
  70.  
  71. This introduction  is followed by  a section that describes the  function
  72. that tests whether an object  is a permutation group or  not (see section
  73. "IsPermGroup").  The  next  sections  describe  the  functions  that  are
  74. related  to  the  set  of  points  moved  by  a  permutation  group  (see
  75. "PermGroupOps.MovedPoints",            "PermGroupOps.SmallestMovedPoint",
  76. "PermGroupOps.LargestMovedPoint", and "PermGroupOps.NrMovedPoints").  The
  77. following section  describes the concept of stabilizer chains, which  are
  78. used by most functions for permutation groups (see "Stabilizer  Chains").
  79. The following sections describe  the  functions that compute or  change a
  80. stabilizer     chain     (see     "MakeStabChain",     "ExtendStabChain",
  81. "ReduceStabChain",  "MakeStabChainStrongGenerators").  The  next sections
  82. describe the  functions that  extract information from  stabilizer chains
  83. (see     "Base      for     Permutation     Groups",     "ListStabChain",
  84. "PermGroupOps.Indices", and  "PermGroupOps.StrongGenerators").  The  next
  85. two sections describe the functions that  find elements or subgroups of a
  86. permutaiton group with a property (see "PermGroupOps.ElementProperty" and
  87. "PermGroupOps.SubgroupProperty").
  88.  
  89. Because each permutation group  is a domain all  set theoretic  functions
  90. can  be  applied  to it  (see  chapter "Domains"  and "Set Functions  for
  91. Permutation Groups").  Also because each permutation group is after all a
  92. group all group functions can be applied to  it (see chapter "Groups" and
  93. "Group  Functions for  Permutation  Groups").  Finally  each  permutation
  94. group operates  naturally  on  the positive integers,  so all  operations
  95. functions  can  be  applied  (see  chapter  "Operations  of  Groups"  and
  96. "Operations of  Permutation  Groups").  The last  section in this chapter
  97. describes the representation  of  permutation  groups  (see  "Permutation
  98. Group Records").
  99.  
  100. The external functions are in the file 'LIBNAME/\"permgrp.g\"'.
  101.  
  102. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  103. \Section{IsPermGroup}
  104.  
  105. 'IsPermGroup( <obj> )'
  106.  
  107. 'IsPermGroup' returns 'true' if the object  <obj>, which may be an object
  108. of an arbitrary type, is  a permutation group, and 'false' otherwise.  It
  109. will signal an error if <obj> is an unbound variable.
  110.  
  111. |    gap> s4 := Group( (1,2), (1,2,3,4) );; s4.name := "s4";;
  112.     gap> IsPermGroup( s4 );
  113.     true
  114.     gap> f := FactorGroup( s4, Subgroup( s4, [(1,2)(3,4),(1,3)(2,4)] ) );
  115.     (s4 / Subgroup( s4, [ (1,2)(3,4), (1,3)(2,4) ] ))
  116.     gap> IsPermGroup( f );
  117.     false    # see section "FactorGroup"
  118.     gap> IsPermGroup( [ 1, 2 ] );
  119.     false |
  120.  
  121. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  122. \Section{PermGroupOps.MovedPoints}
  123.  
  124. 'PermGroupOps.MovedPoints( <G> )'
  125.  
  126. 'PermGroupOps.MovedPoints'  returns  the  set  of  moved  points  of  the
  127. permutation group <G>,  i.e., points  which  are  moved  by at  least one
  128. element of <G> (also see "PermGroupOps.NrMovedPoints").
  129.  
  130. |    gap> s4 := Group( (1,3,5,7), (1,3) );;
  131.     gap> PermGroupOps.MovedPoints( s4 );
  132.     [ 1, 3, 5, 7 ]
  133.     gap> PermGroupOps.MovedPoints( Group( () ) );
  134.     [  ] |
  135.  
  136. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  137. \Section{PermGroupOps.SmallestMovedPoint}
  138.  
  139. 'PermGroupOps.SmallestMovedPoint( <G> )'
  140.  
  141. 'PermGroupOps.SmallestMovedPoint'  returns the smallest  positive integer
  142. which   is   moved   by    the   permutation   group    <G>   (see   also
  143. "PermGroupOps.LargestMovedPoint").  This function signals an error if <G>
  144. is trivial.
  145.  
  146. |    gap> s3b := Group( (2,3), (2,3,4) );;
  147.     gap> PermGroupOps.SmallestMovedPoint( s3b );
  148.     2 |
  149.  
  150. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  151. \Section{PermGroupOps.LargestMovedPoint}
  152.  
  153. 'PermGroupOps.LargestMovedPoint( <G> )'
  154.  
  155. 'PermGroupOps.LargestMovedPoint'  returns  the  largest positive  integer
  156. which    is   moved   by   the   permutation    group   <G>   (see   also
  157. "PermGroupOps.SmallestMovedPoint").  This  function  signals an  error if
  158. <G> is trivial.
  159.  
  160. |    gap> s4 := Group( (1,2,3,4), (1,2) );;
  161.     gap> PermGroupOps.LargestMovedPoint( s4 );
  162.     4 |
  163.  
  164. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  165. \Section{PermGroupOps.NrMovedPoints}
  166.  
  167. 'PermGroupOps.NrMovedPoints( <G> )'
  168.  
  169. 'PermGroupOps.NrMovedPoints'  returns  the number of moved points  of the
  170. permutation  group <G>,  i.e.,  points  which are moved by  at  least one
  171. element of <G> (also see "PermGroupOps.MovedPoints").
  172.  
  173. |    gap> s4 := Group( (1,3,5,7), (1,3) );;
  174.     gap> PermGroupOps.NrMovedPoints( s4 );
  175.     4
  176.     gap> PermGroupOps.NrMovedPoints( Group( () ) );
  177.     0 |
  178.  
  179. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  180. \Section{Stabilizer Chains}
  181.  
  182. Most of  the algorithms for permutation groups  need a *stabilizer chain*
  183. of the group.  The concept of stabilizer chains was introduced by Charles
  184. Sims in \cite{Sim70}.
  185.  
  186. If $[b_1, \ldots, b_n]$ is a list of points, $G^{(1)} = G$ and $G^{(i+1)}
  187. = Stab_{G^{(i)}}(b_i)$ such that $G^{(n+1)} = \{ () \}$.  The list $[b_1,
  188. \ldots, b_n]$ is  called a *base*  of $G$,  the points  $b_i$ are  called
  189. *basepoints*.   A  set $S$ of generators for $G$ satisfying the condition
  190. $\< S \cap G^{(i)} >$ = $G^{(i)}$ for each $1 \leq i \leq n$, is called a
  191. *strong  generating set*  (SGS)  of $G$.  More  precisely we ought to say
  192. that  a  set $S$  that satisfies the  conditions  above is a  SGS  of $G$
  193. *relative*  to $B$.   The chain  of subgroups of $G$ itself is called the
  194. *stabilizer chain* of $G$ relative to $B$.
  195.  
  196. Since $[b_1, \ldots, b_n]$, where $n$ is the degree of $G$ and  $b_i$ are
  197. the moved  points of $G$, certainly is a base for $G$ there exists a base
  198. for each permutation group.  The number of points in a base is called the
  199. *length* of the base.  A base $B$ is called *reduced* if no stabilizer in
  200. the chain relative to $B$ is trivial, i.e., there exists no $i$ such that
  201. $G^{(i)} = G^{(i+1)}$.   Note that  different reduced bases for one group
  202. $G$  may  have  different  length.   For  example,  the  Chevalley  Group
  203. $G_2(4)$ possesses reduced bases of length 5 and 7.
  204.  
  205. Let $R^{(i)}$ be a right transversal of $G^{(i+1)}$ in $G^{(i)}$, i.e., a
  206. set  of  right  coset representatives of the  cosets  of  $G^{(i+1)}$  in
  207. $G^{(i)}$.  Then each  element $g$ of $G$ has a unique  representation of
  208. the following form $g = r_n  \ldots r_1$ with  $r_i \in  R^{(i)}$.   Thus
  209. with the knowledge of  the transversals $R^{(i)}$ we know each element of
  210. $G$, in principle.  This is one  reason  why stabilizer chains are one of
  211. the most  useful tools for permutation  groups.  Furthermore  basic group
  212. theory  tells us  that  we  can  identify  the  cosets of  $G^{(i+1)}$ in
  213. $G^{(i)}$ with the points  in $O^{(i)} \:=  b_i^{G^{(i)}}$.   So we could
  214. represent  a  transversal   as  a  list  $T$  such   that  $T[p]$  is   a
  215. representative of  the coset  corresponding to the point $p \in O^{(i)}$,
  216. i.e., an element of $G^{(i)}$ that takes $b_i$ to $p$.
  217.  
  218. For permutation groups of small degree this  might be  possible,  but for
  219. permutation groups of large degree it is still not good enough.  Our goal
  220. then is to store as  few different permutations as possible  such that we
  221. can still reconstruct each representative in $R^{(i)}$, and from them the
  222. elements in $G$.  A  *factorized inverse transversal* $T$ is a list where
  223. $T[p]$ is a *generator* of $G^{(i)}$ such that $p^{T[p]}$ is a point that
  224. lies earlier  in $O^{(i)}$ than $p$ (note that we consider $O^{(i)}$ as a
  225. list not  as a set).  If we assume inductively that we know an element $r
  226. \in G^{(i)}$ that  takes $b_i$ to $p^{T[p]}$, then  $r  T[p]^{-1}$  is an
  227. element in $G^{(i)}$ that takes $b_i$ to $p$.
  228.  
  229. A stabilizer chain (see  "MakeStabChain", "Permutation Group Records") is
  230. stored recursively  in {\GAP}.  The  group  record of a permutation group
  231. <G> with a stabilizer chain  has the following additional components.
  232.  
  233. 'orbit':  \\
  234.         List of orbitpoints of 'orbit[1]'  (which is the basepoint) under
  235.         the action of the generators.
  236.  
  237. 'transversal': \\
  238.         Factorized inverse transversal as defined above.
  239.  
  240. 'stabilizer': \\
  241.         Record for the  stabilizer  of the point 'orbit[1]' in the  group
  242.         generated  by  'generators'.  The components  of this  record are
  243.         again 'generators', 'orbit', 'transversal' and 'stabilizer'.  The
  244.         last  stabilizer  in  the  stabilizer  chain  only  contains  the
  245.         component 'generators', which is an empty list.
  246.  
  247. Note  that the values of these components are  changed by functions  that
  248. change, extend, or reduce a base (see "MakeStabChain", "ExtendStabChain",
  249. and "ReduceStabChain").
  250.  
  251. Note  that the  records that represent  the  stabilizers  are  not  group
  252. records  (see "Group Records").  Thus you cannot  take such a  stabilizer
  253. and apply group functions to it.  The last 'stabilizer' in the stabilizer
  254. chain is a record whose component 'generators' is empty.
  255.  
  256. Below you  find  an  example for  a *stabilizer chain* for the  symmetric
  257. group of degree 4.
  258.  
  259. |    rec(
  260.         identity    := (),
  261.         generators  := [ (1,2), (1,2,3,4) ],
  262.         orbit       := [ 1, 2, 4, 3 ],
  263.         transversal := [ (), (1,2), (1,2,3,4), (1,2,3,4) ],
  264.         stabilizer := rec(
  265.             identity    := (),
  266.             generators  := [ (3,4), (2,4) ],
  267.             orbit       := [ 2, 4, 3 ],
  268.             transversal := [ , (), (3,4), (2,4) ],
  269.             stabilizer := rec(
  270.                 identity    := (),
  271.                 generators  := [ (3,4) ],
  272.                 orbit       := [ 3, 4 ],
  273.                 transversal := [ ,, (), (3,4) ],
  274.                 stabilizer := rec(
  275.                     identity   := (),
  276.                     generators := [  ]
  277.                 )
  278.             )
  279.         )
  280.     ) |
  281.  
  282. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  283. \Section{MakeStabChain}
  284.  
  285. 'MakeStabChain( <G> )' \\
  286. 'MakeStabChain( <G>, <lst> )'
  287.  
  288. 'MakeStabChain' computes a *reduced* stabilizer chain for the permutation
  289. group <G>.
  290.  
  291. If no stabilizer  chain for $G$ is already known and no argument <lst> is
  292. given,  it  computes a reduced stabilizer chain for the lexicographically
  293. smallest reduced base of <G>.
  294.  
  295. If no stabilizer chain  for $G$ is already known and an argument <lst> is
  296. given, it computes  a *reduced* stabilizer chain with  a base that starts
  297. with the points in <lst>.  Note that  points in <lst>  that would lead to
  298. trivial stabilizers will be skipped (see "ExtendStabChain").
  299.  
  300. The stabilizer  chain  is computed using  the  *Schreier-Sims-Algorithm*,
  301. which  is  described  in  \cite{Leo80}.   The  time used  is in  practice
  302. proportional to the third power of the degree of the group.
  303.  
  304. If a stabilizer chain for  $G$ is already known and  no argument <lst> is
  305. given, it reduces the known stabilizer chain.
  306.  
  307. If a stabilizer chain for $G$ is already known and  an argument <lst>  is
  308. given,  it  changes  the stabilizer chain  such  that  the  result  is  a
  309. *reduced* stabilizer chain with a  base that starts  with the  points  in
  310. <lst> (see "ExtendStabChain").  Note that points in <lst> that would lead
  311. to trivial stabilizers will be skipped.
  312.  
  313. The  algorithm  used  in  this  case is  called  *basechange*,  which  is
  314. described in \cite{But82}.  The worst cases for  the basechange algorithm
  315. are groups of large degree which have a long base.
  316.  
  317. |    gap> s4 := Group( (1,2), (1,2,3,4) );
  318.     Group( (1,2), (1,2,3,4) )
  319.     gap> MakeStabChain( s4 );    # compute a stabilizer chain
  320.     gap> Base( s4 );
  321.     [ 1, 2, 3 ]
  322.     gap> MakeStabChain( s4, [4,3,2,1] );    # perform a basechange
  323.     gap> Base( s4 );
  324.     [ 4, 3, 2 ] |
  325.  
  326. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  327. \Section{ExtendStabChain}
  328.  
  329. 'ExtendStabChain( <G>, <lst> )'
  330.  
  331. 'ExtendStabChain' inserts  trivial  stabilizers into the known stabilizer
  332. chain of  the permutation group <G> such  that <lst>  becomes the base of
  333. <G>.  The stabilizer chain which belongs to the base <lst> must reduce to
  334. the old stabilizer chain (see "ReduceStabChain").
  335.  
  336. This function   is useful if  two  different  (sub-)groups  have  to have
  337. exactly the same base.
  338.  
  339. |    gap> s4 := Group( (1,2), (1,2,3,4) );;
  340.     gap> MakeStabChain( s4, [3,2,1] );  Base( s4 );
  341.     [ 3, 2, 1 ]
  342.     gap> h := Subgroup( Parent(s4), [(1,2,3,4), (2,4)] );
  343.     Subgroup( Group( (1,2), (1,2,3,4) ), [ (1,2,3,4), (2,4) ] )
  344.     gap> Base( h );
  345.     [ 1, 2 ]
  346.     gap> MakeStabChain( h, Base( s4 ) );  Base( h );
  347.     [ 3, 2 ]
  348.     gap> ExtendStabChain( h, Base( s4 ) );  Base( h );
  349.     [ 3, 2, 1 ] |
  350.  
  351. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  352. \Section{ReduceStabChain}
  353.  
  354. 'ReduceStabChain( <G> )'
  355.  
  356. 'ReduceStabChain'  removes  trivial stabilizers  from a known  stabilizer
  357. chain of the permutation group <G>.  The result is a *reduced* stabilizer
  358. chain (also see "ExtendStabChain").
  359.  
  360. |    gap> s4 := Group( (1,2), (1,2,3,4) );;
  361.     gap> Base( s4 );
  362.     [ 1, 2, 3 ]
  363.     gap> ExtendStabChain( s4, [ 1, 2, 3, 4 ] );  Base( s4 );
  364.     [ 1, 2, 3, 4 ]
  365.     gap> PermGroupOps.Indices( s4 );
  366.     [ 4, 3, 2, 1 ]
  367.     gap> ReduceStabChain( s4 );  Base( s4 );
  368.     [ 1, 2, 3 ] |
  369.  
  370. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  371. \Section{MakeStabChainStrongGenerators}
  372.  
  373. 'MakeStabChainStrongGenerators( <G>, <base>, <stronggens> )'
  374.  
  375. 'MakeStabChainStrongGenerators' computes a *reduced* stabilizer chain for
  376. the permutation group <G> with the base <base>  and the strong generating
  377. set <stronggens>.   <stronggens> must be  a strong generating set for <G>
  378. relative to  the base <base>; note that this  is  not tested.  Since  the
  379. generators for <G> are not  changed the strong generating set of <G>  got
  380. by    'PermGroupOps.StrongGenerators'   is   not   exactly   <stronggens>
  381. afterwards.  This  function is  mostly used to  reconstruct a  stabilizer
  382. chain for a  group <G> and works considerably faster than 'MakeStabChain'
  383. (see "MakeStabChain").
  384.  
  385. |    gap> G := Group( (1,2), (1,2,3), (4,5) );;
  386.     gap> Base( G );
  387.     [ 1, 2, 4 ]
  388.     gap> ExtendStabChain( G, [1,2,3,4] );
  389.     gap> PermGroupOps.Indices( G );  base := Base( G );
  390.     [ 3, 2, 1, 2 ]    # note that the stabilizer chain is not reduced
  391.     [ 1, 2, 3, 4 ]
  392.     gap> stronggens := PermGroupOps.StrongGenerators( G );
  393.     [ (4,5), (2,3), (1,2), (1,2,3) ]
  394.     gap> H := Group( (1,2), (1,3), (4,5) );
  395.     Group( (1,2), (1,3), (4,5) )    # of course <G> = <H>
  396.     gap> MakeStabChainStrongGenerators( H, base, stronggens );
  397.     gap> PermGroupOps.Indices( H );  Base( H );
  398.     [ 3, 2, 2 ]       # note that the stabilizer chain is reduced
  399.     [ 1, 2, 4 ]
  400.     gap> PermGroupOps.StrongGenerators( H );
  401.     [ (4,5), (2,3), (1,2), (1,3) ]
  402.     # note that this is different from 'stronggens' |
  403.  
  404. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  405. \Section{Base for Permutation Groups}
  406.  
  407. 'Base( <G> )'
  408.  
  409. 'Base'  returns a base  for the permutation group <G>.   If a  stabilizer
  410. chain  for  <G>  is  already known,  'Base'  returns  the  base  for this
  411. stabilizer chain.  Otherwise a stabilizer chain for the lexicographically
  412. smallest  reduced  base  is  computed  and  its  base  is  returned  (see
  413. "Stabilizer Chains").
  414.  
  415. |    gap> s4 := Group( (1,2,3,4), (1,2) );;
  416.     gap> Base( s4 );
  417.     [ 1, 2, 3 ]  |
  418.  
  419. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  420. \Section{PermGroupOps.Indices}
  421.  
  422. 'PermGroupOps.Indices( <G> )'
  423.  
  424. 'PermGroupOps.Indices'  returns a list <l>  of indices of the permutation
  425. group <G> with  respect to a stabilizer chain of <G>, i.e., '<l>[<i>]' is
  426. the index of  $G^{(i+1)}$  in $G^{(i)}$.  Thus  the size  of  <G>  is the
  427. product of all indices in <l>.  If  a stabilizer chain for <G> is already
  428. known,  'PermGroupOps.Indices' returns the indices  corresponding to this
  429. stabilizer    chain.    Otherwise    a   stabilizer   chain    with   the
  430. lexicographically  smallest reduced  base  is  computed  and  the indices
  431. corresponding to this chain are returned (see "Stabilizer Chains").
  432.  
  433. |    gap> s4 := Group( (1,2,3,4), (1,2) );;
  434.     gap> PermGroupOps.Indices( s4 );
  435.     [ 4, 3, 2 ]    # note that for s4 the indices are
  436.                    # actually independent of the base |
  437.  
  438. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  439. \Section{PermGroupOps.StrongGenerators}
  440.  
  441. 'PermGroupOps.StrongGenerators( <G> )'
  442.  
  443. 'PermGroupOps.StrongGenerators' returns a list of  strong generators  for
  444. the permutation  group <G>.  If  a  stabilizer  chain for <G>  is already
  445. known,  'PermGroupOps.StrongGenerators'  returns a strong  generating set
  446. corresponding  to  this stabilizer chain.  Otherwise a  stabilizer  chain
  447. with the lexicographically smallest reduced base is computed and a strong
  448. generating  set corresponding to this chain is returned  (see "Stabilizer
  449. Chains").
  450.  
  451. |    gap> s4 := Group( (1,2,3,4), (1,2) );;
  452.     gap> Base( s4 );
  453.     [ 1, 2, 3 ]
  454.     gap> PermGroupOps.StrongGenerators( s4 );
  455.     [ (3,4), (2,3,4), (1,2), (1,2,3,4) ] |
  456.  
  457. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  458. \Section{ListStabChain}
  459.  
  460. 'ListStabChain( <G> )'
  461.  
  462. 'ListStabChain'  returns a list  of stabilizer  records of the stabilizer
  463. chain of the  permutation group <G>, i.e., the result  is a list <l> such
  464. that '<l>[<i>]' is the <i>-th stabilizer  $G^{(i)}$.  The records in that
  465. list are identical to the records of the  stabilizer chain.  Thus changes
  466. made  in a record  '<l>[<i>]'  are simultaneously done in  the stabilizer
  467. chain (see "Identical Records").
  468.  
  469. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  470. \Section{PermGroupOps.ElementProperty}
  471.  
  472. 'PermGroupOps.ElementProperty( <G>, <prop> )' \\
  473. 'PermGroupOps.ElementProperty( <G>, <prop>, <K> )'
  474.  
  475. 'PermGroupOps.ElementProperty' returns an element  <g> in the permutation
  476. group <G> such that '<prop>(<g>)'  is 'true'.  <prop>  must be a function
  477. of one  argument that  returns either 'true'  or 'false'  when applied to
  478. an element of <G>.  If <G> has no such element, 'false' is returned.
  479.  
  480. |    gap> V4 := Group((1,2),(3,4));;
  481.     gap> PermGroupOps.ElementProperty( V4, g -> (1,2)^g = (3,4) );
  482.     false |
  483.  
  484. 'PermGroupOps.ElementProperty' first computes a stabilizer chain for <G>,
  485. if necessary.   Then  it performs a backtrack search through  <G>  for an
  486. element  satisfying  <prop>,  i.e.,  enumerates  all  elements  of <G> as
  487. described in  section "Stabilizer  Chains", and applies  <prop>  to  each
  488. until one element  <g> is found for which '<prop>(<g>)' is  'true'.  This
  489. algorithm is described in detail in \cite{But82}.
  490.  
  491. |    gap> S8 := Group( (1,2), (1,2,3,4,5,6,7,8) );;  S8.name := "S8";;
  492.     gap> Size( S8 );
  493.     40320
  494.     gap> V := Subgroup( S8, [(1,2),(1,2,3),(6,7),(6,7,8)] );;
  495.     gap> Size( V );
  496.     36
  497.     gap> U := V ^ (1,2,3,4)(5,6,7,8);;
  498.     gap> PermGroupOps.ElementProperty( S8, g -> U ^ g = V );
  499.     (1,4,2)(5,6)    # another permutation conjugating <U> to <V> |
  500.  
  501. This search will of course take quite a while if <G> is large, especially
  502. if no element of <G>  satisfies <prop>, and therefore all elements of <G>
  503. must be tried.
  504.  
  505. To  speed  up  the computation you  may  pass a subgroup  <K> of  <G>  as
  506. optional third argument.  This subgroup must preserve <prop> in the sense
  507. that either all  elements of a left coset '<g>\*<K>' satisfy <prop> or no
  508. element of '<g>\*<K>' does.
  509.  
  510. In our example above such a  subgroup is the normalizer $N_G(V)$  because
  511. $h \in g N_G(V)$ takes $U$  to $V$ if and only if  $g$  does.  Of  course
  512. every subgroup of  $N_G(V)$ has  this  property too.   Below we  use  the
  513. subgroup $V$ itself.  In this example this speeds up the computation by a
  514. factor of 4.
  515.  
  516. |    gap> K := Subgroup( S8, V.generators );;
  517.     gap> PermGroupOps.ElementProperty( S8, g -> U ^ g = V, K );
  518.     (1,4,2)(5,6) |
  519.  
  520. In the following example,  we use  the same  subgroup, but  with a larger
  521. generating system.   This  speeds up the computation by another factor of
  522. 3.   Something  like this  may  happen  frequently.   The  reason  is too
  523. complicated to be explained here.
  524.  
  525. |    gap> K2 := Subgroup( S8, Union( V.generators, [(2,3),(7,8)] ) );;
  526.     gap> K2 = K;
  527.     true
  528.     gap> PermGroupOps.ElementProperty( S8, g -> U ^ g = V, K2 );
  529.     (1,4,2)(5,6) |
  530.  
  531. Passing the full normalizer speeds up  the computation in this example by
  532. another  factor  of  2.   Beware   though  that  in  other  examples  the
  533. computation  of  the  normalizer  alone  may  take  longer  than  calling
  534. 'PermGroupOps.ElementProperty' with only the subgroup itself as argument.
  535.  
  536. |    gap> N := Normalizer( S8, V );
  537.     Subgroup( S8, [ (1,2), (1,2,3), (6,7), (6,7,8), (2,3), (7,8),
  538.       (1,6)(2,7)(3,8), (4,5) ] )
  539.     gap> Size( N );
  540.     144
  541.     gap> PermGroupOps.ElementProperty( S8, g -> U ^ g = V, N );
  542.     (1,4)(5,6) |
  543.  
  544. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  545. \Section{PermGroupOps.SubgroupProperty}
  546.  
  547. 'PermGroupOps.SubgroupProperty( <G>, <prop> )' \\
  548. 'PermGroupOps.SubgroupProperty( <G>, <prop>, <K> )'
  549.  
  550. 'PermGroupOps.SubgroupProperty'   returns  the   subgroup  <U>   of   the
  551. permutation group  <G> of  all elements in <G> that satisfy <prop>, i.e.,
  552. the  subgroup  of  all elements  <g> in <G>  such  that  '<prop>(<g>)' is
  553. 'true'.  <prop> must be a function of  one  argument  that returns either
  554. 'true' or 'false'  when applied  to an element  of  <G>.  Of  course  the
  555. elements   that   satisfy   <prop>   must  form   a   subgroup  of   <G>.
  556. 'PermGroupOps.SubgroupProperty' builds a stabilizer chain for <U>.
  557.  
  558. |    gap> S8 := Group( (1,2), (1,2,3,4,5,6,7,8) );;  S8.name := "S8";;
  559.     gap> Size(S8);
  560.     40320
  561.     gap> V := Subgroup( S8, [(1,2),(1,2,3),(6,7),(6,7,8)] );;
  562.     gap> Size(V);
  563.     36
  564.     gap> PermGroupOps.SubgroupProperty( S8, g -> V ^ g = V );
  565.     Subgroup( S8, [ (7,8), (6,7), (4,5), (2,3)(4,5)(6,8,7), (1,2), 
  566.       (1,6,3,8)(2,7) ] )
  567.     # the normalizer of 'V' in 'S8' |
  568.  
  569. 'PermGroupOps.SubgroupProperty'  first  computes a  stabilizer chain  for
  570. <G>, if necessary.  Then it performs a backtrack search  through  <G> for
  571. the elements  satisfying <prop>, i.e.,  enumerates all elements of <G> as
  572. described in  section  "Stabilizer Chains",  and  applies <prop> to each,
  573. adding elements for which '<prop>(<g>)' is 'true' to  the  subgroup  <U>.
  574. Once <U> has  become non-trivial, it is used to eliminate whole cosets of
  575. stabilizers  in the stabilizer  chain  of  <G>  if  they  cannot  contain
  576. elements  with  the  property  <prop> that are not already  in <U>.  This
  577. algorithm is described in detail in \cite{But82}.
  578.  
  579. This search will of course take quite a while if  <G> is large.  To speed
  580. up the  computation you may pass a subgroup  <K> of <U> as optional third
  581. argument.
  582.  
  583. Passing  the subgroup $V$  itself,  speeds  up  the  computation in  this
  584. example by a factor of 2.
  585.  
  586. |    gap> K := Subgroup( S8, V.generators );;
  587.     gap> PermGroupOps.SubgroupProperty( S8, g -> V ^ g = V, K );
  588.     Subgroup( S8, [ (1,2), (1,2,3), (6,7), (6,7,8), (2,3), (7,8), (4,5),
  589.       (1,6,3,8)(2,7) ] ) |
  590.  
  591. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  592. \Section{CentralCompositionSeriesPPermGroup}
  593.  
  594. 'CentralCompositionSeriesPPermGroup( <G> )'
  595.  
  596. This  function calculates a central  composition series for the $p$-group
  597. <G>.   The  method used is known as Holt\'s algorithm.  If <G>  is not  a
  598. <p>-group, an error is signalled.
  599.  
  600. |    gap> D := Group( (1,2,3,4), (1,3) );; D.name := "d8";;
  601.     gap> CentralCompositionSeriesPPermGroup( D );
  602.     [ d8, Subgroup( d8, [ (2,4), (1,3) ] ),
  603.       Subgroup( d8, [ (1,3)(2,4) ] ), Subgroup( d8, [  ] ) ] |
  604.  
  605. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  606. \Section{PermGroupOps.PgGroup}
  607.  
  608. 'PermGroupOps.PgGroup( <G> )'
  609.  
  610. This function converts a permutation group <G> of prime power order $p^d$
  611. into an ag group <P> such that the presentation corresponds to a <p>-step
  612. central series of <G>.  This central composition series is constructed by
  613. calling             'CentralCompositionSeriesPPermGroup'             (see
  614. "CentralCompositionSeriesPPermGroup").   An isomorphism from the ag group
  615. to the permutation group is bound to '<P>.bijection'.
  616.  
  617. There   is  no  dispatcher  to  this  function,  it  must  be  called  as
  618. 'PermGroupOps.PgGroup'.
  619.  
  620. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  621. \Section{Set Functions for Permutation Groups}%
  622. \index{Random!for Permutation Groups}%
  623. \index{Size!for Permutation Groups}%
  624. \index{Elements!for Permutation Groups}%
  625. \index{Intersection!for Permutation Groups}
  626.  
  627. All  set theoretic  functions  described in  chapter  "Domains"  are also
  628. applicable to permutation groups.  This section describes which functions
  629. are  implemented  specially  for  permutation  groups.    Functions   not
  630. mentioned  here  are  handled  by the default methods  described  in  the
  631. respective sections.
  632.  
  633. \vspace{5mm}
  634. 'Random( <G> )'
  635.  
  636. To compute a random element in a permutation group <G>  {\GAP} computes a
  637. stabilizer chain for <G>, takes on each level a random representative and
  638. returns the  product of those.  All elements of <G> are chosen with equal
  639. probability by this method.
  640.  
  641. \vspace{5mm}
  642. 'Size( <G> )'
  643.  
  644. 'Size' calls  'MakeStabChain'  (see "MakeStabChain"),  if necessary,  and
  645. returns  the  product  of  the  indices  of  the  stabilizer  chain  (see
  646. "Stabilizer Chains").
  647.  
  648. \vspace{5mm}
  649. 'Elements( <G> )'
  650.  
  651. 'Elements' calls 'MakeStabChain' (see "MakeStabChain"), if necessary, and
  652. enumerates the  elements of <G> as described in "Stabilizer  Chains".  It
  653. returns the set of those elements.
  654.  
  655. \vspace{5mm}
  656. 'Intersection( <G1>, <G2> )'
  657.  
  658. 'Intersection' first computes  stabilizer chains for <G1> and <G2>  for a
  659. common base.  If either group already has a stabilizer chain a basechange
  660. is  performed  (see  "MakeStabChain").   'Intersection'  enumerates   the
  661. elements of <G1> and <G2> using a backtrack  algorithm, eliminating whole
  662. cosets  of   stabilizers  in  the  stabilizer  chains  if  possible  (see
  663. "PermGroupOps.SubgroupProperty").  It builds a  stabilizer  chain for the
  664. intersection.
  665.  
  666. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  667. \Section{Group Functions for Permutation Groups}%
  668. \index{Conjugate Subgroup!of Permutation Group}%
  669. \index{Centralizer!for Permutation Groups}%
  670. \index{Normalizer!for Permutation Groups}%
  671. \index{SylowSubgroup!for Permutation Groups}%
  672. \index{Coset!for Permutation Groups}%
  673. \index{Cosets!for Permutation Groups}%
  674. \index{ElementaryAbelianSeries!for Permutation Groups}%
  675. \index{IsSolvable!for Permutation Groups}%
  676. \index{CompositionSeries!for Permutation Groups}%
  677. \index{ExponentsPermSolvablePermGroup}%
  678. \index{AgGroup!for Permutation Groups}
  679.  
  680. All group functions  for groups  described  in chapter  "Group"  are also
  681. applicable to permutation groups.  This section describes which functions
  682. are   implemented  specially  for   permutation  groups.   Functions  not
  683. mentioned  here  are handled  by the  default  methods described  in  the
  684. respective sections.
  685.  
  686. \vspace{5mm}
  687. '<G> \^\ <p>' \\
  688. 'ConjugateSubgroup( <G>, <p> )'
  689.  
  690. Returns the conjugate permutation group of  <G> with the permutation <p>.
  691. <p> must be an element of the parent group of <G>.  If a stabilizer chain
  692. for <G> is already known, it is also conjugated.
  693.  
  694. \vspace{5mm}
  695. 'Centralizer( <G>, <U> )' \\
  696. 'Centralizer( <G>, <g> )' \\
  697. 'Normalizer( <G>, <U> )'
  698.  
  699. These  functions  first  compute  a  stabilizer  chain  for  <G>.   If  a
  700. stabilizer chain is already known a basechange may be performed to obtain
  701. a  base  that  is  better suited for the  problem.  These functions  then
  702. enumerate the  elements  of  <G> with a backtrack algorithm,  eliminating
  703. whole  cosets  of  stabilizers  in the  stabilizer chain if possible (see
  704. "PermGroupOps.SubgroupProperty").  They build  a stabilizer chain for the
  705. resulting subgroup.
  706.  
  707. \vspace{5mm}
  708. 'SylowSubgroup( <G>, <p> )'
  709.  
  710. If <G> is not transitive, its <p>-Sylow subgroup is computed by starting
  711. with '<P>\:=<G>', and for each transitive constituent homomorphism <hom>
  712. iterating \\
  713. '<P> \:= PreImage( SylowSubgroup( Image( <hom>, <P> ), <p> ) )'.
  714.  
  715. If <G>  is  transitive but  not  primitive,  its  <p>-Sylow  subgroup  is
  716. computed as \\
  717. 'SylowSubgroup( PreImage( SylowSubgroup(Image(<hom>,<G>),<p>) ), <p> )'.
  718.  
  719. If <G> is primitive,  'SylowSubgroup' takes random elements in <G>, until
  720. it finds a <p>-element <g>, whose centralizer in <G>  contains  the whole
  721. <p>-Sylow subgroup.   Such an element must exist, because a <p>-group has
  722. a nontrivial  centre.  Then the  <p>-Sylow subgroup of the centralizer is
  723. computed and  returned.   Note that  the  centralizer  must  be  a proper
  724. subgroup of <G>, because it operates imprimitively on the cycles of <g>.
  725.  
  726. \vspace{5mm}
  727. 'Coset( <U>, <g> )'
  728.  
  729. Returns   the  coset  '<U>\*<g>'.   The  representative  chosen   is  the
  730. lexicographically smallest element of that coset.  It is computed with an
  731. algorithm that is very similar to the backtrack algorithm.
  732.  
  733. |    gap> s4 := Group( (1,2,3,4), (1,2) );;  s4.name := "s4";;
  734.     gap> u := Subgroup( s4, [(1,2,3)] );;
  735.     gap> Coset( u, (1,3,2) );
  736.     (Subgroup( s4, [ (1,2,3) ] )*())
  737.     gap> Coset( u, (3,2) );
  738.     (Subgroup( s4, [ (1,2,3) ] )*(2,3)) |
  739.  
  740. \vspace{5mm}
  741. 'Cosets( <G>, <U> )'
  742.  
  743. Returns the  cosets  of <U> in  <G>.   'Cosets' first computes stabilizer
  744. chains for <G> and <U> with  a common  base.  If either subgroup  already
  745. has a stabilizer  chain, a basechange is performed (see "MakeStabChain").
  746. A  transversal is  computed recursively using the fact that  if  $S$ is a
  747. transversal of $U^{(2)} =  Stab_U(b_1)$ in  $G^{(2)}  = Stab_G(b_1)$, and
  748. $R^{(1)}$ is a transversal of $G^{(2)}$ in $G$, then a transversal of $U$
  749. in $G$ is a subset of $S \* R^{(1)}$.
  750.  
  751. |    gap> Cosets( s4, u );
  752.     [ (Subgroup( s4, [ (1,2,3) ] )*()),
  753.       (Subgroup( s4, [ (1,2,3) ] )*(3,4)),
  754.       (Subgroup( s4, [ (1,2,3) ] )*(2,3)),
  755.       (Subgroup( s4, [ (1,2,3) ] )*(2,3,4)),
  756.       (Subgroup( s4, [ (1,2,3) ] )*(2,4,3)),
  757.       (Subgroup( s4, [ (1,2,3) ] )*(2,4)),
  758.       (Subgroup( s4, [ (1,2,3) ] )*(1,2,3,4)),
  759.       (Subgroup( s4, [ (1,2,3) ] )*(1,2,4)) ] |
  760.  
  761. \vspace{5mm}
  762. 'ElementaryAbelianSeries( <G> )'
  763.  
  764. This  function  builds  an elementary  abelian series of <G>  by iterated
  765. construction of normal closures. If a  partial elementary abelian  series
  766. reaches  up  to  a  subgroup <U>  of <G> which  does not yet  contain the
  767. generator <s> of <G> then the series is extended up to the normal closure
  768. <N> of <U>  and <s>. If the factor  '<N>/<U>'  is not elementary abelian,
  769. i.e., if some commutator of <s> with one of its conjugates under <G> does
  770. not lie  in  <U>, intermediate  subgroups  are calculated  recursively by
  771. extending <U> with that commutator. If <G> is solvable this process  must
  772. come to  an  end  since commutators  of  arbitrary depth  cannot exist in
  773. solvable groups.
  774.  
  775. Hence this method gives an elementary  abelian  series if <G> is solvable
  776. and gives an infinite recursion  if  it is not.  For permutation  groups,
  777. however, there is a  bound on the derived length that depends only on the
  778. degree <d> of the group. According to Dixon this is $(5 \log_3(d))/2$. So
  779. if  the commutators  get deeper  than this bound  the algorithm stops and
  780. sets   '<G>.isSolvable'  to  'false',  signalling  an  error.   Otherwise
  781. '<G>.isSolvable' is  set  to 'true' and the elementary abelian series  is
  782. returned as a list of subgroups of <G>.
  783.  
  784. |    gap> S := Group( (1,2,3,4), (1,2) );; S.name := "s4";;
  785.     gap> ElementaryAbelianSeries( S );
  786.     [ Subgroup( s4, [ (1,2)(3,4), (1,4)(2,3), (1,2,4), (1,2,3,4) ] ),
  787.       Subgroup( s4, [ (1,2)(3,4), (1,4)(2,3), (1,2,4) ] ),
  788.       Subgroup( s4, [ (1,2)(3,4), (1,4)(2,3) ] ), Subgroup( s4, [  ] ) ]
  789.     gap> A := Group( (1,2,3), (3,4,5) );;
  790.     gap> ElementaryAbelianSeries( A );
  791.     Error, <G> must be solvable|
  792.  
  793. \vspace{5mm}
  794. 'IsSolvable( <G> )'
  795.  
  796. Solvability of a  permutation group <G> is tested  by trying to construct
  797. an elementary abelian  series  as described  above.  After this has  been
  798. done  the  flag  '<G>.isSolvable' is  set  correctly,  so  its  value  is
  799. returned.
  800.  
  801. |    gap> S := Group( (1,2,3,4), (1,2) );;
  802.     gap> IsSolvable( S );
  803.     true
  804.     gap> A := Group( (1,2,3), (3,4,5) );;
  805.     gap> IsSolvable( A );
  806.     false|
  807.  
  808. \vspace{5mm}
  809. 'CompositionSeries( <G> )'
  810.  
  811. A composition series for the solvable group <G> is calculated either from
  812. a given subnormal  series, which must be bound to  '<G>.subnormalSeries',
  813. in  which  case  '<G>.bssgs'  must  hold  the  corresponding  base-strong
  814. subnormal  generating system,  or  from an elementary abelian  series (as
  815. computed  by   'ElementaryAbelianSeries(   <G>  )'  above)  by  inserting
  816. intermediate subgroups  (i.e.   powers  of  the  polycyclic generators or
  817. composition  series along bases  of the vector spaces in  the  elementary
  818. abelian  series).   In either  case,  after  execution  of this function,
  819. '<G>.bssgs'  holds  a  base-strong   pag   system  corresponding  to  the
  820. composition series calculated.
  821.  
  822. |    gap> S := Group( (1,2,3,4), (1,2) );; S.name := "s4";;
  823.     gap> CompositionSeries( S );
  824.     [ Subgroup( s4, [ (1,2)(3,4), (1,4)(2,3), (1,2,4), (1,2,3,4) ] ),
  825.       Subgroup( s4, [ (1,2)(3,4), (1,4)(2,3), (1,2,4) ] ),
  826.       Subgroup( s4, [ (1,2)(3,4), (1,4)(2,3) ] ), 
  827.       Subgroup( s4, [ (1,2)(3,4) ] ), Subgroup( s4, [  ] ) ] |
  828.  
  829. If <G> is not solvable then a composition series <cs> is computed with an
  830. algorithm by A. Seress and R.  Beals.  In this case the  factor  group of
  831. each  element '<cs>[<i>]' in the composition  series modulo  the next one
  832. '<cs>[<i>+1]'  are  represented as  primitive  permutation  groups.   One
  833. should call '<cs>[<i>].operations.FactorGroup( <cs>[<i>], <cs>[<i>+1]  )'
  834. directly to avoid the check in 'FactorGroup' that '<cs>[<i>+1]' is normal
  835. in '<cs>[<i>]'.  The natural homomorphism of '<cs>[<i>]' onto this factor
  836. group    will   be   given   as    a   'GroupHomomorphismByImages'   (see
  837. "GroupHomomorphismByImages").
  838.  
  839. |    gap> pyl29 := Group( (1,2,3)(4,5,6)(7,8,9), (2,6,4,9,3,8,7,5),
  840.     >                     (4,7)(5,8)(6,9), (1,10)(4,7)(5,6)(8,9) );;
  841.     gap> pyl29.name := "pyl29";;
  842.     gap> cs := CompositionSeries( pyl29 );
  843.     [ Subgroup( pyl29, [ (1,9,5)(2,7,6)(3,8,4), (2,7,3,4)(5,8,9,6), 
  844.           ( 1, 2,10)( 4, 9, 5)( 6, 8, 7), (2,6,4,9,3,8,7,5),
  845.           (4,7)(5,8)(6,9) ] ), 
  846.       Subgroup( pyl29, [ (1,9,5)(2,7,6)(3,8,4), (2,7,3,4)(5,8,9,6), 
  847.           ( 1, 2,10)( 4, 9, 5)( 6, 8, 7), (2,6,4,9,3,8,7,5) ] ), 
  848.       Subgroup( pyl29, [ (1,9,5)(2,7,6)(3,8,4), (2,7,3,4)(5,8,9,6), 
  849.           ( 1, 2,10)( 4, 9, 5)( 6, 8, 7) ] ), Subgroup( pyl29, [  ] ) ]
  850.     gap> List( [1..3], i->cs[i].operations.FactorGroup(cs[i],cs[i+1]) );
  851.     [ Group( (1,2) ), Group( (1,2) ), 
  852.       Group( (1,9,5)(2,7,6)(3,8,4), (2,7,3,4)(5,8,9,6), ( 1, 2,10)
  853.         ( 4, 9, 5)( 6, 8, 7) ) ]
  854.     gap> List( last, Size );
  855.     [ 2, 2, 360 ] |
  856.  
  857. \vspace{5mm}
  858. 'ExponentsPermSolvablePermGroup( <G>, <perm> [, <start> ] )'
  859.  
  860. 'ExponentsPermSolvablePermGroup' returns a  list <e>, such that '<perm> =
  861. <G>.bssgs[1]\^<e>[1]   {\*}    <G>.bssgs[2]\^<e>[2]   {\*}    ...    {\*}
  862. <G>.bssgs[<n>]\^<e>[<n>]',  where  '<G>.bssgs'  must   be   a  prime-step
  863. base-strong    subnormal    generating    system    as   calculated    by
  864. 'ElementaryAbelianSeries' (see "ElementaryAbelianSeries"  and above).  If
  865. the   optional  third  argument  <start>  is  given,   the  list  entries
  866. '<exps>[1],  ...,  <exps>[<start>-1]'  are  left  unbound and the element
  867. <perm>  is  decomposed  as  product  of  the  remaining   pag  generators
  868. '<G>.bssgs[<start>], ..., <G>.bssgs[<n>]'.
  869.  
  870. |    gap> S := Group( (1,2,3,4), (1,2) );; S.name := "s4";;
  871.     gap> ElementaryAbelianSeries( S );;
  872.     gap> S.bssgs;
  873.     [ (1,2), (1,3,2), (1,4)(2,3), (1,2)(3,4) ]
  874.     gap> ExponentsPermSolvablePermGroup( S, (1,2,3) );
  875.     [ 0, 2, 0, 0 ]|
  876.  
  877. \vspace{5mm}
  878. 'AgGroup( <G> )'
  879.  
  880. This function converts a solvable permutation group into an ag group.  It
  881. calculates an elementary abelian  series  and a prime-step  bssgs for <G>
  882. (see  'ElementaryAbelianSeries'  above)  and  then  finds  the   relators
  883. belonging    to    this    prime-step    bssgs   using    the    function
  884. 'ExponentsPermSolvablePermGroup' (see above).  An isomorphism from the ag
  885. group to the permutation group is bound to 'AgGroup( <G> ).bijection'.
  886.  
  887. |    gap> G := WreathProduct( SymmetricGroup( 4 ), CyclicGroup( 3 ) );;
  888.     gap> A := AgGroup( G );
  889.     Group( g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13 )
  890.     gap> (A.1*A.3)^A.bijection;    
  891.     ( 1, 6,10, 2, 5, 9)( 3, 7,11)( 4, 8,12) |
  892.     
  893. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  894. \Section{Operations of Permutation Groups}%
  895. \index{IsSemiRegular!for Permutation Groups}%
  896. \index{RepresentativeOperation!for Permutation Groups}%
  897. \index{Stabilizer!for Permutation Groups}%
  898. \index{Blocks!for Permutation Groups}
  899.  
  900. All  functions  that deal  with  operations  of  groups are applicable to
  901. permutation groups (see "Operations of Groups").  This section  describes
  902. which  functions  are  implemented  specially  for   permutation  groups.
  903. Functions not mentioned here are handled by the default methods described
  904. in the respective sections.
  905.  
  906. \vspace{5mm}
  907. 'IsSemiRegular( <G>, <D>, <opr> )'
  908.  
  909. 'IsSemiRegular'  returns  'true'  if <G>  operates  semiregularly on  the
  910. domain <D> and 'false' otherwise.
  911.  
  912. If $D$ is  a  list of integers and <opr>  is 'OnPoints',  'IsSemiRegular'
  913. uses the lemma  that  says that such an operation  is semiregular if  all
  914. orbits of $G$  on $D$ have the same length, and if for an arbitrary point
  915. $p$ of $D$ and for each generator $g$ of $G$ there is a permutation $z_g$
  916. (not  necessarily in  $G$) such  that $p^{z_g}  = p^g$ and which commutes
  917. with all elements  of $G$, and if  there is  a permutation $z$ (again not
  918. necessarily in $G$) that  permutes the orbits of $G$ on  $D$  setwise and
  919. commutes  with  all  elements  of  $G$.   This  can  be  tested  in  time
  920. proportional to $o n^2 + d n$, where $o$ is the size  of a  single orbit,
  921. $n$ is the number of generators of $G$, and $d$ is the size of $D$.
  922.  
  923. \vspace{5mm}
  924. 'RepresentativeOperation( <G>, <d>, <e>, <opr> )'
  925.  
  926. 'RepresentativeOperation' returns  a  permutation <perm> in <G> that maps
  927. <d> to <e> in respect to the given operation  <opr> if such a permutation
  928. exists, and 'false' otherwise.
  929.  
  930. If the  operation is 'OnPoints',  'OnPairs', 'OnTuples', or  'OnSets' and
  931. <d> and <e> are  positive integers or lists  of integers, a basechange is
  932. performed and the representative is computed  from the factorized inverse
  933. transversal (see "Stabilizer Chains" and "MakeStabChain").
  934.  
  935. If the operation is 'OnPoints', 'OnPairs', 'OnTuples' or 'OnSets' and <d>
  936. and <e> are permutations or lists of  permutations, a backtrack search is
  937. performed (see "PermGroupOps.ElementProperty").
  938.  
  939. \vspace{5mm}
  940. 'Stabilizer( <G>, <D>, <opr> )'
  941.  
  942. 'Stabilizer'  returns the stabilizer of  <D>  in <G> using the  operation
  943. <opr> on the <D>.  If <D> is a positive  integer (respectively  a list of
  944. positive  integers) and the  operation  <opr> is 'OnPoints' (respectively
  945. 'OnPairs'   or  'OnTuples')  a  basechange  of  <G>   is  performed  (see
  946. "MakeStabChain").  If <D> is a set of positive integers and the operation
  947. <opr>   is  'OnSets'   a  backtrack  algorithm   for  set-stabilizers  of
  948. permutation groups is performed.
  949.  
  950. \vspace{5mm}
  951. 'Blocks( <G>, <D> [, <seed> ] [, <operation> ] )'
  952.  
  953. Returns a partition of <D> being a minimal block system of <G> in respect
  954. to the  operation <opreration> on the objects  of  <D>.  If  the argument
  955. <seed> is given the objects of  <seed>  are contained in  the same block.
  956. If <D> is a list of positive integers an Atkinson algorithm is performed.
  957.  
  958. Theoretically the algorithm lies in ${\cal{O}}(n^3 m)$ but in practice it
  959. is mostly in ${\cal{O}}(n^2 m)$ with $m$ the number of generators and $n$
  960. the cardinality of $D$.
  961.  
  962. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  963. \Section{Homomorphisms for Permutation Groups}%
  964. \index{GroupHomomorphismsByImages!for permutation groups}%
  965. \index{IsMapping!for GroupHomomorphismByImages for permutation groups}%
  966. \index{Image!for GroupHomomorphismByImages for permutation groups}%
  967. \index{CompositionMapping!for GroupHomomorphismByImages for permutation groups}%
  968. \index{OperationHomomorphism!for transitive constituents}%
  969. \index{Image!for transitive constituent homomorphisms}%
  970. \index{Images!for transitive constituent homomorphisms}%
  971. \index{PreImages!for transitive constituent homomorphisms}%
  972. \index{OperationHomomorphism!for blocks}%
  973. \index{Image!for blocks homomorphisms}%
  974. \index{Images!for blocks homomorphisms}%
  975. \index{PreImage!for blocks homomorphisms}%
  976. \index{PreImages!for blocks homomorphisms}%
  977. \index{Kernel!for blocks homomorphisms}
  978.  
  979. This  section  describes  the  various  homomorphisms  that  are  treated
  980. specially for permutation groups.
  981.  
  982. \vspace{7mm}
  983. 'GroupHomomorphisByImages( <P>, <H>, <gens>, <imgs> )'
  984.  
  985. The group homomorphism of  a permutation group <P> into another group <H>
  986. is handled especially  by 'GroupHomomorphisByImages'.  Below we  describe
  987. how the  various  mapping  functions  are implemented  for  such a  group
  988. homomorphism <ghom>.   The mapping  functions  not  mentioned  below  are
  989. implemented     by     the     default     functions     described     in
  990. "GroupHomomorphismByImages".
  991.  
  992. To work with <ghom>,  a stabilizer  chain for  the source  of  <ghom>  is
  993. computed    and   stored    as   '<ghom>.orbit',    '<ghom>.transversal',
  994. '<ghom>.stabilizer'.  For every stabilizer <stab> in the stabilizer chain
  995. there  is  a  list  parallel  to  '<stab>.generators',  which  is  called
  996. '<stab>.genimages',   and   contains  images   of  the  generators.   The
  997. stabilizer chain is computed with a random Schreier Sims algorithm, using
  998. the size of the source to know when to stop.
  999.  
  1000. \vspace{5mm}
  1001. 'IsMapping( <ghom> )'
  1002.  
  1003. To test  if <ghom> is a (single valued) mapping, all Schreier generatores
  1004. are  computed.   Each  Schreier  generator  is  then  reduced  along  the
  1005. stabilizer chain.  Because the chain is complete, each one must reduce to
  1006. the  identity.   Parallel  the  images  of  the  strong   generators  are
  1007. multiplied.  If they also reduce to the identity (in  the range),  <ghom>
  1008. is a function, otherwise the remainders form  a normal generating set for
  1009. the subgroup of images of the identity of the source.
  1010.  
  1011. \vspace{5mm}
  1012. 'Image( <ghom>, <elm> )'
  1013.  
  1014. The  image of  an element <elm>  can be computed by reducing  the element
  1015. along   the   stabilizer  chain,  and   at  each  step   multiplying  the
  1016. corresponding images of the strong generators.
  1017.  
  1018. \vspace{5mm}
  1019. 'CompositionMapping( <hom>, <ghom> )'
  1020.  
  1021. The composition of  an  arbitrary group homomorphism <hom> and <ghom> the
  1022. stabilizer  chain  of  <ghom> is copied.  On each level the images of the
  1023. generators  in '<stab>.genimages'  are  replaced  by  their images  under
  1024. <hom>.
  1025.  
  1026. \vspace{7mm}
  1027. 'OperationHomomorphism( <P>, Operation( <P>, <list> ) )'
  1028.  
  1029. The operation of a permutation group <P> on  a list <list> of integers is
  1030. handled especially by 'OperationHomomorphism'.  (Note that <list> must be
  1031. a union of orbits of <P> for 'Operation' to work.)  We call the resulting
  1032. homomorphism  a *transitive constituent* homomorphism.  Below we describe
  1033. how  the  various  mapping  functions  are implemented  for  a transitive
  1034. constituent homomorphism <tchom>.   The  mapping functions  not mentioned
  1035. below   are  implemented  by   the   default   functions   described   in
  1036. "OperationHomomorphism".
  1037.  
  1038. \vspace{5mm}
  1039. 'Image( <tchom>, <elm> )'
  1040.  
  1041. The image of an element is  computed  by restricting <elm> to <list> (see
  1042. "RestrictedPerm")  and   conjugating   the  restricted  permutation  with
  1043. '<tchom>.conperm',  which maps  it  to  a permutation  that  operates  on
  1044. '[1..Length(<list>)]' instead of <list>.
  1045.  
  1046. \vspace{5mm}
  1047. 'Image( <tchom>, <H> )'
  1048.  
  1049. The image of a  subgroup <H> is computed as follows.  First  a stabilizer
  1050. chain for <H> is  computed.  This stabilizer  chain is such that the base
  1051. starts with points in  <list>.  Then  the images of the strong generators
  1052. of <sub> form a strong generating set of the image.
  1053.  
  1054. \vspace{5mm}
  1055. 'PreImages( <tchom>, <H> )'
  1056.  
  1057. The  preimage  of a  subgroup  <H>  is  computed  as  follows.   First  a
  1058. stabilizer chain for the  source of <tchom> is computed.  This stabilizer
  1059. chain is such that  the base starts with  the point in <list>.  Then  the
  1060. kernel  of  <tchom>  is  a  stabilizer  in  this  stabilizer  chain.  The
  1061. preimages  of  the  strong generators for  <H> together  with  the strong
  1062. generators for the  kernel form a strong generating  set  of the preimage
  1063. subgroup.
  1064.  
  1065. \vspace{7mm}
  1066. 'OperationHomomorphism( <P>, Operation( <P>, <blocks>, OnSets ) )'
  1067.  
  1068. The operation of a permutation  group <P> on a block system <blocks> (see
  1069. "Blocks") is handled especially  by 'OperationHomomorphism'.  We call the
  1070. resulting homomorphism a *blocks  homomorphism*.   Below we describe  how
  1071. the various mapping functions are implemented for a  blocks  homomorphism
  1072. <bhom>.  The mapping functions not mentioned below are implemented by the
  1073. default functions described in "OperationHomomorphism".
  1074.  
  1075. \vspace{5mm}
  1076. 'Image( <bhom>, <elm> )'
  1077.  
  1078. To compute  the  image  of  an element <elm> under <bhom>, the record for
  1079. <bhom> contains a  list '<bhom>.reps',  which  contains for each point in
  1080. the union of the blocks the position of this block in <blocks>.  Then the
  1081. image of an element can simply be computed by applying  the element  to a
  1082. representative  of each block  and  using '<bhom>.reps' to find in  which
  1083. block the image lies.
  1084.  
  1085. \vspace{5mm}
  1086. 'Image( <bhom>, <H> )' \\
  1087. 'PreImage( <bhom>, <elm> )' \\
  1088. 'PreImage( <bhom>, <H> )' \\
  1089. 'Kernel( <bhom> )'
  1090.  
  1091. The image of a subgroup, the  preimage of an element, and the preimage of
  1092. a  subgroup  are  computed  by  rather  complicated  algorithms.   For  a
  1093. description of these algorithms see \cite{But85a}.
  1094.  
  1095. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1096. \Section{Permutation Group Records}
  1097.  
  1098. All  groups are represented by a record that contains  information  about
  1099. the  group.  A permutation group record contains the following components
  1100. in addition to those described in section "Group Records".
  1101.  
  1102. 'isPermGroup': \\
  1103.         always 'true'.
  1104.  
  1105. 'isFinite': \\
  1106.         always 'true' as permutation groups are always of finite order.
  1107.  
  1108. A  stabilizer  chain (see "Stabilizer Chains") is  stored recursively  in
  1109. {\GAP}.   The group record  of a permutation group <G>  with a stabilizer
  1110. chain has the following additional components.
  1111.  
  1112. 'orbit':  \\
  1113.         List of orbitpoints of 'orbit[1]'  (which is the basepoint) under
  1114.         the action of the generators.
  1115.  
  1116. 'transversal': \\
  1117.         Factorized inverse transversal as defined above.
  1118.  
  1119. 'stabilizer': \\
  1120.         Record for the  stabilizer  of the point 'orbit[1]' in the  group
  1121.         generated  by  'generators'.  The components  of this  record are
  1122.         again 'generators', 'orbit', 'transversal' and 'stabilizer'.  The
  1123.         last  stabilizer  in  the  stabilizer  chain  only  contains  the
  1124.         component 'generators', which is an empty list.
  1125.  
  1126. Note  that the values of these components are  changed by functions  that
  1127. change, extend, or reduce a base (see "MakeStabChain", "ExtendStabChain",
  1128. and "ReduceStabChain").
  1129.  
  1130. Note that the records that represent  the stabilizers are  not themselves
  1131. group  records  (see  "Group  Records").   Thus  you  cannot take such  a
  1132. stabilizer and apply group functions to it.  The last 'stabilizer' in the
  1133. stabilizer chain is a record whose component 'generators' is empty.
  1134.  
  1135. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1136. %%
  1137. %E  Emacs . . . . . . . . . . . . . . . . . . . . . local Emacs variables
  1138. %%
  1139. %%  Local Variables:
  1140. %%  mode:               outline
  1141. %%  outline-regexp:     "\\\\Chapter\\|\\\\Section"
  1142. %%  fill-column:        73
  1143. %%  eval:               (hide-body)
  1144. %%  End:
  1145. %%
  1146.  
  1147.  
  1148.  
  1149.