Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/wedderga/lib/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 7.6.2025 mit Größe 22 kB image not shown  

Quelle  auxiliar.gi   Sprache: unbekannt

 
#############################################################################
##
#W  auxiliar.gi           The Wedderga package            Osnel Broche Cristo
#W                                                         Olexandr Konovalov
#W                                                            Aurora Olivieri
#W                                                           Gabriela Olteanu
#W                                                              Ángel del Río
#W                                                          Inneke Van Gelder
##
#############################################################################


#############################################################################
##
#P IsSemisimpleRationalGroupAlgebra( FG )
##  
## The function checks whether a group ring is a rational group algebra 
## of a finite group
##
InstallImmediateMethod( IsSemisimpleRationalGroupAlgebra,
    IsGroupRing,
    0,
R -> IsRationals(LeftActingDomain(R)) and IsFinite(UnderlyingMagma(R))); 


#############################################################################
##
#P IsSemisimpleZeroCharacteristicGroupAlgebra( FG )
##  
## The function checks whether a group ring is a group algebra 
## of a finite group over the field of characteristic zero
##
InstallImmediateMethod( IsSemisimpleZeroCharacteristicGroupAlgebra,
    IsGroupRing, 
    0,
R -> Characteristic(LeftActingDomain(R))=0 and IsFinite(UnderlyingMagma(R))); 


#############################################################################
##
#P IsCFGroupAlgebra( FG )
##  
## The function checks whether a group ring is a group algebra of a finite
## group over a cyclotomic field
##
InstallImmediateMethod( IsCFGroupAlgebra,
    IsGroupRing, 
    0,
R ->  IsField(LeftActingDomain(R)) and IsCyclotomicField(LeftActingDomain(R)) and IsFinite(UnderlyingMagma(R))); 

#############################################################################
##
#P IsSemisimpleANFGroupAlgebra( FG )
##  
## The function checks whether a group ring is a group algebra of a finite
## group over an abelian number field
##
InstallImmediateMethod( IsSemisimpleANFGroupAlgebra,
    IsGroupRing, 
    0,
R -> IsField(LeftActingDomain(R)) and IsAbelianNumberField(LeftActingDomain(R)) and IsFinite(UnderlyingMagma(R))); 


#############################################################################
##
#P IsSemisimpleFiniteGroupAlgebra( FG )
##  
## The function checks whether a group ring is a semisimple group algebra
## of a finite group over a finite field
##
InstallImmediateMethod( IsSemisimpleFiniteGroupAlgebra,
    IsGroupRing, 
    0,
function( FG )
 local   F,      # Field
         G;      # Group

 F := LeftActingDomain( FG );
 G := UnderlyingMagma( FG );
       
 return IsField( F ) and IsFinite( F ) and IsFinite( G ) and 
        Gcd( Size( F ), Size( G ) ) = 1;
end); 


#############################################################################
##
#M IsCompleteSetOfPCIs( R, ListPCIs )
##
## The function checks if the sum of given idempotents of a ring R is the
## identity element of R. It is supposed to be used to check if a given 
## list of PCIs of R is complete.
##
InstallMethod( IsCompleteSetOfPCIs,
    "for list of idempotents", 
    true, 
    [ IsRing, IsList ], 
    0,
function( R, ListPCIs )
    local x;
    if not ForAll( ListPCIs, x -> x in R ) then
        Error("Wedderga: An element of <ListPCIs> does not belong to <R>!!!\n");
    else
        return Sum( ListPCIs ) = One( R ) and ForAll( ListPCIs, x -> x=x^2 );
    fi;
end);

#############################################################################
##
#M IsCompleteSetOfOrthogonalIdempotents( R, List )
##
## The function checks if List is a complete set of orthogonal central 
## idempotents of a ring R.
##
InstallMethod( IsCompleteSetOfOrthogonalIdempotents,
    "for list of idempotents", 
    true, 
    [ IsRing, IsList ], 
    0,
function( R, ListPCIs )
    if not ForAll( ListPCIs, x -> x in R ) then
        Error("Wedderga: An element of <ListPCIs> does not belong to <R> !!!\n");
    elif ForAny( ListPCIs, IsZero ) then
        Error("Wedderga: Zero element in  <ListPCIs> !!!\n");
    else
        return Sum( ListPCIs ) = One( R ) and 
                    ForAll( [1..Length(ListPCIs)], i -> 
                        ListPCIs[i]= ListPCIs[i]^2 and 
                        ForAll ( [(i+1)..Length(ListPCIs)], j -> 
                            ListPCIs[i]* ListPCIs[j] = Zero(R) ) ) ;
    fi;
end);




#############################################################################
##
#F IsStrongShodaPair( G, K, H )
##
## The function IsStrongShodaPair checks if (H,K) is a strong Shoda pair of G
##
InstallMethod( IsStrongShodaPair,
    "for a group and two subgroups", 
    true,
    [ IsGroup, IsGroup, IsGroup ], 
    0,
function( G, K, H )
local   QG,
        NH,
        Eps,
        NdK,
        eGKH1,
        RTNH,
        i,
        g,
        RTNdK,
        nRTNdK,
        Epi,
        NHH,
        KH,
  zero;

# First verifies if H, K are subgroups of G and K is a normal subgroup of K
if not ( IsSubgroup( G, K ) and IsSubgroup( K, H ) ) then
    Error("Wedderga: <G> must contain <K> and <K> must contain <H> !!!\n");
fi;

if not IsNormal( K, H ) then
    Info(InfoWedderga, 2, "Wedderga: IsSSP: <H> is not normal in <K>");
    return false;
fi;

# Now, if K/H is the maximal abelian subgroup in N/H,
# where N is the normalizer of H in G

NH:=Normalizer(G,H);

if not(IsNormal( NH, K ) ) then
    Info(InfoWedderga, 2, "Wedderga: IsSSP: <K> is not normal in N_<G>(<H>)");
    return false;
fi;

Epi:=NaturalHomomorphismByNormalSubgroup( NH, H ) ;
NHH:=Image( Epi, NH ); #It is isomorphic to the factor group NH/H.
KH:=Image( Epi, K ); #It is isomorphic to the factor group K/H.

if not(IsCyclic(KH)) then
    Info(InfoWedderga, 2, "Wedderga: IsSSP: <K>/<H> is not cyclic");
    return false;
fi;

if Centralizer( NHH, KH ) <> KH then
    Info(InfoWedderga, 2, "Wedderga: IsSSP: <K>/<H> is not maximal ",
                     "abelian in N_<G>(<H>)");
    return false;
fi;

#Now (SSS3)
QG := GroupRing( Rationals, G );
zero := Zero( QG );
Eps := IdempotentBySubgroups( QG, K, H );
NdK := Normalizer( G, K );

if NdK<>G then
    RTNH := RightTransversal( NdK, NH );
    eGKH1 := Sum( List( RTNH, g -> Eps^g ) ); 
    RTNdK := RightTransversal( G, NdK );
    nRTNdK:=Length(RTNdK);
    for i in [ 2 .. nRTNdK ] do
        g:=RTNdK[i];
        if eGKH1*eGKH1^g <> zero then
            Info(InfoWedderga, 2, 
                 "Wedderga: IsSSP: The conjugates of epsilon are not orthogonal");
            return  false;
        fi;
    od;
fi;

return true;

end);


#############################################################################
##
#M Centralizer( G, a )
##
## The function Centralizer computes the centralizer of an
## element of a group ring in a subgroup of the underlying group
##
InstallMethod( Centralizer,
    "Wedderga: for a subgroup of an underlying group and a group ring element",
    function( F1, F2 )    
      return IsBound( F2!.familyMagma ) and
             IsIdenticalObj( F1, F2!.familyMagma);
    end,  
    [ IsGroup, IsElementOfFreeMagmaRing ], 
    0,
function( G, a ) 
local   C,
        leftover,
        cosrep,
        g, 
        h;

C := TrivialSubgroup( G );
cosrep := [ One(G) ];
leftover := Difference( G, C );
while leftover <> [] do
    g := leftover[1];
    if a^g = a then 
        C := Subgroup( G, Union( GeneratorsOfGroup( C ), [ g ] ) );
    else 
        Add( cosrep, g );
    fi;
    leftover := Difference( leftover, 
    Flat( List ( Set( List( cosrep, h -> RightCoset( C, h ) ) ), AsList ) ) );
od;
return C;
end);


#############################################################################
##
#M OnPoints( a, g )
##
## The function OnPoints(a,g) computes the conjugate a^g where a is an 
## element of the group ring FG and g an element of G. You can use the
## notation a^g to compute it as well.
##
InstallMethod( \^,
    "Wedderga: for a group ring element and a group element",
    function( F1, F2 )
      return IsBound( F1!.familyMagma ) and 
             IsIdenticalObj( ElementsFamily( F1!.familyMagma ), F2 );
    end,
    [ IsElementOfFreeMagmaRing, IsMultiplicativeElementWithInverse ], 
    0,
function( a, g )
local   coeffsupp,
        coeff,
        supp,
        lsupp;

coeffsupp := CoefficientsAndMagmaElements(a);
lsupp := Size(coeffsupp)/2;
supp := List( [ 1 .. lsupp ], i -> coeffsupp [ 2*i-1 ]^g );
coeff := List([ 1 .. lsupp ], i -> coeffsupp[2*i] );

return ElementOfMagmaRing( FamilyObj( a ) ,
                                Zero( a ),
                                coeff,
                                supp);
end);


#############################################################################
##
## CyclotomicClasses( q, n )
##
## The function CyclotomicClasses computes the set of the Cyclotomic Classes
## of q module n 
##
InstallMethod( CyclotomicClasses,
    "for pairs of positive integers", 
    true, 
    [ IsPosInt, IsPosInt ], 
    0,
function(q, n)
local   cc,     # List of cyclotomic classes
        ccc,    # Cyclotomic Class
        i,      # Representative of cyclotomic class
        leftover,  # List of integers
        j;      # Integer
        
# Initialization     
if Gcd( q, n ) <> 1 then
    Error("Wedderga: <q> and <n> should be relatively prime"); 
fi;

#Program
cc := [ [0] ];
leftover:=[ 1 .. n-1 ];
while leftover <> [] do
    i := leftover[ 1 ];
    ccc := [ i ];
    j:=q*i mod n;
    while j <> i do
        Add( ccc, j );
        j:=j*q mod n;
    od;
    Add( cc, ccc );
    leftover := Difference( leftover, ccc );
od;
return cc;
end);


#############################################################################
##
## BigPrimitiveRoot( q )
##
## The function BigPrimitiveRoot computes a primitive root of the finite 
## field of order q.
##
InstallMethod( BigPrimitiveRoot,
    "for a prime power", 
    true, 
    [ IsPosInt ], 
    0,
function(q)
local   Fq,      # The finite field of order q
        factors, # prime factors of q
        p,       # The only prime divisor of q
        o,       # q = p^o
        cp,      # The conway polynomial 
        pr;      # A primitive root of Fq 

# Initialization     
if not IsPrimePowerInt( q ) then
    Error("Wedderga: The input must be a prime power!!!"); 
fi;

#Program
if q<=2^16 then
    Fq := GF(q);
    pr := PrimitiveRoot(Fq);
else
    factors := FactorsInt(q);
    p:=factors[1];
    o:=Size(factors);
    # If q^o is too big then gap never finish to compute the ConwayPolynomial.
    # If there is not cheap ConwayPolynomial, random primitive will be enough
    if IsCheapConwayPolynomial(p,o) then
      cp := ConwayPolynomial(p,o);
    else
      cp := RandomPrimitivePolynomial(p,o);  
    fi;  
    Fq := GF(p, cp);
    pr := RootOfDefiningPolynomial(Fq);
fi;
return pr;
end);


#############################################################################
##
## BigTrace( o, Fq, a )
##
## The function BigTrace returns the trace of the element a in the field 
## extension Fq^o/Fq.
##
InstallMethod( BigTrace,
    "for elements of finite fields", 
    true, 
    [ IsPosInt, IsField, IsObject ], 
    0,
function( o, Fq, a )
local   q,      # The order of the field Fq
        t, y,   # Elements of finite field
        i;      # Integer
        
# Program               
q := Size(Fq);
t := a;
y := a;
for i in [ 1 .. o-1 ] do
    y := y^q;
    t := t + y;
od;
if not(IsFFE(t)) then
    t := ExtRepOfObj(t)[1];
fi;
  return t;
end);


#############################################################################
##
#P IsStronglyMonomial( G )
## ## The property checks whether a group is strongly monomial
##
InstallMethod( IsStronglyMonomial,
    "for finite groups",
    true,
  [ IsGroup ],
  0,
function( G )

local QG ;
 if IsFinite(G) then
#  if IsSupersolvable(G) or IsAbelian(DerivedSubgroup(G)) then
   if IsAbelian(SupersolvableResiduum(G)) then
      return true;
  elif IsMonomial(G) then
      QG := GroupRing( Rationals, G );
      # enforce setting of IsStronglyMonomial
      SSPNonESSPAndTheirIdempotents( QG );
      return IsStronglyMonomial(G);
  else
      return false;
  fi;
else
  Error("Wedderga: The input should be a finite group\n");
fi;
end);


#############################################################################
##
#M IsCyclotomicClass( q, n, C )
##
## The function IsCyclotomicClass checks if C is a q-cyclotomic class module n
##
InstallMethod( IsCyclotomicClass,
 "for two coprime positive integers and a list of integers", 
 true, 
 [ IsPosInt, IsPosInt, IsList ], 
 0,
function( q, n, C )
    local c,C1,j;

c:=C[1];

if n=1 then 
    return C=[0];
elif Gcd(q,n)<> 1 then
    Error("Wedderga: <q> and <n> should be coprime");
elif c >= n then
    return false;
else 
    C1:=[c];
    j:=q*c mod n;
    while j <> c do
      Add( C1, j );
      j:=j*q mod n;
    od;  
    return Set(C)=Set(C1);
fi;

end);


#############################################################################
##
#P IsCyclGroupAlgebra( FG )
##  
## The function checks whether a group is strongly monomial
##
InstallMethod( IsCyclGroupAlgebra, 
    "for semisimple group algebras", 
    true, 
    [ IsGroupRing ], 
    0,
function( FG )

local G ;

G := UnderlyingMagma(FG);

if not(IsSemisimpleFiniteGroupAlgebra(FG) or IsSemisimpleZeroCharacteristicGroupAlgebra(FG)) then 
  Error("Wedderga: The input should be a semisimple group algebra \n",
        "over a finite or a zero characteristic field \n");
fi;

if IsSemisimpleFiniteGroupAlgebra(FG) or 
   IsStronglyMonomial(G) or 
   ForAll( WeddDecomp(FG), x-> not IsList(x) ) then 
    return true;
else
    return false;
fi;
end);


#############################################################################
##
## SizeOfSplittingField( char, p )  
##
## The function SizeOfSplittingField returns the SizeOfFieldOfDefinition 
## for the character char and the prime p
##
InstallMethod( SizeOfSplittingField,
    "for character of finite group and prime number", 
    true, 
    [ IsCharacter, IsPosInt ], 
    0,
function( char, p )

local size,    #  The power of p
      cc,      #  Conjugacy Classes
      value,   #  Element in ValuesOfClassFunction(char)
      m,       #  counter
      image;   #  Galois Group

size := 1;
cc := ConjugacyClasses( UnderlyingCharacterTable( char ) );
for value in ValuesOfClassFunction(char) do
   m:= 1;
   image:= GaloisCyc( value, p );
   while image <> value do
       m:= m+1;
       image:= GaloisCyc( image, p );
   od;      
   size := Lcm( size , m );
od;

return p^size;

end);


#############################################################################
##
## SquareRootMod( a, q )  
##
## The function SquareRootMod solves the equation x^2 = a (mod q) 
## using the algorithm of Tonelli-Shanks
##
InstallMethod( SquareRootMod,
    "for positive integers", 
    true, 
    [ IsPosInt, IsPosInt ], 
    0,
function( a, q )

local x,Q,z,bool,c,i,t,M,b;

# Initialization  
if not IsPrimePowerInt(q)
 then Error("Wedderga: The input needs to be a prime power integer","\n");
fi;   
if IsEvenInt(q) 
 then Error("Wedderga: The input needs to be an odd integer","\n"); 
fi;
if Legendre(a,q)<1
 then Error("Wedderga: The input needs to be a square mod q","\n"); 
fi;

# Program
if (q mod 4) = 3
 then x := a^((q+1)/4) mod q;
else
 Q:=Product(Filtered(Factors(q-1),IsOddInt)); #take the odd part of q-1
 
 # take integer z such that Jacobi(z,q)=-1
 bool := false;
 while bool = false do
  z:=Random([1..q-1]);
  if Jacobi(z,q)=-1 then bool:=true; fi;
 od;
 c := z^Q mod q;

 x := a^((Q+1)/2) mod q;
 t := a^Q mod q;
 M := LogInt((q-1)/Q,2);

 while (t mod q) <> 1 do
  # find lowest o<i<M such that t^(2^i) moq q = 1
  i := 1;
  while (t^(2^i) mod q) <> 1 do
   i := i+1;   
  od;

  b := c^(2^(M-i-1)) mod q;
  x := x*b mod q;
  t := t*b^2 mod q;
  c := b^2 mod q;
  M := i;
 od; 
fi;

return x;
end);


#############################################################################
##
## SquaresMod( q )  
##
## The function SquaresMod returns an integer a such that both a and -1-a 
## are squares modulo q (odd prime power)
##
InstallMethod( SquaresMod,
    "for a positive integer", 
    true, 
    [ IsPosInt], 
    0,
function( q )

local a,bool;

# Initialization
if not IsPrimePowerInt(q)
 then Error("Wedderga: input needs to be a prime power integer","\n");
fi;
if IsEvenInt(q) 
 then Error("Wedderga: input needs to be odd","\n");
fi;

# Program 
bool := false;

while bool = false do
 a:=Random([1..q-1]);
 if Jacobi(a,q)=1 and Jacobi(-1-a,q)=1 then bool:=true; fi;
od;

return a;
end);

 
#############################################################################
##
## SolveEquation2@wedderga ( q )  
##
## The function SolveEquation2@wedderga returns a in GF(q) satisfying 
## a^((q-1)/2)=-1=-Z(q)^0 when q is odd
##
InstallMethod( SolveEquation2@,
    "for a positive integer", 
    true, 
    [ IsPosInt], 
    0,
function( q )

local a,F,bool;

# Initialization

if not IsPrimePowerInt(q) 
 then Error("Wedderga: input needs to be a prime power integer","\n");
fi;
if IsEvenInt(q) 
 then Error("Wedderga: input needs to be odd","\n"); 
fi;

# Program

bool := false;
F:=GF(q);

while bool = false do
 a:=Random(F);
 if a^((q-1)/2) = -Z(q)^0 then bool:=true; fi;
od;

return a;
end);


#############################################################################
##
## SolveEquation3@wedderga( q )  
##
## The function SolveEquation3@wedderga returns b in GF(q^2) satisfying 
## b^((q^2-1)/2)=-1=-Z(q^2)^0 when q is odd
##
InstallMethod( SolveEquation3@,
    "for a positive integer", 
    true, 
    [ IsPosInt], 
    0,
function( q )

local b,F,bool;

# Initialization
if not IsPrimePowerInt(q)
 then Error("Wedderga: input needs to be a prime power integer","\n");
fi;
if IsEvenInt(q) 
 then Error("Wedderga: input needs to be odd","\n"); 
fi;

# Program
bool := false;
F:=GF(q^2);

while bool = false do
 b:=Random(F);
 if b^((q^2-1)/2) = -Z(q^2)^0 then bool:=true; fi;
od;

return b;
end);


#############################################################################
##
## SolveEquation@wedderga( F )  
##
## The function SolveEquation@wedderga returns x and y<>0 in a finite field 
## (of odd characteristic q) F satisfying x^2+y^2=-1=-Z(q^m)^0 
##
InstallMethod( SolveEquation@,
    "for a field", 
    true, 
    [ IsField], 
    0,
function( F )

local q,m,x,y,a,b;

# Initialization
if not IsFinite(F) 
 then Error("Wedderga: input needs to be finite","\n"); 
fi;

q := Characteristic(F);
m := LogInt(Size(F),q);
# F is finite field GF(q^m)

if IsEvenInt(q) 
 then Error("Wedderga: input needs to be of odd characteristic","\n"); 
fi;

# Program
if (q mod 4) = 1
 then 
   x := 0*Z(q^m); 
   a := SolveEquation2@(q);
   y := a^((q-1)/4);
elif (m mod 2) = 0
 then 
   x := 0*Z(q^m); 
   b := SolveEquation3@(q);   
   y := b^((q^2-1)/4);
else
   a := SquaresMod(q);
   x := (Z(q^m)^0)*SquareRootMod(a,q);
   y := (Z(q^m)^0)*SquareRootMod((-1-a) mod q,q);
fi;

return [x,y];

end);



#############################################################################
##
## PrimRootOfUnity( F,n )  
##
## The function PrimRootOfUnity returns returns a n-th primitive root of unity in F
InstallMethod( PrimRootOfUnity,
    "for a field and an positive integer", 
    true, 
    [ IsField, IsPosInt], 
    0,
function( F,n)
  local m,q;
 q := Size(F);
 m := First([1..1000],m->RemInt(q^m,n)=1);
  return BigPrimitiveRoot(q^m)^((q^m-1)/n);
end);


#############################################################################
##
## MakeMatrixByBasis( f,B )  
##
## The function MakeMatrixByBasis represents a linear mapping f with respect 
## to a basis B
InstallMethod( MakeMatrixByBasis,
    "for a mapping and a basis", 
    true, 
    [ IsMapping, IsBasis], 
    0,
function( f,B)
 local M,b;
 M:=[];
 for b in B do
  Add(M,Coefficients(B,Image(f,b)));
 od; 
 return TransposedMat(M);
end);



#############################################################################
##
## ReturnGalElement( e,E,H,K,F1,xi )  
##
## We know that E/H = Gal(F1/F2). And that F1=F(xi).
## The action is defined by the induced conjugation action of E on H/K.
## This function returns an element e in E as element in the Galois group.
InstallMethod( ReturnGalElement,
    "for subgroups and a field", 
    true, 
    [ IsObject , IsGroup, IsGroup, IsGroup, IsField, IsObject], 
    0,
function( e,E,H,K,F1,xi)
 local f,epi,h,hK,xK,i,image;

 epi := NaturalHomomorphismByNormalSubgroup(H,K);
 hK:=MinimalGeneratingSet(Image(epi,H))[1];
 for h in H do
  if Image(epi,h) = hK then break; fi;
 od;
 xK := Image(epi,h^e);
 i:=1;
 while xK <> hK^i do
  i:=i+1;   
 od; 
 
 image := [xi^i];
 f := AlgebraHomomorphismByImages(F1,F1,[xi],image);

 return f;
end);


#############################################################################
##
## LeftMultiplicationBy(x,F1)
##
## Returns the mapping F1->F1 associated with left multiplication by x
InstallMethod( LeftMultiplicationBy,
    "for fields", 
    true, 
    [IsObject, IsField], 
    0,
function(x,F1)
 return MappingByFunction(F1,F1,y->x*y);
end);


#############################################################################
##
## MakeLinearCombination( FE, coef, supp)
##
## Makes the linear combination of coef and supp in FE
InstallMethod( MakeLinearCombination,
    "for algebra, a list and a list", 
    true, 
    [IsAlgebra, IsList, IsList], 
    0,
function( FE, coef, supp)
 local x,i;

 x := Zero(FE);

 for i in [1..Size(coef)] do
  x := x+coef[i]*supp[i];
 od;

 return x;
end);

#############################################################################
##
## Product3Lists( L )  
##
## The function Product3Lists returns the product [a_i*b_j*c_k] of 3 lists 
## [a_1,a_2,...], [b_1,b_2,...] and [c_1,c_2,...]
##
InstallMethod( Product3Lists,
    "for a list", 
    true, 
    [ IsList], 
    0,
function( L )

local I,i,j,k;

I := [];
for i in L[1] do
 for j in L[2] do
  for k in L[3] do
   Add(I,i*j*k);
  od;
 od;
od;

return I;
end);


#############################################################################
##
## IsTwistingTrivial(G,H,K) 
##
## The function IsTwistingTrivial checks if twisting of the simple algebra 
## associated with the strong Shoda Pair (H,K) is trivial
## This can be done in the rational group ring QG
InstallMethod( IsTwistingTrivial,
    "for subgroups", 
    true, 
    [IsGroup, IsGroup, IsGroup], 
    0,
function(G,H,K)
 local A,QG;

 QG:=GroupRing(Rationals,G);
 A:=SimpleAlgebraByStrongSPInfo(QG,H,K);
 if Size(A)=4 and A[4][3]<>0 then return false;
 elif Size(A)=5 and ( not(IsZero(A[5])) or not(IsZero(List(A[4],x->x[3]))) ) then return false;
 fi;
 return true;
end);


#############################################################################
##
#E
##

[ Dauer der Verarbeitung: 0.45 Sekunden  (vorverarbeitet)  ]