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)
]
|
2026-04-02
|