Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  fpf.gi   Sprache: unbekannt

 
Spracherkennung für: .gi vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]


##
##  AUXILIARY FUNCTIONS FOR DETERMINING FPF REPRESENTATIONS
##

  Maxfactor := function( m, prime )

## returns the maximal power of prime dividing m

  local q;

    q := prime;  
    while m mod q = 0 do
      q := q*prime;  
    od;
    return q/prime;
  end; 



  Cofactor := function( m, n )

## returns the maximal integer mprime dividing m and coprime to n
## if each prime divisor of n divides m, otherwise 0 is returned
 
  local mprime, prime, q;

    if n = 1 then
      return m;
    fi; 
 
    mprime := m;
    for prime in Set( FactorsInt( n ) ) do    
      q := Maxfactor( m, prime );
      if q = 1 then
## undefined, m and r are not feasible for our purpose
 return 0;
      fi;
      mprime := mprime/q;
    od;

    return mprime; 
  end;

  MatrixInt := function( matrix ) 
    return List( matrix, x -> List( x, Int ) );
  end;


#############################################################################
##
  BlockDiagonalMatrix := function( blocks )
##
## note: as in the case of BlockMatrix( arg ) all the blocks must have
## the same dimensions rpb, cpb

    return BlockMatrix( 
 List( [1..Length( blocks )], x -> [x, x, blocks[x]] ),
 Length( blocks ), Length( blocks ) );
  end;



#############################################################################
##
  SolutionDiophant := function( a, b, c )
##
## gives one solution (x, y) of the diophant equation a*x+b*y = c 
## if existing
##

  local coeff, d, l;

    coeff := GcdRepresentation( a, b );
    d := a*coeff[1]+b*coeff[2];

    if c mod d <> 0 then
      return fail;
    fi;

    return QuoInt( c, d )*coeff;
  end;



#############################################################################
##
  SolutionMatMod := function ( mat, vec, p )
##
##  returns one solution <x> of <mat>*<x> = <vec> or `fail' over the
##  ring ZmodnZ(p) with <p> a prime power
##
##  this function is an adaption of the GAP-function
##  SolutionMat (SolutionMatNoCo) avoiding inversion 
##

    local h, v, i, l, r, s, c, zero, root,
   A, b, d, m, n, found, done, indices, minindex, q, qnow, res,
   x, t, temp;

    # solve <mat>*x = <vec>.
    vec := ShallowCopy( vec );
    A := MatrixInt( mat );
    b := List( vec, Int );
    m := Length( mat );
    n := Length( mat[1] );
    d := 0; r := 0; c := 0;
    zero := Zero( mat[1][1] );
    root := SmallestRootInt( p );
    q := root; 
    indices := [1..m];
    Info( InfoNearRing, 1, "SolutionMatMod called" );

    done := false;
    while d < n and not done do
## run through all columns of the matrix to search for minimal pivot-element
      c := d; 
      qnow := p; found := false;
      while not found and c < n  do
        c := c+1; r := d;
        while not found and r < m do
          r := r+1;
          if A[r][c] mod q <> 0 then
     found := true;
     minindex := [r,c]; qnow := QuoInt( q, root );
   elif A[r][c] mod qnow <> 0 then
     minindex := [r,c];
     qnow := Gcd( A[r][c], qnow );
   fi;
        od;       
      od;

      if qnow = p then
## all the subsequent entries of mat are zero
 done := true;
      else
## put this column in the appropriate position
        d := d+1; 
        r := minindex[1]; c := minindex[2]; 
        temp := indices[c]; 
        indices[c] := indices[d];
        indices[d] := temp;
        for i in [1..m] do 
   temp := A[i][c];  
   A[i][c] := A[i][d];
    A[i][d] := temp;
        od; 

## normalize this row and clear this column 

        q := qnow;

#if Gcd( A[r][d], p ) <> q then
#  return false;
#fi;
        t := SolutionDiophant( A[r][d], p, q )[1]; 
        l := List( A[r], x -> t*x mod p );
 Info( InfoNearRing, 3, "l = ", l );
        temp := t*b[r] mod p;
        A[r] := A[d]; b[r] := b[d];
        A[d] := l; b[d] := temp;
 
        for i in [d+1..m] do
#if A[i][d] mod q <> 0 then
#  return false;
#fi;
   t := QuoInt( A[i][d], q );
          A[i] := (A[i]-t*l) mod p; b[i] := (b[i]-t*b[d]) mod p;
       od;
      fi;
    od;  ##  while d < n and not done do

    Info( InfoNearRing, 2, "rowreduced matrix = ", A );
    Info( InfoNearRing, 2, "vector = ", b );

## now find a solution

    temp := [];
    for i in [1..d] do
      if b[i] mod A[i][i] <> 0 then return fail; fi; 
    od;
    for i in [d+1..m] do
      if b[i] mod p <> 0 then return fail; fi;
      temp[i] := 0;  
    od;

    i := d-1;
    temp[d] := QuoInt( b[d], A[d][d] );  
    while i > 0 do
      temp[i] := QuoInt( b[i]-A[i]{[i+1..d]}*temp{[i+1..d]}, A[i][i] ); 
      i := i-1;
    od; 
      
    res := [];
    for i in [1..n] do
      res[indices[i]] := temp[i]; 
    od;  

    Info( InfoNearRing, 2, "mat * x = vec solved by x^t = ", res );
    Info( InfoNearRing, 1, "SolutionMatMod returns" );
    return res*One( mat[1][1] );
end;


#############################################################################
##
  GroupHomomorphismByMatrix := function( G, gens, mats )
##
##  for an abelian group G with generators gens this function returns
##     GroupHomomorphismByImages( G, G, gens, imgs )  
##  where imgs is described by mats (the coefficients of images with respect
##  to gens)   
##  e.g., for G elementary abelian with "basis" gens and mats = [A] 
##  this would simply return the homomorphism x -> x*A  
##  
    local d, n,
   imgs,
   i, j, x;
    
      imgs := []; d := 0;            
      for i in [1..Length( mats )] do
 n := Length( mats[i] );
 for j in [1..n] do
## add the image of the (d+j)-th generator:
          Add( imgs,
  Product( List( [1..n], x -> gens[d+x]^Int(mats[i][j][x]) ) ) );
 od;
 d := d+n;
      od;

      return GroupHomomorphismByImages( G, G, gens, imgs );
   end;






##
##  FPF BASICS
##



############################################################################
##
#M  IsFpfAutomorphismGroup( <phi>, <G>  )
##
##  - tests whether <phi> acts fpf on <G> by converting <phi> to a
##  permutation group
##


InstallMethod( 
 IsFpfAutomorphismGroup,
 "default",
 true,
 [IsGroup, IsGroup],
 0,
  function( phi, G  )

  local k, n, O;
 
    k := Size( phi );
    n := Size( G );
    if n mod k <> 1 then
      return false;
    fi;

    O := SortedList( G );
    RemoveSet( O, Identity( G ) );
    
    return IsSemiRegular( phi, O );   
  end );



############################################################################
##
#M  FpfAutomorphismGroupsMaxSize( <G> )
##
##  - returns an upper bound for the maximal size of a fixed point free 
##  automorphism group on <G>
##  - tests whether a fixed point free automorphism group on <G> has to be
##  necessarily cyclic
##  - uses only the size of <G>
##


InstallMethod(
 FpfAutomorphismGroupsMaxSize,
 "default",
 true,
 [IsGroup],
 0,
  function( G )

  local primesandexp,  # list of primes and exponents [[p1,d1],...[pn,dn]]
    # such that Size(G) = p1^d1*...pn^dn
 kmax,   # maximum possible size of an fpf aut grp on <G>
 dmax,  # maximum possible size of a factor in a noncyclic
   # fpf aut grp on <G>, see presentations
   # dmax = 1 means that all fpf aut grps are cyclic
 factors, f, x;


      if not IsNilpotentGroup( G ) then
        return [1,1];
      fi;    
     
      primesandexp := Collected( Factors( Size( G ) ) );

      if IsCyclic( G ) then
 return [Gcd( List( primesandexp, x -> x[1]-1 ) ), 1];
      fi; 

      kmax := Gcd( List( primesandexp, x -> x[1]^x[2]-1 ) );

      if not IsAbelian( G ) then 
## <kmax> is certainly odd 
        while IsEvenInt( kmax ) do
   kmax := kmax/2;
        od;
      fi;    

      dmax := Gcd( List( primesandexp, x -> x[2] ) ); 
      dmax := Gcd( [dmax, kmax, Phi(kmax)] );
      factors := Collected( Factors( dmax ) );
      for f in factors do
## pq-condition 
        if kmax mod f[1]^(f[2]+1) <> 0 then
   dmax := dmax/f[1];
 fi;
      od;     
      return [kmax,dmax];     
   end );



##
## functions returning the degree of irreducible fpf representations over
## GF(p) for solvable groups as described in 
##
## PM: Fpf representations over fields of prime characteristic. Technical
## Report
##
## NOTE: no checking whether the input-parameters are feasible
##


############################################################################
##
  DegreeOfIrredFpfRepCyclic := function( p, m )
## error if p and m are not coprime
    return OrderMod( p, m );
  end;

############################################################################
##
  DegreeOfIrredFpfRepMetacyclic := function( p, m, r )
##   
  local n, q, mprime;      

## check the necessary conditions whether the input-parameters are feasible:
    n := OrderMod( r, m );
    if n = 0 then 
      Error( "parameters are not feasible: <m> and <r> coprime" ); 
    fi;
 
    q := Maxfactor( m, 2 );
    if q > 2 and (r+1) mod q = 0 and n mod 4 = 2 then
## type II, quaternion 2-Sylow subgroup
      mprime := Cofactor( m/2, n/2 );
      if mprime = 0 or r mod (m/mprime) <> 1 then
 Error( "parameters are not feasible" );
      fi;
      Info( InfoNearRing, 1,
  "parameters are feasible; metacyclic group of type II" );
    else 
## type I, all Sylow subgroups are cyclic
      mprime := Cofactor( m, n );
      if mprime = 0 or r mod (m/mprime) <> 1 then
 Error( "parameters are not feasible" );
      fi;
      Info( InfoNearRing, 1,
  "parameters are feasible; metacyclic group of type I" );
    fi;

    return Size( GroupByPrimeResidues( [p,r], m ) );

  end;

############################################################################
##
  DegreeOfIrredFpfRep2 := function( p, m, r, k )
##
## necessary conditions:
## all prime divisors of n := OrderMod( r, m ) divide m
## n/2 is an odd number
## not k in GroupByPrimeResidues( [r], m )
## k = -1 mod Maxfactor( m, 2 )
## OrderMod( k, m ) = 2

   
  local n, q, mprime;      

## check the necessary conditions whether the input-parameters are feasible:
    n := OrderMod( r, m );
    q := Maxfactor( m, 2 );
    mprime := Cofactor( m, n );
    if n mod 4 <> 2 then
      Error( "parameters are not feasible: <m> and <r> coprime" ); 
    elif q = 1 then
      Error( "parameters are not feasible: <m> is even" );
#    elif q > 1 and (r+1) mod q = 0 then
#      Error( "parameters are not feasible: 4 divides <r>-1" );  
    elif mprime = 0 or r mod (m/mprime) <> 1 then
      Error( "parameters are not feasible: pq-condition" );
    elif OrderMod( k, m ) <> 2 or (k+1) mod q <> 0 or 
   ( m <> mprime*q and k mod (m/(mprime*q)) <> 1 ) then
      Error( "parameters are not feasible: pq-condition" ); 
    fi;
  
    return Size( GroupByPrimeResidues( [p,r,k], m ) );
  end;


############################################################################
##
  DegreeOfIrredFpfRep3 := function( p, m, r )
##
## necessary conditions:
## 3 divides m, 
## m is odd
## all prime divisors of n := OrderMod( r, m ) divide m

  local n, mprime;

    n := OrderMod( r, m );
    if n = 0 then 
      Error( "parameters are not feasible: <m> and <r> coprime" ); 
    fi;
 
    mprime := Cofactor( m, n );
    if m mod 2 = 0 or m mod 3 <> 0 or mprime = 0 or
    (n > 1 and r mod (m/mprime) <> 1) then
      Error( "parameters are not feasible" );
    elif m mod 9 <> 0 and n mod 3 <> 0 then
##      return 2*DegreeOfIrredFpfRepMetacyclic( p, m/3, r );
      return 2*Size( GroupByPrimeResidues( [p, r], m/3 ) );
    else
##      return 2*DegreeOfIrredFpfRepMetacyclic( p, m, r );
      return 2*Size( GroupByPrimeResidues( [p, r], m ) );
    fi; 
  end;


############################################################################
##
  DegreeOfIrredFpfRep4 := function( p, m, r, k )
##
## necessary conditions:
## m is odd
## all prime divisors of n := OrderMod( r, m ) divide m
##    in particular n is odd
## 3 divides m, but 3 does not divide n
## OrderMod( k, m ) = 2
## k = -1 mod 3
## k = 1 mod prime divisors of n

  local n, mprime;

    n := OrderMod( r, m );
    if n = 0 then 
      Error( "parameters are not feasible: <m> and <r> coprime" ); 
    fi;
 
    mprime := Cofactor( m, n );
    if m mod 2 = 0 or mprime mod 3 <> 0 or mprime = 0 or
    (n > 1 and r mod (m/mprime) <> 1) then
      Error( "parameters are not feasible: 3" );
    elif OrderMod( k, m ) <> 2 or (k+1) mod 3 <> 0 or
    (n > 1 and k mod (m/mprime) <> 1) then
      Error( "parameters are not feasible: 4" );
    elif m mod 9 <> 0 and p^2 mod 16 = 1 then
      return 2*Size( GroupByPrimeResidues( [p,r,k], m/3 ) );
    elif m mod 9 <> 0 then
      return Lcm( 4, 2*Size( GroupByPrimeResidues( [p,r,k], m/3 ) ) );
    else
      return 2*Size( GroupByPrimeResidues( [p,r,k], m ) );  
    fi;
  end;



##
##  DETERMINING THE REPRESENTATIONS OVER GF(P)
##


############################################################################
##
#M  IsFpfRepresentation( <matrices>, <F> )
##
##  - tests whether the group of d times d matrices in the list <matrices>
##  over F acts fpf by multiplication on the d-dimensional vector space
##  (module) over F 
##  - converts <phi> to a permutation group acting on the row vectors F^d from
##  the right (GAP-convention, x -> x*A)     
##

InstallMethod( 
 IsFpfRepresentation,
 "default",
 true,
 [IsList, IsDomain],
 0,
  function( matrices, F )

  local d,   #  degree of the matrix representation
 phi,  #  matrix group generated by <matrices> over F
        n,
        o,
        I,
        l;
 

    d := Length( matrices[1] );
    phi := Group( matrices*One(F) );
    n := Size( F )^d;
 
    if n mod Size( phi ) <> 1 then
      return false;
    fi;
    
    o := Zero(F);
    I := IdentityMat( d, F );
    l := SortedList( phi );
    RemoveSet( l, I );

    return ForAll( l, x -> Determinant( x-I ) <> o ); 
  end );



############################################################################
##
  FGRepC := function( p, f, m )
##
## returns a matrix <AR> representing an fpf automorphism of order m over
## the ring R = ZmodnZ( p^f ) with p a prime
## <AR> acts from the right, x -> x*AR
##

  local e, F, gens, a, A, AR, R, 
 i, x, y;

    e := OrderMod( p, m );
    if e = 0 then
      Error( "size of the group, m, and characteristic, p, have to be coprime" );
    fi;
    F := GF( p^e ); 
    gens := Basis( F );
    a := Z(p^e)^((p^e-1)/m);
    A := List( gens, x -> Coefficients( gens, a*x ) );

    if f = 1 then 
      return A;
    fi;

## the representation over GF(p) determines a representation over ZmodnZ( p^f )
    R := ZmodnZ( p^f );
    AR := MatrixInt( A )*One( R );
    AR := AR^(p^(f-1));
## now AR has order m over R, but AR is not necessarily congruent to A mod p 
    return AR; 
  end;  



############################################################################
##
#M  FpfRepresentationsCyclic( <p>, <size> )
##
##  determines the irreducible fixed point free representations of a cyclic
##  group of order <size> over ZmodnZ( p )
##   
##  returns a list of matrices { A^i | i in indexlist }
##  such that each matrix A^i operates from the right on a ZmodnZ(p)-module
##  thus determining a representation.
##  The A^i describe all irred. representation up to equivalence.
##  additionally <indexlist> is returned.
##

InstallMethod(
 FpfRepresentationsCyclic,
 "default",
 true,
 [IsInt, IsInt],
 0,
  function( p, size )

  local A,  # matrix (i.e., representation of the generator
   # of the cyclic group of order <size> )
   # linear map: x -> x*A
 CmodsizeCstar, # multiplicative group of residues prime to <size>
 U,  
 indexlist,  # A^i for i in <indexlist> form all the irreducible
   # nonequivalent representations  
 prime, f,
 x;

    prime := SmallestRootInt( p );
    f := LogInt( p, prime );
       

    if size mod prime = 0 then  
      Error( "size of group and characteristic of field have to be coprime" );
    elif size = 1 then
      return [[[[One( ZmodnZ( p ) )]]], [1]];
    elif size = 2 then 
      return [[[[-One( ZmodnZ( p ) )]]], [1]];   
    fi;  
 
    A := FGRepC( prime, f, size );   
    CmodsizeCstar := Units( Integers mod size );
    U := GroupByPrimeResidues( [prime], size );
    indexlist := List( RightCosets( CmodsizeCstar, U ),
     x -> Int( Representative(x) ) );
    
    return [List( indexlist, x -> A^x ), indexlist];       
  end );


############################################################################
##
  FGRepQ := function( prime, f )
##
## returns matrices P, Q  representing an fpf quaternion group over Z(prime^f)
## this irreducible fpf representation is unique (upto equivalence)
## note that p has to be an odd prime 
##

  local P, Q,
 u, v, p,
 x;

      p := prime^f;
      u := 0; v := 0;  
## find the solution by trial and error:
      while (u^2+v^2+1) mod p <> 0 and u < p do  
 u := u+1; v := u;
        while (u^2+v^2+1) mod p <> 0 and v < p do 
    v := v+1;
 od;
      od;  

      P := [[u,v],[v,-u]];
      Q := [[0,-1],[1,0]];

      return [P,Q]*One( ZmodnZ( p ) );
    end;



############################################################################
##
  FGRepMC := function( p, f, m, mprime, d )
##
## returns matrices AR, WR^u, BR representing a metacyclic fpf automorphism
## group over the ring R = ZmodnZ( p^f ) with p a prime such that
##    m ... order of AR
## d ... (BR*WR^u)^-1*AR*(BR*WR^u) = AR^(p^d)
## WR is induced by x -> x*w and w is primitive in GF(p^e)
## additionally, with n = e/gcd(e,d) and q = p^d:   
##      (BR*WR^u)^n = (WR^u)^[1+p^d+p^2d+...+p^(n-1)d] 
##      = (WR^u)^[1+q+q^2+...+q^(n-1)] 
##      = (WR^u)^[(q^n-1)/(q-1)] 
##      = AR^mprime 
##

  local e, # degree of irred. representation of C_m over GF(p) 
 n,     # n = e/gcd(e,d)
 q, # q = p^d
 u,
 F, gens, 
 w, W, WR, 
 a, A, AR, B, BR, R, ARq, XR, M, y, I,
 i, j, x;

    e := OrderMod( p, m );
    if e = 0 then  
      Error( "size of group and characteristic of field have to be coprime" );
    fi;
    n := e/Gcd(e,d);

## now: beta^n = alpha^mprime
## m/mprime divides q-1

    q := p^d;
    if q mod (m/mprime) <> 1 then
      Error( "parameters not feasible: m/mprime has to divide q-1" );
    fi; 

    F := GF( p^e ); 
    w := Z(p^e);
    gens := Basis( F ); 
    W := List( gens, x -> Coefficients( gens, x*w ) );
    B := List( gens, x -> Coefficients( gens, x^q ) );

## u is determined by (WR^u)^[(q^n-1)/(q-1)] = AR^mprime 
    u := ((p^(e/n)-1)*mprime)/m;
## for an integer i coprime to m: (W^i)^((p^e-1)/m) and
## B*(W^i)^u together form the irred representations

    if f = 1 then       
      return [W^((p^e-1)/m), W^u, B];
    fi;

## the representation over GF(p) determines a representation over ZmodnZ( p^f )
    R := ZmodnZ( p^f );
    WR := (MatrixInt( W )*One( R ))^(p^(f-1));
## now WR has order relatively prime to p over R
## but WR is not necessarily congruent to W mod p 

    AR := WR^((p^e-1)/m);
    BR := MatrixInt( B )*One( R );
## BR does not necessarily normalize the group generated by AR  
    ARq := AR^q;
    y := Flat( AR*BR-BR*ARq );
    I := IdentityMat( e )*One( R );
    M := KroneckerProduct( I, TransposedMat( ARq ))-KroneckerProduct( AR, I );
    x := SolutionMatMod( M, y, p^f );

    if x = fail then
      return fail;
    fi;
 
    XR := List( [1..e], i -> x{[(i-1)*e+1..i*e]} ); 
## Now (BR+XR)^-1*AR*(BR+XR) = AR^q but (BR+XR) has not yet order n.
## Let j be minimal such that j*e > f. Then (BR+XR)^(p^(j*e)) has order n
## and maps AR to AR^q by conjugation. 
    BR := (BR+XR)^( p^((QuoInt(f-1, e)+1)*e) );

    return [AR, WR^u, BR];
  end;  



############################################################################
##
#M  FpfRepresentationsMetacyclic( <p>, <m>, <r> )
##
##  determines the fixed point free representations of a metacyclic group
##  with generators a, b and relations a^m = 1, b^n = a^mprime, 
##  b^(-1)*a*b = a^r where n is the multiplicative order of r in the group 
##  of prime residues modulo m.
##  Additional conditions are: mprime divides m
##  each prime divisor of n divides m/mprime and
##  r = 1 mod (m/mprime)
##   
##  returns a list of pairs of matrices corresponding to a and b 
##  which operate from the right on a ZmodnZ(p)-module
##  additionally a list <indexlist> of indices is returned
##

InstallMethod(
 FpfRepresentationsMetacyclic,
 "quaternion group",
 true,
 [IsInt, IsInt, IsInt],
 10,
  function( p, m, r )

  local prime, f;

     if m <> 4 then
       TryNextMethod();
     fi;
     prime := SmallestRootInt( p );
     f := LogInt( p, prime );
     return [[FGRepQ( prime, f )], [1]];     
  end );


InstallMethod(
 FpfRepresentationsMetacyclic,
 "default",
 true,
 [IsInt, IsInt, IsInt],
 0,
  function( p, m, r )

  local A, B, C, I, # auxiliary matrices (blocks) for the representations
 AA, BB,         # matrices (representations of the generators of the
   # metacyclic group of determined by the 
   # parameters <m> and <r> )
   # linear maps,  a: x -> x*AA
   #  b: x -> x*BB  
 fpfreps,  # list of matrices [AA, BB] determining the
   # nonequivalent representations 
 indexlist,  # AA^i, BB(i) for i in <indexlist> form all the
   # nonequivalent representations  
 CmodmCstar, # multiplicative group of residues prime to <m>
 e, t, q, d,
 Ubyrandprime,   # subgroup of CmodmCstar generated by r and prime
 n,  # size of Ubyr
        mprime, 
 factors, aux, subdiagonal, prime, f,
 i, x;


    prime := SmallestRootInt( p );
    f := LogInt( p, prime );
    e := OrderMod( prime, m );
## e is the degree of an irreducible fpf representation of <a> over GF(prime)
    if e = 0 then  
      Error( "size of group and characteristic of field have to be coprime" );
    fi; 

## check the necessary conditions whether the input-parameters are feasible:
    r := r mod m; 
    n := OrderMod( r, m );
    if n = 0 then 
      Error( "parameters are not feasible: <m> and <r> coprime" );
    elif n = 1 then
      Error( "parameters of a cyclic group of size <m>" ); 
    fi;
 
    q := Maxfactor( m, 2 );
    if q > 2 and (r+1) mod q = 0 and n mod 4 = 2 then
## type II, quaternion 2-Sylow subgroup
      mprime := Cofactor( m/2, n/2 );
      if mprime = 0 or r mod (m/mprime) <> 1 then
 Error( "parameters are not feasible" );
      fi;      
      Info( InfoNearRing, 1, "parameters are feasible; metacyclic group of type II" );
    else 
## type I, all Sylow subgroups are cyclic
      mprime := Cofactor( m, n );
      if mprime = 0 or r mod (m/mprime) <> 1 then
 Error( "parameters are not feasible" );
      fi;
      Info( InfoNearRing, 1, "parameters are feasible; metacyclic group of type I" );
    fi;

    Ubyrandprime := GroupByPrimeResidues( [r, prime], m );
    t := Size( Ubyrandprime )/e; 
## r^t is congruent to a power of prime modulo m

    if n = t then 
## prime^x = r^t mod m implies that x = e
      A := FGRepC( prime, f, m );   
      C := A^mprime;
      B := IdentityMat( Length( A ), ZmodnZ(p) );   
    else 
      q := r^t mod m;
      d := LogMod( q, prime, m ); 
      aux := FGRepMC( prime, f, m, mprime, d );      
      A := aux[1]; C := aux[2]; B := aux[3]; 
    fi;

    CmodmCstar := Units( Integers mod m );
    indexlist := List( RightCosets( CmodmCstar, Ubyrandprime ), x ->
      Int( Representative(x) ) );
 
    I := IdentityMat( Length( A ), ZmodnZ( p ) );
    subdiagonal := List( [1..t-1], x -> [x+1, x, I] );

    fpfreps := [];
    for i in indexlist do
      AA := BlockDiagonalMatrix( List( [0..t-1], x -> A^(i*r^x) ) );
      BB := BlockMatrix( Concatenation( subdiagonal, [[1, t, B*C^i]] ), t, t );
      Add( fpfreps, [AA,BB] );
    od; 
 
    return [fpfreps, indexlist];
  end );




############################################################################
##
  FGRep2 := function( p, f, m, mprime, d, l )
##
## returns matrices AR, WR^u, BR = DR^2, WR^v, QR = DR^n representing an fpf
## automorphism group of type 2 over the ring R = ZmodnZ(p^f) such that
##    m ... order of AR with AR a power of WR
## d ... (BR*WR^u)^-1*AR*(BR*WR^u) = AR^(p^d)  
## WR is induced by x -> x*w and w is primitive in GF(p^e)
## Note that d has to be even and n = e/gcd(e,d) odd; d <> 0 but possibly
## d = e.
##      DR is induced by x -> x^(p^(d/2))  
## Then B = D^2 and Q = D^n commute and with q = p^d:
##      (BR*WR^u)^n = (WR^u)^[1+p^d+p^2d+...+p^(n-1)d] 
##      = (WR^u)^[1+q+q^2+...+q^(n-1)] 
##      = (WR^u)^[(q^n-1)/(q-1)] 
##      = AR^mprime 
##      e ... (QR*WR^v)^-1*AR*(QR*WR^v) = AR^(p^(e/2))
## l ... (QR*WR^v)^-1*(BR*WR^u)*(QR*WR^v) = (BR*WR^u)^l
##

  local e, # degree of irred. representation of C_m over GF(p) 
 n,     # n = e/gcd(e,d)
 q, # q = p^d
 u, v, k,
 F, gens, 
 w, W, WR, D, DR,
 a, A, AR, R, ARq, ARk, XR, M, y, I,
 i, j, x;

    e := OrderMod( p, m );

    if e = 0 or e mod 2 <> 0 then
      Error( "parameters not feasible: e has to be even" );
    fi;

    n := e/Gcd( e, d );

## now: beta^n = alpha^mprime
## m/mprime divides q-1

    k := p^(e/2);
    q := p^d;
    Info( InfoNearRing, 3, " p^d = ", q );
    if q mod (m/mprime) <> 1 then
      Error( "parameters not feasible: m/mprime divides q-1" );
    fi; 

## u is determined by (WR^u)^[(q^n-1)/(q-1)] = AR^mprime
## same as in FGRepMC( p, f, m, mprime, d) with possibly q = p^e
    u := ((p^(e/n)-1)*mprime)/m;
    if n = 1 then
## v is determined by ( Q*W^[v*(p^(e/2)-1)/2] )^2 = -I, that is, for example
      v := 1;
    else
## v has to be determined from the equality  q^-1*beta*q = beta^l
      v := SolutionDiophant( (q-1)*(k-1)/2, p^e-1, u*(k-(q^l-1)/(q-1)) );
      if v = fail then
        Error( "parameters not feasible" );
      fi;
      v := v[1]; 
    fi;     

    F := GF( p^e ); 
    w := Z(p^e);
    gens := Basis( F ); 
    W := List( gens, x -> Coefficients( gens, w*x ) );
    D := List( gens, x -> Coefficients( gens, x^(p^(d/2)) ) );

## for an integer i coprime to m the irred representations are formed by: 
## (W^i)^QuoInt( p^e-1, m )
## D^2*W^(iu)
## D^n*(W^iv)^[(p^(e/2)-1)/2]
    if f = 1 then
      return [W^QuoInt( p^e-1, m ), W^u, D^2, W^(v*((k-1)/2)), D^n];
    fi;

## the representation over GF(p) determines a representation over ZmodnZ( p^f )
    R := ZmodnZ( p^f );
    WR := (MatrixInt( W )*One( R ))^(p^(f-1));
## now WR has order relatively prime to p over R
## but WR is not necessarily congruent to W mod p 
    AR := WR^QuoInt( p^e-1, m );
    DR := MatrixInt( D )*One( R );
    ARq := AR^(p^(d/2));
    y := Flat( AR*DR-DR*ARq );
    I := IdentityMat( e )*One( R );
    M := KroneckerProduct( I, TransposedMat(ARq) )-KroneckerProduct( AR, I );
    x := SolutionMatMod( M, y, p^f );
    XR := List( [1..e], i -> x{[(i-1)*e+1..i*e]} ); 
## Now (DR+XR)^-1*AR*(DR+XR) = AR^(p^(d/2)) but (DR+XR) has not yet order 2n.
## Let j be minimal such that j*e > f. Then (DR+XR)^(p^(j*e)) has order 2n
## (important: 2n divides p^e-1)  and maps AR to AR^(p^(d/2)) by conjugation. 
    DR := (DR+XR)^( p^((QuoInt(f-1, e)+1)*e) );

    return [AR, WR^u, DR^2, WR^(v*(k-1)/2), DR^n];
  end;  







############################################################################
##
#M  FpfRepresentations2( <p>, <m>, <r>, <k> )
##
##  determines the fixed point free representations of a group of type 2
##  that is, with generators a, b, q
##  and relations a^m = 1, b^n = a^mprime, q^2 = a^(m/2)  
##  b^(-1)*a*b = a^r where n is the multiplicative order of r in the group of
##  prime residues modulo m
##  q^(-1)*a*q = a^k, q^(-1)*b*q = b^l and k has order 2 in the group of prime
##  residues modulo m 
##  l is determined by:  l = -1 mod 2s and l = 1 mod (nm)/(2s*mprime) where
##       s is the maximal power of 2 dividing m
##  Additional conditions are: mprime divides m
##  each prime divisor of n divides m/mprime
##  r = 1 mod (m/mprime)
##  m is even, n is 2 times an odd number
##  k = -1 mod 4
##  k = l mod (m/mprime)
##  k <> r^(n/2) mod m
##  thus: <a,b,q>/<a> is isomorphic to C_2 x C_n not cyclic
##   
##  if k = p^(e/2)*r^(n/2) mod m, then a different presentation for the
##  same group with k = p^(e/2) mod m is chosen to compute the representations
##  more efficiently
##
##  returns a list of triples of matrices corresponding to a, b and q
##  which operate from the right on a ZmodnZ(p)-module
##  additionally a list <indexlist> of indices is returned
##


InstallMethod(
 FpfRepresentations2,
 "default",
 true,
 [IsInt, IsInt, IsInt, IsInt],
 0,
  function( p, m, r, k )

  local CmodmCstar,  # group of prime residues mod <m>
 e,         # multiplicative order of <p> mod <m>
 n,         # multiplicative order of <r> mod <m>
 Ubyrandprime, t, # subgroup of the group of prime residues mod
    # <m> generated by <r,prime> 
 indexlist_ab, fpfreps_ab, # representations of <a,b> 
 Ubykpr,   # subgroup of the group of prime residues mod
    # <m> generated by <k,prime,r>
 conjugates,  # elements of Ubykpr
    # sublist of indexlist_ab desbcribing the
    # representations of <a,b> that are conjugate
    # to another list of reps
 indexlist, fpfreps, # result, representations of <a,b,q>
 A, B, Q, I,  # auxiliary matrices (blocks) for the
 C, S,   #    representation
 AA, BB, QQ,  # matrices (representations of the generators
    # of the group of type II determined by the
     # parameters m, r and k
    # linear maps   a: x -> x*AA 
    #         b: x -> x*BB
    #  q: x -> x*QQ 
 kchanged,  # <true> if k = r^(n/2)*p^(e/2) mod m;
    # then for computational reasons k = p^(e/2)
 mprime, l, s,
 q, d, prime, f,
 factors, auxiliary, inv, subdiagonal, M, 
 i, x;

    prime := SmallestRootInt( p );
    f := LogInt( p, prime );   
    r := r mod m;  
    k := k mod m; 
    n := OrderMod( r, m );
    s := Maxfactor( m, 2 );
    mprime := Cofactor( m, n );
## determine <l>:
    l := ChineseRem( [(n*m)/(2*s*mprime), 2*s], [1,-1] );

    if n mod 4 <> 2 then
      Error( "parameters are not feasible: <m> and <r> coprime" ); 
    elif s = 1 then
      Error( "parameters are not feasible: <m> is even" );
#   elif s > 2 and (r+1) mod s = 0 then
#     Error( "parameters are not feasible: 4 divides <r>-1" );  
    elif mprime = 0 or r mod (m/mprime) <> 1 then
      Error( "parameters are not feasible: pq-condition" );
    elif k = r^(n/2) mod m then
      Error( "parameters are not feasible: k = r^(n/2) mod m, metacyclic" );
    elif OrderMod( k, m ) <> 2 or (k-l) mod (m/mprime) <> 0 then
      Error( "parameters are not feasible: k = l mod (m/mprime)" ); 
    fi;
  

    indexlist := []; fpfreps := [];
    Ubyrandprime := GroupByPrimeResidues( [r, prime], m );
    conjugates := List( Ubyrandprime, Int );

    if not k in conjugates then
## The irreducible fpf representations of <a,b,q> are induced by the
## irreducible fpf representations of the metacyclic group <a,b>. 
## Note: one rep of <a,b,q> is induced by 2 nonequivalent reps of <a,b>
      Info( InfoNearRing, 1, "GF(", prime,
   ")-representations of the type-II-group are induced" );
      auxiliary := FpfRepresentationsMetacyclic( p, m, r );  
      fpfreps_ab := auxiliary[1]; 
      indexlist_ab := auxiliary[2];
## the degrees of the reps of <a,b> are Length( fpfreps_ab[1][1] )
      I := IdentityMat( Length( fpfreps_ab[1][1] ), ZmodnZ(p) );
      QQ := BlockMatrix( [[2, 1, I], [1, 2, -I]], 2, 2 );
      for i in [1..Length( indexlist_ab )] do 
 inv := SolutionDiophant( indexlist_ab[i], m, 1 )[1];
 if not ForAny( indexlist, x -> (x*k*inv) mod m in conjugates ) then
## the induction of the conjugate representation gives again the same
## and is therefore omitted
   A := fpfreps_ab[i][1];
   B := fpfreps_ab[i][2];
   AA := BlockDiagonalMatrix( [A, A^k] );
   BB := BlockDiagonalMatrix( [B, B^l] ); 
   
   Add( indexlist, indexlist_ab[i] );
   Add( fpfreps, [AA,BB,QQ] );
 fi;
      od; 

      return [fpfreps, indexlist]; 
    fi;

    Info( InfoNearRing, 1, "GF(", prime,
   ")-representations of the type-II-group are not induced" );

    e := OrderMod( prime, m );
## either k = p^(e/2) mod m or k = r^(n/2)*p^(e/2) mod m
## in any case e is even

    kchanged := false;
    if k = (r^(n/2)*prime^(e/2)) mod m then
## intermediate change of the presentation for computational convenience  
      k := prime^QuoInt( e, 2 ) mod m;
      kchanged := true;  
      Info( InfoNearRing, 3, "intermediate change of presentation, k = ", k ); 
    fi;    

## for the rest of this function we may assume that k = prime^(e/2) mod m
## but the returned representations are for the initial value of k

    t := QuoInt( Size( Ubyrandprime ), e ); 
## r^t is congruent to a power of prime modulo m
    q := r^t mod m;
    if q = 1 then
      d := e;
    else  
      d := LogMod( q, prime, m );
    fi;

    auxiliary := FGRep2( prime, f, m, mprime, d, l );
    A := auxiliary[1]; C := auxiliary[2]; B := auxiliary[3];
    S := auxiliary[4]; Q := auxiliary[5];
    I := IdentityMat( Length( A ), ZmodnZ(p) );

    CmodmCstar := Units( Integers mod m );
    indexlist := List( RightCosets( CmodmCstar, Ubyrandprime ), x ->
       Int( Representative(x) ) );   
    subdiagonal := List( [1..t-1], x -> [x+1, x, I] ); 
    M := ((l-1)/n)*mprime*prime^(e/2);
    fpfreps := [];
    for i in indexlist do  
      AA := BlockDiagonalMatrix( List( [0..t-1], x -> A^(i*r^x) ) );
      BB := BlockMatrix( Concatenation( subdiagonal, [[1, t, C^i*B]] ), t, t );
      QQ := BlockDiagonalMatrix( List( [0..t-1], x -> S^i*Q*A^(M*(t-1-x) ) ) );

      if kchanged then
## the conjugation of AA by BB^(m*n/(mprime*2*s))*QQ yields AA^(r^(n/2)*p^(e/2)
        Add( fpfreps, [AA,BB,BB^(m*n/(mprime*2*s))*QQ] );
      else
        Add( fpfreps, [AA,BB,QQ] );
      fi;
    od; 

    return [fpfreps, indexlist];
  end); 



############################################################################
##
  FGRepT := function( prime, f )
##
## returns matrices P, Q, R  representing an fpf tetrahedral group, SL(2,3), 
## over Z(prime^f)
## this irreducible fpf representation is unique (upto equivalence)
## note that prime has to be a prime distinct from 2 and 3
##

  local P, Q, R,
 u, v, p,
 x;

      p := prime^f;
      u := 0; v := 0;  
      while (u^2+v^2+1) mod p <> 0 and u < p do  
 u := u+1; v := u;
        while (u^2+v^2+1) mod p <> 0 and v < p do 
    v := v+1;
 od;
      od;  

      P := [[u,v],[v,-u]];
      Q := [[0,-1],[1,0]];
## (p+1)/2 represents 1/2 in ZmodnZ( p ) 
      R := (p+1)/2*[[-1+u+v,-1-u+v],[1-u+v,-1-u-v]]; 

      return [P, Q, R]*One( ZmodnZ( p ) );
    end;




############################################################################
##
#M  FpfRepresentations3( <p>, <m>, <r> )
##
##  determines the fixed point free representations of a group of type 3
##  that is, with generators p, q, a, b
##  and relations a^m = 1, b^n = a^mprime  
##  b^(-1)*a*b = a^r where n is the multiplicative order of r in the group of
##  prime residues modulo m
##  p and q generate the quaternion group of size 8
##  if 3 divides n, then a commutes with p,q and
##     b^(-1)*p*b = q, b^(-1)*q*b = pq
##  if 3 does not divide n, then b commutes with p,q and
##     a^(-1)*p*a = q, a^(-1)*q*a = pq
##
##  m and r have to fulfill the following conditions:
##  3 divides m; m is odd; m and r are coprime.
##  Let n be the mult. order of r mod m. Then each prime divisor of n
##  divides m.
##  Let m' be maximal such that m' divides m and m' is coprime to n. Then
##  r = 1 \mod (m/m').
##
##  returns a list of lists of matrices corresponding to p, q, a and b
##  (or if r = 1 a list of triples of matrices corresponding to p, q and a)
##  which operate from the right on a ZmodnZ(p)-module
##  additionally a list <indexlist> of indices is returned as for metacyclic
##  or cyclic groups
##


InstallMethod(
 FpfRepresentations3,
 "SL(2,3)",
 true,
 [IsInt, IsInt, IsInt],
 10,
  function( p, m, r )

  local prime, f;

     if m <> 3 or r mod m <> 1 then
       TryNextMethod();
     fi;
     prime := SmallestRootInt( p );
     f := LogInt( p, prime );
     return [[FGRepT( prime, f )], [1]];     
  end );

 

InstallMethod(
 FpfRepresentations3,
 "default",
 true,
 [IsInt, IsInt, IsInt],
 0,
  function( p, m, r )

  local CmodmCstar, # group of prime residues mod <m>
 n,  # multiplicative order of <r> modulo <m>
 P, Q, R, # matrix representation of the binary tetrahedral
   # group of size 24 
 fpfreps_ab, # representations of <a,b> 
 A, AandB, # auxiliary matrices
 PP, QQ, AA, BB, # matrices (representations of the generators
   # of the type III group determined by the 
   # parameters <m> and <r> )
   # linear maps,  a: x -> x*AA
   #  b: x -> x*BB  
 fpfreps,  # list of matrices [PP, QQ, AA, BB]
   # determining the nonequivalent representations
 indexlist,  # AA^i, BB(i) for i in <indexlist> form all the
   # nonequivalent representations of <p,q,a,b> 
 prime, f, 
 t, mprime,
 auxiliary, I, I2,
 x;

      prime := SmallestRootInt( p );
      f := LogInt( p, prime );   
      r := r mod m;
      n := OrderMod( r, m ); 
      mprime := Cofactor( m, n );
 
      if n = 0 then 
        Error( "parameters are not feasible: <m> and <r> coprime" ); 
      elif prime = 2 or prime = 3 then
 Error( "field characteristic has to be coprime to 6" );
      elif m mod 2 = 0 or m mod 3 <> 0 or mprime = 0 or
    (n > 1 and r mod (m/mprime) <> 1) then 
 Error( "parameters are not feasible" );
      fi;

      auxiliary := FGRepT( prime, f );
      if m = 3 then 
       return [auxiliary,[1]];
      fi; 
      P := auxiliary[1]; Q := auxiliary[2]; R := auxiliary[3];

      fpfreps := [];
      if n = 1 then
## that is, if <a,b> is cyclic
 if m mod 9 = 0 then
   auxiliary := FpfRepresentationsCyclic( p, m );  
 else
   auxiliary := FpfRepresentationsCyclic( p, m/3 );
   fi;
 fpfreps_ab := auxiliary[1];
 indexlist := auxiliary[2];
 I := IdentityMat( Length( fpfreps_ab[1] ), ZmodnZ(p) );
 PP := KroneckerProduct( I, P );
 QQ := KroneckerProduct( I, Q );
 for A in fpfreps_ab do
   AA := KroneckerProduct( A, R );
    Add( fpfreps, [PP,QQ,AA] );
 od; 
 return [fpfreps, indexlist];
      fi;

## <a,b> is not cyclic

      if n mod 3 = 0 or m mod 9 = 0 then 
 auxiliary := FpfRepresentationsMetacyclic( p, m, r );
      else 
 auxiliary := FpfRepresentationsMetacyclic( p, m/3, r );
      fi;
      fpfreps_ab := auxiliary[1];
      indexlist := auxiliary[2];
      I := IdentityMat( Length( fpfreps_ab[1][1] ), ZmodnZ(p) );
      PP := KroneckerProduct( I, P );
      QQ := KroneckerProduct( I, Q ); 
      I2 := IdentityMat( 2, ZmodnZ(p) ); 

      if n mod 3 = 0 then
 for AandB in fpfreps_ab do
   AA := KroneckerProduct( AandB[1], I2 );
   BB := KroneckerProduct( AandB[2], R );
    Add( fpfreps, [PP,QQ,AA,BB] );
 od; 
      elif m mod 9 = 0 then         
 for AandB in fpfreps_ab do
   AA := KroneckerProduct( AandB[1], R );
   BB := KroneckerProduct( AandB[2], I2 );
    Add( fpfreps, [PP,QQ,AA,BB] );
 od;
      else
# Note: if 9 does not divide m, then we still want AA^mprime = BB^n,
# and not AA^mprime = BB^(3*n). Thus:
        t := SolutionDiophant( 3, m/3, 1)[1];
        for AandB in fpfreps_ab do
   AA := KroneckerProduct( AandB[1]^t, R );
   BB := KroneckerProduct( AandB[2], I2 );
    Add( fpfreps, [PP,QQ,AA,BB] );
 od;
      fi;

      return [fpfreps, indexlist];    
  end ); 





############################################################################
##
  FGRepO := function( prime, f )
##
## returns matrices P, Q, R, Z  representing an fpf binary octahedral group
## of order 48 over ZmodnZ(prime^f)
## note that prime has to be a prime distinct from 2 and 3
##

  local P, Q, R, Z, I,
 u, v, one, c, p,
 x;

      p := prime^f;
      u := 0; v := 0;  
      while (u^2+v^2+1) mod p <> 0 and u < p do  
 u := u+1; v := u;
        while (u^2+v^2+1) mod p <> 0 and v < p do 
    v := v+1;
 od;
      od;      

      P := [[u,v],[v,-u]];
      Q := [[0,-1],[1,0]];
      R := [[-1+u+v,-1-u+v],[1-u+v,-1-u-v]]*((p+1)/2); 
      Z := [[u-v,u+v],[u+v,-u+v]];  

      if prime^2 mod 16 = 1 then
##  x^2-2 splits over GF(p), c^2 = 1/2 
## In this case we obtain 2 non-equivalent irreducible fpf representations of 
## degree 2.
       c := RootMod( (p+1)/2, p );
       return [[P, Q, R, c*Z], [P, Q, R, -c*Z]]*One( ZmodnZ (p) );
      else 
##  x^2-2 does not split over GF(p)
## In this case we obtain one unique (upto equivalence) irreducible fpf
## representation of degree 4, which is induced from the unique irreducible fpf
## representation of the binary tetrahedral group, <p,q,r>.
 I := [[1,0],[0,1]];
 return [[BlockDiagonalMatrix( [P, Q*P] ),
  BlockDiagonalMatrix( [Q, -Q] ), 
  BlockDiagonalMatrix( [R, R^2] ),
         BlockMatrix( [[2,1,I], [1,2,-I]], 2, 2 )]*One( ZmodnZ (p) )];
      fi; 
    end;




############################################################################
##
  FGRep4C := function( p, f, m )
##
## returns matrices AR, CR such that
## AR^m = 1,
## CR^(-1)*AR*CR = AR^(p^(e/2)),
## CR^2 = 1/2
## for the representation of an fpf type-IV-group over R = ZmodnZ(p^f)
## cases c,d) with cyclic complement of the quaternion group in H
##
## note that p has to be a prime distinct from 2 and 3
##

  local e, # degree of irred. representation of C_m over GF(p) 
 k, # k = p^(e/2)
 l, # logarithm of 1/2 for the base w 
 gens, w,
 x;

    if f > 1 then
      Error( "Sorry, these ZmodnZ(p^f)-reps are not yet implemented" ); 
    fi;

    e := OrderMod( p, m );
    k := p^(e/2);
    w := Z(p^e);
    gens := Basis( GF( p^e ) ); 
    l := -LogFFE( 2*Z(p)^0, w );
## thus w^l = 1/2
    return [List( gens, x -> Coefficients( gens, x*w^((p^e-1)/m) ) ), 
     List( gens, x -> Coefficients( gens, x^k*w^(l/(k+1)) ) )];
  end;



############################################################################
##
  FGRep4 := function( p, f, m, mprime, d  )
##
## returns matrices A, Wu, B, Ws, C such that
##   A^m = 1,
##   (B*Wu)^(-1)*A*(B*Wu) = A^(p^d), (B*Wu)^n = A^mprime,
##   (C*Ws)^(-1)*A*(C*Ws) = A^(p^(e/2)), (B*Wu)*(C*Ws) = (C*Ws)*(B*Wu)
##   (C*Ws)^2 = 1/2*I
## for the representation of an fpf type-IV-group over R = ZmodnZ(p^f)
## cases c,d) with non-cyclic complement of the quaternion group in H
##
## note that p has to be a prime distinct from 2 and 3
##

  local e, # degree of irred. representation of C_m over GF(p) 
 n,     # n = e/gcd(e,d)
 q, # q = p^d
 k, # k = p^(e/2)
 l, # logarithm of 1/2 for the base w 
 u, v, r, s,
 F, gens, w,
 W, B, C, I,
 x;

    if f > 1 then 
      Error( "Sorry, these ZmodnZ(p^f)-reps are not yet implemented" ); 
    fi;

    e := OrderMod( p, m );
    n := e/Gcd( e, d );

## now: beta^n = alpha^mprime
## m/mprime divides q-1

    k := p^(e/2);
    q := p^d;
    F := GF( p^e ); 
    w := Z(p^e);
    gens := Basis( F ); 
 
    W := List( gens, x -> Coefficients( gens, w*x ) );
    C := List( gens, x -> Coefficients( gens, x^k ) );

    l := -LogFFE( 2*Z(p)^0, w );
## thus w^l = 1/2
    v := l/(k+1);

    if n = 1 then
      u := ((p^e-1)*mprime)/m;
      I := IdentityMat(e)*One(F);
      return [W^((p^e-1)/m), W^u, I, I, C*W^v];
    fi;

    B := List( gens, x -> Coefficients( gens, x^q ) );    
## u is determined by (WR^u)^[(q^n-1)/(q-1)] = AR^mprime
## same as in FGRepMC( p, f, m, mprime, d)
    u := ((p^(e/n)-1)*mprime)/m;
## v is determined by (C*W^v)^2 = 1/2*I and (B*W^u)*(C*W^v) = (C*W^v)*(B*W^u)
    r := SolutionDiophant( q-1, k+1, -(v*(q-1))/(k-1) )[1];
    s := SolutionDiophant( q-1, k+1, u )[1];

    B := List( gens, x -> Coefficients( gens, x^q ) );

    return [W^((p^e-1)/m), W^u, B, W^((k-1)*s), C*W^(v+(k-1)*r)];
  end;  


############################################################################
##
  FGRepSQHalf := function( p, f, e )
##
##  returns an e times e matrix C over ZmodnZ(p^f) such that C^2 = 1/2*I
##  e is even and 16 does not divide p^2-1
##

  local w, gens,
        n, c, half, C,  
 x, i;

    if f > 1 then
## This case poses a problem:
## C has to commute with the representation-matrices, A and B, of the
## metacyclic complement for the quaternion group in H.
## To guarantee this, we would have to compute C together with A and B. 
      Error( "Sorry, these ZmodnZ(p^f)-reps are not yet implemented" ); 
    fi;

    w := Z(p^e);
    gens := Basis( GF(p^e) ); 

    c := w^(-LogFFE( 2*Z(p)^0, w )/2);
    C := List( gens, x -> Coefficients( gens, x*c ) );
    return C;
  end;



############################################################################
##
#M  FpfRepresentations4( <p>, <m>, <r>, <k> )
##
##  determines the fixed point free representations of a group of type 4
##  that is, with generators p, q, a, b, z
##  and relations a^m = 1, b^n = a^mprime,    
##  b^(-1)*a*b = a^r where n is the multiplicative order of r in the group of
##  prime residues modulo m
##  p and q generate the quaternion group of size 8
##  b commutes with p,q and a^(-1)*p*a = q, a^(-1)*q*a = p*q
##
##  Hence, p, q, a, b generate a group of type 3, determined by m and r.
##  
##  z^2 = p^2, z^(-1)*p*z = q*p, z^(-1)*q*z = q^(-1), z^(-1)*a*z = a^k and
##  z commutes with b
##
##  m, r and k have to fulfill the following conditions:
##  3 divides m but 3 does not divide n; m is odd; m and r are coprime.
##  Let n be the mult. order of r mod m. Then each prime divisor of n
##  divides m.
##  Let m' be maximal such that m' divides m and m' is coprime to n. Then
##  r = 1 \mod (m/m').
##  k = -1 mod 3^s where s is maximal such that 3^s divides m
##  k = 1 mod (m/mprime) and k^2 = 1 mod m
##
##  returns a list of lists of matrices corresponding to p, q, a, b, z
##  (or if r = 1 a list of lists of matrices corresponding to p, q, a and z)
##  which operate from the right on a ZmodnZ(p)-module
##  additionally a list <indexlist> of indices is returned
##


InstallMethod(
 FpfRepresentations4,
 "m = 3",
 true,
 [IsInt, IsInt, IsInt, IsInt],
 50,
  function( p, m, r, k )

  local prime, f,
 fpfreps;

    if m <> 3 then 
      TryNextMethod(); 
    fi;   

    prime := SmallestRootInt( p );
    f := LogInt( p, prime );

    if prime = 2 or prime = 3 then
      Error( "field characteristic has to be coprime to 6" );
    elif r mod 3 <> 1 or k mod 3 <> 2 then  
      Error( "parameters are not feasible" );
    fi;

    fpfreps := FGRepO( prime, f );
    if Length( fpfreps ) = 1 then
## case b)      
      Info( InfoNearRing, 1, "induced representation from SL(2,3)" ); 
      return [fpfreps, [1]];
    else
## case a)
      Info( InfoNearRing, 1,
   "exception (a): representations as direct products" ); 
      return [fpfreps, [[1,1],[-1,1]]];
    fi;
end ); 



InstallMethod(
 FpfRepresentations4,
 "case a",
 true,
 [IsInt, IsInt, IsInt, IsInt],
 40,
  function( p, m, r, k )

  local P, Q,  # fpf representation of the quaternion group over 
 quaternion,  # ZmodnZ(p)
 fpfreps_H, # fpf representations of H over ZmodnZ(p)
 indexlist_H,
 c, Z2, ZZ,
 fpfreps, # list of matrices [PP,QQ,AA,BB,ZZ] (resp. for r = 1
   # [PP,QQ,AA,ZZ]) determining
   # the nonequivalent representations
 indexlist,
 n,  # mult. order of r modulo m
 auxiliary,   
 prime, f, 
 mprime, 
  x;

## checking the necessary conditions on the input parameters m, r, k:
    prime := SmallestRootInt( p );
    n := OrderMod( r, m );
    mprime := Cofactor( m, n );

    if prime = 2 or prime = 3 then
      Error( "field characteristic has to be coprime to 6" );
    elif m mod 2 = 0 or n mod 3 = 0 or mprime = 0 or
    (n > 1 and r mod (m/mprime) <> 1) then
      Error( "parameters are not feasible: 3 divides m; pq-condition" );
    elif OrderMod( k, m ) <> 2 or (k+1) mod 3 <> 0 or
    (n > 1 and k mod (m/mprime) <> 1) then
      Error( "parameters are not feasible: k has order 2" );
    fi; 

 
    if not( m mod 9 <> 0 and (k mod (m/3) = 1 or m = 3) and
       prime^2 mod 16 = 1 ) then
       TryNextMethod(); 
    fi;
##
## exception (a): 2 is a square in GF(prime)
##
    Info( InfoNearRing, 1,
   "exception (a): representations as direct products" ); 

    auxiliary := FpfRepresentations3( p, m, r );
    fpfreps_H := auxiliary[1];  
    indexlist_H := auxiliary[2];
    P := fpfreps_H[1][1]; Q := fpfreps_H[1][2];
    Z2 := P-P*Q;
    c := RootMod( (p+1)/2, p );
    ZZ := c*Z2;
## Each irred representation of H can be extended to two non-equivalent
## irred representations of <p,q,a,b,z> of the same degree by adding
## ZZ resp. -ZZ 
    fpfreps := Concatenation( List( fpfreps_H, x -> 
  [Concatenation( x, [ZZ] ), Concatenation( x, [-ZZ] )] ) );
    indexlist := Concatenation( List( indexlist_H, x -> [[1,x],[-1,x]] ) );
  
    return [fpfreps, indexlist];
end );



InstallMethod(
 FpfRepresentations4,
 "case b",
 true,
 [IsInt, IsInt, IsInt, IsInt],
 30,
  function( p, m, r, k )

  local P, Q,  # fpf representation of the quaternion group over 
 quaternion,  # ZmodnZ(p)
 fpfreps_H, # fpf representations of H over ZmodnZ(p)
 indexlist_H,
 C, Z2, ZZ,
 e, auxiliary, t,   
 prime, f, 
  x;

    prime := SmallestRootInt( p );
    e := OrderMod( p, m/3 );

    if not (m mod 9 <> 0 and (k mod (m/3) = 1 or m = 3) and e mod 2 = 0) then
       TryNextMethod(); 
    fi;
##
## exception (b): determine a 2 times 2 matrix C induced by scalar
## multiplication in GF(prime^2) such that C^2 = 1/2 I2 
##
    Info( InfoNearRing, 1, "exception (b): extending type-III representations" ); 
    auxiliary := FpfRepresentations3( p, m, r );
    fpfreps_H := auxiliary[1];  
    indexlist_H := auxiliary[2];

    f := LogInt( p, prime );
    quaternion := FGRepQ( p, f );   
    P := quaternion[1]; Q := quaternion[2];
    Z2 := P-P*Q;
## Note: For f > 1 there is a problem:
## C has to commute with the representation-matrices, A and B, of the
## metacyclic complement for the quaternion group in H.
## To guarantee this, we would have to compute C together with A and B. 
    t := Size( GroupByPrimeResidues( [p,r], m/3 ) )/e;  
    C := FGRepSQHalf( prime, f, e );
    ZZ := BlockDiagonalMatrix( List( [1..t], x ->
      KroneckerProduct( C, Z2 ) ) );

## each irred representation of H can be extended to an irred rep of
## <p,q,a,b,z> of the same degree by adding ZZ

    return [List( fpfreps_H, x -> Concatenation( x, [ZZ] ) ), indexlist_H];
end );



InstallMethod(
 FpfRepresentations4,
 "cases c,d",
 true,
 [IsInt, IsInt, IsInt, IsInt],
 20,
  function( p, m, r, k )

  local P, Q, R, # representation of the binary tetrahedral group of
 tetrahedral, # size 24 
 fpfreps, # fpf representations of H over ZmodnZ(p)
 indexlist,
 CmodmCstar, # group of prime residues modulo m (resp. m/3 if
   # m mod 9 <> 0 )
 Ubykpr,
 A, B, C, Wu, Ws, I,
 Z2, I2, subdiagonal,
 PP, QQ, AA, BB, ZZ,
 n, mprime,
 e, t, auxiliary,   
 prime, f,
 q, d, 
  x, i;

    prime := SmallestRootInt( p );
    if m mod 9 = 0 then
      e := OrderMod( prime, m );
      if not( e mod 2 = 0 and (k-prime^(e/2)) mod m = 0 ) then  
       TryNextMethod();   
      fi;
##  exceptional case d)
      Info( InfoNearRing, 1, "exception (d): extending type-III representations" );
      n := OrderMod( r, m ); 
      mprime := Cofactor( m, n );  
    else   ## m only divisible by 3 
      e := OrderMod( prime, m/3 );
      if not( e mod 2 = 0 and (k-prime^(e/2)) mod (m/3) = 0 ) then  
       TryNextMethod();      
      fi;
##  exceptional case c)
      Info( InfoNearRing, 1, "exception (c): extending type-III representations" );
      n := OrderMod( r, m );  ## OrderMod( r, m ) = OrderMod( r, m/3 ) 
      mprime := Cofactor( m, n );  
      m := m/3; 
    fi;

##
## Note: finding matrix representations for a,b,z fulfilling
## z^(-1)*a*z = a^k and z^(-1)*b*z = b is best done simultanously.
## Therefore we do not use the representations of H and extend them with a
## matrix ZZ, but compute the matrices AA, BB, ZZ from scratch.
##

    CmodmCstar := Units( Integers mod m );
    Ubykpr := GroupByPrimeResidues( [prime, r], m );
    indexlist := List( RightCosets( CmodmCstar, Ubykpr ),
      x -> Int( Representative(x) ) );   
    f := LogInt (p, prime);
    tetrahedral := FGRepT( prime, f );
    P := tetrahedral[1]; Q := tetrahedral[2]; R := tetrahedral[3]; 
    Z2 := P-P*Q;
    I := IdentityMat(Size(Ubykpr))*One(ZmodnZ(p)); 
    PP := KroneckerProduct( I, P );
    QQ := KroneckerProduct( I, Q );

    if r mod m = 1 then
## that is, the complement of the quaternion group in H is cyclic
      auxiliary := FGRep4C( prime, f, m );
      A := auxiliary[1];
      C := auxiliary[2];
      ZZ := KroneckerProduct( C, Z2 );
      fpfreps := List( indexlist, x ->
    [PP,QQ, KroneckerProduct( A^x, R ), ZZ] );
    else
## that is, the complement of the quaternion group in H is not cyclic,
## but metacyclic
      t := Size( Ubykpr )/e;
      r := r mod m;
      q := r^t mod m;
      d := LogMod( q, prime, m ); 
# If q = 1, then d = 0. 
      auxiliary := FGRep4( prime, f, m, mprime, d  );        
      A := auxiliary[1];
      Wu := auxiliary[2]; B := auxiliary[3];
      Ws := auxiliary[4]; C := auxiliary[5];
      I := IdentityMat(e)*One(ZmodnZ(p));
      subdiagonal := List( [1..t-1], x -> [x+1, x, I] );
      I2 := IdentityMat(2)*One(ZmodnZ(p));

      fpfreps := [];
      for i in indexlist do
       AA := KroneckerProduct(
   BlockDiagonalMatrix( List( [0..t-1], x -> A^(i*r^x) ) ), R );
        BB := KroneckerProduct(
     BlockMatrix( Concatenation( subdiagonal, [[1, t, B*Wu^i]] ), t, t ), I2);
        ZZ := KroneckerProduct(
  BlockDiagonalMatrix( List( [0..t-1], x -> C*Ws^i ) ), Z2 );
        Add( fpfreps, [PP,QQ,AA,BB,ZZ] );
      od; 
    fi;
  
    return [fpfreps, indexlist]; 
end );



InstallMethod(
 FpfRepresentations4,
 "induced representations",
 true,
 [IsInt, IsInt, IsInt, IsInt],
 0,
  function( p, m, r, k )

  local P, Q, A, B, I, # auxiliary matrices (representation of the
 auxiliary, # generators of H)
 indexlist_H, fpfreps_H,
 PP, QQ,  # matrices  (representing the generators of the
 AA, BB, ZZ, # type-IV-group determined by m,r and k)
 fpfreps, # list of matrices [PP,QQ,AA,BB,ZZ] (resp. for r = 1
   # [PP,QQ,AA,ZZ]) determining
   # the nonequivalent representations
 indexlist,
 CmodmCstar, # group of prime residues modulo m (resp. m/3 if
   # m mod 9 <> 0 ) 
 n,  # size of the subgroup of CmodmCstar generated by r
 Ubykpr,  # subgroup of CmodmCstar generated by k, prime and r
 rcs,   # RightCosets( CmodmCstar, Ubykpr )
 constituents, # for induction: list of indices i such that the
   # fpfreps_H[i] induce nonequivalent representations 
 prime,
  i, x, y;

##
## If none of the exceptional cases holds, then the irreducible representations
## are simply those induced by the irred reps of H of type III and index 2.
##

    prime := SmallestRootInt( p );
    n := OrderMod( r, m );

    Info( InfoNearRing, 1, "GF(", prime,
   ")-representations of the type-IV-group are induced" );

    auxiliary := FpfRepresentations3( p, m, r );
    fpfreps_H := auxiliary[1];
    indexlist_H := auxiliary[2];
    I := IdentityMat( Length(fpfreps_H[1][1]), ZmodnZ(p) );
    P := fpfreps_H[1][1]; Q := fpfreps_H[1][2];
    PP := BlockDiagonalMatrix( [P, Q*P] );
    QQ := BlockDiagonalMatrix( [Q, -Q] ); 
    ZZ := BlockMatrix( [[2, 1, I], [1, 2, -I]], 2, 2 );
 
    if m mod 9 <> 0 and (k mod (m/3) = 1 or m = 3) then
## Note: if 9 does not divide m and k = 1 modulo m/3 (and e is odd),
## then the nonequivalent irred reps of H all induce nonequivalent irred reps
## of <p,q,a,b,z>
     constituents := [1..Length(indexlist_H)];
    else
## 2 respective nonequivalent irred reps of H (index i and i*k)
## induce the same irred rep of <p,q,a,b,z>
      if m mod 9 = 0 then 
        CmodmCstar := Units( Integers mod m );
        Ubykpr := GroupByPrimeResidues( [k, prime, r], m );
      else
       CmodmCstar := Units( Integers mod (m/3) );
        Ubykpr := GroupByPrimeResidues( [k, prime, r], m/3 );
      fi; 
      rcs := RightCosets( CmodmCstar, Ubykpr );
      constituents := List( rcs, x ->
  PositionProperty( indexlist_H, y -> y*One(CmodmCstar) in x ) );
    fi;

    k := k mod m;
    fpfreps := []; indexlist := [];
    if n = 1 then
## that is, if <a,b> is cyclic
      for i in constituents do
        A := fpfreps_H[i][3];
 AA := BlockDiagonalMatrix( [A, A^k] );
 Add( indexlist, indexlist_H[i] );
 Add( fpfreps, [PP, QQ, AA, ZZ] );
      od;
    else
      for i in constituents do 
       A := fpfreps_H[i][3]; B := fpfreps_H[i][4];
       AA := BlockDiagonalMatrix( [A, A^k] );
       BB := BlockDiagonalMatrix( [B, B] );   
       Add( indexlist, indexlist_H[i] );
       Add( fpfreps, [PP, QQ, AA, BB, ZZ] );
      od;
    fi;
    
    return [fpfreps, indexlist]; 

end );







##
##  FPF AUTOMORPHISM GROUPS OF ABELIAN GROUPS 
##


##
##  In order to build the generators of the non-conjugate fixed point free
##  automorphism groups from the irreducible fpf representations, some
##  combinatorical functions are needed. 
##


  OnRightSets := function( list, g )   
    return SortedList( OnRight( list, g ) );
  end;

  OnRightTuplesSets := function( e, g )
    return List( e, function(i) return OnRightSets( i, g ); end );
  end;  


############################################################################
##
  IndexCombs := function( nr, indexlist, invariancegrp )
##
##  nr[i]     number of indices to be combined 
##  indexlist[i]  indices to be combined, coset representatives
##   of the respective invariancegrp[i]
##
##  returns combinations of coset-representatives not necessarily
##  corresponding to the indices in indexlist;
##  used to find the non-conjugate CYCLIC fpf aut groups acting on 
##  an abelian group from fpf representations.
##  Don't use this function for non-cyclic fpf aut groups. Take IndexCombs2 
##  instead.
##
  local G,  ## group acting on the index combinations; index combs
   ## from the same G-orbit yield conjugate aut groups
 one, U, 
 cosets, reps,
 tuples, l,
 i, tuple, x, y;
 

    G := Parent( invariancegrp[1] );
    one := One( invariancegrp[1] );
    l := Length(nr);
    cosets := []; tuples := [];
    for i in [1..l] do
      U := invariancegrp[i]; 
      Add( cosets, List( indexlist[i], x -> RightCoset( U, x*one ) ) );
      Add( tuples, UnorderedTuples( cosets[i], nr[i] ) );
    od;

    reps := List( Orbits( G, Cartesian( tuples ), OnRightTuplesSets ),
        Representative ); 
##
## Note: the indices as determined in the next step are not necessarily
## the same numbers as the initial representatives as given in indexlist. 
## However, for the use of the combinations in FpfAutGrpsC 
## this does not matter 
##
   return List( reps, tuple -> List( tuple, set ->
    List( set, x -> Int(Representative(x)) ) ) );
 end;


############################################################################
##
  IndexCombs2 := function( nr, indexlist, invariancegrp, G )
##
##  nr[i]     number of indices to be combined 
##  indexlist[i]  indices to be combined, coset representatives
##   of the respective invariancegrp[i]
##  G   group acting on the index combinations; index combs
##   from the same G-orbit yield conjugate aut groups
##
##  returns combinations of the positions of cosets with respect to indexlist 
##

  local one,
 cosets, reps, U,
 tuples, l, positions,
 i, tuple, x, y;
 
    one := One(G);
    l := Length(nr);
    cosets := []; tuples := [];
    for i in [1..l] do
      U := invariancegrp[i]; 
      Add( cosets, List( indexlist[i], x -> RightCoset( U, x*one ) ) );
      Add( tuples, UnorderedTuples( cosets[i], nr[i] ) );
    od;
    Info( InfoNearRing, 3, "Cartesian( tuples ) = ", Cartesian( tuples ) );
    reps := List( Orbits( G, Cartesian( tuples ), OnRightTuplesSets ),
        Representative ); 
    positions := [];
    for tuple in reps do
      Add( positions, List( [1..l], i -> List( tuple[i],
     x -> Position( cosets[i], x ) ) ) );
    od;
    return positions;
 end;




############################################################################
##
#M  FpfAutGrpsC( <primepowers>, <dimensions>, <m> )
##
##  returns the "matrix"-generators for non conjugate cyclic fpf groups of
##  order m on the abelian group
##  (Z_p1)^d1 x...x (Z_pl)^dl for <primepowers> = [p1,...,pl]
##  and the integers <dimensions> = [d1,...,dl]
##
##  <primepowers> has to be sorted, [8,4,2,27,3,...], according to the order
##  as given in FpfAutomorphismGroupsCyclic
##

InstallMethod(
 FpfAutGrpsC,
 "default",
 true,
 [IsList, IsList, IsInt],
 0,
 function( ps, ds, m )  


  local CmodmCstar, # multiplicative group of residues prime to m
 prime, f,
 l,
 nr, indexlist, invariancegrp,
 A,
 fpfreps,
        U, e,  # subgroup of CmodmCstar generated by prime and
   # its size (degree of the irr. fpf rep over GF(prime))
 matrices,
   pnew,
 i, tuple, x, y;

    CmodmCstar := Units( Integers mod m );

    prime := 0;
    l := Length( ps );  
    nr := []; indexlist := []; invariancegrp := []; fpfreps := [];
    for i in [1..l] do
      pnew := SmallestRootInt( ps[i] );
      f := LogInt( ps[i], pnew );
      if pnew <> prime then
 prime := pnew;  
 A := MatrixInt( FGRepC( prime, f, m ) );
        U := GroupByPrimeResidues( [prime], m );
 e := Size( U ); 
      fi;

      if ds[i] mod e <> 0 then
 Error( "no fpf aut group of size m on this group: degree" );
      fi;  
 
      Add( nr, ds[i]/e );
      Add( indexlist, List( RightCosets(CmodmCstar, U), Representative ) );
      Add( invariancegrp, U );

      Add( fpfreps, A*One(ZmodnZ( ps[i] )) );
    od;

    matrices := [];
    for tuple in IndexCombs( nr, indexlist, invariancegrp ) do
      Add( matrices, List( [1..l],
  i -> BlockDiagonalMatrix( List( tuple[i], x -> fpfreps[i]^x ) ) ) );
    od;

    return matrices;
  end );


############################################################################
##
#M  FpfAutomorphismGroupsCyclic ( <ints>, <m> )
##
## determines one representative for each conjugacy class of cyclic
## fpf automorphism groups of size m acting on the abelian group
## AbelianGroup( ints )
## returns this list of nonconjugate fpf aut groups and AbelianGroup( ints )
##
## ints has to be a list of prime power integers and is ordered in
## the following function
##

InstallMethod(
 FpfAutomorphismGroupsCyclic,
 "default",
 true,
 [IsList, IsInt],
 0,
 function( ints, m )  

  local coll,
 ps, ds,
 matrices,
 G, gens,
 x, y;

    coll := Collected( ints );
    Sort( coll, function( x, y ) 
  local p, q;
    p := SmallestRootInt(x[1]);
           q := SmallestRootInt(y[1]);
         return p > q or ( p = q and x[1] > y[1] ); end );

    ps := List( coll, x -> x[1] ); 
    ds := List( coll, x -> x[2] );
    
    matrices := FpfAutGrpsC( ps, ds, m );

    G := AbelianGroup( Concatenation( List( [1..Length( ps )], i ->
      List( [1..ds[i]], x -> ps[i] ) ) ) );  
    gens := GeneratorsOfGroup( G );  

    return [List( matrices, A -> GroupHomomorphismByMatrix( G, gens, A ) ),
          G];
end );




############################################################################
##
#M  FpfAutGrpsMC( <primepowers>, <dimensions>, <m>, <r> )
##
##  returns the matrix generators for non conjugate metacyclic fpf groups of
##  order m*OrderMod(r,m) on the abelian group
##  (Z_p1)^d1 x...x (Z_pl)^dl for <primepowers> = [p1,...,pl]
##  and the integers <dimensions> = [d1,...,dl]
##
##  <primepowers> has to be sorted, [8,4,2,27,3,...], according to the order
##  as given in FpfAutomorphismGroupsMetacyclic, etc.
##

InstallMethod(
 FpfAutGrpsMC,
 "default",
 true,
 [IsList, IsList, IsInt, IsInt],
 0,
 function( ps, ds, m, r )  


  local CmodmCstar, # multiplicative group of residues prime to m
 prime, f,
 l,
 nr, indexlist, invariancegrp,
 aux,
 fpfreps,
        Ubyrandprime, # subgroup of CmodmCstar generated by r and prime and
 deg,  # its size (degree of the irr. fpf rep over GF(prime))
 n,  # OrderMod( r, m )
 mprime, q,
 G,  ## subgroup of CmodmCstar, acting on the index
   ## combinations; index combs from the same G-orbit
   ## yield conjugate aut groups
  nrmatgens,
 matrices,
   pnew,
 i, g, aandb, tuple, x, y;

    CmodmCstar := Units( Integers mod m );

    prime := 0;
    l := Length( ps );  
    nr := []; indexlist := []; invariancegrp := []; fpfreps := [];
    for i in [1..l] do
      pnew := SmallestRootInt( ps[i] );
      f := LogInt( ps[i], pnew );
      if pnew <> prime then
 prime := pnew;  
 aux := FpfRepresentationsMetacyclic( ps[i], m, r );
        Ubyrandprime := GroupByPrimeResidues( [prime, r], m );
 deg := Size( Ubyrandprime ); 
      fi;

      if ds[i] mod deg <> 0 then
 Error( "no such fpf aut group on this group: degree" );
      fi;  
 
      Add( nr, ds[i]/deg );
      Add( indexlist, aux[2] );
      Add( invariancegrp, Ubyrandprime );
      Add( fpfreps, List( aux[1], aandb -> List( aandb, MatrixInt ) ) );
    od;
##
## Determine the group G acting on the combinations of representation indices
## such that index combs from the same G-orbit yield conjugate aut groups.
## Note: For reps of cyclic groups G = CmodmCstar;
##  for metacyclic groups G can be smaller than CmodmCstar.
##
    n := OrderMod( r, m );  
    q := Maxfactor( m, 2 );
    if q > 2 and (r+1) mod q = 0 and n mod 4 = 2 then
## type II, quaternion 2-Sylow subgroup
      mprime := Cofactor( m/2, n/2 );
      if mprime = 0 or r mod (m/mprime) <> 1 then
 Error( "parameters are not feasible" );
      fi;
      Info( InfoNearRing, 1,
   "parameters are feasible; metacyclic group of type II" );
    else 
## type I, all Sylow subgroups are cyclic
      mprime := Cofactor( m, n );
      if mprime = 0 or r mod (m/mprime) <> 1 then
 Error( "parameters are not feasible" );
      fi;
      Info( InfoNearRing, 1,
   "parameters are feasible; metacyclic group of type I" );
    fi;

    g := Gcd( n, m/mprime ); 
    G := GroupByPrimeResidues( 
 Filtered( List( [0..m/g-1], x -> 1+x*g ), y -> Gcd(m,y) = 1 ), m );

    Info( InfoNearRing, 3, " Size( G ) = ", Size( G ) );

    matrices := [];
    nrmatgens := 2;    ##  2 generators for the metacyclic group
    for tuple in IndexCombs2( nr, indexlist, invariancegrp, G ) do
      Add( matrices, List( [1..nrmatgens], z -> List( [1..l], i ->
--> --------------------

--> maximum size reached

--> --------------------

[ Dauer der Verarbeitung: 0.59 Sekunden  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge