Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/repsn/gap/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 22.0.2024 mit Größe 53 kB image not shown  

Quelle  repsn.g   Sprache: unbekannt

 
############################################################################################
############################################################################################
############################################################################################
##                                                                                         #
##                                         REPSN                                           #
##                                                                                         #
##                                     A GAP4 Package                                      #
##                      for Constructing Representations of Finite Groups                  #
##                                                                                         #
##                Developed by: Vahid Dabbaghian                                           #
##                              Department of Mathematics,                                 #
##                              Simon Fraser University,                                   #
##                              Burnaby, BC, Canada.                                       #
##                              E-mail: vdabbagh@sfu.ca                                    #
##                              Home Page: www.sfu.ca/~vdabbagh                            #
##                                                                                         #
############################################################################################



############################################################################################
############################################################################################
################################### A Main Function ########################################
## This program returns a representation of a group $G$ affording $\chi$.
## In this program the following programs and subroutines are called.
## 1. CharacterSubgroupRepresentation
## 2. PerfectRepresentation
## 3. ReducedSubgroupCharacter
## 4. InducedSubgroupRepresentation
## 5. ExtendedRepresentationNormal
## 6. IrreducibleAffordingRepresentation
############################################################################################

 InstallGlobalFunction( IrreducibleAffordingRepresentation,
 function( chi )
 local n, k, g, c, rep, G;
 G := UnderlyingGroup( chi );
 if chi[1] = 1 then
    return CharacterSubgroupRepresentation( chi );
 fi;
 if Size(Kernel(chi)) > 1 then
    k := NaturalHomomorphismByNormalSubgroupNC( G, Kernel( chi ) );
    g := Image(k);
    c := Filtered(Irr(Image(k)), x-> chi=RestrictedClassFunction( x, k ) );
 else
    g := G;
    c := [chi];
 fi;
 if IsPerfect( g ) then
    rep := PerfectRepresentation( g, c[1], SpecialCoversData );
 else
    n := ReducedSubgroupCharacter( c[1] );
    if n[2][1] < c[1][1] then
      rep := InducedSubgroupRepresentation( g, IrreducibleAffordingRepresentation( n[2] ) );
    fi;
    if n[2][1] = c[1][1] then
      if IsPerfect(n[1]) and PerfectRepresentation( n[1], n[2], 1 ) = true then
        return CharacterSubgroupRepresentation( chi );
      fi;
      rep := ExtendedRepresentationNormal( c[1], IrreducibleAffordingRepresentation( n[2] ) );
    fi;
 fi;
 if IsBound( k ) then
   return CompositionMapping( rep, k );
 else
   return rep;
 fi;
 end );


############################################################################################
############################################################################################
####################################### A main Function ####################################
## This is a test function. If $R$ is a representation of $G$ and $\chi$ is an irreducible
## character of $G$ then this program returns "true" if the trace of $R(x)$ is equal to
## $\chi(x)$ for all representatives $x$ of the conjugacy classes of $G$. The inputs of this
## program are a representation rep and a character chi of a group.
############################################################################################

 InstallGlobalFunction( IsAffordingRepresentation,
 function( chi, rep )
 local tbl, ccl, i;
     tbl:= UnderlyingCharacterTable( chi );
     ccl:= ConjugacyClasses( tbl );
     for i in [ 1 .. Length( ccl ) ] do
       if Trace( Representative( ccl[i] )^rep ) <> chi[i] then
         return false;
       fi;
     od;
     return true;
 end );


############################################################################################
############################################################################################
####################################### A main Function ####################################
## This program finds all $p$-subgroups of a group $G$ which are $\chi$-subgroups.
## In this program the following programs and subroutines are called,
## 1. LinearConstituentWithMultiplicityOne
## 2. PSubgroups
############################################################################################

 InstallGlobalFunction( AllCharacterPSubgroups,
 function( G, chi )
 local i, lin, P, psub, L;
 psub := [ ];
 L := PSubgroups( G );
 for P in L do
    lin := LinearConstituentWithMultiplicityOne( chi, P );
    if lin <> fail then
       Add( psub, P );
    fi;
 od;
 return psub;
 end );


############################################################################################
############################################################################################
####################################### A main Function ####################################
## This program finds standard subgroups (Sylow subgroups and their normalizers, centralizers
## and derived subgroups) of a group $G$ which are $\chi$-subgroups.
## In this program the following programs and subroutines are called,
## 1. LinearConstituentWithMultiplicityOne
## 2. StandardSubgroups
############################################################################################

 InstallGlobalFunction( AllCharacterStandardSubgroups,
 function( G, chi )
 local i, lin, P, psub, L;
 psub := [ ];
 L := StandardSubgroups( G );
 for P in L do
    lin := LinearConstituentWithMultiplicityOne( chi, P );
    if lin <> fail then
       Add( psub, P );
    fi;
 od;
 return psub;
 end );


############################################################################################
############################################################################################
####################################### A main Function ####################################
## This program finds all $\chi$-subgroups of $G$ among the lattice of subgroups.
## In this program the following programs and subroutines are called,
## 1. LinearConstituentWithMultiplicityOne
############################################################################################

 InstallGlobalFunction( AllCharacterSubgroups,
 function( G, chi )
 local H, i, lin, l, S;
 S := [ ];
 l := List( ConjugacyClassesSubgroups( G ), Representative );
 for H in l do
   lin := LinearConstituentWithMultiplicityOne( chi, H );
   if lin <> fail then
      Add( S, H );
   fi;
 od;
 return S;
 end );


############################################################################################
############################################################################################
##################################### A Main Function ######################################
## This is a test function. If $H$ is a $\chi$-subgroup then it returns "true", otherwise
## it returns "false".
## In this program the following programs and subroutines are called,
## 1. LinearConstituentWithMultiplicityOne
############################################################################################

 InstallGlobalFunction( IsCharacterSubgroup,
 function( chi, H )
 local l;
 l := LinearConstituentWithMultiplicityOne( chi, H );
 if  l = fail then
    return false;
 else
    return true;
 fi;
 end );


############################################################################################
############################################################################################
#################################### A Main Function #######################################
## This program computes an equivalent representation to the representation rep by
## transforming rep to a new basis. If $x, y,...$ are the generators of the image
## of rep, this program finds this new basis among the elements
## $x, y, xy, x^2, y^2, x^2y,...$.
############################################################################################

 InstallGlobalFunction( EquivalentRepresentation,
 function( rep )
 local l, l1, L, LL, V, f, G, GG, U, N, u, s, i, d, row, g, S, B, Mb;
 d := 0;
 L := [ ];
 LL := [ ];
 l := [ ];
 GG := [ ];
 U := GeneratorsOfGroup( Image( rep ) );
 g := PreImagesRange( rep );
 S := GeneratorsOfGroup( g );
 f := FieldOfMatrixGroup( Image(rep) );
 V := FullRowSpace( f, DimensionsMat( U[1] )[1] );
 G := [ Identity (Image( rep ) ) ];
 Append( G, List( [ 1..Length( U ) ] ,i -> U[ i ] ) );
 while d = 0 do
   for u in U do
     for s in G do
       Add( GG , s*u );
       GG := Set( GG );
     od;
   od;
   G := GG;
   Mb := MutableBasis( f, List( [ 1..Length(GG) ], i -> GG[i][1] ));
   LL := BasisVectors( Mb );
   l1 := TransposedMat( LL );
   N := LinearIndependentColumns( l1 );
   if Length(N) = Dimension( V ) then
   for i in N do
     Add( l, LL [i] );
   od;
   B := Basis( V, l );
   for u in U do
     row := List( [ 1..Dimension(V) ] , i -> Coefficients (  B, l[i]*u ) );
     Add( L, row );
   od;
     return GroupHomomorphismByImagesNC( g, Group( L ), S, L );
   fi;
 od;
 end );


############################################################################################
############################################################################################
################################### A Main Function ########################################
## This is a program for constructing representation of finite groups according
## to Dixon's method. The input of this program are a group $G$ and an irreducible
## character $\chi$ of $G$, or $G$, $\chi$ and a $\chi$-subgroup.
## In this program the following programs and subroutines are called.
## 1. CharacterSubgroup
## 2. CharacterSubgroupLinearConstituent
## 3. InducedSubgroupRepresentation
## 4. RepresentationMatrixGenerators
## 5. CharacterSubgroupRepresentation
############################################################################################

InstallGlobalFunction( CharacterSubgroupRepresentation,
 function( arg )
    local  G, U, r, chi, s, S, H, f, M, m1, Y, rep;
    chi := arg[1];
    G := UnderlyingGroup( chi );
    U := GeneratorsOfGroup( G );
    if chi[1] = 1 then
        if Length( U ) = 0 then
           if IsPermGroup(G) then
              return GroupHomomorphismByImagesNC( Group(()), Group([[1]]), [()], [[[1]]] );
           else
              return GroupHomomorphismByImagesNC( G, G, U, U );
           fi;
        fi;
        r := List( [ 1..Length( U ) ],i -> [ [ U[ i ] ^ arg[ 1 ] ] ] );
        return GroupHomomorphismByImagesNC( G, Group( r ), U, r );
    fi;
    if Length( arg ) = 1  then
       if IsClassFunction( chi ) and IsCharacter( chi ) then
          s := CharacterSubgroup( G, chi );
          H := s[1];
          f := s[2];
       else
          Error("first argument must be an ordinary character");
       fi;
    fi;
    if Length( arg ) = 2  then
        if IsSubgroup ( G, arg[2] ) and IsClassFunction( chi ) and IsCharacter( chi ) then
        H := arg[2];
        s := CharacterSubgroupLinearConstituent( chi, [ H ] );
        if s = fail then
           Error( "the given group is not a chi-subgroup");
        fi;
        H := s[1];
        f := s[2];
        else
           Error("first argument is not a character or second argument is not a subgroup of the given group");
    fi; fi;
    if Index( G, H ) = chi[1] then
    rep := CharacterSubgroupRepresentation( f );
    return InducedSubgroupRepresentation ( G, rep );
    fi;
    M := MatrixRepsn( chi, G, H, f);
    m1 := M[1];
    Y := M[2];
    r := RepresentationMatrixGenerators( U, Y, m1, f, chi, H );
    return GroupHomomorphismByImagesNC( G, Group( r ), U, r );
 end );


############################################################################################
############################################################################################
#################################### A Main Function #######################################
## If rep is a representation of a subgroup $H$ of a group $G$, this programs
## returns an induced representation of rep of group $G$.
############################################################################################

InstallGlobalFunction( InducedSubgroupRepresentation,
 function( G, rep )
 local M, M1, mat, u, U, rt, i, j, k, LL, L, m, Ls, Lr, l, d, h, r, t, nmat, lrt;
 mat := [ ];
 L := [ ];
 h := PreImagesRange( rep );
 if Size(h) = 1 then
   d := 1;
 else
   d := DimensionsMat( GeneratorsOfGroup( Image(rep) )[1] )[1];
 fi;
 U := GeneratorsOfGroup( G );
 rt := RightTransversal( G, h );
 lrt := Length( rt );
 nmat := NullMat(d,d);
 for u in U do
  M := [ ];
  for i in [1..lrt] do
   t := rt[i]*u;
   M1 := [ ];
    for j in [1..lrt] do
      r := t*rt[j]^(-1);
      if r in h then
        Add( M1, r^rep );
      else
        Add( M1, nmat );
      fi;
    od;
   Add( M, M1 );
  od;
  Add( mat, M );
 od;
 for m in mat do
 LL := [ ];
 Lr := [ ];
 Ls := [ ];
  for i in [1..lrt] do
    for j in [1..d] do
      for k in [1..lrt] do
          Add( LL, m[i][k][j] );
      od;
    Add( Ls, Concatenation(LL) );
    LL := [ ];
    od;
    Add( Lr, Ls );
  od;
  Add( L, Lr );
 od;
 l := List( L, i-> i[1] );
 return GroupHomomorphismByImagesNC( G, Group( l ), U, l );
 end );


############################################################################################
############################################################################################
#################################### A Main Function #######################################
## The inputs of this program are an irreducible character $\chi$ of a group $G$ and
## a representation rep of a subgroup $H$ of $G$ affording the irreducible character
## $\chi_H$.
## In this program the following programs and subroutines are called,
## 1. ModuleBasis
############################################################################################

 InstallGlobalFunction( ExtendedRepresentation,
 function( chi, rep )
 local S, C, mat, B, i, j, s, u, U, L, n, M, l, h, G, Mat, dim;
 S := [ ];
 C := [ ];
 mat := [ ];
 L := [ ];
 n := chi[1];
 h := PreImagesRange( rep );
 if Size(h) = 1 then
    B := [ [ [ [ 1 ] ] ], [ Identity( h ) ] ];
 else
    Mat := GeneratorsOfGroup(Image(rep));
    dim := DimensionsMat( Mat[1] )[1];
    Info( InfoWarning, 1, "Need to extend a representation of degree ", dim, ". This may take a while." );
    B := ModuleBasis( h, rep );
 fi;
 G := UnderlyingGroup( chi );
 U := GeneratorsOfGroup( G );
 for u in U do
   for i in [1..n^2] do
     for j in [1..n] do
       Append( L, TransposedMat( B[1][i] )[j] );
     od;
     Add( mat, L );
     L := [ ];
     Add( C, (B[2][i]*u)^chi );
   od;
   s := SolutionMat( TransposedMat(mat), C );
   M:= List( [ 1 .. n ], i -> s{ [ (i-1)*n+1 .. i*n ] } );
   Add( S, M );
   mat := [ ];
   C := [ ];
 od;
 return  GroupHomomorphismByImagesNC( G, Group( S ), U, S );
 end );


############################################################################################
############################################################################################
#################################### A Main Function #######################################
## The inputs of this program are an irreducible character $\chi$ of a group $G$ and
## a representation rep of a normal subgroup $H$ of $G$ affording the irreducible
## character $\chi_H$.
############################################################################################

 InstallGlobalFunction( ExtendedRepresentationNormal,
 function( chi, rep )
 local R, S, C, G, x, M1, M2, M, Mat, i, s, u, U, Uh, h, b, w, o, n, dim;
 C := [ ];
 n := chi[1];
 h := PreImage( rep );
 Uh:= GeneratorsOfGroup( h );
 U := ShallowCopy( Uh );
 Mat := List( [1..Length(U)], i -> U[i]^rep );
 Mat := ShallowCopy( Mat );
 if Size( h ) = 1 then
   dim := 1;
 else
   dim := DimensionsMat( Mat[1] )[1];
   Info( InfoWarning, 1, "Need to extend a representation of degree ", dim, ". This may take a while." );
 fi;
 G := UnderlyingGroup( chi );
 repeat
   repeat
     x:= PseudoRandom( G );
   until not x in h and x^chi <> 0;
   for u in Uh do
     R := u^rep;
     S := ( x^(-1)*u*x )^rep;
     M1 := KroneckerProduct( R, IdentityMat(n) );
     M2 := KroneckerProduct( IdentityMat(n), TransposedMat(S) );
     Append( C, M1 - M2);
   od;
     b := IdentityMat(n);
     b := Concatenation(b);
     Add( C, b );
     w := List( [1..Length(Uh)*n^2] , i->0 );
     Add( w, x^chi );
     s := SolutionMat( TransposedMat(C), w );
     M:= List( [ 1 .. n ], i -> s{ [ (i-1)*n+1 .. i*n ] } );
     Add( Mat, M );
     C := [ ];
     Add( U, x );
 until Size ( Group(U) ) = Size( G );
 return GroupHomomorphismByImagesNC( Group(U), Group( Mat ), U, Mat );
 end );


############################################################################################
############################################################################################
################################### A Main Function ########################################
## This program returns constituents and multiplicities a representation $rep$.
## In this program the following program is called.
## 1. IrreducibleAffordingRepresentation
############################################################################################

   InstallGlobalFunction( ConstituentsOfRepresentation,
 function( rep )
   local D, G, ctb, chi, con, R, C, m, i, r, UG, l;
   D := [ ];
   G := PreImagesRange( rep );
   UG := GeneratorsOfGroup( G );
   ctb := CharacterTable( G );
   con := ConjugacyClasses( ctb );
   chi := ClassFunction( ctb, List( con , i -> TraceMat( Image( rep, Representative( i )))));
   R := RestrictedClassFunction( chi, G );
   C := ConstituentsOfCharacter( R );
   m := MatScalarProducts( C, [ R ] );
   for i in [1..Length( C )] do
      r := IrreducibleAffordingRepresentation( C[i] );
      l := List( UG, i -> i^r );
      Add( D, [ m[1][i], GroupHomomorphismByImagesNC( G, Group( l ), UG, l ) ] );
   od;
   return D;
 end );


############################################################################################
############################################################################################
################################### A Main Function ########################################
## This program computes an equivalent block diagonal representation to a given
## representation, or computes a block diagonal representation of the given list of
## irreducible representations.
## In this program the following program is called.
## 1. DiagonalBlockMatrix
############################################################################################

   InstallGlobalFunction( EquivalentBlockRepresentation,
 function( reps )
   local G, UG, U, i, j, k, matlist, mat, Mat;
   Mat := [ ]; U := [ ];
   if not IsList( reps ) then
      reps := ConstituentsOfRepresentation( reps ) ;
   fi;
   if Length( reps ) = 1 and reps[1][1] = 1 then
      return reps[1][2];
   fi;
   G := PreImagesRange( reps[1][2] );
   UG := GeneratorsOfGroup( G );
   for k in [1..Length( reps )] do
       for j in [1..reps[k][1]] do
            Add( U, GeneratorsOfGroup( Image( reps[k][2] ) ) );
       od;
   od;
   for i in [1..Length( U[1] )] do
      matlist := List( U, j-> j[i] );
      mat := DiagonalBlockMatrix( matlist );
      Add( Mat, mat );
   od;
   return GroupHomomorphismByImagesNC( G, Group( Mat ), UG, Mat );
 end );


############################################################################################
############################################################################################
################################### A Main Function ########################################
## This program returns true if the representation $rep$ is reducible.
############################################################################################

 InstallGlobalFunction( IsReducibleRepresentation,
 function( rep )
   local G, ctb, chi, con;
   G := PreImagesRange( rep );
   ctb := CharacterTable( G );
   con := ConjugacyClasses( ctb );
   chi := ClassFunction( ctb, List( con , i -> TraceMat( Image( rep, Representative( i )))));
   if IsIrreducibleCharacter( chi ) = false then
      return true;
   else
      return true;
   fi;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
##
##

 InstallGlobalFunction( DiagonalBlockMatrix,
 function( matrices )
   local dimension,  partialSum,  totalLength,  result,  m,  i,  range;
   dimension := List( matrices, Length );
   partialSum := List([0..Length( matrices )], x -> Sum( dimension{[1..x]} ));
   range := List( [1..Length( matrices )], x -> [ partialSum[x]+1..partialSum[x+1] ] );
   totalLength := Sum( dimension );
   result := NullMat( totalLength, totalLength, Field(matrices[1][1][1]) );
   for m in [1..Length( matrices )] do
     for i in [1..dimension[m]] do
       result[ range[m][i] ]{range[m]} := matrices[m][i];
     od;
   od;
   return result;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
##
##

 InstallGlobalFunction( AlphaRepsn,
    function( x, f, chi, H )
    local  z, sum, C, l, a, i, t;
    sum := 0; t:=0;
    C := ConjugacyClasses(H);
    l := List(C, Representative);
    for i in [1..Length(l)] do
        a := ( l[i] ^ -1 ) ^ f;
        for z in C[i] do
          t := t +  (z * x ) ^ chi;
        od;
        t := t * a;
        sum := sum + t ;
        t := 0;
    od;
    return sum;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This program finds a linear constituent with multiplicity one of $\chi_H$.
## If such a constituent does not exist, it returns "false".
##

 InstallGlobalFunction( LinearConstituentWithMultiplicityOne,
 function( chi, H )
 local rest;
 rest:= RestrictedClassFunction( chi, H );
 return First( LinearCharacters( H ), lambda -> ScalarProduct( rest, lambda ) = 1 );
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This program finds a $\chi$-subgroup from the list S. If such a subgroup
## does not exist it returns "fail".
##

 InstallGlobalFunction( CharacterSubgroupLinearConstituent,
 function( chi, S )
 local  j, lin;
 for j  in [1..Length(S)]  do
    lin := LinearConstituentWithMultiplicityOne( chi, S[j]);
    if lin <> fail then
       return [ S[j] ,lin ];
    fi;
 od;
 return fail;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This Program constructs the matrix A described in Dixon's paper.
##

 InstallGlobalFunction( MatrixRepsn,
    function( chi, G, H, f )
    local  mat, matn, X, Xinv, j, n, x, d, h, Y;
    h := Size(H);
    mat := [ [ h ] ];
    X := [ Identity( G ) ];
    Xinv:= [ Identity( G ) ];
    d := DegreeOfCharacter( chi );
    while Length( X ) < d  do
        matn := [  ];
        n := Length( X );
        x := PseudoRandom( G );
        for j  in [ 1 .. n ]  do
            Y := x * Xinv[j];
            matn[j] := AlphaRepsn( Y, f, chi, H );
            mat[j][n + 1] := ComplexConjugate( matn[j] );
        od;
        matn[n + 1] := h;
        mat[n + 1] := matn;
        if RankMat( mat ) = Length( mat) then
            X[n + 1] := x;
            Xinv[n + 1] := x^-1;
        fi;
    od;
    return [ mat, X ];
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This program finds a $\chi$-subgroup among the Sylow subgroups of $G$.
##

 InstallGlobalFunction( CharacterSylowSubgroup,
 function( G, chi )
 local   S, x, pair, coll, sizes, lin;
 coll:= Collected( Factors( Size( G ) ) );
 sizes:= List( coll, x -> x[1]^x[2] );
 SortParallel( sizes, coll );
 for pair in coll do
 S:= SylowSubgroup( G, pair[1] );
    lin := LinearConstituentWithMultiplicityOne( chi, S );
    if lin <> fail then
       return S;
    fi;
 od;
 return fail;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This program constructs the matrices of the representation, corresponding
## to set of generators U in the main Lemma of Dixon's paper.
##

 InstallGlobalFunction( RepresentationMatrixGenerators,
    function( U, Y, m1, f, chi, H )
    local  u, i, j, m2, L, X, inv, Yinv, lenY;
    L := [ ];
    lenY := Length( Y );
    Yinv := List( Y, i -> i^-1 );
    inv := Inverse( m1 );
    for u  in U  do
      m2 := [ ];
      for i in [ 1 .. lenY ] do
        m2[i] := [ ];
        for j in [ 1 .. lenY ] do
            X := ( Y[i] * u ) * Yinv[j];
            m2[i][j] := AlphaRepsn( X, f, chi, H );
        od;
     od;
     Add( L, m2 * inv );
    od;
    return L;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This program finds the smallest possible $\chi$-subgroup of $G$. At the first
## it checks among the standard subgroups of $G$ and then the lattice of subgroups of the
## Sylow subgroups. If there is no subgroup as a $\chi$-subgroup then it searches among
## the lattice of subgroups of $G$.
##

 InstallGlobalFunction( CharacterSubgroup,
 function( G, chi )
 local N, s, S, pi, i, L, reps, sp, l;
      reps := [  ];
      N := StandardSubgroups( G );
      s := CharacterSubgroupLinearConstituent( chi, N );
  #   if s <> fail the return s; fi;
      if s = fail then
         pi := Set(FactorsInt( Size(G) ) );
         for i in [1..Length(pi)] do
             S := SylowSubgroup( G, pi[i] );
             sp := List(ConjugacyClassesSubgroups(S),Representative);
             L := sp[1];
             repeat
                 Add( reps, L );
                 L := First( sp, g -> not ForAny( reps, rep -> IsConjugate( G, g, rep ) ) );
                 until L = fail;
             reps := Set( reps );
             l := List( reps, Size );
             SortParallel( l , reps );
             s := CharacterSubgroupLinearConstituent( chi, reps );
        od;
      fi;
      if s = fail  then
             if not ( HasConjugacyClassesSubgroups( G ) or HasTableOfMarks( G ) ) then
                  Info( InfoWarning, 1, "need to compute subgroup lattice of a group of order ", Size( G ) );
             fi;
            S := List( ConjugacyClassesSubgroups( G ), Representative );
            s := CharacterSubgroupLinearConstituent( chi, S );
            if s = fail  then
               Error ( "Dixon's method does not work for the given character ");
            fi;
      fi;
 return s;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## The inputs of this program are a group $G$ and a representation rep of a subgroup
## $H$ of $G$ which is the restriction of a representation of $G$ to $H$.
## Using the Burnside's Theorem, this program finds a basis for the matrix algebra
## of the image of rep.
##

 InstallGlobalFunction( ModuleBasis,
 function( G, rep )
 local V, f, B, u, x, L, l, d, i, N, P;
 l := [ ];
 L := [ ];
 B := [ ];
 d := DimensionsMat( GeneratorsOfGroup( Image(rep) )[1] )[1];
 for i in [1..2*d^2] do
   x := PseudoRandom( G );
   Add( l, x^rep );
 od;
 f := FieldOfMatrixGroup( Image(rep) );
 V := MutableBasis( f, l );
 while NrBasisVectors(V) < d^2 do
   x := PseudoRandom(G);
   u := x^rep;
   if IsContainedInSpan( V, u ) = false then
              CloseMutableBasis( V, u );
              Add( l, u );
   fi;
 od;
 for i in [1..Length(l)] do
   Add( L, Concatenation( l[i] ) );
 od;
 N := LinearIndependentColumns( TransposedMat( L ) );
 for i in N do
   Add( B, l[i] );
 od;
 P := List( [1..d^2], i->PreImagesRepresentative( rep, B[i] ) );
 return [B,P];
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This is a subprogram for the function ``MinimalNormalSubgps".
##

 InstallGlobalFunction( AddToSubgpList,
 function( nt, U )
 local i, N;
 for N in nt do
   if IsSubgroup( U, N ) then
      return nt;
   fi;
 od;
 for i in [1..Length(nt)] do
   if IsSubgroup(nt[i], U) then
      nt[i] := false;
   fi;
 od;
 nt := Filtered( nt, x -> not IsBool(x) );
 Add( nt, U );
 return nt;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This function finds the minimal normal subgroups of a group $G$.
##

 InstallGlobalFunction( MinimalNormalSubgps,
 function( G )
 local cl, nt, c, U;
 cl := ConjugacyClasses( G );
 nt := [];
 for c in cl do
   if IsPrime( Order( Representative(c) ) ) then
      U  := SubgroupNC( G, [Representative(c)] );
      U  := NormalClosure( G, U );
      nt := AddToSubgpList( nt, U );
   fi;
 od;
 return nt;
 end );


############################################################################################
############################################################################################
###################################### A Utility Function ##################################
## If $\chi$ is an irreducible character of $G$, this program reduces the problem of
## constructing a representation of $G$ affording $\chi$ to a perfect subgroup of $G$.
## It finds either a subgroup $H$ and an irreducible character $\phi$ of $H$ such that
## $\chi=\phi^G$ or a subgroup $H$ such that $\chi_H$ is irreducible. The input of this
## program is $\chi$ and the outputs are either $H$ and $\phi$ or $H$ and $\chi_H$.
##

 InstallGlobalFunction( ReducedSubgroupCharacter,
 function( chi )
 local k, i, N, I, R, Ri, Rc, C, Ci, Cc, c, L, n, G;
 G := UnderlyingGroup( chi );
 N := DerivedSeries( G );
 k := 0;
 for i in [2..Length( N )] do
   R := RestrictedClassFunction( chi, N[i] );
   C := ConstituentsOfCharacter(R);
   if Length(C) > 1 then
    I := InertiaSubgroup( G, C[1] );
    Ri := RestrictedClassFunction( chi, I );
    Ci := ConstituentsOfCharacter( Ri );
    for c in Ci do
      Rc := RestrictedClassFunction( c, N[i] );
      Cc := ConstituentsOfCharacter( Rc );
      if C[1] in Cc then
        return [I,c];
      fi;
    od;
   elif IsIrreducibleCharacter( R ) then
      k := i; c := R;
   fi;
 od;
 if k > 0 then
   return [ N[k], c ];
 fi;
 L := ChiefSeriesThrough( G, [N[2]] );
 n := Length(L);
 for i in [2..n] do
   R := RestrictedClassFunction( chi, L[i] );
   C := ConstituentsOfCharacter( R );
   if Length(C) > 1 then
       I := InertiaSubgroup( G, C[1] );
       Ri := RestrictedClassFunction( chi, I );
       Ci := ConstituentsOfCharacter( Ri );
         for c in Ci do
          Rc := RestrictedClassFunction( c, L[i] );
          Cc := ConstituentsOfCharacter( Rc );
          if C[1] in Cc then
            return [I,c];
          fi;
         od;
   fi;
 od;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This program lists all $p$-subgroups of $G$ which are not $G$-conjugate.
##

 InstallGlobalFunction( PSubgroups,
 function( G )
 local P, S, reps, L, rep, g, sp, l;
 reps := [ ];
 S := List( Set(FactorsInt( Size(G) ) ), i->SylowSubgroup( G, i ) );
 for P in S do
   sp := List(ConjugacyClassesSubgroups(P),Representative);
   L := sp[1];
   repeat
   Add( reps, L );
   L := First( sp, g -> not ForAny( reps, rep -> IsConjugate( G, g, rep ) ) );
   until L = fail;
 od;
 reps := Set( reps );
 l := List( reps, Size );
 SortParallel( l , reps );
 return reps;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## For all Sylow $p$-subgroups $P$ of $G$ of order $p^a$, this program lists $P$, the
## normalizer of $P$ in $G$ if $a <= 2$, and the derived subgroup $P'$ of $P$ and the
## centralizer of $P'$ in $G$ if $a > 2$.
##

 InstallGlobalFunction( StandardSubgroups,
 function( G )
 local reps, S, P, D, l, i, col;
 col := Collected( FactorsInt( Size ( G ) ) );
 S := List(col, i-> SylowSubgroup( G, i[1] ) );
 reps := S;
 for i in [1..Length(col)] do
   if col[i][2] <= 2 then
     Add( reps, Normalizer( G, S[i] ) );
   elif not IsAbelian( S[i] ) then
     D := DerivedSubgroup( S[i] );
     Add( reps, D );
     Add( reps, Centralizer( G, D ) );
   fi;
 od;
 reps := Set( reps );
 l := List( reps, Size );
 SortParallel( l , reps );
 return reps;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This program is for constructing representations of groups $6.A_6$, $2.A_7$,
## $3.A_7$, $6.A_7$ and $2.A_8$, affording some special characters. These are the
## characters, say $\chi$, such that there exists a $\chi$-subgroup which is
## not a $p$-subgroup.
##

 InstallGlobalFunction( CoversOfAlternatingGroupsRepresentation,
 function( G, chi, size, hom )
 # See section 4.4 of thesis.
 local L, g, c, C, H;
 L := [ ];
 g := Image( hom );
 C := List( ConjugacyClassesSubgroups( g ), Representative );
 for c in C do
     if Size(c) = size then
       Add( L, PreImage( hom, c ) );
     fi;
 od;
 H := CharacterSubgroupLinearConstituent( chi, L )[1];
 return CharacterSubgroupRepresentation( chi, H );
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This program is for constructing representations of covering groups, say $G$, of
## group $U_4(3)$, affording an irreducible character $\chi$ of degree less than 32.
## This program finds a maximal subgroup $M$ of $G$ such that $\chi_M$ is irreducible.
##

 InstallGlobalFunction( CoversOfU43Representation,
 function( chi, hom )
 local g, k, d, c, n, r, max, R;
 g := Image( hom );
    if chi[1] in [6,15] then
      k := SylowSubgroup( g, 3 );
      d := DerivedSubgroup( k );
      c := Centralizer( k, d );
      n := Normalizer( g, c );
    fi;
    if chi[1] = 21 then
      r := IsomorphicSubgroups( g, PSL(3,4) );
      n := Image( r[1] );
    fi;
 max := PreImage( hom, n );
 R := RestrictedClassFunction( chi, max );
 return ExtendedRepresentation( chi, IrreducibleAffordingRepresentation( R ) );
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This program is for constructing representations of covering group $G:=3.O_7(3)$
## of group $O_7(3)$ affording an irreducible character $\chi$ of degree less than 32.
## This program finds a maximal subgroup $M$ of $G$ such that $\chi_M$ is irreducible.
##

 InstallGlobalFunction( CoversOfO73Representation,
 function( chi, hom )
 local g, P, n, C, f, l, F, t, M, max, R;
 g := Image( hom );
 P := SylowSubgroup( g, 3 );
 n := Normalizer( g, P );
 C := List( ConjugacyClasses( n ), Representative );
 f := Filtered( C, i-> i in P );
 l := List( f, i-> NormalClosure( n, Group( i ) ) );
 F := Filtered( l, i-> Size( i ) = 243 );
 for t in F do
   M := Normalizer( g, t );
   if Index( g, M ) = 364 then
     max := PreImage( hom, M );
     R := RestrictedClassFunction( chi, max );
     return ExtendedRepresentation( chi, IrreducibleAffordingRepresentation( R ) );
   fi;
 od;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This program is for constructing representations of covering group $G:=3.U_6(2)$
## of group $U_6(2)$ affording an irreducible character $\chi$ of degree less than 32.
## This program finds a maximal subgroup $M$ of $G$ such that $\chi_M$ is irreducible.
##

 InstallGlobalFunction( CoversOfU62Representation,
 function( chi, hom )
 local g, k, u, c, n, m, R;
 g := Image( hom );
 k := SylowSubgroup( g, 2 );
 u := UpperCentralSeries( k );
 c := Centralizer( k, u[3] );
 n := Normalizer( g, c );
 m := PreImage( hom, n );
 R := RestrictedClassFunction( chi, m );
 return ExtendedRepresentation( chi, IrreducibleAffordingRepresentation( R ) );
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## For computing projective representations based on Minkwitz's method
##

 InstallGlobalFunction( ProjectiveReps,
 function( chi, rep, g )
 local d, N, mat, y, G, e, T, ZG;
 G := UnderlyingGroup( chi );
 ZG := Center(G);
 N := PreImages( rep );
 d := DimensionsMat( GeneratorsOfGroup( Image(rep) )[1] )[1];
 e := chi[1]/d;
 T := List(RightTransversal(N,ZG),i->CanonicalRightCosetElement(ZG,i));
 mat := (d/(e*Size(T))) * Sum(List(T, y-> (g*(y^(-1)))^chi * ImagesRepresentative( rep,y ) ) );
 return mat;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## Group generators for Minkwitz's method
##

 InstallGlobalFunction( GeneratorsProjective,
 function( chi, rep )
 local z, N, U, g, e, ZG, G;
 G := UnderlyingGroup( chi );
 ZG := Center(G);
 N := FittingSubgroup( G );
 U := [];
 z := Size(G);
 repeat g:=Random( Difference( G, N ) );
    if g^chi<>0 then
       Add(U,g);
    fi;
 until U<>[] and Size(Group(U))=z;
 return U;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## A program for finding suitable ordinary representation of the cover of G/F to use in
## Schur's theorem
##

 InstallGlobalFunction( FilteringCharacters,
 function( chi, rep, U, Phi, h, EpiGf, IsoGf, SGf )
 local LU, d, e, l, le, ls, conj, G, Uproj, Iso, phi, Iphi, lUSGf, mu, A, S3, WS, s, s1, s2, s3, g, cfp, a, WsGf, j, TrA, tst;
 LU := Length(U);
 d := DimensionsMat( GeneratorsOfGroup( Image(rep) )[1] )[1];
 e := chi[1]/d;
 G := Group(U);                                                                  ###### G=<x1,...,xn> and U={x1...,xn} ######
 Uproj := List( U, i-> ProjectiveReps( chi, rep, i) );                           ###### [A1,...An] where Ai=V(xi) for a Proj. Reps V of G ######
 l  := List( [1..LU], i->ImagesRepresentative( h, U[i] ) );
 le := List( [1..LU], i->PreImagesRepresentative( EpiGf, l[i] ) );
 ls := List( [1..LU], i->ImagesRepresentative( IsoGf, le[i] ) );                  ###### \bar{x1},...,\bar{xn} in the cover of G/F ######
 conj := List( ConjugacyClasses(SGf), Representative );
 Iso := IsomorphismFpGroupByGenerators(G,U);
 for phi in Phi do
   Iphi := IrreducibleAffordingRepresentation( phi );
   lUSGf := List( [1..LU], i->ImagesRepresentative( Iphi, ls[i] ) );
   mu := List(lUSGf, t -> Trace(t));
   if ForAll(mu, t -> (t <> 0)) then
     A:=[]; S3:=[]; WS:=[];
     for s in conj do
        s1:= PreImagesRepresentative( IsoGf, s );
        s2:= ImagesRepresentative( EpiGf, s1 );
        s3:= PreImagesRepresentative( h, s2 );                                   ####### \bar{s} in the cover ######
        g := ImagesRepresentative( Iso, s3 );                                    ####### \bar{s}=w(x1,...xn)  ######
        cfp := ExtRepOfObj(g);
        Add(S3,s3);
        a := IdentityMat( d );
        for j in [1..Length(cfp)/2] do
            a := a * (e/(mu[cfp[2*j-1]])*Uproj[cfp[2*j-1]])^cfp[2*j];            ####### A=w(A1,...,An) #######
        od;
        Add(A,a);
        WsGf := Identity( SGf );
        for j in [1..Length(cfp)/2] do
            WsGf := WsGf * (ls[cfp[2*j-1]])^cfp[2*j];                            ####### WsGf=w(\bar{x1},...,\bar{xn})  #######
        od;
        Add(WS, WsGf);
     od;
     TrA := List( [1..Length(conj)], i->Trace(A[i]) );
     tst:= Filtered( [1..Length(conj)], i->TrA[i]<>0 );
     if List( tst, i-> WS[i]^phi) = List( tst, i-> S3[i]^chi/TrA[i] ) then
        return [lUSGf, mu];
     fi;
   fi;
 od;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## A program for computing representation of a perfect group $G$ with abelian
## $Soc(G/Z(G))$ affording \chi, in the case that \chi_F=e*\theta and e not prime.
##

 InstallGlobalFunction( IrrRepsNotPrime,
 function(chi,theta,f)
 local G, h, e, Gf, EpiGf, SchurGf, IsoGf, SGf, chiSGf, Vf, U, lVG, SGfReps, r, i;
    G := UnderlyingGroup( chi );
    h := NaturalHomomorphismByNormalSubgroup( G, f );
    e:= chi[1]/theta[1];
    Gf := Image(h);
    EpiGf := EpimorphismSchurCover( Gf, [2,3,5,7,11] );
    SchurGf := PreImage(EpiGf);
    IsoGf := IsomorphismPermGroup(SchurGf);
    SGf := Image(IsoGf);                                                   ####### SGf is a perm. reps of a cover of G/F #######
    chiSGf:= Filtered( Irr(SGf), i->i[1] = e);
    Vf := IrreducibleAffordingRepresentation( theta );
## The following 2 lines is for computing a projective representation of G of degree \theta(1)
## Here it computes the matrices V(x) for generators x in U
   U := GeneratorsProjective( chi, Vf );
   lVG := List( U, x->ProjectiveReps( chi, Vf, x ) );
## The program "FilteringCharacters" checks to find the suitable representation of
## the central cover of G/F
   SGfReps := FilteringCharacters( chi, Vf, U, chiSGf, h, EpiGf, IsoGf, SGf );
   r := List( [1..Length(U)], i->(e/SGfReps[2][i])*KroneckerProduct( SGfReps[1][i], lVG[i] ) );
   return GroupHomomorphismByImagesNC( Group(U), Group( r ), U, r );
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This program returns a representation of a perfect group $G$ with abelian $Soc(G/Z(G))$
## using Gallagher's Theorem
##

 InstallGlobalFunction( GallagherRepsn,
 function( G, chi, h, f, C, m, U )
 local IrrG, i, R, psi, e1, r1, im, Irrim, e2, r2, r, l;
 IrrG := Irr(G);
 psi:=0;
 for i in [1..Length(IrrG)] do
    R := RestrictedClassFunction( IrrG[i], f );
    if R = C[1] then
       psi := IrrG[i];
       e1 := IrreducibleAffordingRepresentation( psi );
       r1 := List( U, x->ImagesRepresentative( e1, x ) );
       break;
    fi;
 od;
 if psi <> 0 then
   im := Image( h );
   Irrim := Irr(im);
   for i in [1..Length( Irrim )] do
      if m[1][1] = Irrim[i][1] then
        R := RestrictedClassFunction( Irrim[i], h );
        if chi = psi*R then
           e2 := IrreducibleAffordingRepresentation( Irrim[i] );
           l := List( U, x->ImagesRepresentative( h, x ) );
           r2 := List( l, x->ImagesRepresentative( e2, x ) );
           r := List( [1..Length(r1)], i->KroneckerProduct( r1[i], r2[i] ) );
           return GroupHomomorphismByImagesNC( G, Group( r ), U, r );
        fi;
      fi;
   od;
 fi;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This program returns a representation of a perfect group $G$ with abelian
## $Soc(G/Z(G))$. This function calls the following three functions:
## 1. ExtendedRepresentationNormal
## 2. InducedSubgroupRepresentation
## 3. GallagherRepsn
##

 InstallGlobalFunction( PerfectAbelianSocleRepresentation,
 function( G, chi )
 local Ug, U, f, R, C, m, I, t, Rc, Cc, h, P;
 Ug := GeneratorsOfGroup( G );
 U := ShallowCopy( Ug );
 f := FittingSubgroup( G );
 R := RestrictedClassFunction( chi , f );
 C := ConstituentsOfCharacter( R );
 m := MatScalarProducts( C, [ R ] );
 ######### if \chi_F is irreducible #########
 if IsIrreducibleCharacter( R ) then
    return ExtendedRepresentationNormal( chi, IrreducibleAffordingRepresentation( R ) );
 fi;
 ######### if \chi is imprimitive #########
 if Length( C ) > 1 then
   I := InertiaSubgroup( G, C[1] );
   R := RestrictedClassFunction( chi, I );
   C := ConstituentsOfCharacter( R );
   for t in C do
     Rc := RestrictedClassFunction( t, f );
     Cc := ConstituentsOfCharacter( Rc );
     if C[1] in Cc then
        return InducedSubgroupRepresentation( G, IrreducibleAffordingRepresentation( t ));
     fi;
   od;
 fi;
 h := NaturalHomomorphismByNormalSubgroup( G, f );
 ######### if \chi_F=e*\theta for e prime #########
 if Length( C ) = 1  and IsPrime( m[1][1] ) then
    P := PreImage( h , SylowSubgroup( Image(h), m[1][1] ) );
    R := RestrictedClassFunction( chi , P );
    if IsIrreducibleCharacter( R ) then
       return ExtendedRepresentation( chi, IrreducibleAffordingRepresentation( R ) );
    else
       return GallagherRepsn( G, chi, h, f, C, m, U );
    fi;
 fi;
 ######### if \chi_F=e*\theta for e not prime #########
 if Length( C ) = 1 and IsPrime( m[1][1] ) = false then
    return IrrRepsNotPrime( chi, C[1], f );
 fi;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This program returns a representation of a perfect group $G$ with abelian
## $Soc(G/Z(G))$. This function calls the following three functions:
## 1. ExtendedRepresentationNormal3
## 2. InducedSubgroupRepresentation3
## 3. GallagherRepsn
##

 InstallGlobalFunction( SocleMoreComponents,
 function( G, chi, S )
 local Ug, U, R, C, m, I, t, Rc, Cc, h, P;
 Ug := GeneratorsOfGroup( G );
 U := ShallowCopy( Ug );
 R := RestrictedClassFunction( chi , S );
 C := ConstituentsOfCharacter( R );
 m := MatScalarProducts( C, [ R ] );
 ######### if \chi_S is irreducible #########
 if IsIrreducibleCharacter( R ) then
    return ExtendedRepresentationNormal( chi, IrreducibleAffordingRepresentation( R ) );
 fi;
 ######### if \chi is imprimitive #########
 if Length( C ) > 1 then
   I := InertiaSubgroup( G, C[1] );
   R := RestrictedClassFunction( chi, I );
   C := ConstituentsOfCharacter( R );
   for t in C do
     Rc := RestrictedClassFunction( t, S );
     Cc := ConstituentsOfCharacter( Rc );
     if C[1] in Cc then
        return InducedSubgroupRepresentation( G, IrreducibleAffordingRepresentation( t ));
     fi;
   od;
 fi;
 h := NaturalHomomorphismByNormalSubgroup( G, S );
 ######### if \chi_F=e*\theta for e in [ 2, 3] #########
 if Length( C ) = 1  and m[1][1] in [ 2, 3 ] then
    P := PreImage( h , SylowSubgroup( Image(h), m[1][1] ) );
    R := RestrictedClassFunction( chi , P );
    if IsIrreducibleCharacter( R ) then
       return ExtendedRepresentation( chi, IrreducibleAffordingRepresentation( R ) );
    fi;
 else
    return GallagherRepsn( G, chi, h, S, C, m, U );
 fi;
 end );


############################################################################################
############################################################################################
##################################### A Utility Function ###################################
## This program returns a representation of a perfect group $G$.
##

 InstallGlobalFunction( PerfectRepresentation,
 function( arg )
 local  G, chi, hom, n, a, r, s, S, c, C, i, R, l, L, M, Co, cl, so, N, x, I, t, Ri, Ci, Rc, Cc, run, ls, j, k, A;
 G := arg[1];
 chi := arg[2];
 hom := NaturalHomomorphismByNormalSubgroup( G, Centre( G ) );
 L := [ ]; M := [ ];
 n := MinimalNormalSubgroups( Image(hom) );
 a := Filtered( n, IsAbelian );
 ## First program checks to find an abelian normal subgroup N not < Z(G).
 if a=n then
   cl := List( ConjugacyClasses( G ), Representative );
   so := Difference( cl, Centre( G) );
   for x in so do
      N := NormalClosure( G, Group( x ) );
      if IsAbelian(N) then
         R := RestrictedClassFunction( chi , N );
         C := ConstituentsOfCharacter( R );
         I := InertiaSubgroup( G, C[1] );
         Ri := RestrictedClassFunction( chi, I );
         Ci := ConstituentsOfCharacter( Ri );
         for t in Ci do
           Rc := RestrictedClassFunction( t, N );
           Cc := ConstituentsOfCharacter( Rc );
           if C[1] in Cc then
              Info( InfoWarning, 1, " the given character of degree ", chi[1], " is imprimitive" );
              return InducedSubgroupRepresentation( G, IrreducibleAffordingRepresentation( t ));
           fi;
         od;
      fi;
   od;
   return PerfectAbelianSocleRepresentation( G, chi );
 else
   S := Difference( n, a );
 ## S is the non-abelian part of the soc(G/Z) which is the direct product of simple groups
 ## if Length( S ) = 1 then G is a central cover of a simple group and we use Dixon's method
   if Length( arg ) = 3 and Length( S ) = 1 and arg[3] = 1 then
       return true;
   fi;
 ## if Length( S ) >= 5 then we apply Gallaghe's method.
 ## For checking the components of S we only use the size of these components.
   ls := List(S,Size);
   A := 0;
   Sort(ls);
   for k in [1..Length(ls)] do
      if ls[k] > A then
         A:=ls[k];
         j := 0;
      fi;
      j:=j+1;
      if j > 4 then
         return  SocleMoreComponents( G, chi, S );
      fi;
   od;
 ## if Length( S ) > 1 then, if number of isomorphic components of S is <= 5 then we use
 ## the Tensor Product method.
   for s in S do
      Append( M, GeneratorsOfGroup( s ) );
   od;
   c := Centralizer( Image( hom ), Group( M ) );
   if Size(c) > 1 then
      Add( S, c );
   fi;
   S := List( S, i -> PreImage( hom, i ) );
   Co := [ One( Source( hom ) ) ];
   for i in [ 1..Length( S ) ] do
      R := RestrictedClassFunction( chi, S[i] );
      C := ConstituentsOfCharacter( R );
      r := CharacterSubgroupRepresentation( C[1] );
      Add( L, GeneratorsOfGroup( Image( r ) ) );
      Co := ListX(Co, GeneratorsOfGroup( S[i] ), \*);
   od;
   if Length(L) = 1 then
      return r;
   fi;
   r := L[1];
   for i in [ 2..Length( L ) ] do
     r := ListX( r, L[i], KroneckerProduct );
   od;
 fi;
 if arg[3] <> 1 then
 M := arg[3];
 for i in [1..Length(M)] do
    if Size(G) = M[i][1]  and Size(Centre(G)) = M[i][2] and chi[1] = M[i][3] and IsSimple( Image(hom) ) then
       if Length[ M[i] ] = 5 then
          run := M[i][4]( G, chi, M[i][5], hom );
       fi;
       if Length[ M[i] ] = 4 then
          run := M[i][4]( chi, hom );
       fi;
       return run;
    fi;
 od;
 fi;
 return GroupHomomorphismByImagesNC( G, Group( r ), Co, r );
 end );

[ Dauer der Verarbeitung: 0.54 Sekunden  (vorverarbeitet)  ]