############################################################################ ## #W rmat.gi QuaGroup Willem de Graaf ## ## ## Function for computing R-matrices. ##
QGPrivateFunctions.TensorIsomData:= function( V, W )
# Here <V>, <W> are two modules over the same quantized enveloping # algebra <A>. # This function returns a linear map $\theta : V\otimes W\to V\otimes W$ # such that $\theta\circ P$ is an isomorphism of the $A$-modules # $W\otimes V$ and $V\otimes W$. Here $P : W\otimes V\to V\otimes W$ # is the map defined by $P(w\otimes v) = v\otimes w$. # # More precisely: a record is returned containing the tensor space, # and a lit of images. This data is used in the two subsequent functions.
local basis_of_wtspace, theta_mu, A, R, sim, bas, B,
wtsV, wtsW, cc, i, j, mu, cands, VW, bVW, theta,
sm, Q, S, d, reps, inds, v, the_fct_f, vec, pos,
w1, w2, qpar, Qi;
basis_of_wtspace:= function( rt )
# `rt' is a positive weight, represented as a list of cfts, # [k1,..,kn] such that wt = \sum ki \alpha_i (sum of simple # roots).
# This function returns all monomials of weight `rt' in the # positive (or negative) part of the uea. The same algorithm # as in canbas.gi (GetCanonicalElements) is used.
local posR, nu, i, oldlev, mlist, deg, newlev, mon,
rts, j, rr, pos, mn1;
posR:= PositiveRootsInConvexOrder( R );
nu:= 0*[1..Length(posR)]; for i in [1..Length(rt)] do
nu[ Position( posR , SimpleSystemNF(R)[i] ) ]:= rt[i];
od;
oldlev:= [ nu ];
mlist:= [ nu ];
deg:= Sum( rt )-1; while deg >= 1do
newlev:= [ ]; for mon in oldlev do
rts:= [ ]; for i in [1..Length(mon)] do if mon[i] <> 0then
Add( rts, [ i, posR[i] ] ); fi;
od; for i in [1..Length(rts)] do for j in [i+1..Length(rts)] do
rr:= rts[i][2]+rts[j][2];
pos := Position( posR, rr ); if pos <> fail then
mn1:= ShallowCopy( mon );
mn1[rts[i][1]]:= mn1[rts[i][1]]-1;
mn1[rts[j][1]]:= mn1[rts[j][1]]-1;
mn1[pos]:= mn1[pos]+1; if not mn1 in newlev then
Add( newlev, mn1 ); fi; fi;
od;
od;
od;
oldlev:= newlev;
Append( mlist, newlev );
deg:= deg-1;
od;
return mlist; end;
theta_mu:= function( mu )
local g, bas_mu, theta, ww, im, k, mn1, mn2, i, f,
e, cf, w0, lenw0, qa, vec, pos, w1, w2, et;
# We construct the action of theta_mu on the tensor product VW, # as a list of images...
g:= GeneratorsOfAlgebra( A );
bas_mu:= basis_of_wtspace( mu );
theta:= [ ];
ww:= mu*CartanMatrix( R ); # i.e., mu written as linear combination # of fundamental weights.
im:= List( [1..Length(bVW)], x -> ExtRepOfObj( Zero(VW) ) );
for k in [1..Length(bas_mu)] do
# We construct the monomials corresponding to `bas_mu[k]', `mn1' # will represent the monomial in the negative part, # `mn2' the monomial in the positive part.
mn1:= [ ];
mn2:= [ ]; for i in [1..Length(bas_mu[k])] do if bas_mu[k][i] <> 0then
Add( mn1, bas_mu[k][i] ); Add( mn1, i );
Add( mn2, bas_mu[k][i] );
Add( mn2, i+Length( PositiveRoots(R) ) +
Length( CartanMatrix(R) ) ); fi;
od;
# w1 is the weight of the first component of the tensor element, # and w2 the weight of the seond component. If w1-mu is not a # weight of V, or w2+mu is not a weight of W, then # theta_mu(bVW[i])=0, so that we do not have to calculate it.
if w1-ww in wtsV[1] and w2+ww in wtsW[1] then
# We act with f<x>e on bVW[i], and normalize the result.
od;
return List( im, x -> ObjByExtRep( FamilyObj( bVW[1] ), x ) ); end;
A:= LeftActingAlgebra( V );
qpar:= QuantumParameter( A );
# Some easy tests.... if A <> LeftActingAlgebra( W ) then
Error( "both modules must have the same left acting algebra" ); fi;
if not IsQuantumUEA( A ) then
Error( "the modules must be defined over a quantized uea" ); fi;
R:= RootSystem( A );
sim:= SimpleRootsAsWeights( R );
bas:= Basis( VectorSpace( Rationals, sim ), sim );
B:= BilinearFormMatNF( R );
# We extract the set of weights from V and W; note that here we # use the fact that we know the representation of elements of V,W...
wtsV:= WeightsAndVectors( V );
wtsW:= WeightsAndVectors( W );
# We have that the result \theta is a sum of \theta_mu, where mu > 0 # is a difference of two weights in wtsV, and a difference of two weights # in wtsW. We calculate the set of such mu; they will be represented as # linear combinations of the simple roots.
cc:= [ ]; for i in [1..Length(wtsV[1])] do for j in [1..Length(wtsV[1])] do
mu:= wtsV[1][i]-wtsV[1][j]; # Write mu as a lin co of simple roots:
mu:= Coefficients( bas, mu ); # Add mu if mu > 0: if ForAll( mu, x -> x >=0 ) and mu <> 0*mu then
AddSet( cc, mu ); fi;
od;
od;
# Now the set of candidates is formed by differences of weights of W, # that also appear in `cc':
cands:= [ ]; for i in [1..Length(wtsW[1])] do for j in [1..Length(wtsW[1])] do
mu:= wtsW[1][i]-wtsW[1][j];
mu:= Coefficients( bas, mu ); if ForAll( mu, x -> x >= 0) and mu <> 0*mu and mu in cc then
AddSet( cands, mu ); fi;
od;
od;
VW:= TensorProductOfAlgebraModules( V, W );
bVW:= Basis( VW );
theta:= Sum( List( cands, x -> theta_mu( x ) ) ) +
List( Basis(VW), x -> x ); # i.e., adding the identity...
# Let P denote the weight lattice and T the root latice. Then # P/T is a finite Abelian group. We calculate a set of representatives of # that group. Then we construct a # function for writing an arbitrary element of # P as one of these elements plus an element of T.
# We calculate the Smith normal form on the Cartan matrix, and use # Sims, Prop. 3.3 of Chapter 8.
# We have that P/T = Z_{d1} + ... + Z_{dr}, where r=Length(d). # A representative of a weight w is calculated by taking w*Q, and # mapping each component into Z_{di}. So the set of all representatives # is formed by [ k1,...,kr ], where 0 <= ki <= di. # `reps' will be a set of weights, the i-th element of reps is zero # if di=0, otherwise it will be a pre-image of [0,0...,0,1,0,...0] # (1 on the i-th position). # Then in the function the_fct_f a canonical pre-image can be calculated # by taking the appropriate linear combination of the elements from reps.
# First we map `w1' to a representative
v:= w1*Q; for j in [1..Length( v )] do if v[j] >= d[j] then while v[j] >= d[j] do v[j]:= v[j]-d[j]; od; elif v[j] < 0then while v[j] < 0do v[j]:= v[j]+d[j]; od; fi;
od;
# Then we take a linear combination of elements of `reps':
wt1:= 0*w1; for j in [1..Length(v)] do
wt1:= wt1+v[j]*reps[j];
od;
# Now we map w2 to a representative
v:= w2*Q; for j in [1..Length( v )] do if v[j] >= d[j] then while v[j] >= d[j] do v[j]:= v[j]-d[j]; od; elif v[j] < 0then while v[j] < 0do v[j]:= v[j]+d[j]; od; fi;
od;
# Then we take a linear combination of elements of `reps':
wt2:= 0*w2; for j in [1..Length(v)] do
wt2:= wt2+v[j]*reps[j];
od;
# Write wt1, wt2, etc as linear combinations of simple roots, and get # their inner product.
for i in [1..Length(bVW)] do
e:= ShallowCopy( ExtRepOfObj( ExtRepOfObj( bVW[i] ) ) );
e[1]:= Reversed( e[1] ); # this constitutes the action of P...
e:= ObjByExtRep( fam1, e );
e:= ObjByExtRep( fam2, e );
Add( images, Image( hom, e ) );
od;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.