  
  [1X4 [33X[0;0Y[22XFG[122X[101X[1X-module homomorphisms[133X[101X
  
  
  [1X4.1 [33X[0;0YThe [9XFpGModuleHomomorphismGF[109X[101X[1X datatype[133X[101X
  
  [33X[0;0YLinear  homomorphisms  between free [22XFG[122X-modules (as [9XFpGModuleGF[109X objects - see
  Chapter  [14X3[114X)  are  represented  in [5XHAPprime[105X using the [9XFpGModuleHomomorphismGF[109X
  datatype.  This  represents  module  homomorphisms  in  a  similar manner to
  [22XFG[122X-modules,  using  a  set  of generating vectors, in this case vectors that
  generate  the  images  in  the target module of the generators of the source
  module.[133X
  
  [33X[0;0YThree    items   need   to   be   passed   to   the   constructor   function
  [2XFpGModuleHomomorphismGF[102X ([14X4.4-1[114X):[133X
  
  [30X    [33X[0;6Y[10Xsource[110X the source [9XFpGModuleGF[109X module for the homomorphism[133X
  
  [30X    [33X[0;6Y[10Xtarget[110X the target [9XFpGModuleGF[109X module for the homomorphism[133X
  
  [30X    [33X[0;6Y[10Xgens[110X  a  list  of  vectors  that  are the images (in [10Xtarget[110X) under the
        homomorphisms of each of the generators stored in [10Xsource[110X[133X
  
  
  [1X4.2  [33X[0;0YCalculating  the kernel of a [22XFG[122X[101X[1X-module homorphism by splitting into two[101X
  [1Xhomomorphisms[133X[101X
  
  [33X[0;0Y[5XHAPprime[105X  represents  a  homomorphism  between  two  [22XFG[122X-modules as a list of
  generators  for the image of the homomorphism. Each generator is given as an
  element  in the target module, represented as a vector in the same manner as
  used  in  the  [9XFpGModuleGF[109X  datatype  (see  Chapter  [14X3[114X). Given a set of such
  generating  vectors,  an  [22XF[122X-generating set for the image of the homomorphism
  (as  elements  of  the  target module's vector space) is given by taking all
  [22XG[122X-multiples of the generators. Writing the vectors in this expanded set as a
  matrix,  the kernel of the boundary homomorphism is the (left) null-space of
  this  matrix.  As  with  [9XFpGModuleGF[109Xs, the block structure of the generating
  vectors  (see Section [14X3.2-1[114X) allows this null-space to be calculated without
  necessarily expanding the whole matrix.[133X
  
  [33X[0;0YThis   basic   algorithm   is   implemented   in   the   [5XHAPprime[105X   function
  [2XKernelOfModuleHomomorphismSplit[102X ([14X4.6-3[114X). The generating vectors for a module
  homomorphism  [22XH[122X  are divided in half, with the homomorphism generated by the
  first  half  of the generating vectors being called [22XU[122X and that by the second
  half being called [22XV[122X. Given this partition the kernel of [22XH[122X can be defined as[133X
  
  
  [24X[33X[0;6Yker(H) = intersection of preim_U(I) with [-preim_V(I)][133X
  
  [124X
  
  [33X[0;0Ywhere[133X
  
  [30X    [33X[0;6Y[22XI  =  im(U)  ∩  im(V)[122X  is  the  intersection  of the images of the two
        homomorphisms [22XU[122X and [22XV[122X[133X
  
  [30X    [33X[0;6Y[22Xpreim_U(I)[122X the set of all preimages of [22XI[122X under [22XU[122X[133X
  
  [30X    [33X[0;6Y[22Xpreim_V(I)[122X the set of all preimages of [22XI[122X under [22XV[122X[133X
  
  [33X[0;0YRather   than   computing   the  complete  set  of  preimages,  instead  the
  implementation  takes  a preimage representative of each generator for [22XI[122X and
  adds  the  kernel  of  the  homomorphisms [22XU[122X and [22XV[122X. The means that instead of
  calculating  the  null-space of the full expanded matrix, we can compute the
  answer   by   calculating  the  kernels  of  two  homomorphisms  with  fewer
  generators,  as  well  as the intersection of two modules, and some preimage
  representatives.  Each  of these operations takes less memory than the naive
  null-space  calculation. The intersection of two [22XFG[122X-modules can be compactly
  calculated  using the generators' block structure (see Section [14X3.2-4[114X), while
  the  kernels  of  [22XU[122X  and  [22XV[122X  can  be  computed  recursively using these same
  algorithm.  The  block  structure can also help in calculating the preimage,
  but  at  a  considerable cost in time, so this is not done. However, since [22XU[122X
  and [22XV[122X have fewer generators than the original homomorphism [22XH[122X, a space saving
  is still made.[133X
  
  [33X[0;0YIn  the case where the problem is seperable, i.e. a [22XU[122X and [22XV[122X can be found for
  which  there  is no intersection, this approach can give a large saving. The
  separable  components of the homomorphism can be readily identified from the
  block  structure  of the generators (they are the rows which share no blocks
  or  heads  with  other  rows),  and  the  kernels of these can be calculated
  independently,  with  no intersection to worry about. This is implemented in
  the    alternative    algorithm   [2XKernelOfModuleHomomorphismIndependentSplit[102X
  ([14X4.6-3[114X).[133X
  
  
  [1X4.3 [33X[0;0YCalculating the kernel of a [22XFG[122X[101X[1X-module homorphism by column reduction and[101X
  [1Xpartitioning[133X[101X
  
  [33X[0;0YThe  list  of  generators  of  the  image of a [22XFG[122X-module homomorphism can be
  interpreted  as  the  rows  of a matrix [22XA[122X with elements in [22XFG[122X, and it is the
  kernel  of  this  matrix which must be found (i.e. the solutions to [22XxA=0[122X. If
  column  reduction  is  performed  on  this matrix (by adding [22XFG[122X-multiples of
  other  columns  to a column), the kernel is left unchanged, and this process
  can  be  performed to enable the kernel to be found by a recursive algorithm
  similar to standard back substitution methods.[133X
  
  [33X[0;0YGiven  the  matrix [22XA = (a_ij)[122X, take the [22XFG[122X-module generated by the first row
  [22X(a_1j)[122X  and  find  a minimal (or small) subset of elements [22X{a_1j}_j ∈ J[122X that
  generate  this  module.  Without  altering  the  kernel,  we can permute the
  columns  of  [22XA[122X  such  that  [22XJ = {1 ... t}[122X. Taking [22XF[122X and [22XG[122X-multiples of these
  columns  from  the  remaining columns, the first row of these columns can be
  reduced  to  zero, giving a new matrix [22XA'[122X. This matrix can be partitioned as
  follows:[133X
  
  
  [24X[33X[0;6Y[ B 0 ] [ C D ][133X
  
  [124X
  
  [33X[0;0Ywhere  [22XB[122X  is [22X1× t[122X, [22XC[122X is [22X(m-1)× t[122X and [22XD[122X is [22X(m-1)× (n-t)[122X. It is assumed that [22XB[122X
  and  [22XC[122X  are  `small'  and  operations  on these can can be easily handled in
  memory using standard linear algebra, while [22XD[122X may still be large.[133X
  
  [33X[0;0YTaking  the [22XFG[122X-module generated by the [22Xt[122X columns which form the [22XBC[122X partition
  of  the  matrix, we compute [22XE[122X, a set of minimal generators for the submodule
  of  this  which  is zero in the first row. These are added as columns at the
  end of [22XA'[122X, giving a matrix[133X
  
  
  [24X[33X[0;6Y[ B 0 0 ] [ C D E ][133X
  
  [124X
  
  [33X[0;0YThe kernel of this matrix can be shown to be[133X
  
  
  [24X[33X[0;6Y[ ker(B) 0 ] [ L ker(DE) ][133X
  
  [124X
  
  [33X[0;0Ywhere[133X
  
  
  [24X[33X[0;6YL = preim_B((\ker (DE)) C)[133X
  
  [124X
  
  [33X[0;0YThe  augmentation  of  [22XD[122X with [22XE[122X guarantees that this preimage always exists.
  Since  [22XB[122X  and [22XC[122X are small, both [22Xker B[122X and [22XL[122X are easy to compute using linear
  algebra, while [22Xker (DE)[122X can be computed by recursion.[133X
  
  [33X[0;0YUnfortunately,  [22XE[122X  can be large, and the accumulated increase of size of the
  matrix  over  many  recursions  negates the time and memory saving that this
  algorithm  might be expected to give. Testing indicates that it is currently
  no  faster than the [2XKernelOfModuleHomomorphismSplit[102X ([14X4.6-3[114X) method, and does
  not  save  much  memory  over  the  full  expansion using linear algebra. An
  improved  version of this algorithm would reduce [22XE[122X by [22XD[122X before augmentation,
  thus  adding  a  smaller  set of generators and restricting the explosion in
  size. If [22XD[122X were already in echelon form, this would also be time-efficient.[133X
  
  
  [1X4.4 [33X[0;0YConstruction functions[133X[101X
  
  
  [1X4.4-1 [33X[0;0YFpGModuleHomomorphismGF construction functions[133X[101X
  
  [33X[1;0Y[29X[2XFpGModuleHomomorphismGF[102X( [3XS[103X, [3XT[103X, [3Xgens[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XFpGModuleHomomorphismGFNC[102X( [3XS[103X, [3XT[103X, [3Xgens[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Y[9XFpGModuleHomomorphismGF[109X[133X
  
  [33X[0;0YCreates  and  returns an [9XFpGModuleHomomorphismGF[109X module homomorphism object.
  This  represents  the  homomorphism from the module [3XS[103X to the module [3XT[103X with a
  list  of vectors [3Xgens[103X whose rows are the images in [3XT[103X of the generators of [3XS[103X.
  The modules must (currently) be over the same group.[133X
  
  [33X[0;0YThe standard constructor checks that the homomorphism is compatible with the
  modules,  i.e.  that the vectors in [3Xgens[103X have the correct dimension and that
  they  lie  within the target module [3XT[103X. It also checks whether the generators
  of  [3XS[103X  are minimal. If they are not, then the homomorphism is created with a
  copy  of [3XS[103X that has minimal generators (using [2XMinimalGeneratorsModuleRadical[102X
  ([14X3.5-9[114X)),  and  [3Xgens[103X is also copied and converted to agree with the new form
  of  [3XS[103X.  If  you  wish  to  skip these checks then use the [10XNC[110X version of this
  function.[133X
  
  [33X[0;0YIMPORTANT: The generators of the module [3XS[103X and the generator matrix [3Xgens[103X must
  be  remain  consistent  for  the  lifetime  of  this  homomorphism.  If  the
  homomorphism  is  constructed  with  a  mutable  source  module or generator
  matrix,  then  you must be careful not to modify them while the homomorphism
  is needed.[133X
  
  
  [1X4.4-2 [33X[0;0YExample: Constructing a [9XFpGModuleHomomorphismGF[109X[101X[1X[133X[101X
  
  [33X[0;0YIn  this  example we construct the module homomorphism [22Xϕ: (FG)^2 -> FG[122X which
  maps both generators of [22X(FG)^2[122X to the generator of [22XFG[122X[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XG := SmallGroup(8, 4);;[127X[104X
    [4X[25Xgap>[125X [27Xim := [1,0,0,0,0,0,0,0]*One(GF(2));[127X[104X
    [4X[28X[ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ][128X[104X
    [4X[25Xgap>[125X [27Xphi := FpGModuleHomomorphismGF([127X[104X
    [4X[25X>[125X [27X             FpGModuleGF(G, 2),[127X[104X
    [4X[25X>[125X [27X             FpGModuleGF(G, 1),[127X[104X
    [4X[25X>[125X [27X             [im, im]);[127X[104X
    [4X[28X<Module homomorphism>[128X[104X
  [4X[32X[104X
  
  
  [1X4.5 [33X[0;0YData access functions[133X[101X
  
  [1X4.5-1 SourceModule[101X
  
  [33X[1;0Y[29X[2XSourceModule[102X( [3Xphi[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Y[9XFpGModuleGF[109X[133X
  
  [33X[0;0YReturns the source module for the homomorphism [3Xphi[103X, as an [9XFpGModuleGF[109X.[133X
  
  [1X4.5-2 TargetModule[101X
  
  [33X[1;0Y[29X[2XTargetModule[102X( [3Xphi[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10YFpGModuleGF[133X
  
  [33X[0;0YReturns the targetmodule for the homomorphism [3Xphi[103X, as an [9XFpGModuleGF[109X.[133X
  
  [1X4.5-3 ModuleHomomorphismGeneratorMatrix[101X
  
  [33X[1;0Y[29X[2XModuleHomomorphismGeneratorMatrix[102X( [3Xphi[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10YList of vectors[133X
  
  [33X[0;0YReturns   the   generating   vectors  [10Xgens[110X  of  the  representation  of  the
  homomorphism  [3Xphi[103X.  These vectors are the images in the target module of the
  generators of the source module.[133X
  
  [1X4.5-4 DisplayBlocks[101X
  
  [33X[1;0Y[29X[2XDisplayBlocks[102X( [3Xphi[103X ) [32X method[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YPrints a detailed description of the module in human-readable form, with the
  module generators and generator matrix shown in block form. The standard [5XGAP[105X
  methods  [2XView[102X  ([14XReference:  View[114X),  [2XPrint[102X  ([14XReference:  Print[114X)  and  [2XDisplay[102X
  ([14XReference: Display[114X) are also available.)[133X
  
  [1X4.5-5 DisplayModuleHomomorphismGeneratorMatrix[101X
  
  [33X[1;0Y[29X[2XDisplayModuleHomomorphismGeneratorMatrix[102X( [3Xphi[103X ) [32X method[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YPrints  a detailed description of the module homomorphism generating vectors
  [10Xgens[110X  in human-readable form. This is the display method used in the [2XDisplay[102X
  ([14XReference: Display[114X) method for this datatype.[133X
  
  [1X4.5-6 DisplayModuleHomomorphismGeneratorMatrixBlocks[101X
  
  [33X[1;0Y[29X[2XDisplayModuleHomomorphismGeneratorMatrixBlocks[102X( [3Xphi[103X ) [32X method[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YPrints  a detailed description of the module homomorphism generating vectors
  [10Xgens[110X  in human-readable form. This is the function used in the [2XDisplayBlocks[102X
  ([14X4.5-4[114X) method.[133X
  
  
  [1X4.5-7 [33X[0;0YExample: Accessing data about a [9XFpGModuleHomomorphismGF[109X[101X[1X[133X[101X
  
  [33X[0;0YA free [22XFG[122X resolution is a chain complex of [22XFG[122X-modules and homomorphisms, and
  the  homomorphisms  in a [9XHAPResolution[109X (see Chapter [14X2[114X) can be extracted as a
  [9XFpGModuleHomomorphismGF[109X  using  the function [2XBoundaryFpGModuleHomomorphismGF[102X
  ([14X2.4-6[114X).  We  construct a resolution [10XR[110X and then examine the third resolution
  in  the  chain  complex,  which  is a [22XFG[122X-module homomorphism [22Xd_3 : (FG)^7 ->
  (FG)^5[122X.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XR := ResolutionPrimePowerGroupRadical(SmallGroup(64, 141), 3);;[127X[104X
    [4X[28X#I  Dimension 2: rank 5[128X[104X
    [4X[28X#I  Dimension 3: rank 7[128X[104X
    [4X[25Xgap>[125X [27Xd3 := BoundaryFpGModuleHomomorphismGF(R, 3);;[127X[104X
    [4X[25Xgap>[125X [27XSourceModule(d3);[127X[104X
    [4X[28XFull canonical module FG^7 over the group ring of <pc group of size 64 with[128X[104X
    [4X[28X6 generators> in characteristic 2[128X[104X
    [4X[28X[128X[104X
    [4X[25Xgap>[125X [27XTargetModule(d3);[127X[104X
    [4X[28XFull canonical module FG^5 over the group ring of <pc group of size 64 with[128X[104X
    [4X[28X6 generators> in characteristic 2[128X[104X
    [4X[28X[128X[104X
    [4X[25Xgap>[125X [27XModuleHomomorphismGeneratorMatrix(d3);[127X[104X
    [4X[28X<an immutable 7x320 matrix over GF2>[128X[104X
    [4X[25Xgap>[125X [27XDisplayBlocks(d3);[127X[104X
    [4X[28XModule homomorphism with source:[128X[104X
    [4X[28XFull canonical module FG^7 over the group ring of Group([128X[104X
    [4X[28X[ f1, f2, f3, f4, f5, f6 ] )[128X[104X
    [4X[28X in characteristic 2[128X[104X
    [4X[28X[128X[104X
    [4X[28Xand target:[128X[104X
    [4X[28XFull canonical module FG^5 over the group ring of Group([128X[104X
    [4X[28X[ f1, f2, f3, f4, f5, f6 ] )[128X[104X
    [4X[28X in characteristic 2[128X[104X
    [4X[28X[128X[104X
    [4X[28Xand generator matrix:[128X[104X
    [4X[28X[*.*.*][128X[104X
    [4X[28X[*****][128X[104X
    [4X[28X[.**..][128X[104X
    [4X[28X[.**..][128X[104X
    [4X[28X[..**.][128X[104X
    [4X[28X[...**][128X[104X
    [4X[28X[...*.][128X[104X
    [4X[28X[128X[104X
  [4X[32X[104X
  
  [33X[0;0YNote  that  the  module  homomorphism  generating  vectors  in  a resolution
  calculated  using [5XHAPprime[105X are in block-echelon form (see Section [14X3.2[114X). This
  makes  it  efficient  to  compute  the  kernel  of  this  homomorphism using
  [2XKernelOfModuleHomomorphismSplit[102X  ([14X4.6-3[114X), as described in Section [14X4.2[114X, since
  there  is  only a small intersection between the images generated by the top
  and bottom halves of the generating vectors.[133X
  
  
  [1X4.6 [33X[0;0YImage and kernel functions[133X[101X
  
  
  [1X4.6-1 [33X[0;0YImageOfModuleHomomorphism[133X[101X
  
  [33X[1;0Y[29X[2XImageOfModuleHomomorphism[102X( [3Xphi[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XImageOfModuleHomomorphism[102X( [3Xphi[103X, [3XM[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XImageOfModuleHomomorphism[102X( [3Xphi[103X, [3Xelm[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XImageOfModuleHomomorphism[102X( [3Xphi[103X, [3Xcoll[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XImageOfModuleHomomorphismDestructive[102X( [3Xphi[103X, [3Xelm[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XImageOfModuleHomomorphismDestructive[102X( [3Xphi[103X, [3Xcoll[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Y[9XFpGModuleGF[109X, vector or list of vectors depending on argument[133X
  
  [33X[0;0YFor  a module homomorphism [3Xphi[103X, the one-argument function returns the module
  that  is  the  image  of  the  homomorphism, while the two-argument versions
  return  the  result  of  mapping  of  an [10XFpGModuleGF[110X [3XM[103X, a module element [3Xelm[103X
  (given  as  a  vector),  or a collection of module elements [3Xcoll[103X through the
  homomorphism.  This  uses  standard  linear  algebra  to  find  the image of
  elements from the source module.[133X
  
  [33X[0;0YThe  [10XDestructive[110X versions of the function will corrupt the second parameter,
  which  must  be  mutable  as  a  result.  The version of this operation that
  returns a module does not guarantee that the module will be in minimal form,
  and  one  of the [10XMinimalGeneratorsModule[110X functions ([14X3.5-9[114X) should be used on
  the result if a minimal set of generators is needed.[133X
  
  
  [1X4.6-2 [33X[0;0YPreImageRepresentativeOfModuleHomomorphism[133X[101X
  
  [33X[1;0Y[29X[2XPreImageRepresentativeOfModuleHomomorphism[102X( [3Xphi[103X, [3Xelm[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XPreImageRepresentativeOfModuleHomomorphism[102X( [3Xphi[103X, [3Xcoll[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XPreImageRepresentativeOfModuleHomomorphism[102X( [3Xphi[103X, [3XM[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XPreImageRepresentativeOfModuleHomomorphismGF[102X( [3Xphi[103X, [3Xelm[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XPreImageRepresentativeOfModuleHomomorphismGF[102X( [3Xphi[103X, [3Xcoll[103X ) [32X operation[133X
  
  [33X[0;0YFor an element [3Xelm[103X in the image of [3Xphi[103X, this returns a representative of the
  set  of  preimages of [3Xelm[103X under [3Xphi[103X, otherwise it returns [10Xfail[110X. If a list of
  vectors  [3Xcoll[103X  is  provided  then  the  function  returns a list of preimage
  representatives,  one  for  each  element in the list (the returned list can
  contain  [10Xfail[110X  entries  if  there  are  vectors  with  no  solution). For an
  [9XFpGModuleGF[109X  module  [3XM[103X, this returns a module whose image under [3Xphi[103X is [3XM[103X (or
  [10Xfail[110X). The module returned will not necessarily have minimal generators, and
  one  of  the [10XMinimalGeneratorsModule[110X functions ([14X3.5-9[114X) should be used on the
  result if a minimal set of generators is needed.[133X
  
  [33X[0;0YThe  standard  functions  use linear algebra, expanding the generator matrix
  into  a  full  matrix  and  using  [2XSolutionMat[102X  ([14XReference:  SolutionMat[114X) to
  calculate  a  preimage  of  [3Xelm[103X.  In  the  case  where  a list of vectors is
  provided,  the  matrix  decomposition is only performed once, which can save
  significant time.[133X
  
  [33X[0;0YThe  [10XGF[110X  versions  of  the functions can give a large memory saving when the
  generators of the homomorphism [3Xphi[103X are in echelon form, and operate by doing
  back-substitution using the generator form of the matrices.[133X
  
  [1X4.6-3 KernelOfModuleHomomorphism[101X
  
  [33X[1;0Y[29X[2XKernelOfModuleHomomorphism[102X( [3Xphi[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XKernelOfModuleHomomorphismSplit[102X( [3Xphi[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XKernelOfModuleHomomorphismIndependentSplit[102X( [3Xphi[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XKernelOfModuleHomomorphismGF[102X( [3Xphi[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Y[9XFpGModuleGF[109X[133X
  
  [33X[0;0YReturns the kernel of the module homomorphism [3Xphi[103X, as an [9XFpGModuleGF[109X module.
  There   are   three  independent  algorithms  for  calculating  the  kernel,
  represented by different versions of this function:[133X
  
  [30X    [33X[0;6YThe standard version calculates the kernel by the obvious vector-space
        method.  The  homomorphism's  generators  are  expanded  into  a  full
        vector-space basis and the kernel of that vector space homomorphism is
        found.  The  generators  of  the  returned module are in fact a vector
        space basis for the kernel module.[133X
  
  [30X    [33X[0;6YThe  [10XSplit[110X  version divides the homomorphism into two (using the first
        half  and  the  second  half  of the generating vectors), and uses the
        preimage  of  the  intersection  of  the  images  of the two halves to
        calculate  the kernel (see Section [14X4.2[114X). If the generating vectors for
        [3Xphi[103X  are  in  block echelon form (see Section [14X3.2[114X), then this approach
        provides a considerable memory saving over the standard approach.[133X
  
  [30X    [33X[0;6YThe  [10XIndependentSplit[110X  version splits the generating vectors into sets
        that generate vector spaces which have no intersection, and calculates
        the kernel as the sum of the kernels of those independent rows. If the
        generating  vectors  can  be  decomposed  in this manner (i.e. the the
        generator  matrix  is  in  a  diagonal form), this will provide a very
        large memory saving over the standard approach.[133X
  
  [30X    [33X[0;6YThe  [10XGF[110X  version  performs  column  reduction  and partitioning of the
        generator  matrix  to  enable  a  recursive  approach to computing the
        kernel (see Section [14X4.3[114X). The level of partitioning is governed by the
        option  [10XMaxFGExpansionSize[110X,  which  defaults  to  [22X10^9[122X, allowing about
        128Mb  of  memory  to  be  used  for  standard  linear  algebra before
        partitioning  starts.  See  [14X'Reference:  Options Stack'[114X for details of
        using options in [5XGAP[105X[133X
  
  [33X[0;0YNone  of these basis versions of the functions guarantee to return a minimal
  set  of generators, and one of the [10XMinimalGeneratorsModule[110X functions ([14X3.5-9[114X)
  should  be  used on the result if a minimal set of generators is needed. All
  of the functions leave the input homomorphism [3Xphi[103X unchanged.[133X
  
  
  [1X4.6-4 [33X[0;0YExample: Kernel and Image of a [9XFpGModuleHomomorphismGF[109X[101X[1X[133X[101X
  
  [33X[0;0YA   free   [22XFG[122X-resolution  of  a  module  is  an  exact  sequence  of  module
  homomorphisms.     In     this     example     we    use    the    functions
  [2XImageOfModuleHomomorphism[102X  ([14X4.6-1[114X) and [2XKernelOfModuleHomomorphism[102X ([14X4.6-3[114X) to
  check  that  one of the sequences in a resolution is exact, i.e. that in the
  sequence[133X
  
  
  [24X[33X[0;6YM_3 -> M_2 -> M_1[133X
  
  [124X
  
  [33X[0;0Ythe  image  of  the  first homomorphism [22Xd_3: M_3 -> M_2[122X is the kernel of the
  second homomorphism [22Xd_2: M_2 -> M_1[122X[133X
  
  [33X[0;0YWe  also  demonstrate  that  we  can  find  the image and preimage of module
  elements  under  our  module  homomorphisms. We take an element [10Xe[110X of [22XM_2[122X, in
  this  case  by taking the first generating element of the kernel of [22Xd_2[122X, and
  map it up to [22XM_3[122X and back.[133X
  
  [33X[0;0YFinally,  we compute the kernel using the other available methods, and check
  that the results are the same.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XR := ResolutionPrimePowerGroupRadical(SmallGroup(8, 3), 3);;[127X[104X
    [4X[25Xgap>[125X [27Xd2 := BoundaryFpGModuleHomomorphismGF(R, 2);;[127X[104X
    [4X[25Xgap>[125X [27Xd3 := BoundaryFpGModuleHomomorphismGF(R, 3);;[127X[104X
    [4X[25Xgap>[125X [27X#[127X[104X
    [4X[25Xgap>[125X [27XI := ImageOfModuleHomomorphism(d3);[127X[104X
    [4X[28XModule over the group ring of <pc group of size 8 with[128X[104X
    [4X[28X3 generators> in characteristic 2 with 4 generators in FG^3.[128X[104X
    [4X[28X[128X[104X
    [4X[25Xgap>[125X [27XK := KernelOfModuleHomomorphism(d2);[127X[104X
    [4X[28XModule over the group ring of <pc group of size 8 with[128X[104X
    [4X[28X3 generators> in characteristic 2 with 15 generators in FG^3.[128X[104X
    [4X[28X[128X[104X
    [4X[25Xgap>[125X [27XI = K;[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27X#[127X[104X
    [4X[25Xgap>[125X [27Xe := ModuleGenerators(K)[1];;[127X[104X
    [4X[25Xgap>[125X [27XPreImageRepresentativeOfModuleHomomorphism(d3, e);[127X[104X
    [4X[28X<a GF2 vector of length 32>[128X[104X
    [4X[25Xgap>[125X [27Xf := PreImageRepresentativeOfModuleHomomorphism(d3, e);[127X[104X
    [4X[28X<a GF2 vector of length 32>[128X[104X
    [4X[25Xgap>[125X [27XImageOfModuleHomomorphism(d3, f);[127X[104X
    [4X[28X<a GF2 vector of length 24>[128X[104X
    [4X[25Xgap>[125X [27Xlast = e;[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27X#[127X[104X
    [4X[25Xgap>[125X [27XL := KernelOfModuleHomomorphismSplit(d2);[127X[104X
    [4X[28XModule over the group ring of <pc group of size 8 with[128X[104X
    [4X[28X3 generators> in characteristic 2 with 5 generators in FG^3.[128X[104X
    [4X[28X[128X[104X
    [4X[25Xgap>[125X [27XK = L;[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27XM := KernelOfModuleHomomorphismGF(d2);[127X[104X
    [4X[28XModule over the group ring of <pc group of size 8 with[128X[104X
    [4X[28X3 generators> in characteristic 2 with 4 generators in FG^[128X[104X
    [4X[28X3. Generators are minimal.[128X[104X
    [4X[28X[128X[104X
    [4X[25Xgap>[125X [27XK = M;[127X[104X
    [4X[28Xtrue[128X[104X
  [4X[32X[104X
  
