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

  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. %%
  3. %A  operatio.tex                GAP documentation            Martin Schoenert
  4. %%
  5. %A  @(#)$Id: operatio.tex,v 3.16 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 the functions that deal with  operations  of  groups.
  10. %%
  11. %H  $Log: operatio.tex,v $
  12. %H  Revision 3.16  1993/02/19  10:48:42  gap
  13. %H  adjustments in line length and spelling
  14. %H
  15. %H  Revision 3.15  1993/02/18  14:52:37  felsch
  16. %H  another example fixed
  17. %H
  18. %H  Revision 3.14  1993/02/15  14:16:36  felsch
  19. %H  DefineName eliminated
  20. %H
  21. %H  Revision 3.13  1993/02/12  14:44:22  felsch
  22. %H  examples adjusted to line length 72
  23. %H
  24. %H  Revision 3.12  1993/02/02  12:48:20  felsch
  25. %H  long lines fixed
  26. %H
  27. %H  Revision 3.11  1993/02/01  13:50:06  felsch
  28. %H  example fixed
  29. %H
  30. %H  Revision 3.10  1993/01/27  10:09:53  fceller
  31. %H  various fixes of examples
  32. %H
  33. %H  Revision 3.9  1992/06/01  19:18:28  martin
  34. %H  changed 'Blocks', <G> must operate transitively on <D>
  35. %H
  36. %H  Revision 3.8  1992/04/30  11:59:19  martin
  37. %H  changed a few sentences to avoid bold non-roman fonts
  38. %H
  39. %H  Revision 3.7  1992/04/06  16:18:22  martin
  40. %H  fixed some more typos
  41. %H
  42. %H  Revision 3.6  1992/03/25  15:37:32  martin
  43. %H  added new sections for group homomorphisms
  44. %H
  45. %H  Revision 3.5  1992/03/11  15:59:44  martin
  46. %H  added the examples
  47. %H
  48. %H  Revision 3.4  1992/03/10  12:17:54  martin
  49. %H  added 'IsRegular' and 'IsSemiRegular'
  50. %H
  51. %H  Revision 3.3  1992/01/31  16:33:08  martin
  52. %H  added 'IsEquivalentOperation'
  53. %H
  54. %H  Revision 3.2  1992/01/23  13:06:56  martin
  55. %H  changed a reference
  56. %H
  57. %H  Revision 3.1  1992/01/15  13:22:44  martin
  58. %H  changed a reference
  59. %H
  60. %H  Revision 3.0  1991/12/27  16:10:27  martin
  61. %H  initial revision under RCS
  62. %H
  63. %%
  64. \Chapter{Operations of Groups}
  65.  
  66. One of the most  important tools in  group  theory is the *operation*  or
  67. *action* of a group on a certain set.
  68.  
  69. We say that a group $G$ operates on a set $D$ if we  have a function that
  70. takes each $d \in D$ and  each $g \in G$ to  another element $d^g \in D$,
  71. which we  call the image of $d$  under $g$, such  that $d^{identity} = d$
  72. and $(d^g)^h = d^{gh}$ for each $d \in D$ and $g,h \in G$.
  73.  
  74. This is equivalent to saying that  an operation is  a homomorphism of the
  75. group $G$ into the full symmetric group on $D$.  We  usually call $D$ the
  76. *domain* of the operation and its elements *points*.
  77.  
  78. An example of the usage of the functions in this  package can be found in
  79. the introduction to {\GAP} (see "About Operations of Groups").
  80.  
  81. In  {\GAP}  group elements usually operate through  the  power  operator,
  82. which is denoted by  the caret '\^'.  It is  possible  however to specify
  83. other operations (see "Other Operations").
  84.  
  85. First this chapter describes the functions that take  a single element of
  86. the group   and compute   cycles    of this  group  element and   related
  87. information  (see "Cycle",  "CycleLength", "Cycles", and "CycleLengths"),
  88. and the function   that  describes how  a group  element  operates  by  a
  89. permutation that operates the same way on '[1..<n>]' (see "Permutation").
  90.  
  91. Next come the functions that test whether an orbit has minimal or maximal
  92. length   and related    functions  (see "IsFixpoint",   "IsFixpointFree",
  93. "DegreeOperation", "IsTransitive", and "Transitivity").
  94.  
  95. Next this chapter  describes the functions that  take a group and compute
  96. orbits of this group and related information (see "Orbit", "OrbitLength",
  97. "Orbits", and "OrbitLengths").
  98.  
  99. Next are the   functions that  compute  the permutation  group  <P>  that
  100. operates on '[ 1 .. Length(<D>) ]' in  the same way  that <G> operates on
  101. <D>, and the corresponding homomorphism from <G> to <P> (see "Operation",
  102. "OperationHomomorphism").
  103.  
  104. Next is the functions that compute block systems, i.e., partitions of <D>
  105. such that <G> operates on the  sets of the  partition (see "Blocks"), and
  106. the function that tests whether  <D>  has such a nontrivial  partitioning
  107. under the operation of <G> (see "IsPrimitive").
  108.  
  109. Finally come the  functions that relate an orbit  of <G> on <D> with  the
  110. subgroup of  <G>   that  fixes  the   first  point  in  the  orbit   (see
  111. "Stabilizer"), and    the   cosets  of   this   subgroup in      <G> (see
  112. "RepresentativeOperation" and "RepresentativesOperation").
  113.  
  114. All functions described in this chapter are in 'LIBNAME/\"operatio.g\"'.
  115.  
  116. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  117. \Section{Other Operations}
  118.  
  119. The functions in   the operation  package   generally  compute  with  the
  120. operation of group elements defined  by the canonical  operation that  is
  121. denoted with the caret ('\^') in {\GAP}.   However they also allow you to
  122. specify other operations.   Such  operations are specified  by functions,
  123. which are  accepted as optional  argument  by all  the operations package
  124. functions.
  125.  
  126. This function must accept two arguments.   The first argument will be the
  127. point and the second will be the group element.  The function must return
  128. the image of the point under the group element.
  129.  
  130. As an example, the function  'OnPairs' that  specifies  the operation  on
  131. pairs could be defined as follows\\
  132. |    OnPairs := function ( pair, g )
  133.         return [ pair[1] ^ g, pair[2] ^ g ];
  134.     end; |
  135.  
  136. The following operations are predefined.
  137.  
  138. 'OnPoints':\\
  139.         specifies the canonical default operation.  Passing this function
  140.         is equivalent to specifying no operation.  This  function  exists
  141.         because there are places where the operation in not an option.
  142.  
  143. 'OnPairs':\\
  144.         specifies the componentwise operation of  group elements on pairs
  145.         of points, which are represented by lists of length 2.
  146.  
  147. 'OnTuples':\\
  148.         specifies the componentwise operation of group elements on tuples
  149.         of points, which are represented  by  lists.   'OnPairs'  is  the
  150.         special case of 'OnTuples' for tuples with two elements.
  151.  
  152. 'OnSets':\\
  153.         specifies  the  operation of group   elements on sets  of points,
  154.         which  are   represented   by  sorted   lists of  points  without
  155.         duplicates (see "Sets").
  156.  
  157. 'OnRight':\\
  158.         specifies that group elements operate by multiplication from  the
  159.         right.
  160.  
  161. 'OnLeft':\\
  162.         specifies that group elements operate by multiplication  from the
  163.         left.
  164.  
  165. 'OnRightCosets':\\
  166.         specifies that group elements operate by multiplication from  the
  167.         right on sets of points, which are represented by sorted lists of
  168.         points without duplicates (see "Sets").
  169.  
  170. 'OnLeftCosets':\\
  171.         specifies that group elements operate by multiplication from  the
  172.         left  on sets of points, which are represented by sorted lists of
  173.         points without duplicates (see "Sets").
  174.  
  175. 'OnLines':\\
  176.         specifies that group elements, which must be matrices, operate on
  177.         lines,  which are  represented  by  vectors  with  first  nonzero
  178.         coefficient one.  That is, 'OnLines' multiplies the vector by the
  179.         group  element and  then divides  the vector by the first nonzero
  180.         coefficient.
  181.  
  182. Note that it is your responsibility to make sure that the elements of the
  183. domain <D> on which you  are  operating  are already in normal form.  The
  184. reason is that all functions will compare points using the '=' operation.
  185. For example, if you are operating on sets  with 'OnSets', you will get an
  186. error message it not all elements of the domain are sets.
  187.  
  188. |    gap> Cycle( (1,2), [2,1], OnSets );
  189.     Error, OnSets: <tuple> must be a set |
  190.  
  191. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  192. \Section{Cycle}
  193.  
  194. 'Cycle( <g>, <d> )' \\
  195. 'Cycle( <g>, <d>, <operation> )'
  196.  
  197. 'Cycle' returns the orbit  of the point <d>,  which may be  an  object of
  198. arbitrary type, under the group element <g> as a list of points.
  199.  
  200. The points <e> in the cycle of <d> under  the group element <g> are those
  201. for which a power $g^i$ exists such that $d^{g^i} = e$.
  202.  
  203. The first point in the list returned by 'Cycle' is  the point <d> itself,
  204. the ordering of the other points is such that each point  is the image of
  205. the previous point.
  206.  
  207. 'Cycle' accepts a  function <operation> of two arguments  <d> and  <g> as
  208. optional third argument, which  specifies how  the element   <g> operates
  209. (see "Other Operations").
  210.  
  211. |    gap> Cycle( (1,5,3,8)(4,6,7), 3 );
  212.     [ 3, 8, 1, 5 ]
  213.     gap> Cycle( (1,5,3,8)(4,6,7), [3,4], OnPairs );
  214.     [ [ 3, 4 ], [ 8, 6 ], [ 1, 7 ], [ 5, 4 ], [ 3, 6 ], [ 8, 7 ], 
  215.       [ 1, 4 ], [ 5, 6 ], [ 3, 7 ], [ 8, 4 ], [ 1, 6 ], [ 5, 7 ] ] |
  216.  
  217. 'Cycle' calls \\
  218. 'Domain([<g>]).operations.Cycle( <g>, <d>, <operation> )' \\
  219. and returns the value.  Note that the third argument  is not optional for
  220. the functions called this way.
  221.  
  222. The default function  called this  way is 'GroupElementsOps.Cycle', which
  223. starts with <d> and applies <g> to the last point repeatedly until <d> is
  224. reached again.  Special categories of group elements overlay this default
  225. function with more efficient functions.
  226.  
  227. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  228. \Section{CycleLength}
  229.  
  230. 'CycleLength( <g>, <d> )' \\
  231. 'CycleLength( <g>, <d>, <operation> )'
  232.  
  233. 'CycleLength' returns the length of the orbit of the point <d>, which may
  234. be an object of  arbitrary  type,  under  the  group  elements  <g>.  See
  235. "Cycle" for the definition of cycles.
  236.  
  237. 'CycleLength' accepts a function <operation> of two arguments <d> and <g>
  238. as optional third  argument, which specifies  how the  group element  <g>
  239. operates (see "Other Operations").
  240.  
  241. |    gap> CycleLength( (1,5,3,8)(4,6,7), 3 );
  242.     4
  243.     gap> CycleLength( (1,5,3,8)(4,6,7), [3,4], OnPairs );
  244.     12 |
  245.  
  246. 'CycleLength' calls \\
  247. 'Domain([<g>]).operations.CycleLength( <g>, <d>, <operation> )' \\
  248. and returns the value.  Note that the third argument  is not optional for
  249. the functions called this way.
  250.  
  251. The default function called  this way  is 'GroupElementsOps.CycleLength',
  252. which starts with <d> and applies <g> to the  last point repeatedly until
  253. <d> is reached again.  Special categories of group  elements overlay this
  254. default function with more efficient functions.
  255.  
  256. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  257. \Section{Cycles}
  258.  
  259. 'Cycles( <g>, <D> )' \\
  260. 'Cycles( <g>, <D>, <operation> )'
  261.  
  262. 'Cycles' returns the set of cycles of the group element <g> on the domain
  263. <D>, which must be a list of points of arbitrary type,  as a set of lists
  264. of points.  See "Cycle" for the definition of cycles.
  265.  
  266. It is allowed that <D> is a proper subset of a domain, i.e., that  <D> is
  267. not invariant under the  operation of <g>.   In this case <D> is silently
  268. replaced by the smallest superset of <D> which is invariant.
  269.  
  270. The first point in each cycle is the smallest point of <D> in this cycle.
  271. The ordering of the other points is such that each  point is the image of
  272. the previous point.  If <D> is invariant under <g>, then because 'Cycles'
  273. returns a set  of cycles,  i.e.,  a sorted list, and  because cycles  are
  274. compared lexicographically, and because the first point in each  cycle is
  275. the smallest  point in that  cycle, the list returned  by  'Cycles' is in
  276. fact sorted with respect to the smallest point in the cycles.
  277.  
  278. 'Cycles' accepts a  function <operation> of two arguments  <d> and <g> as
  279. optional third  argument, which specifies  how  the element  <g> operates
  280. (see "Other Operations").
  281.  
  282. |    gap> Cycles( (1,5,3,8)(4,6,7), [3,5,7] );
  283.     [ [ 3, 8, 1, 5 ], [ 7, 4, 6 ] ]
  284.     gap> Cycles( (1,5,3,8)(4,6,7), [[1,3],[4,6]], OnPairs );
  285.     [ [ [ 1, 3 ], [ 5, 8 ], [ 3, 1 ], [ 8, 5 ] ], 
  286.       [ [ 4, 6 ], [ 6, 7 ], [ 7, 4 ] ] ] |
  287.  
  288. 'Cycles' calls \\
  289. 'Domain([<g>]).operations.Cycles( <g>, <D>, <operation> )' \\
  290. and returns the value.  Note that the third  argument is not optional for
  291. the functions called this way.
  292.  
  293. The default function called this  way is 'GroupElementsOps.Cycles', which
  294. takes elements from <D>, computes their  orbit, removes all points in the
  295. orbit from <D>, and  repeats  this until <D>  has been emptied.   Special
  296. categories  of  group elements  overlay this default  function  with more
  297. efficient functions.
  298.  
  299. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  300. \Section{CycleLengths}
  301.  
  302. 'CycleLengths( <g>, <D> )' \\
  303. 'CycleLengths( <g>, <D>, <operation> )'
  304.  
  305. 'CycleLengths' returns a list of the  lengths of the  cycles of the group
  306. element   <g> on  the domain  <D>,   which must be   a  list of points of
  307. arbitrary type.  See "Cycle" for the definition of cycles.
  308.  
  309. It is allowed that <D> is a proper subset of a domain, i.e., that  <D> is
  310. not invariant under the  operation of <g>.   In this case <D> is silently
  311. replaced by the smallest superset of <D> which is invariant.
  312.  
  313. The  ordering  of   the lengths  of   cycles   in  the  list  returned by
  314. 'CycleLengths' corresponds  to the list  of cycles returned  by 'Cycles',
  315. which is ordered with respect to the smallest point in each cycle.
  316.  
  317. 'CycleLengths' accepts  a function <operation>  of two arguments  <d> and
  318. <g>  as   optional third argument, which  specifies   how the element <g>
  319. operates (see "Other Operations").
  320.  
  321. |    gap> CycleLengths( (1,5,3,8)(4,6,7), [3,5,7] );
  322.     [ 4, 3 ]
  323.     gap> CycleLengths( (1,5,3,8)(4,6,7), [[1,3],[4,6]], OnPairs );
  324.     [ 4, 3 ] |
  325.  
  326. 'CycleLengths' calls \\
  327. 'Domain([<g>]).operations.CycleLengths( <g>, <D>, <operation> )' \\
  328. and returns the value.  Note that the  third argument is not optional for
  329. the functions called this way.
  330.  
  331. The default function called  this way is 'GroupElementsOps.CycleLengths',
  332. which takes elements  from <D>, computes  their orbit, removes all points
  333. in the orbit from <D>,  and repeats  this   until  <D> has been  emptied.
  334. Special categories of group elements  overlay  this default function with
  335. more efficient functions.
  336.  
  337. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  338. \Section{Permutation}
  339.  
  340. 'Permutation( <g>, <D> )' \\
  341. 'Permutation( <g>, <D>, <operation> )'
  342.  
  343. 'Permutation'   returns  a  permutation that   operates   on the   points
  344. '[1..Length(D)]' in the same way  that the group  element <g> operates on
  345. the domain <D>, which may be a list of arbitrary type.
  346.  
  347. It is not allowed that <D> is a proper subset of a domain, i.e., <D> must
  348. be invariant under the element <g>.
  349.  
  350. 'Permutation' accepts a function <operation> of two arguments <d> and <g>
  351. as optional third argument, which  specifies how the element <g> operates
  352. (see "Other Operations").
  353.  
  354. |    gap> Permutation( (1,5,3,8)(4,6,7), [4,7,6] );
  355.     (1,3,2)
  356.     gap> D := [ [1,4], [1,6], [1,7], [3,4], [3,6], [3,7],
  357.     >           [4,5], [5,6], [5,7], [4,8], [6,8], [7,8] ];;
  358.     gap> Permutation( (1,5,3,8)(4,6,7), D, OnSets );
  359.     ( 1, 8, 6,10, 2, 9, 4,11, 3, 7, 5,12) |
  360.  
  361. 'Permutation' calls \\
  362. 'Domain([<g>]).operations.Permutation( <g>, <D>, <operation> )' \\
  363. and returns the value.  Note that the  third argument is not optional for
  364. the functions called this way.
  365.  
  366. The default  function called this  way is 'GroupElementsOps.Permutation',
  367. which simply applies <g> to all the points of  <D>, finds the position of
  368. the image in <D>, and finally applies 'PermList'  (see "PermList") to the
  369. list of those positions.   Actually this  is  not  quite  true.   Because
  370. finding the position of an image in a sorted list is so  much faster than
  371. finding it in <D>,  'GroupElementsOps.Permutation' first sorts  a copy of
  372. <D> and remembers how it had to rearrange the elements  of <D> to achieve
  373. this.  Special categories of group elements overlay this default function
  374. with more efficient functions.
  375.  
  376. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  377. \Section{IsFixpoint}
  378.  
  379. 'IsFixpoint( <G>, <d> )' \\
  380. 'IsFixpoint( <G>, <d>, <operation> )'
  381.  
  382. 'IsFixpoint'  returns  'true' if the point  <d>  is a  fixpoint under the
  383. operation of the group <G>.
  384.  
  385. We say that  <d> is  a *fixpoint*  under the  operation of <G>  if  every
  386. element <g> of <G> maps <d> to itself.  This is equivalent to saying that
  387. each generator of <G> maps <d> to itself.
  388.  
  389. As a special case it is allowed that the first argument is a single group
  390. element,  though this  does not make a  lot of sense, since in  this case
  391. 'IsFixpoint' simply has to test '<d>\^<g> = <d>'.
  392.  
  393. 'IsFixpoint' accepts a function <operation> of two arguments <d>  and <g>
  394. as optional  third  argument,  which specifies how  the  elements  of <G>
  395. operate (see "Other Operations").
  396.  
  397. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  398.     gap> IsFixpoint( g, 1 );
  399.     false
  400.     gap> IsFixpoint( g, [6,7,8], OnSets );
  401.     true |
  402.  
  403. 'IsFixpoint' is so simple that  it  does  all  the  work  by itself, and,
  404. unlike the  other functions described in this chapter, does not  dispatch
  405. to another function.
  406.  
  407. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  408. \Section{IsFixpointFree}
  409.  
  410. 'IsFixpointFree( <G>, <D> )' \\
  411. 'IsFixpointFree( <G>, <D>, <operation> )'
  412.  
  413. 'IsFixpointFree'  returns  'true'  if  the group  <G>  operates without a
  414. fixpoint (see "IsFixpoint")  on the domain  <D>, which must be  a list of
  415. points of arbitrary type.
  416.  
  417. We say that  <G> operates *fixpoint free* on the domain <D> if each point
  418. of <D> is moved  by at least  one element of  <G>.  This is equivalent to
  419. saying that each point of <D> is moved by at least one generator of  <G>.
  420. This definition also applies in the case that <D> is a proper subset of a
  421. domain, i.e., that <D> is not invariant under the operation of <G>.
  422.  
  423. As a special case it is allowed that the first argument is a single group
  424. element.
  425.  
  426. 'IsFixpointFree' accepts a function <operation> of two arguments <d>  and
  427. <g> as optional third argument, which specifies how the  elements  of <G>
  428. operate (see "Other Operations").
  429.  
  430. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  431.     gap> IsFixpointFree( g, [1..8] );
  432.     true
  433.     gap> sets := Combinations( [1..8], 3 );;  Length( sets );
  434.     56    # a list of all three element subsets of '[1..8]'
  435.     gap> IsFixpointFree( g, sets, OnSets );
  436.     false |
  437.  
  438. 'IsFixpointFree' calls \\
  439. '<G>.operations.IsFixpointFree( <G>, <D>, <operation> )' \\
  440. and returns the value.  Note that the third  argument is not optional for
  441. functions called this way.
  442.  
  443. The default function called this  way is 'GroupOps.IsFixpointFree', which
  444. simply loops over the elements of <D> and applies to each  all generators
  445. of <G>, and tests whether each is moved by at  least one generator.  This
  446. function is seldom overlaid, because it is very difficult to improve it.
  447.  
  448. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  449. \Section{DegreeOperation}
  450.  
  451. 'DegreeOperation( <G>, <D> )' \\
  452. 'DegreeOperation( <G>, <D>, <operation> )'
  453.  
  454. 'DegreeOperation' returns the degree of the operation of the group <G> on
  455. the domain <D>, which must be a list of points of arbitrary type.
  456.  
  457. The *degree* of the operation of <G>  on <D> is defined  as the number of
  458. points  of <D> that  are properly moved by at   least one element of <G>.
  459. This definition also applies in the case that <D> is a proper subset of a
  460. domain, i.e., that <D> is not invariant under the operation of <G>.
  461.  
  462. 'DegreeOperation' accepts a function <operation> of two arguments <d> and
  463. <g> as optional third  argument, which specifies  how the elements of <G>
  464. operate (see "Other Operations").
  465.  
  466. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  467.     gap> DegreeOperation( g, [1..10] );
  468.     8
  469.     gap> sets := Combinations( [1..8], 3 );;  Length( sets );
  470.     56   # a list of all three element subsets of '[1..8]'
  471.     gap> DegreeOperation( g, sets, OnSets );
  472.     55 |
  473.  
  474. 'DegreeOperation' calls \\
  475. '<G>.operations.DegreeOperation( <G>, <D>, <operation> )' \\
  476. and returns the value.  Note that the third argument is  not optional for
  477. functions called this way.
  478.  
  479. The default function called this way is 'GroupOps.DegreeOperation', which
  480. simply loops over the elements of <D> and  applies to each all generators
  481. of <G>, and counts those that are  moved by at least one generator.  This
  482. function is seldom overlaid, because it is very difficult to improve it.
  483.  
  484. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  485. \Section{IsTransitive}
  486.  
  487. 'IsTransitive( <G>, <D> )' \\
  488. 'IsTransitive( <G>, <D>, <operation> )'
  489.  
  490. 'IsTransitive' returns 'true' if  the group  <G> operates transitively on
  491. the domain <D>, which must be a list of points of arbitrary type.
  492.  
  493. We say that a  group <G> acts *transitively* on  a domain <D> if and only
  494. if for every pair  of points <d>  and <e> there is  an element <g> of <G>
  495. such that $d^g = e$.  An alternative characterization of this property is
  496. to say that <D> as a set is equal to the orbit of every single point.
  497.  
  498. It is allowed that <D> is a proper subset of  a domain, i.e., that <D> is
  499. not invariant under the  operation of  <G>.  In this  case 'IsTransitive'
  500. checks  whether  for every pair  of  points  <d>, <e>  of <D> there is an
  501. element <g> of  <G>, such that $d^g = e$.  This can also be characterized
  502. by saying that <D> is a subset of the orbit of every single point.
  503.  
  504. 'IsTransitive' accepts a  function <operation> of  two  arguments <d> and
  505. <g> as  optional third argument, which specifies  how the elements of <G>
  506. operate (see "Other Operations").
  507.  
  508. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  509.     gap> IsTransitive( g, [1..8] );
  510.     false
  511.     gap> IsTransitive( g, [1,6] );
  512.     false    # note that the domain need not be invariant
  513.     gap> sets := Combinations( [1..5], 3 );;  Length( sets );
  514.     10    # a list of all three element subsets of '[1..5]'
  515.     gap> IsTransitive( g, sets, OnSets );
  516.     true |
  517.  
  518. 'IsTransitive' calls \\
  519. '<G>.operations.IsTransitive( <G>, <D>, <operation> )' \\
  520. and returns the value.  Note that the third argument is not  optional for
  521. functions called this way.
  522.  
  523. The default function  called  this way is  'GroupOps.IsTransitive', which
  524. tests  whether <D> is a subset  of the orbit  of  the first point in <D>.
  525. This function is seldom overlaid, because it is difficult to improve it.
  526.  
  527. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  528. \Section{Transitivity}
  529.  
  530. 'Transitivity( <G>, <D> )' \\
  531. 'Transitivity( <G>, <D>, <operation> )'
  532.  
  533. 'Transitivity' returns the degree of transitivity of the group <G> on the
  534. domain  <D>, which must be a  list of points  of  arbitrary type.  If <G>
  535. does not operate transitively on <D> then 'Transitivity' returns 0.
  536.  
  537. The  *degree of  transitivity*  of the operation of    <G> on <D> is  the
  538. largest <k> such that <G> operates <k>-fold  transitively on <D>.  We say
  539. that  <G>   operates  <k>-*fold   transitively*  on <D>   if it  operates
  540. transitively on <D> (see "IsTransitive") and  the stabilizer of one point
  541. <d> of <D> operates '<k>-1'-fold transitively on 'Difference(<D>,[<d>])'.
  542. Because the stabilizers   of the  points  of  <D> are conjugate  this  is
  543. equivalent to  saying  that the stabilizer  of  *each* point  <d>  of <D>
  544. operates '<k>-1'-fold transitively on 'Difference(<D>,[<d>])'.
  545.  
  546. It is not allowed that <D> is a proper subset of a domain, i.e., <D> must
  547. be invariant under the operation of <G>.
  548.  
  549. 'Transitivity'  accepts a function <operation>  of two  arguments <d> and
  550. <g>  as optional third argument, which  specifies how the elements of <G>
  551. operate (see "Other Operations").
  552.  
  553. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  554.     gap> Transitivity( g, [1..8] );
  555.     0
  556.     gap> Transitivity( g, [1..5] );
  557.     3
  558.     gap> sets := Combinations( [1..5], 3 );;  Length( sets );
  559.     10    # a list of all three element subsets of '[1..5]'
  560.     gap> Transitivity( g, sets, OnSets );
  561.     1 |
  562.  
  563. 'Transitivity' calls \\
  564. '<G>.operations.Transitivity( <G>, <D>, <operation> )' \\
  565. and returns the value.  Note that the third argument is not  optional for
  566. functions called this way.
  567.  
  568. The  default function called  this way is  'GroupOps.Transitivity', which
  569. first tests whether <G> operates transitively on <D>.  If so, it returns \\
  570. 'Transitivity(Stabilizer(<G>,Difference(<D>,[<D>[1]]),<operation>)+1'; \\
  571. if not, it simply returns 0.  Special  categories of groups  overlay this
  572. default function with more efficient functions.
  573.  
  574. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  575. \Section{IsRegular}
  576.  
  577. 'IsRegular( <G>, <D> )'
  578. 'IsRegular( <G>, <D>, <operation> )'
  579.  
  580. 'IsRegular'  returns 'true'  if  the group <G>  operates regularly on the
  581. domain <D>, which must be a list of points of arbitrary type, and 'false'
  582. otherwise.
  583.  
  584. A  group  <G>  operates *regularly*  on  a  domain  <D>  if  it  operates
  585. transitively and no element of <G>  other than the idenity leaves a point
  586. of   <D>   fixed.   An  equal   characterisation  is  that  <G>  operates
  587. transitively on <D> and the stabilizer  of any  point  of <D> is trivial.
  588. Yet  another  characterisation  is  that the operation of <G>  on <D>  is
  589. equivalent to the operation of <G> on its elements by multiplication from
  590. the right.
  591.  
  592. It is not allowed that <D> is a proper subset of a domain, i.e., <D> must
  593. be invariant under the operation of <G>.
  594.  
  595. 'IsRegular'  accepts a function <operation> of two  arguments <d> and <g>
  596. as  optional  third  argument, which specifies  how  the elements  of <G>
  597. operate (see "Other Operations").
  598.  
  599. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  600.     gap> IsRegular( g, [1..5] );
  601.     false
  602.     gap> IsRegular( g, Elements(g), OnRight );
  603.     true
  604.     gap> g := Group( (1,2,3), (3,4,5) );;
  605.     gap> IsRegular( g, Orbit( g, [1,2,3], OnTuples ), OnTuples );
  606.     true |
  607.  
  608. 'IsRegular' calls \\
  609. '<G>.operations.IsRegular( <G>, <D>, <operation> )' \\
  610. and returns the  value.  Note that the third argument is not optional for
  611. functions called this way.
  612.  
  613. The default function called this way is 'GroupOps.IsRegular', which tests
  614. if <G> operates transitively and semiregularly on <D> (see "IsTransitive"
  615. and "IsSemiRegular").
  616.  
  617. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  618. \Section{IsSemiRegular}
  619.  
  620. 'IsSemiRegular( <G>, <D> )'\\
  621. 'IsSemiRegular( <G>, <D>, <operation> )'
  622.  
  623. 'IsSemiRegular' returns 'true' if the group <G> operates semiregularly on
  624. the domain  <D>, which must  be  a list of  points of arbitrary type, and
  625. 'false' otherwise.
  626.  
  627. A group <G> operates *semiregularly* on a domain <D> if no element of <G>
  628. other  than  the   idenity  leaves  a  point  of  <D>  fixed.   An  equal
  629. characterisation is  that the stabilizer of any point of <D> is  trivial.
  630. Yet  another characterisation  is that  the operation  of <G>  on <D>  is
  631. equivalent to multiple copies of the operation  of <G> on its elements by
  632. multiplication from the right.
  633.  
  634. It is not allowed that <D> is a proper subset of a domain, i.e., <D> must
  635. be invariant under the operation of <G>.
  636.  
  637. 'IsSemiRegular' accepts a function <operation> of two arguments  <d>  and
  638. <g> as  optional third argument,  which specifies how the elements of <G>
  639. operate (see "Other Operations").
  640.  
  641. |    gap> g := Group( (1,2)(3,4)(5,7)(6,8), (1,3)(2,4)(5,6)(7,8) );;
  642.     gap> IsSemiRegular( g, [1..8] );
  643.     true
  644.     gap> g := Group( (1,2)(3,4)(5,7)(6,8), (1,3)(2,4)(5,6,7,8) );;
  645.     gap> IsSemiRegular( g, [1..8] );
  646.     false
  647.     gap> IsSemiRegular( g, Orbit( g, [1,5], OnSets ), OnSets );
  648.     true |
  649.  
  650. 'IsSemiRegular' calls \\
  651. '<G>.operations.IsSemiRegular( <G>, <D>, <operation> )' \\
  652. and returns the  value.  Note that the third argument is not optional for
  653. functions called this way.
  654.  
  655. The  default  function called this way is 'GroupOps.IsSemiRegular', which
  656. computes  a permutation group <P> that operates on  '[1..Length(<D>)]' in
  657. the  same way  that <G> operates on <D> (see "Operation") and then checks
  658. if this permutation group operations semiregularly.  This of course  only
  659. works because this  default  function is overlaid  for permutation groups
  660. (see "Operations of Permutation Groups").
  661.  
  662. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  663. \Section{Orbit}
  664.  
  665. 'Orbit( <G>, <d> )' \\
  666. 'Orbit( <G>, <d>, <operation> )'
  667.  
  668. 'Orbit' returns the orbit  of the point <d>,  which  may be an  object of
  669. arbitrary type, under the group <G> as a list of points.
  670.  
  671. The points <e> in the orbit of <d>  under the group  <G> are those points
  672. for which a group element <g> of <G> exists such that $d^g = e$.
  673.  
  674. Suppose  <G> has <n> generators.   First we  order the words of the  free
  675. monoid with <n>  abstract  generators according to length and  for  words
  676. with equal length lexicographically.  So if <G> has two generators called
  677. <a> and <b> the ordering is $identity, a, b, a^2, ab, ba, b^2, a^3, ...$.
  678. Next we order the elements of <G> that can be written as a product of the
  679. generators, i.e., without inverses  of the generators, according  to  the
  680. first occurence of a word representing the element in the above ordering.
  681. Then the ordering of points in the orbit returned by 'Orbit' is according
  682. to the order of the  first  representative of  each point  <e>, i.e., the
  683. smallest <g> such that $d^g  = e$.  Note that because the orbit is finite
  684. there is  for every  point in the orbit at least one  representative that
  685. can be written as a product in the generators of <G>.
  686.  
  687. 'Orbit' accepts a  function <operation> of two  arguments <d>  and <g> as
  688. optional third argument, which specifies how the elements of <G>  operate
  689. (see "Other Operations").
  690.  
  691. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  692.     gap> Orbit( g, 1 );
  693.     [ 1, 2, 3, 4, 5 ]
  694.     gap> Orbit( g, 2 );
  695.     [ 2, 3, 1, 4, 5 ]
  696.     gap> Orbit( g, [1,6], OnPairs );
  697.     [ [ 1, 6 ], [ 2, 7 ], [ 3, 6 ], [ 2, 8 ], [ 1, 7 ], [ 4, 6 ], 
  698.       [ 3, 8 ], [ 2, 6 ], [ 1, 8 ], [ 4, 7 ], [ 5, 6 ], [ 3, 7 ], 
  699.       [ 5, 8 ], [ 5, 7 ], [ 4, 8 ] ] |
  700.  
  701. 'Orbit' calls \\
  702. '<G>.operations.Orbit( <G>, <d>, <operation> )' \\
  703. and returns the value.  Note that the third argument  is not optional for
  704. functions called this way.
  705.  
  706. The default function called this  way is 'GroupOps.Orbit', which performs
  707. an ordinary orbit algorithm.  Special  categories of groups  overlay this
  708. default function with more efficient functions.
  709.  
  710. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  711. \Section{OrbitLength}
  712.  
  713. 'OrbitLength( <G>, <d> )' \\
  714. 'OrbitLength( <G>, <d>, <operation> )'
  715.  
  716. 'OrbitLength' returns the length of the orbit of the point <d>, which may
  717. be an object of arbitrary type, under the group <G>.  See "Orbit" for the
  718. definition of orbits.
  719.  
  720. 'OrbitLength' accepts a function <operation> of two arguments <d> and <g>
  721. as  optional third  argument,  which specifies how  the  elements  of <G>
  722. operate (see "Other Operations").
  723.  
  724. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  725.     gap> OrbitLength( g, 1 );
  726.     5
  727.     gap> OrbitLength( g, 10 );
  728.     1
  729.     gap> OrbitLength( g, [1,6], OnPairs );
  730.     15 |
  731.  
  732. 'OrbitLength' calls \\
  733. '<G>.operations.OrbitLength( <G>, <d>, <operation> )' \\
  734. and returns the value.  Note that the third argument is  not optional for
  735. functions called this way.
  736.  
  737. The  default  function called this way   is 'GroupOps.OrbitLength', which
  738. performs an  ordinary   orbit  algorithm.  Special categories  of  groups
  739. overlay this default function with more efficient functions.
  740.  
  741. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  742. \Section{Orbits}
  743.  
  744. 'Orbits( <G>, <D> )' \\
  745. 'Orbits( <G>, <D>, <operation> )'
  746.  
  747. 'Orbits' returns  the orbits of the group  <G>  on the domain  <D>, which
  748. must be a list of points of arbitrary type, as a set of lists of  points.
  749. See "Orbit" for the definition of orbits.
  750.  
  751. It is allowed that <D> is a proper subset of a domain,  i.e., that <D> is
  752. not invariant under the  operation of <G>.  In  this case <D> is silently
  753. replaced by the smallest superset of <D> which is invariant.
  754.  
  755. The first point in each orbit is the smallest point, the  other points of
  756. each orbit  are  ordered in the standard  order defined  for  orbits (see
  757. "Orbit").  Because 'Orbits' returns a set of orbits, i.e., a sorted list,
  758. and because those orbits  are compared lexicographically, and because the
  759. first point in each orbit is the smallest point  in that orbit,  the list
  760. returned  by 'Orbits' is in  fact  sorted  with respect  to  the smallest
  761. points the orbits.
  762.  
  763. 'Orbits' accepts a  function <operation> of two arguments <d>  and <g> as
  764. optional third argument, which specifies how the elements of <G>  operate
  765. (see "Other Operations").
  766.  
  767. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  768.     gap> Orbits( g, [1..8] );
  769.     [ [ 1, 2, 3, 4, 5 ], [ 6, 7, 8 ] ]
  770.     gap> Orbits( g, [1,6] );
  771.     [ [ 1, 2, 3, 4, 5 ], [ 6, 7, 8 ] ]    # the domain is not invariant
  772.     gap> sets := Combinations( [1..8], 3 );; Length( sets );
  773.     56    # a list of all three element subsets of '[1..8]'
  774.     gap> Orbits( g, sets, OnSets );
  775.     [ [ [ 1, 2, 3 ], [ 1, 2, 4 ], [ 2, 3, 4 ], [ 1, 2, 5 ], [ 1, 3, 4 ], 
  776.           [ 2, 4, 5 ], [ 2, 3, 5 ], [ 1, 4, 5 ], [ 3, 4, 5 ], [ 1, 3, 5 ] 
  777.          ],
  778.       [ [ 1, 2, 6 ], [ 2, 3, 7 ], [ 1, 3, 6 ], [ 2, 4, 8 ], [ 1, 2, 7 ], 
  779.           [ 1, 4, 6 ], [ 3, 4, 8 ], [ 2, 5, 7 ], [ 2, 3, 6 ], 
  780.           [ 1, 2, 8 ], [ 2, 4, 7 ], [ 1, 5, 6 ], [ 1, 4, 8 ], 
  781.           [ 4, 5, 7 ], [ 3, 5, 6 ], [ 2, 3, 8 ], [ 1, 3, 7 ], 
  782.           [ 2, 4, 6 ], [ 3, 4, 6 ], [ 2, 5, 8 ], [ 1, 5, 7 ], 
  783.           [ 4, 5, 6 ], [ 3, 5, 8 ], [ 1, 3, 8 ], [ 3, 4, 7 ], 
  784.           [ 2, 5, 6 ], [ 1, 4, 7 ], [ 1, 5, 8 ], [ 4, 5, 8 ], [ 3, 5, 7 ] 
  785.          ],
  786.       [ [ 1, 6, 7 ], [ 2, 6, 7 ], [ 1, 6, 8 ], [ 3, 6, 7 ], [ 2, 6, 8 ], 
  787.           [ 2, 7, 8 ], [ 4, 6, 8 ], [ 3, 7, 8 ], [ 3, 6, 8 ], 
  788.           [ 4, 7, 8 ], [ 5, 6, 7 ], [ 1, 7, 8 ], [ 4, 6, 7 ], 
  789.           [ 5, 7, 8 ], [ 5, 6, 8 ] ], [ [ 6, 7, 8 ] ] ] |
  790.  
  791. 'Orbits' calls \\
  792. '<G>.operations.Orbits( <G>, <D>, <operation> )' \\
  793. and returns the value.  Note that the third argument is  not optional for
  794. functions called this way.
  795.  
  796. The default function called this way is 'GroupOps.Orbits', which takes an
  797. element from  <D>, computes its  orbit, removes all  points in the  orbit
  798. from  <D>,  and  repeats  this  until  <D>  has  been  emptied.   Special
  799. categories of  groups  overlay this default  function with more efficient
  800. functions.
  801.  
  802. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  803. \Section{OrbitLengths}
  804.  
  805. 'OrbitLengths( <G>, <D> )' \\
  806. 'OrbitLengths( <G>, <D>, <operation> )'
  807.  
  808. 'OrbitLengths' returns a list of the lengths  of  the orbits of the group
  809. <G> on the domain <D>, which may be a list of  points of arbitrary  type.
  810. See "Orbit" for the definition of orbits.
  811.  
  812. It is allowed that <D>  is  proper subset of a domain,  i.e., that <D> is
  813. not invariant under the operation of <G>.   In this case  <D> is silently
  814. replaced by the smallest superset of <D> which is invariant.
  815.  
  816. The  ordering   of  the  lengths  of  orbits  in  the  list  returned  by
  817. 'OrbitLengths'  corresponds to the list of cycles returned  by  'Orbits',
  818. which is ordered with respect to the smallest point in each orbit.
  819.  
  820. 'OrbitLengths' accepts  a  function <operation> of two arguments  <d> and
  821. <g> as optional third argument, which specifies how  the elements  of <G>
  822. operate (see "Other Operations").
  823.  
  824. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  825.     gap> OrbitLengths( g, [1..8] );
  826.     [ 5, 3 ]
  827.     gap> sets := Combinations( [1..8], 3 );; Length( sets );
  828.     56    # a list of all three element subsets of '[1..8]'
  829.     gap> OrbitLengths( g, sets, OnSets );
  830.     [ 10, 30, 15, 1 ] |
  831.  
  832. 'OrbitLengths' calls \\
  833. '<G>.operations.OrbitLenghts( <G>, <D>, <operation> )' \\
  834. and returns the value.  Note that the  third argument is not optional for
  835. functions called this way.
  836.  
  837. The default  function called this way is  'GroupOps.OrbitLengths',  which
  838. takes an element from <D>, computes its orbit, removes all points  in the
  839. orbit from <D>,  and repeats this until <D>  has been  emptied.   Special
  840. categories  of groups  overlay  this default function with more efficient
  841. functions.
  842.  
  843. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  844. \Section{Operation}
  845.  
  846. 'Operation( <G>, <D> )' \\
  847. 'Operation( <G>, <D>, <operation> )'
  848.  
  849. 'Operation'  returns  a  permutation  group  with  the  same   number  of
  850. generators  as  <G>, such that each generator  of  the permutation  group
  851. operates  on  the  set  '[1..Length(D)]'  in   the   same  way  that  the
  852. corresponding  generator of the  group <G> operates on  the  domain  <D>,
  853. which may be a list of arbitrary type.
  854.  
  855. It is not allowed that <D> is a proper subset of a domain, i.e., <D> must
  856. be invariant under the element <g>.
  857.  
  858. 'Operation' accepts  a  function <operation> of two arguments <d> and <g>
  859. as  optional  third  argument, which  specifies how  the elements  of <G>
  860. operate (see "Other Operations").
  861.  
  862. The function 'OperationHomomorphism' (see "OperationHomomorphism") can be
  863. used to  compute the homomorphism that  maps <G> onto the new permutation
  864. group.  Of course  if you are  only interested in mapping single elements
  865. of <G> into the new permutation group you may also use 'Permutation' (see
  866. "Permutation").
  867.  
  868. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  869.     gap> Operation( g, [1..5] );
  870.     Group( (1,2,3), (3,4,5) )
  871.     gap> Operation( g, Orbit( g, [1,6], OnPairs ), OnPairs );
  872.     Group( ( 1, 2, 3, 5, 8,12)( 4, 7, 9)( 6,10)(11,14), ( 2, 4)( 3, 6,11)
  873.     ( 5, 9)( 7,10,13,12,15,14) ) |
  874.  
  875. 'Operation' calls \\
  876. '<G>.operations.Operation( <G>, <D>, <operation> )' \\
  877. and returns the value.  Note that the  third argument is not optional for
  878. functions called this way.
  879.  
  880. The default function  called   this  way is  'GroupOps.Operation',  which
  881. simply applies each generator of <G> to all the points of <D>,  finds the
  882. position of  the  image in  <D>,  and   finally applies 'PermList'   (see
  883. "PermList") to  the list of those positions.   Actually this is not quite
  884. true.  Because  finding the  position on an image in  a sorted list is so
  885. much  faster than  finding it in  <D>, 'GroupElementsOps.Operation' first
  886. sorts a copy of <D> and remembers how it had to rearrange the elements of
  887. <D> to achieve this.  Special  categories of groups overlay this  default
  888. function with more efficient functions.
  889.  
  890. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  891. \Section{OperationHomomorphism}
  892. \index{group homomorphisms!operation}
  893. \index{homomorphisms!operation, group}
  894. \index{Image!for OperationHomomorphism}
  895. \index{PreImage!for OperationHomomorphism}
  896. \index{Kernel!for OperationHomomorphism}
  897.  
  898. 'OperationHomomorphism( <G>, <P> )'
  899.  
  900. 'OperationHomomorphism'  returns  the  group  homomorphism  (see   "Group
  901. Homomorphisms") from  the group <G> to the  permutation group <P>,  which
  902. must be the result of a prior call to 'Operation' (see  "Operation") with
  903. <G>  or a group of which <G>  is a  subgroup (see "IsSubgroup") as  first
  904. argument.
  905.  
  906. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  907.     gap> h := Operation( g, [1..5] );
  908.     Group( (1,2,3), (3,4,5) )
  909.     gap> p := OperationHomomorphism( g, h );
  910.     OperationHomomorphism( Group( (1,2,3)(6,7), (3,4,5)(7,8) ), Group( 
  911.     (1,2,3), (3,4,5) ) )
  912.     gap> (1,4,2,5,3)(6,7,8) ^ p;
  913.     (1,4,2,5,3)
  914.     gap> h := Operation( g, Orbit( g, [1,6], OnPairs ), OnPairs );
  915.     Group( ( 1, 2, 3, 5, 8,12)( 4, 7, 9)( 6,10)(11,14), ( 2, 4)( 3, 6,11)
  916.     ( 5, 9)( 7,10,13,12,15,14) )
  917.     gap> p := OperationHomomorphism( g, h );;
  918.     gap> s := SylowSubgroup( g, 2 );
  919.     Subgroup( Group( (1,2,3)(6,7), (3,4,5)(7,8) ),
  920.     [ (7,8), (7,8), (2,5)(3,4), (2,3)(4,5) ] )
  921.     gap> Images( p, s );
  922.     Subgroup( Group( ( 1, 2, 3, 5, 8,12)( 4, 7, 9)( 6,10)(11,14), ( 2, 4)
  923.     ( 3, 6,11)( 5, 9)( 7,10,13,12,15,14) ),
  924.     [ ( 2, 4)( 5, 9)( 7,12)(10,15)(13,14),
  925.       ( 2, 4)( 5, 9)( 7,12)(10,15)(13,14),
  926.       ( 2,14)( 3, 6)( 4,13)( 7,15)( 8,11)(10,12),
  927.       ( 2,12)( 3, 8)( 4, 7)( 6,11)(10,14)(13,15) ] )
  928.     gap> OperationHomomorphism( g, Group( (1,2,3), (3,4,5) ) );
  929.     Error, <P> must be an operation group in
  930.     OperationHomomorphism( g, Group( (1,2,3), (3,4,5) ) ) called from
  931.     main loop |
  932.  
  933. 'OperationHomomorphism' calls \\
  934. '<P>.operations.OperationHomomorphism( <G>, <P> )' \\
  935. and returns the value.
  936.  
  937. The default function called this way is 'GroupOps.OperationHomomorphism',
  938. which uses  the  fields  '<P>.operationGroup', '<P>.operationDomain', and
  939. '<P>.operationOperation'  (the arguments  to  the  'Operation' call  that
  940. created    <P>)   to  construct     a  generic   homomorphism  <h>.  This
  941. homomorphism uses \\
  942. 'Permutation(<g>,<h>.range.operationDomain,<h>.range.operationOperation)'
  943. \\
  944. to  compute  the image  of an element  <g>  of  <G>  under  <h>.  It uses
  945. 'Representative' to compute the preimages  of an element <p> of <P> under
  946. <h>.  And it computes  the kernel by intersecting  the cores (see "Core")
  947. of the stabilizers (see "Stabilizer") of representatives of the orbits of
  948. <G>.  Look  under  *OperationHomomorphism* in the index  to see for which
  949. groups and operations this function is overlaid.
  950.  
  951. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  952. \Section{Blocks}
  953.  
  954. 'Blocks( <G>, <D>, <seed> )' \\
  955. 'Blocks( <G>, <D>, <seed>, <operation> )'
  956.  
  957. In this form 'Blocks' returns a block system of the domain <D>, which may
  958. be a list of points of arbitrary type, under the group <G>, such that the
  959. points  in  the  list <seed>  all  lie in  the  same block.  If  no  such
  960. nontrivial  block  system exists,  'Blocks' returns '[ <D>  ]'.  <G> must
  961. operate transitively on <D>, otherwise an error is signalled.
  962.  
  963. 'Blocks( <G>, <D> )' \\
  964. 'Blocks( <G>, <D>, <operation> )'
  965.  
  966. In this form 'Blocks' returns a minimal  block system of the domain  <D>,
  967. which may be a list of points of arbitrary type, under the group <G>.  If
  968. no nontrivial  block system exists, 'Blocks' returns '[ <D> ]'.  <G> must
  969. operate transitively on <D>, otherwise an error is signalled.
  970.  
  971. A *block system* <B> is  a list of blocks  with the following properties.
  972. Each block <b> of  <B>  is a subset of   <D>.   The blocks are   pairwise
  973. disjoint.   The union of blocks  is <D>.  The  image  of each block under
  974. each element  <g> of <G> is as  a set  equal to  some block of  the block
  975. system.  Note that  this implies that all  blocks contain the same number
  976. of elements as <G>  operates transitive on <D>.   Put differently a block
  977. system  <B> of  <D>  is a partition  of <D>  such that  <G> operates with
  978. 'OnSets' (see "Other Operations") on <B>.  The block system that consists
  979. of  only singleton sets  and the block system consisting  only of <D> are
  980. called *trivial*.  A block system <B> is called *minimal*  if there is no
  981. nontrivial block system whose blocks are all subsets of the blocks of <B>
  982. and whose number of blocks is larger than the number of blocks of <B>.
  983.  
  984. 'Blocks' accepts a function <operation>  of two  arguments <d> and <g> as
  985. optional third, resp. fourth, argument, which  specifies how the elements
  986. of <G> operate (see "Other Operations").
  987.  
  988. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  989.     gap> Blocks( g, [1..5] );
  990.     [ [ 1 .. 5 ] ]
  991.     gap> Blocks( g, Orbit( g, [1,2], OnPairs ), OnPairs );
  992.     [ [ [ 1, 2 ], [ 3, 2 ], [ 4, 2 ], [ 5, 2 ] ], 
  993.       [ [ 1, 3 ], [ 2, 3 ], [ 4, 3 ], [ 5, 3 ] ], 
  994.       [ [ 1, 4 ], [ 2, 4 ], [ 3, 4 ], [ 5, 4 ] ], 
  995.       [ [ 1, 5 ], [ 2, 5 ], [ 3, 5 ], [ 4, 5 ] ], 
  996.       [ [ 2, 1 ], [ 3, 1 ], [ 4, 1 ], [ 5, 1 ] ] ] |
  997.  
  998. 'Blocks' calls \\
  999. '<G>.operations.Blocks( <G>, <D>, <seed>, <operation> )' \\
  1000. and returns the value.  If  no seed was given as  argument to 'Blocks' it
  1001. passes the empty list.  Note that the fourth argument is not optional for
  1002. functions called this way.
  1003.  
  1004. The default function called this way is 'GroupOps.Blocks', which computes
  1005. a permutation  group  <P> that operates on '[1..Length(<D>)]' in the same
  1006. way  that  <G>  operates on <D>  (see "Operation") and leaves  it to this
  1007. permutation group to find the blocks.  This of  course works only because
  1008. this default function is overlaid for permutation groups (see "Operations
  1009. of Permutation Groups").
  1010.  
  1011. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1012. \Section{IsPrimitive}
  1013.  
  1014. 'IsPrimitive( <G>, <D> )' \\
  1015. 'IsPrimitive( <G>, <D>, <operation> )'
  1016.  
  1017. 'IsPrimitive' returns 'true' if the group <G> operates primitively on the
  1018. domain <D>, which may  be a list of points of arbitrary type, and 'false'
  1019. otherwise.
  1020.  
  1021. A group <G>  operates *primitively*  on a  domain <D> if and only  if <D>
  1022. operates transitively (see "IsTransitive") and has only the trivial block
  1023. systems (see "Blocks").
  1024.  
  1025. 'IsPrimitive' accepts a function <operation> of two arguments <d> and <g>
  1026. as  optional third argument,   which specifies  how  the elements  of <G>
  1027. operate (see "Other Operations").
  1028.  
  1029. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  1030.     gap> IsPrimitive( g, [1..5] );
  1031.     true
  1032.     gap> IsPrimitive( g, Orbit( g, [1,2], OnPairs ), OnPairs );
  1033.     false |
  1034.  
  1035. 'IsPrimitive' calls \\
  1036. '<G>.operations.IsPrimitive( <G>, <D>, <operation> )' \\
  1037. and returns the value.  Note that the  third argument is not optional for
  1038. functions called this way.
  1039.  
  1040. The  default  function called this way is  'GroupOps.IsPrimitive',  which
  1041. simply calls  'Blocks( <G>, <D>,  <operation>  )'  and tests whether  the
  1042. returned block  system is '[ <D> ]'.  This function  is  seldom overlaid,
  1043. because all the important work is done in 'Blocks'.
  1044.  
  1045. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1046. \Section{Stabilizer}
  1047.  
  1048. 'Stabilizer( <G>, <d> )' \\
  1049. 'Stabilizer( <G>, <d>, <operation> )'
  1050.  
  1051. 'Stabilizer' returns the stabilizer of  the point <d> under the operation
  1052. of the group <G>.
  1053.  
  1054. The *stabilizer* $S$ of $d$ in $G$ is  the subgroup of those elements $g$
  1055. of $G$ that fix $d$, i.e., for which $d^g = d$.   The right cosets of $S$
  1056. correspond in a canonical way to  the points $p$ in  the orbit $O$ of $d$
  1057. under  $G$; namely all elements  from a right coset  $S g$ map $d$ to the
  1058. same  point $d^g \in  O$, and elements from different  right cosets $S g$
  1059. and $S h$ map $d$ to different points $d^g$ and $d^h$.  Thus the index of
  1060. the stabilizer $S$   in $G$ is equal to    the length of  the orbit  $O$.
  1061. 'RepresentativesOperation'  (see "RepresentativesOperation")  computes  a
  1062. system of representatives of the right cosets of $S$ in $G$.
  1063.  
  1064. 'Stabilizer' accepts a function <operation> of  two arguments <d> and <g>
  1065. as  optional  third argument, which  specifies  how the  elements  of <G>
  1066. operate (see "Other Operations").
  1067.  
  1068. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  1069.     gap> g.name := "G";;
  1070.     gap> Stabilizer( g, 1 );
  1071.     Subgroup( G, [ (3,4,5)(7,8), (2,5,3)(6,7) ] )
  1072.     gap> Stabilizer( g, [1,2,3], OnSets );
  1073.     Subgroup( G, [ (7,8), (6,8), (2,3)(4,5)(6,7,8), (1,2)(4,5)(6,7,8) ] )|
  1074.  
  1075. 'Stabilizer' calls \\
  1076. '<G>.operations.Stabilizer( <G>, <d>, <operation> )' \\
  1077. and returns the value.  Note that the third argument is  not optional for
  1078. functions called this way.
  1079.  
  1080. The  default  function called  this  way  is 'GroupOps.Stabilizer', which
  1081. computes the orbit of $d$ under $G$, remembers a representative $r_e$ for
  1082. each  point $e$ in the  orbit,  and uses Schreier\'s theorem, which  says
  1083. that the stabilizer  is generated by  the elements $r_e  g r_{e^g}^{-1}$.
  1084. Special categories of  groups overlay  this  default  function with  more
  1085. efficient functions.
  1086.  
  1087. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1088. \Section{RepresentativeOperation}
  1089.  
  1090. 'RepresentativeOperation( <G>, <d>, <e> )' \\
  1091. 'RepresentativeOperation( <G>, <d>, <e>, <operation> )'
  1092.  
  1093. 'RepresentativeOperation' returns a  representative of the  point <e>  in
  1094. the  orbit of the point  <d> under the group   <G>.   If <d> =  <e>  then
  1095. 'RepresentativeOperation' returns   '<G>.identity',  otherwise it  is not
  1096. specified which group element   'RepresentativeOperation' will return  if
  1097. there are several that map <d> to <e>.  If <e> is not in the orbit of <d>
  1098. under <G>, 'RepresentativeOperation' returns 'false'.
  1099.  
  1100. An element $g$ of $G$ is called a *representative*  for  the point $e$ in
  1101. the orbit of $d$ under $G$ if $g$ maps $d$ to $e$, i.e., $d^g = e$.  Note
  1102. that the set  of such  representatives that map  $d$ to $e$ forms a right
  1103. coset of the stabilizer of $d$ in $G$ (see "Stabilizer").
  1104.  
  1105. 'RepresentativeOperation' accepts a function <operation> of two arguments
  1106. <d> and <g> as optional third  argument, which specifies how the elements
  1107. of <G> operate (see "Other Operations").
  1108.  
  1109. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  1110.     gap> RepresentativeOperation( g, 1, 5 );
  1111.     (1,5,4,3,2)(6,8,7)
  1112.     gap> RepresentativeOperation( g, 1, 6 );
  1113.     false
  1114.     gap> RepresentativeOperation( g, [1,2,3], [3,4,5], OnSets );
  1115.     (1,3,5,2,4)
  1116.     gap> RepresentativeOperation( g, [1,2,3,4], [3,4,5,2], OnTuples );
  1117.     false |
  1118.  
  1119. 'RepresentativeOperation' calls \\
  1120. '<G>.operations.RepresentativeOperation( <G>, <d>, <e>, <operation> )' \\
  1121. and returns the value.  Note that the fourth argument is not optional for
  1122. functions called this way.
  1123.  
  1124. The      default     function      called     this          way        is
  1125. 'GroupOper.RepresentativeOperation',   which    starts   a  normal  orbit
  1126. calculation to compute the orbit of <d> under <G>, and remembers for each
  1127. point how it was obtained, i.e., which generator of  <G> took which orbit
  1128. point to this new point.  When the point <e> appears this information can
  1129. be traced back to write down the representative of <e>  as a  word in the
  1130. generators.  Special  categories of groups  overlay this default function
  1131. with more efficient functions.
  1132.  
  1133. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1134. \Section{RepresentativesOperation}
  1135.  
  1136. 'RepresentativesOperation( <G>, <d> )' \\
  1137. 'RepresentativesOperation( <G>, <d>, <operation> )'
  1138.  
  1139. 'RepresentativesOperation' returns  a  list  of  representatives of   the
  1140. points in the orbit of the point <d> under the group <G>.
  1141.  
  1142. The ordering  of the representatives corresponds  to  the ordering of the
  1143. points in  the orbit  as  returned by 'Orbit'  (see  "Orbit").  Therefore
  1144. 'List( RepresentativesOperation(<G>,<d>), r-><d>\^r ) = Orbit(<G>,<d>)'.
  1145.  
  1146. An element $g$ of $G$ is called a  *representative*  for the point $e$ in
  1147. the orbit of $d$ under $G$ if $g$ maps $d$ to $e$, i.e., $d^g = e$.  Note
  1148. that the set  of such representatives  that map $d$ to $e$  forms a right
  1149. coset of the stabilizer of $d$ in $G$ (see "Stabilizer").  The set of all
  1150. representatives of the orbit  of  $d$ under $G$  thus  forms a system  of
  1151. representatives of the right cosets of the stabilizer of $d$ in $G$.
  1152.  
  1153. 'RepresentativesOperation' accepts    a  function   <operation>  of   two
  1154. arguments <d> and <g> as optional third argument, which specifies how the
  1155. elements of <G> operate (see "Other Operations").
  1156.  
  1157. |    gap> g := Group( (1,2,3)(6,7), (3,4,5)(7,8) );;
  1158.     gap> RepresentativesOperation( g, 1 );
  1159.     [ (), (1,2,3)(6,7), (1,3,2), (1,4,5,3,2)(7,8), (1,5,4,3,2) ]
  1160.     gap> Orbit( g, [1,2], OnSets );
  1161.     [ [ 1, 2 ], [ 2, 3 ], [ 1, 3 ], [ 2, 4 ], [ 1, 4 ], [ 3, 4 ], 
  1162.       [ 2, 5 ], [ 1, 5 ], [ 4, 5 ], [ 3, 5 ] ]
  1163.     gap> RepresentativesOperation( g, [1,2], OnSets );
  1164.     [ (), (1,2,3)(6,7), (1,3,2), (1,2,4,5,3)(6,8,7), (1,4,5,3,2)(7,8), 
  1165.       (1,3,2,4,5)(6,8), (1,2,5,4,3)(6,7), (1,5,4,3,2), (1,4,3,2,5)(6,7,8),
  1166.       (1,3,2,5,4) ] |
  1167.  
  1168. 'RepresentativesOperation' calls \\
  1169. '<G>.operations.RepresentativesOperation( <G>, <d>, <operation> )' \\
  1170. and returns the value.  Note that the third  argument is not optional for
  1171. functions called this way.
  1172.  
  1173. The       default       function      called       this       way      is
  1174. 'GroupOps.RepresentativesOperation', which computes the orbit of <d> with
  1175. the  normal  algorithm,  but remembers  for each point $e$ in the orbit a
  1176. representative $r_e$.  When a generator $g$ of $G$ takes an old point $e$
  1177. to a point $f$ not yet in the orbit, the representative $r_f$ for  $f$ is
  1178. computed as $r_e  g$.  Special categories of  groups overlay this default
  1179. function with more efficient functions.
  1180.  
  1181. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1182. \Section{IsEquivalentOperation}
  1183.  
  1184. 'IsEquivalentOperation( <G>, <D>, <H>, <E> )' \\
  1185. 'IsEquivalentOperation( <G>, <D>, <H>, <E>, <operationH> )' \\
  1186. 'IsEquivalentOperation( <G>, <D>, <operationG>, <H>, <E> )' \\
  1187. 'IsEquivalentOperation( <G>, <D>, <operationG>, <H>, <E>, <operationH> )'
  1188.  
  1189. 'IsEquivalentOperation' returns 'true' if <G> operates on <D> in like <H>
  1190. operates on <E>, and 'false' otherwise.
  1191.  
  1192. The operations of $G$ on $D$ and $H$  on $E$ are  equivalent if they have
  1193. the same  number of  generators  and there  is a   permutation $F$ of the
  1194. elements of   $E$  such that  for every   generator $g$ of   $G$  and the
  1195. corresponding generator  $h$ of  $H$ we  have   $Position(  D, D_i^g  ) =
  1196. Position( F, F_i^h )$.  Note that this  assumes that the  mapping defined
  1197. by mapping $G.generators$  to $H.generators$ is a  homomorphism (actually
  1198. an isomorphism  of  factor  groups of $G$   and  $H$ represented   by the
  1199. respective operation).
  1200.  
  1201. 'IsEquivalentOperation' accepts functions   <operationG> and <operationH>
  1202. of two arguments <d> and <g> as optional third and sixth arguments, which
  1203. specify  how  the  elements  of   <G>  and  <H>  operate   (see    "Other
  1204. Operations").
  1205.  
  1206. |    gap> g := Group( (1,2)(4,5), (1,2,3)(4,5,6) );;
  1207.     gap> h := Group( (2,3)(4,5), (1,2,3)(4,5,6) );;
  1208.     gap> IsEquivalentOperation( g, [1..6], h, [1..6] );
  1209.     true
  1210.     gap> h := Group( (1,2), (1,2,3) );;
  1211.     gap> IsEquivalentOperation(g,[[1,4],[2,5],[3,6]],OnPairs,h,[1..3]);
  1212.     true
  1213.     gap> h := Group( (1,2), (1,2,3)(4,5,6) );;
  1214.     gap> IsEquivalentOperation( g, [1..6], h, [1..6] );
  1215.     false
  1216.     gap> h := Group( (1,2,3)(4,5,6), (1,2)(4,5) );;
  1217.     gap> IsEquivalentOperation( g, [1..6], h, [1..6] );
  1218.     false    # the generators must correspond |
  1219.  
  1220. 'IsEquivalentOperation' calls \\
  1221. '<G>.operations.IsEquivalentOperation(<G>,<D>,<oprG>,<H>,<E>,<oprH>)' and
  1222. returns  the value.   Note that  the  third   and sixth argument are  not
  1223. optional for functions called this way.
  1224.  
  1225. The default function called this way is 'GroupOps.IsEquivalentOperation',
  1226. which tries to rearrange <E>  so that the above  condition  is satisfied.
  1227. This is done one orbit of <G> at a time, and for each such  orbit all the
  1228. orbits of <H> of the same length are tried to see  if there is  one which
  1229. can be rearranged  as necessary.  Special   categories of groups  overlay
  1230. this function with more efficient ones.
  1231.  
  1232. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1233. %%
  1234. %E  Emacs . . . . . . . . . . . . . . . . . . . . . local Emacs variables
  1235. %%
  1236. %%  Local Variables:
  1237. %%  mode:               outline
  1238. %%  outline-regexp:     "\\\\Chapter\\|\\\\Section"
  1239. %%  fill-column:        73
  1240. %%  eval:               (hide-body)
  1241. %%  End:
  1242. %%
  1243.  
  1244.  
  1245.  
  1246.