|
|
|
|
Quelle others.gi
Sprache: unbekannt
|
|
#############################################################################
##
#W others.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
##
#############################################################################
#############################################################################
##
#A ShodaPairsAndIdempotents( QG )
##
## The attribute ShodaPairsAndIdempotents of the rational group algebra QG
## returns a record with components ShodaPairs and PCIsBySP
## ShodaPairs = list of SP that covers the complete set of primitive
## central idempotents of QG realizable by SPs,
## PCIsBySP = list of PCIs of QG realizable by SPs.
##
InstallMethod( ShodaPairsAndIdempotents,
"for rational group algebra",
true,
[ IsGroupRing ],
0,
function(QG)
local G, #The group
CCS, #The conjugacy classes of subgroups
LCCS, #The length of CCS
one, #1 of QG
Es, #The list of primitive central idempotents
SEs, #The sum of the elements of Es
e, #Idempotent
H, #Subgroup of G
i, #Counter
SearchingKForSP,#Function to search a K for a given H
SPs;
#begin of functions
#The following function search an element K such that
#(K,H) is a SP
SearchingKForSP:=function( H )
local
NH, #Normalizer of H in G
Epi, #NH --> NH/H
NHH, #NH/H
L, #Centre of NHH
K, #The subgroup searched
e, #a*e(G,K,H) for some of the searched K
# and a rational
KH, #K/H
X; #a subset of NHH
NH:=Normalizer(G,H);
Epi:=NaturalHomomorphismByNormalSubgroup( NH, H ) ;
NHH:=Image(Epi,NH);
if IsAbelian(NHH) then
e := PrimitiveCentralIdempotentBySP( QG, NH, H );
if e=fail then
return fail;
else
return [[NH,H],e];
fi;
else
L:=Centre(NHH);
if IsCyclic(L) then #This guaranties (S1) and (S2)
X:=Difference(Elements(NHH),Elements(L));
while X<>[] do
KH:=Subgroup(NHH,Union(L,[X[1]]));
K:=PreImagesNC(Epi,KH);
e:=PrimitiveCentralIdempotentBySP( QG, K, H );
if e<>fail then
return [[K,H],e];
fi;
X:=Difference(X,KH);
od;
fi;
return fail;
fi;
end;
#end of functions
#PROGRAM
#We start checking if QG is a rational group algebra of a finite group
if not IsSemisimpleRationalGroupAlgebra(QG) then
Error("Wedderga: The input must be a rational group algebra!!!\n");
fi;
#Initialization
G:=UnderlyingMagma(QG);
CCS:=ConjugacyClassesSubgroups(G);
# here we dont' take care how CCS is ordered
LCCS:=Length(CCS);
one:=One(QG);
Es:=[ ];
SPs:=[];
SEs:=Zero(QG);
i:=LCCS;
#Main loop
if Size(G)=1 then
return [[ [G,G] , One(QG)] ];
fi;
while SEs<>one and i>=1 do
H:=Representative(CCS[i]);
e:=SearchingKForSP( H );
if e<>fail then
# if IsZero( SEs*e[2] ) then # slow
if not ( e[2] in Es ) then # fast
SEs:= SEs + e[2];
Add(Es,e[2]);
Add(SPs,e[1] );
fi;
fi;
i:=i-1;
od;
#Output
return rec(
ShodaPairs := SPs,
PCIsBySP := Es);
end);
#############################################################################
##
#F PrimitiveCentralIdempotentsBySP( QG )
##
## The function computes the primitive central idempotents of the form
## a*e(G,K,H) where a is a rational number and (H,K) is a SP.
## The sum of the PCIs obtained is 1 if and only if G is monomial
## This function is for rational group algebras (otherwise you will not
## use ShodaPairsAndIdempotents)
##
InstallGlobalFunction(PrimitiveCentralIdempotentsBySP,
function(QG)
local G;
G := UnderlyingMagma( QG );
if not(IsMonomial(G)) then
Print("Wedderga: Warning!!\nThe output is a NON-COMPLETE list of prim. central idemp.s of the input! \n");
fi;
return ShodaPairsAndIdempotents( QG ).PCIsBySP;
end);
#############################################################################
##
#M PrimitiveCentralIdempotentBySP( QG, K, H )
##
## The function PrimitiveCentralIdempotentBySP checks if (H,K) is a SP of G
## and in that case compute the primitive central idempotent of the form
## alpha*e(G,K,H), where alpha is a rational number.
##
InstallMethod( PrimitiveCentralIdempotentBySP,
"for pairs of subgroups",
true,
[ IsGroupRing, IsGroup, IsGroup ],
0,
function(QG,K,H)
local eGKH, # Function for eGKH
K1, H1, # Subgroups of G
G, # The group
e1, # eGKH
e2, # eGKH^2
alpha; # coeff e1 / coeff ce2
#begin of functions
#The following function computes e(G,K,H)
eGKH:=function(K1,H1)
local alpha, # Element of QG
Eps, # \varepsilon(K1,H1),
Cen, # Centralizer of Eps in G
RTCen, # Right transversal of Cen in G
g; # element of G
Eps := IdempotentBySubgroups( QG, K1, H1 );
Cen := Centralizer( G, Eps );
RTCen := RightTransversal( G, Cen );
return Sum( List( RTCen, g -> Eps^g ) ) ;
end;
#end of functions
#Program
if not IsSemisimpleRationalGroupAlgebra(QG) then
Error("Wedderga: <QG> must be a rational group algebra!!!\n");
fi;
G:=UnderlyingMagma(QG);
if IsShodaPair( G, K, H ) then
e1:=eGKH(K,H);
e2:=e1^2;
alpha := CoefficientsAndMagmaElements(e1)[2] /
CoefficientsAndMagmaElements(e2)[2];
if IsOne( alpha ) then
return e1;
else
return alpha*e1;
fi;
else
return fail;
fi;
end);
#############################################################################
##
#M IsShodaPair( G, K, H )
##
## The function IsShodaPair verifies if (H,K) is a SP
##
InstallMethod( IsShodaPair,
"for pairs of subgroups",
true,
[ IsGroup, IsGroup, IsGroup ],
0,
function( G, K, H )
local DGK, # G\K
ElemK, # Elements of K
DKH, # K\H
k, # Element of K
g, # Elements of DGK
NoReady; # Boolean
# Checking (S1) and (S2)
# 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 ) and IsNormal( K, H ) ) then
Error("Wedderga: Each input should contain the next one and the last one \n",
"should be normal in the second!!!\n");
elif not( IsCyclic( FactorGroup( K, H ) ) ) then
return false;
fi;
#Now, checking (S3)
DGK := Difference( G, K );
ElemK := Elements( K );
DKH := Difference( K, H );
for g in DGK do
NoReady := true;
for k in ElemK do
if Comm( k, g ) in DKH then
NoReady := false;
break;
fi;
od;
if NoReady then
return false;
fi;
od;
return true;
end);
#############################################################################
##
#F PrimitiveCentralIdempotentsUsingConlon( QG )
##
## The function PrimitiveCentralIdempotentsUsingConlon uses the function IrrConlon to compute the
## primitive central idempotents of QG associated to monomial representations
## The result is the same as the function PrimitiveCentralIdempotentsBySP but it is slower
##
InstallGlobalFunction(PrimitiveCentralIdempotentsUsingConlon,
function(QG)
local G, zero, one, IrrG, LIrrG, eGKHs, SeGKHs, i, eGKH, K, H;
if not IsSemisimpleRationalGroupAlgebra(QG) then
Error("Wedderga: The input must be a rational group algebra \n");
fi;
G := UnderlyingMagma( QG );
zero := Zero( QG );
one := One( QG );
IrrG := IrrConlon( G );
LIrrG := Length(IrrG);
eGKHs:=[ IdempotentBySubgroups(QG,G,G) ];
SeGKHs:=eGKHs[1];
i:=2;
while i<=LIrrG do
#
# ??? Why sometimes here the component inducedFrom appears ???
#
K:=TestMonomial(IrrG[i]).subgroup;
H:=TestMonomial(IrrG[i]).kernel;
eGKH:=PrimitiveCentralIdempotentBySP( QG, K, H );
# if eGKH*SeGKHs=zero then # slow
if not( eGKH in eGKHs ) then # fast
SeGKHs:= SeGKHs + eGKH;
Add(eGKHs,eGKH);
fi;
if SeGKHs=one then
return eGKHs;
fi;
i:=i+1;
od;
if SeGKHs=one then
return eGKHs;
else
Print("Warning!!! This is not a complete set of primitive central idempotents !!!\n");
return eGKHs;
fi;
end);
#############################################################################
##
#E
##
#############################################################################
##
#O PrimitiveCentralIdempotentsByCharacterTable( FG )
##
## The function PrimitiveCentralIdempotentsByCharacterTable
## uses the character table of G to compute the primitive
## central idempotents of the group algebra FG with the classical method.
## FOR SEMISIMPLE ABELIAN NUMBER FIELD GROUP ALGEBRAS
##
InstallMethod( PrimitiveCentralIdempotentsByCharacterTable,
"for SemisimpleANFGroupAlgebras",
true,
[ IsSemisimpleANFGroupAlgebra ],
0,
function(FG)
local G, # Underlying group of FG
F, # Coefficient field of FG
irr, # The irreducible characters of G
galmat, # the output of the function GaloisMat(irr).galoisfams (the
# fuction GaloisMat computes the complete orbits under the
# operation of the Galois group of the (irrational) entries of
# irr), that is a list, its entries are either 1, 0, -1, or lists
galirr, # function which computes for the character chi and the field F,
# the Galois group of the extension
# Field(chi)/Intersection(Field(chi),F);
gal, # List of Galois groups as outputs of galirr for chi in Irr(G)
cong, # function with input a list l and a list of Galois groups gal
posit, # function that computes the positions of galmat in gal
irrClasses,# the positions of galmat in gal
coef, # list of coefficients
cc, # Conjugacy classes of G
idem; # List of idempotents, the output
F := LeftActingDomain(FG);
G := UnderlyingMagma(FG);
# Computes the Galois orbit sums
irr := Irr(G);
Assert( 0, Size(irr)=Size(ConjugacyClasses(G)),
"The number of irreducible characters does not equal \nto the number of conjugacy classes of the group !!!\nPlease report this bug to the developers of Wedderga.\n" );
galmat := GaloisMat(irr).galoisfams;
galirr:=function(chi,F)
return GaloisGroup(AsField(Intersection(Field(chi),F),Field(chi)));
end;
gal := List( irr , x->galirr(x,F) );
# The function cong is used to classified the second component of the entries of
# a list l (whose entries are integers representing an automorphism of a
# cyclotomic field as the exponent of the action on roots of unity) into
# congruence classes modulo the Galois group gal
cong := function(l,gal)
local gn,cond,remainder,length,pos,x,pospar,u,gall;
cond := Conductor(Source(One(gal)));
gall:=[];
for u in Filtered([1..cond-1],x->Gcd(x,cond)=1) do
if ANFAutomorphism(Source(One(gal)),u) in gal then
Add(gall,ZmodnZObj(u,cond));
fi;
od;
remainder := l[2];
length := Length(l[2]);
pos := [];
while remainder<>[] do
x:=remainder[1];
pospar := Filtered([1..length],y->ZmodnZObj(x,cond)*ZmodnZObj(l[2][y],cond)^-1 in gall);
Add(pos,pospar);
remainder := Difference(remainder,List(pospar,i->l[2][i]));
od;
return List(pos,y->List(y,i->l[1][i]));
end;
# Computes the positions corresponding to the classes given by cong applied to
# entries of galmat and gal
posit := function(galmat,gal)
local posi,i;
posi := [];
for i in [1..Length(galmat)] do
if galmat[i] = 1 then
Add(posi,[i]);
elif IsList(galmat[i]) then
posi := Concatenation( posi , cong( galmat[i] , gal[i] ) );
fi;
od;
return posi;
end;
# main part of the function
irrClasses := posit(galmat,gal);
coef := List(irrClasses,x->Sum(x,y->irr[y]*irr[y][1]));
cc := ConjugacyClasses(G);
idem := List(coef, chi -> Sum( cc , X -> ElementOfMagmaRing(
FamilyObj( Zero( FG ) ),
Zero( F ),
List(X,x->Representative(X)^chi/Size(G)),
AsList(X) )
)
);
return idem;
end);
######################################################################################
# E
#############################################################################
##
#O PrimitiveCentralIdempotentsByCharacterTable( FG )
##
## The function PrimitiveCentralIdempotentsByCharacterTable
## uses the character table of G to compute the primitive
## central idempotents of the group algebra FG with the classical method.
## FOR SEMISIMPLE FINITE GROUP ALGEBRAS
##
InstallMethod( PrimitiveCentralIdempotentsByCharacterTable,
"for SemisimpleFiniteGroupAlgebras",
true,
[ IsSemisimpleFiniteGroupAlgebra ],
0,
function(FG)
local G, # Underlying group of FG
F, # Coefficient field of FG
p, # Characteristic
irr, # The irreducible characters of G
irrp, # irr module p
cfs, # character fields
galirr, # Galois groups
remainder, # remaining positions
SumIrrClass, # F-Characters
i, # counter
oneclass, # List of Galois groups as outputs of galirr for chi in Irr(G)
positions, # positions of Galois conjugate irreducible characters
cc, # Conjugacy classes of G
idem; # List of idempotents, the output
F := LeftActingDomain(FG);
p := Characteristic(F);
G := UnderlyingMagma(FG);
# Computes the Galois orbit sums
irr := Irr(G);
Assert( 0, Size(irr)=Size(ConjugacyClasses(G)),
"The number of irreducible characters does not equal \nto the number of conjugacy classes of the group !!!\nPlease report this bug to the developers of Wedderga.\n" );
irrp := List( irr , x -> Character(G , List( x, y -> FrobeniusCharacterValue( y , p ) ) ) );
cfs := List( irrp , x -> Field(x) );
galirr := List( cfs , x -> GaloisGroup( AsField( Intersection( F , x ) , x ) ) );
remainder := [1..Length(irrp)];
SumIrrClass := [];
while remainder <> [] do
i := remainder[1];
oneclass := List( galirr[i] , x -> Character( G , List( irrp[i] , y -> y^x )) );
Add( SumIrrClass , irr[i][1]*Sum( oneclass ) );
positions := List( oneclass, x -> Position( irrp , x ) );
remainder := Difference( remainder , positions );
od;
# Compute idempotents
cc := ConjugacyClasses(G);
idem := List(SumIrrClass, chi -> Sum( cc , X -> ElementOfMagmaRing(
FamilyObj( Zero( FG ) ),
Zero( F ),
List(X,x->Representative(X)^chi/Size(G)),
AsList(X) )
)
);
return idem;
end);
#############################################################################
##
#O CodeWordByGroupRingElement( F,S,a )
##
## The function CodeWordByGroupRingElement creates a code word from a group ring element a
## from FG where S is a fixed ordering of the group elements of G
##
InstallMethod( CodeWordByGroupRingElement,
"for a field, a set and an element",
true,
[ IsField, IsSet, IsObject ],
0,
function(F,S,a)
local coeffsupp,lsupp,supp,coeff,s,p,codeword;
coeffsupp := CoefficientsAndMagmaElements(a);
lsupp := Size(coeffsupp)/2;
supp := List( [ 1 .. lsupp ], i -> coeffsupp [ 2*i-1 ] );
coeff := List([ 1 .. lsupp ], i -> coeffsupp[2*i] );
codeword := [];
for s in S do
p := Position(supp,s);
if p = fail then
Add(codeword,Zero(F));
else
Add(codeword,coeff[p]);
fi;
od;
return codeword;
end);
#############################################################################
##
#O CodeByLeftIdeal( F,G,S,I )
##
## The function CodeByLeftIdeal creates all code words for a left ideal I of FG where
## S is a fixed ordering of the group elements of G
##
InstallMethod( CodeByLeftIdeal,
"for a field, a set and an element",
true,
[ IsField, IsGroup, IsSet, IsRing ],
0,
function(F,G,S,I)
local code,i;
code := [];
for i in I do
Add(code,CodeWordByGroupRingElement(F,S,i));
od;
return code;
end);
######################################################################################
# E
#############################################################################
##
#F PrimitiveCentralIdempotentsByCharacterTable( QG ) (RATIONAL VERSION)
##
## The function PrimitiveCentralIdempotentsByCharacterTable
## uses the character table of G to compute the primitive
## central idempotents of QG with the classical method.
##
# InstallGlobalFunction( PrimitiveCentralIdempotentsByCharacterTable,
# function(QG)
# local G, # The group
# OrderG, # Order of G
# zero, # Zero of QG
# I, # The irreducible characters of G
# rat, # rational irreducible characters (Galois orbit sums)
# norms, # norms of the orbit sums
# Id, # The list of primitive central idempotents of QG computed
# nccl,
# i,
# chi, # one entry in `rat'
# eC, # one primitive central idempotent of QG
# j, # loop over class positions
# F, c, elms, val, k, tbl, fusions, deg;
#
# # First check if `QG' is a rational group algebra of a finite group.
# if not ( IsFreeMagmaRing( QG ) and IsGroup( UnderlyingMagma( QG ) )
# and IsRationals( LeftActingDomain( QG ) ) ) then
# Error( "The input must be a rational group algebra" );
# fi;
#
# # Initialization
# G:= UnderlyingMagma( QG );
# elms:= Elements( G );
# OrderG:= Size( G );
# zero:= Zero( QG );
#
# # Compute the irreducible characters.
# IsSupersolvable( G );
# tbl:= CharacterTable( G );
# I:= List( Irr( G ), ValuesOfClassFunction );
#
# # Compute the Galois orbit sums.
# rat:= RationalizedMat( I );
# norms:= List( rat, x -> ScalarProduct( tbl, x, x ) );
#
# # Compute the PCIs of QG.
# F:= FamilyObj( zero );
# fusions:= List( ConjugacyClasses( tbl ),
# c -> List( Elements( c ),
# x -> PositionSorted( elms, x ) ) );
# Id:= [];
# nccl:= Length( I );
# for i in [ 1 .. Length( rat ) ] do
# chi:= rat[i];
# deg:= chi[1] / norms[i];
# eC:= 0 * [ 1 .. OrderG ] + 1;
# for j in [ 1 .. nccl ] do
# val:= chi[j] * deg / OrderG;
# for k in fusions[j] do
# eC[k]:= val;
# od;
# od;
# Add( Id, ElementOfMagmaRing( F, 0, eC, elms ) );
# od;
#
# return Id;
# end);
[ Dauer der Verarbeitung: 0.28 Sekunden
(vorverarbeitet)
]
|
2026-04-02
|
|
|
|
|