lookup_table := rec( ); for i in [ 1 .. Length( vertex_lists ) ] do
lookup_table.( vertex_names[ i ] ) := vertex_lists[ i ];
od; for i in [ 1 .. Length( arrow_lists ) ] do
lookup_table.( arrow_names[ i ] ) := arrow_lists[ i ];
od;
InstallMethod( IsBound\[\], "for quiver product decomposition and positive integer",
[ IsQuiverProductDecomposition, IsPosInt ], function( dec, i )
return i <= Length( dec ); end );
InstallMethod( IncludeInProductQuiver, "for list and quiver with product decomposition",
ReturnTrue,
[ IsDenseList, IsQuiver and HasQuiverProductDecomposition ], function( factors, q )
local dec, make_name, walks, join, product_walk;
dec := QuiverProductDecomposition( q );
make_name := dec!.name_composer;
rest := elem; while true do# TODO should be while not IsZero( rest ), but that doesn't work
tip := Tip( rest );
tip_monom := TipMonomial( rest );
tip_coeff := TipCoefficient( rest ); if IsZero( tip_coeff ) then
break; fi;
rest := rest - tip;
terms[ Length(terms) + 1 ] := rec( monom := tip_monom,
coeff := tip_coeff );
od;
return terms; end );
InstallMethod( SimpleTensor, "for list and path algebra",
ReturnTrue,
[ IsDenseList, IsQuiverAlgebra ], function( factors, pa )
local parts, pairs, inc_paths, inc_terms;
if IsZero( factors[ 1 ] ) or IsZero( factors[ 2 ] ) then
return Zero( pa ); fi;
inc_paths := function( paths )
return IncludeInPathAlgebra( IncludeInProductQuiver( paths, QuiverOfPathAlgebra( pa ) ),
pa ); end;
##################################################################### # # Helene Bjørshol proved in her bachelor thesis at IMF, NTNU, spring # 2021 that a Groebner basis of the tensor product of two quiver # algebras, are given by the Groebner basis elements induced from # each factor of the tensor product in addition to all the # commutativity relations # ( a x o(b) ) * ( t(a) x b ) - ( o(a) x b ) * ( a x t(b) ) # for all arrows a and b from the first and the second factor of the # tensor product. This results in a huge speed up of the function # compared to the previous implementation. #
InstallGlobalFunction( TensorProductOfPathAlgebras, function( PAs )
# Function for finding the relations of a quotient of a path # algebra (or the empty list if the algebra is not a quotient):
get_relators := function( pa ) if IsQuotientOfPathAlgebra( pa ) then
return RelatorsOfFpAlgebra( pa ); else
return [ ]; fi; end;
get_groebner_basis := function( C )
local fam;
if IsQuotientOfPathAlgebra( C ) then
fam := ElementsFamily( FamilyObj( C ) );
return GroebnerBasisOfIdeal( fam!.ideal ); else
return [ ]; fi; end;
# The relations of the two original path algebras:
orig_rels := List( PAs, get_relators );
# The original relations included into the product quiver:
induced_rels := List( Concatenation( Cartesian( orig_rels[ 1 ], VerticesOfPathAlgebra( PAs[ 2 ] ) ),
Cartesian( VerticesOfPathAlgebra( PAs[ 1 ] ), orig_rels[ 2 ] ) ), function( factors ) return SimpleTensor( factors, product_pa ); end );
# All the relations for the tensor product:
tensor_rels := Concatenation( comm_rels, induced_rels );
# The Groebner basis of the two original path algebras:
orig_grbs := List( PAs, get_groebner_basis );
# The original Groebner bases included into the product quiver:
induced_grb := List( Concatenation( Cartesian( orig_grbs[ 1 ], VerticesOfPathAlgebra( PAs[ 2 ] ) ),
Cartesian( VerticesOfPathAlgebra( PAs[ 1 ] ), orig_grbs[ 2 ] ) ), function( factors ) return SimpleTensor( factors, product_pa ); end );
# All the Groebner basis elements for the tensor product:
tensor_grb := Concatenation( induced_grb, comm_rels );
I := Ideal( product_pa, tensor_rels );
product_pa_grb := GroebnerBasis( I, tensor_grb );
tensor_product := product_pa / I;
SetTensorProductDecomposition( tensor_product, PAs );
return tensor_product; end );
####################################################################### ## #O TensorAlgebraInclusion ( < T, n > ) ## ## Returns the inclusion A ---> A \otimes B or the inclusion ## B ---> A \otimes B if n = 1 or n = 2 respectively. ##
InstallMethod( TensorAlgebraInclusion, "for a IsQuiverAlgebra",
[ IsQuiverAlgebra, IS_INT ], 0, function( T, n )
local decomp, A, gens, inclusion, images, f;
if not HasTensorProductDecomposition( T ) then
Error( "The entered algebra is not a tensor product of two algebras.\n" ); fi;
decomp := TensorProductDecomposition( T ); if n = 1then
A := decomp[ 1 ]; else
A := decomp[ 2 ]; fi;
gens := GeneratorsOfAlgebra( A );
inclusion := function( x ) if n = 1then
return SimpleTensor( [ x, One( decomp[ 2 ] ) ], T ); else
return SimpleTensor( [ One( decomp[ 1 ] ), x ], T ); fi; end;
images := List( gens, g -> inclusion( g ) );
f := AlgebraHomomorphismByImages( A, T, gens, images );
f!.generators := gens;
f!.genimages := images;
return f; end
);
InstallMethod( EnvelopingAlgebra, "for an algebra",
[ IsQuiverAlgebra ], function( pa )
local envalg;
envalg := TensorProductOfAlgebras( OppositeAlgebra( pa ), pa );
SetIsEnvelopingAlgebra( envalg, true ); if HasIsAdmissibleQuotientOfPathAlgebra(pa) and IsAdmissibleQuotientOfPathAlgebra(pa) then
SetFilterObj(envalg, IsAdmissibleQuotientOfPathAlgebra ); fi;
return envalg; end );
InstallMethod( IsEnvelopingAlgebra, "for an algebra",
[ IsAlgebra ], function( alg )
return false; end );
InstallMethod( AlgebraAsModuleOverEnvelopingAlgebra, "for an enveloping algebra of a path algebra",
[ IsQuiverAlgebra ], function ( A )
local env, Q, QxQ, basis, basis_vectors, vertices,
vertex_indices, vector_spaces, i, j, dimension_vector,
get_coefficients, make_map, arrows,
module_specification, a;
if not IsFiniteDimensional(A) then
return fail; fi;
env := EnvelopingAlgebra(A);
Q := QuiverOfPathAlgebra( A );
QxQ := QuiverOfPathAlgebra( env );
basis := CanonicalBasis( A );
basis_vectors := BasisVectors( basis );
arrows := ArrowsOfQuiver( QxQ );
module_specification := [ ]; for a in arrows do if make_map( a ) <> fail then
Add( module_specification, [ String( a ), make_map( a ) ] ); fi;
od;
####################################################################### ## #O DualOfAlgebraAsModuleOverEnvelopingAlgebra( <A> ) ## ## Checks if the entered algebra is finite dimensional and returns ## false otherwise. When the algebra is finite dimensional, then it ## returns the dual of the algebra as module over the enveloping algebra ## of A. ##
InstallMethod( DualOfAlgebraAsModuleOverEnvelopingAlgebra, "for an algebra",
[ IsQuiverAlgebra ], 0, function( A )
local Aenv, M, DM, mats, op_name, de_op_name, vertices, arrows,
new_vertices, new_arrows, stringvertices, stringarrows,
vertex_positions, arrow_positions, newdimvector, newmats,
matrices, a, arrowentry;
if not IsFiniteDimensional(A) then
return fail; fi; # # By now we know that the algebra is finite dimensional. #
Aenv := EnvelopingAlgebra(A);
M := AlgebraAsModuleOverEnvelopingAlgebra(A);
DM := DualOfModule(M); # # Finding DM as a module over Aenv. #
mats := MatricesOfPathAlgebraModule(DM);
op_name := OppositeQuiverNameMap(QuiverOfPathAlgebra(A));
de_op_name := OppositeQuiverNameMap(OppositeQuiver(QuiverOfPathAlgebra(A)));
vertices := VerticesOfQuiver(QuiverOfPathAlgebra(Aenv));
arrows := ArrowsOfQuiver(QuiverOfPathAlgebra(Aenv));
new_vertices := List(vertices, x -> Concatenation(op_name(String(ProjectFromProductQuiver(2,x))),"_",de_op_name(String(ProjectFromProductQuiver(1,x)))));
new_arrows := List(arrows, x -> Concatenation(op_name(String(ProjectFromProductQuiver(2,x))),"_",de_op_name(String(ProjectFromProductQuiver(1,x)))));
stringvertices := List(vertices, x -> String(x));
stringarrows := List(arrows, x -> String(x)); # # Finding the permutation of the vertices and the arrows. #
vertex_positions := List(new_vertices, x -> Position(stringvertices, x));
arrow_positions := List(new_arrows, x -> Position(stringarrows, x)); # # Finding the new dimension vector and the matrices of DM as a module over Aenv. #
newdimvector := List([1..Length(vertices)], x -> DimensionVector(DM)[vertex_positions[x]]);
newmats := List([1..Length(mats)], x -> mats[arrow_positions[x]]); # # Creating the input for construction DM as a module over Aenv. #
matrices := []; for a in arrows do if newdimvector[Position(vertices,SourceOfPath(a))] <> 0 and
newdimvector[Position(vertices,TargetOfPath(a))] <> 0then
arrowentry := [[],[]];
arrowentry[1] := String(a);
arrowentry[2] := newmats[Position(arrows,a)];
Add(matrices, arrowentry); fi;
od;
return RightModuleOverPathAlgebra(Aenv, newdimvector, matrices); end
);
################################################################ # Attribute TrivialExtensionOfQuiverAlgebraLevel quiver algebras # is created so that one is avoiding naming problems when taking # iterated trivial extensions of a quiver algebra. This is due # to a bug reported by Rene Marczinzik. # If this attribute is not set, then the level is 0. The # trivial extension of such an algebra, will have level 1, and # so on. #
InstallMethod( TrivialExtensionOfQuiverAlgebraLevel, "for quiveralgebras",
true,
[ IsQuiverAlgebra ], 0, function( A );
if not HasTrivialExtensionOfQuiverAlgebraLevel( A ) then
return 0; else
return TrivialExtensionOfQuiverAlgebraLevel( A ); fi; end );
####################################################################### ## #O TrivialExtensionOfQuiverAlgebra( <A> ) ## ## Constructs the trivial extension T(A) of the algebra A, that is, ## T(A) = A + D(A) by finding the quiver and relations of T(A). ##
InstallMethod( TrivialExtensionOfQuiverAlgebra, "for an algebra",
[ IsQuiverAlgebra ], 0, function( A )
if not IsFiniteDimensional(A) then
return fail; fi;
arrow_add_string := String( TrivialExtensionOfQuiverAlgebraLevel( A ) + 1 );
Q := QuiverOfPathAlgebra(A);
vertices := VerticesOfQuiver(Q);
arrows := ArrowsOfQuiver(Q); # # The vertices in the trivial extension are the "old" ones. #
new_vertices := List(vertices, v -> String(v)); # # Old arrows from the original quiver. #
new_arrows := List(arrows, a -> [String(SourceOfPath(a)),String(TargetOfPath(a)),String(a)]); # # Finding the "new" arrows, te_arrows. #
DA := DualOfAlgebraAsModuleOverEnvelopingAlgebra(A);
TopOfDAProjection := TopOfModuleProjection(DA);
B := BasisVectors(Basis(Range(TopOfDAProjection)));
temp := Flat(List(B, b -> SupportModuleElement(b)));
temp := List(temp, t -> CoefficientsAndMagmaElements(t![1])[1]);
de_op_name := OppositeQuiverNameMap(OppositeQuiver(QuiverOfPathAlgebra(A)));
temp := List(temp, t -> [de_op_name(String(ProjectFromProductQuiver(1,t))), String(ProjectFromProductQuiver(2,t))]);
additional_arrows := [];
i := 0; for t in temp do
i := i + 1;
Add(additional_arrows, [t[1],t[2],Concatenation("te_a",arrow_add_string,"_",String(Position(temp,t)),"_",String(i))]);
od;
Append(new_arrows, additional_arrows);
Q_TE := Quiver(new_vertices, new_arrows);
te_arrows := ArrowsOfQuiver(Q_TE);
string_te_arrows := List(te_arrows, a -> String(a));
K := LeftActingDomain(A);
KQ_TE := PathAlgebra(K,Q_TE); # # The new relations #
relations := []; if not IsPathAlgebra(A) then
relations := RelatorsOfFpAlgebra(A); fi; # # Transferring the relations from A to T(A). #
new_relations := []; for r in relations do
coeffandelem := CoefficientsAndMagmaElements(r);
n := Length(coeffandelem)/2;
temprel := Zero(KQ_TE); for i in [1..n] do
templist := List(WalkOfPath(coeffandelem[2*i-1]), w -> te_arrows[Position(string_te_arrows, String(w))]);
temprel := temprel + coeffandelem[2*i]*One(KQ_TE)*Product(templist);
od;
Add(new_relations, temprel);
od; # # The products te_arrows * <paths in Qarrows> * te_arrows are zero. # First adding te_arrows * te_arrows. #
num_arrows := NumberOfArrows(Q);
V := Subspace(KQ_TE, List(ArrowsOfQuiver(Q_TE){[num_arrows + 1..NumberOfArrows(Q_TE)]}, x -> One(KQ_TE)*x));
Append(new_relations, BasisVectors(Basis(ProductSpace(V,V)))); # # Now adding te_arrows * <non-trival paths in Qarrows> * te_arrows. # if IsPathAlgebra(A) then
nontipsofradA := BasisVectors(Basis(A)){[NumberOfVertices(Q) + 1..Dimension(A)]}; else
nontipsofradA := List(BasisVectors(Basis(A)){[NumberOfVertices(Q) + 1..Dimension(A)]}, x -> x![1]); fi; # # Transferring the nontips of rad A from A to T(A). #
nontipsofradAinKQ_TE := []; for r in nontipsofradA do
coeffandelem := CoefficientsAndMagmaElements(r);
n := Length(coeffandelem)/2;
temprel := Zero(KQ_TE); for i in [1..n] do
templist := List(WalkOfPath(coeffandelem[2*i-1]), w -> te_arrows[Position(string_te_arrows, String(w))]);
temprel := temprel + coeffandelem[2*i]*One(KQ_TE)*Product(templist);
od;
Add(nontipsofradAinKQ_TE, temprel);
od;
W := Subspace(KQ_TE, nontipsofradAinKQ_TE);
W := ProductSpace(W,V);
VWV := ProductSpace(V,W);
Append(new_relations, BasisVectors(Basis(VWV))); # # Factoring out LoewyLength(A) + 2 power of the arrow ideal in KQ_TE, and # calling it AA, this is done so that we can find the remaining relations. #
Jpower := NthPowerOfArrowIdeal(KQ_TE, LoewyLength(A) + 2);
temprel := ShallowCopy(new_relations);
Append(temprel,Jpower);
AA := KQ_TE/temprel;
BAA := BasisVectors(Basis(AA));
te_arrow_rep := List(B, b -> PreImagesRepresentative(TopOfDAProjection, b));
Qarrows := ArrowsOfQuiver(Q_TE){[1..num_arrows]};
Qarrows := Flat(List(Qarrows, a -> WalkOfPath(a))); # # Finding the relations involving the te_arrows. #
Qarrows_labels := List(arrows, a -> String(a));
Q_TE_to_Q := function( a );
return arrows[Position(Qarrows_labels, String(a))]; end;
KQ := OriginalPathAlgebra(A);
matrix := [];
setofvectors := []; for b in BAA{[Length(vertices) + 1..Length(BAA)]} do if IsPathAlgebra(AA) then
temp := CoefficientsAndMagmaElements(b); else
temp := CoefficientsAndMagmaElements(b![1]); fi;
occurring_arrows := WalkOfPath(temp[1]);
positions := PositionsProperty(occurring_arrows, x -> not x in Qarrows); if Length(positions) = 1then
Add(setofvectors, Position(BAA, b));
initialterm := One(KQ); if positions[1] > 1then
temp := List(occurring_arrows{[1..positions[1] - 1]}, a -> Q_TE_to_Q(a));
initialterm := initialterm*Product(temp); fi;
terminalterm := One(KQ); if positions[1] < Length(occurring_arrows) then
temp := List(occurring_arrows{[positions[1] + 1..Length(occurring_arrows)]}, a -> Q_TE_to_Q(a));
terminalterm := terminalterm*Product(temp); fi;
Add(matrix, [initialterm, occurring_arrows[positions[1]], terminalterm]); fi;
od;
setofvectors := Set(setofvectors);
Aenv := RightActingAlgebra(DA);
fam := ElementsFamily(FamilyObj(A)); if IsPathAlgebra(A) then
prod := List(matrix, m -> [OppositePathAlgebraElement(m[1]), m[2], m[3]]); else
prod := List(matrix, m -> [OppositePathAlgebraElement(ElementOfQuotientOfPathAlgebra(fam, m[1]*One(KQ), true)), m[2], ElementOfQuotientOfPathAlgebra(fam, m[3]*One(KQ), true)]); fi;
add_arrows_labels := List(additional_arrows, a -> a[3]);
prod := List(prod, m -> te_arrow_rep[Position(add_arrows_labels,String(m[2]))]^SimpleTensor([m[1],m[3]], Aenv));
matrix := List(prod, x -> Flat(x![1]![1]));
solutions := NullspaceMat(matrix);
tempBAA := BAA{setofvectors};
tempBAA := List(tempBAA, t -> t![1]); # # Getting the relations involving the arrows te_arrows #
Solutions := List(solutions, s -> LinearCombination(tempBAA, s));
Append(new_relations, Solutions);
TA := KQ_TE/new_relations;
SetTrivialExtensionOfQuiverAlgebraLevel( TA, TrivialExtensionOfQuiverAlgebraLevel( A ) + 1 );
return TA; end
);
####################################################################### ## #A EnvelopingAlgebraHomomorphism( <f> ) ## ## Given an algebra homomorphism, this constructs corresponding algebra ## homomorphism between the enveloping algebras. ##
InstallMethod( EnvelopingAlgebraHomomorphism, "for an algebra",
[ IsAlgebraHomomorphism ], 0, function( f )
local A, Aop, Aenv, B, Benv, fop, gensAenv,
coeffgensAenv, firstcoordinates, secondcoordinates,
coeffisients, n, images, g;
A := Source( f );
Aop := OppositeAlgebra( A );
Aenv := EnvelopingAlgebra( A );
B := Range( f );
Benv := EnvelopingAlgebra( B );
fop := OppositeAlgebraHomomorphism( f );
gensAenv := GeneratorsOfAlgebraWithOne( Aenv );
coeffgensAenv := List( gensAenv, g -> CoefficientsAndMagmaElements( g![ 1 ] ) );
firstcoordinates := List( coeffgensAenv, m -> ProjectFromProductQuiver( 1, m[ 1 ] ) );
secondcoordinates := List( coeffgensAenv, m -> ProjectFromProductQuiver( 2, m[ 1 ] ) );
coeffisients := List( coeffgensAenv, m -> m[ 2 ] );
firstcoordinates := List( firstcoordinates, m -> ImageElm( fop, One( Aop ) * m ) );
secondcoordinates := List( secondcoordinates, m -> ImageElm( f, One( A ) * m ) );
n := Length( coeffgensAenv );
images := List( [ 1..n ], i -> coeffisients[ i ] * SimpleTensor( [ firstcoordinates[ i ], secondcoordinates[ i ] ] , Benv ) );
####################################################################### ## #O TrivialExtensionOfQuiverAlgebraProjection( <A> ) ## ## Constructs the natural algebra projection form trivial extension ## T(A) to A. ##
InstallMethod( TrivialExtensionOfQuiverAlgebraProjection, "for an algebra",
[ IsQuiverAlgebra ], 0, function( A )
local TA, gensTA, gensA, newarrows, i, f;
if not IsFiniteDimensional( A ) then
return fail; fi;
TA := TrivialExtensionOfQuiverAlgebra( A );
gensTA := GeneratorsOfAlgebraWithOne( TA );
gensA := ShallowCopy( GeneratorsOfAlgebraWithOne( A ) );
newarrows := Length( gensTA ) - Length( gensA ); for i in [ 1..newarrows ] do
Add( gensA, Zero( A ) );
od;
f := AlgebraHomomorphismByImages( TA, A, gensTA, gensA );
f!.generators := gensTA;
f!.genimages := gensA;
return f; end
);
Messung V0.5 in Prozent
¤ 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.0.35Bemerkung:
(vorverarbeitet am 2026-10-13)
¤
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.