############################################################################# ## #M ImageElm( <map>, <elm> ) . . . for PathAlgebraMatModuleMap and element ##
InstallMethod( ImageElm, "for a map between representations and an element in a representation.",
[ IsPathAlgebraMatModuleHomomorphism, IsAlgebraModuleElement ], 0, function( map, elem )
local elt, n, fam, image, temp, zero, new_image;
if elem in Source(map) then if Dimension(Range(map)) = 0then
return Zero(Range(map)); fi;
elt := ExtRepOfObj(elem);
n := Zero(Range(map));
image := List([1..Length(elt![1])], x -> elt![1][x]*map!.maps[x]);
image := PathModuleElem(FamilyObj(Zero(Range(map))![1]),image);
return Objectify( TypeObj( n ), [ image ] ); else
Error("the element entered is not an element in the source of the map,"); fi; end);
############################################################################# ## #M ImagesSet( <map>, <elms> ) . . for a PathAlgebraMatModuleMap and finite collection ##
InstallMethod( ImagesSet, "for a map between representations and a set of elements in a representation.",
[ IsPathAlgebraMatModuleHomomorphism, IsCollection ], 0, function( map, elms )
local elt, B, images;
images := []; if IsList(elms) then if IsFinite(elms) then
B := elms; fi; else if IsPathAlgebraMatModule(elms) then
B := BasisVectors(CanonicalBasis(elms)); else
Error("input of wrong type,"); fi; fi; for elt in B do if ImageElm(map,elt) <> Zero(Range(map)) then
Add(images,ImageElm(map,elt)); fi;
od;
return images; end
); ############################################################################# ## #M PreImagesRepresentative( <map>, <elms> ) . . for a ## PathAlgebraMatModuleMap and finite collection ##
InstallMethod( PreImagesRepresentative, "for a map between representations and an element in a representation.",
[ IsPathAlgebraMatModuleHomomorphism, IsAlgebraModuleElement ], 0, function( map, elem )
local elt, m, fam, preimage;
if elem in Range(map) then
elt := ExtRepOfObj(elem)![1];
m := Basis(Source(map))[1];
preimage := List([1..Length(elt)], x -> SolutionMat(map!.maps[x],elt[x])); if ForAll(preimage,x -> x <> fail) then
preimage := PathModuleElem(FamilyObj(Zero(Source(map))![1]),preimage);
return Objectify( TypeObj( m ), [ preimage ] ); else
return fail; fi; else
Error("the element entered is not an element in the range of the map,"); fi; end);
####################################################################### ## #O RightModuleHomOverAlgebra( <M>, <N>, <linmaps> ) ## ## This function constructs a homomorphism f from the module <M> to ## the module <N> from the linear maps given in <linmaps>. The ## function checks if <M> and <N> are modules over the same algebra ## and checks if the linear maps <linmaps> defines a homomorphism from ## <M> to <N>. The source and the range of f can be recovered from ## f via the function Source(f) and Range(f). The linear maps can ## be recovered via f!.maps or ## MatricesOfPathAlgebraMatModuleHomomorphism(f). ##
InstallMethod( RightModuleHomOverAlgebra, "for two representations of a quiver",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule, IsList ], 0, function( M, N, linmaps)
local A, K, mat_M, mat_N, map, Fam, dim_M, dim_N, Q, arrows,
vertices, a, i, origin, target, j;
A := RightActingAlgebra(M); if A <> RightActingAlgebra(N) then
Error("the two modules are not over the same algebra, "); fi;
dim_M := DimensionVector(M);
dim_N := DimensionVector(N); # # Checking the number of matrices entered. # if Length( linmaps ) <> Length(dim_M) then
Error("the number of matrices entered is wrong,"); fi; # # Check the matrices of linmaps #
K := LeftActingDomain(A); for i in [1..Length(dim_M)] do if ( dim_M[i] = 0 ) then if dim_N[i] = 0then if linmaps[i] <> NullMat(1,1,K) then
Error("the dimension of matrix number ",i," is wrong (A),"); fi; else if linmaps[i] <> NullMat(1,dim_N[i],K) then
Error("the dimension of matrix number ",i," is wrong (B),"); fi; fi; else if dim_N[i] = 0then if linmaps[i] <> NullMat(dim_M[i],1,K) then
Error("the dimension of matrix number ",i," is wrong (C),"); fi; else if DimensionsMat(linmaps[i])[1] <> dim_M[i] or DimensionsMat(linmaps[i])[2] <> dim_N[i] then
Error("the dimension of matrix number ",i," is wrong (D),"); fi; fi; fi;
od; # # Check commutativity relations with the matrices in M and N. #
mat_M := MatricesOfPathAlgebraModule(M);
mat_N := MatricesOfPathAlgebraModule(N);
Q := QuiverOfPathAlgebra(A);
arrows := ArrowsOfQuiver(Q);
vertices := VerticesOfQuiver(Q); for a in arrows do
i := Position(arrows,a);
origin := Position(vertices,SourceOfPath(a));
target := Position(vertices,TargetOfPath(a)); if mat_M[i]*linmaps[target] <> linmaps[origin]*mat_N[i] then
Error("entered map is not a module map between the representations entered, error for vertex number ",i," and arrow ",a,","); fi;
od; # #
map := Objectify( NewType( CollectionsFamily( GeneralMappingsFamily(
ElementsFamily( FamilyObj( M ) ),
ElementsFamily( FamilyObj( N ) ) ) ),
IsPathAlgebraMatModuleHomomorphism and IsPathAlgebraMatModuleHomomorphismRep ), rec( maps := linmaps ));
SetPathAlgebraOfMatModuleMap(map, A);
SetSource(map, M);
SetRange(map, N);
SetIsWholeFamily(map, true);
return map; end
);
####################################################################### ## #O MatricesOfPathAlgebraMatModuleHomomorphism( <f> ) ## ## This function returns the matrices defining the homomorphism ## <f>. ##
InstallMethod( MatricesOfPathAlgebraMatModuleHomomorphism, "for a PathAlgebraMatModuleHomomorphism",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
return f!.maps; end
);
####################################################################### ## #M ViewObj( <f> ) ## ## This function defines how View prints a ## PathAlgebraMatModuleHomomorphism <f>. ##
InstallMethod( ViewObj, "for a PathAlgebraMatModuleHomomorphism",
true,
[ IsPathAlgebraMatModuleHomomorphism ], NICE_FLAGS+1, function ( f );
Print("<");
View(Source(f));
Print(" ---> ");
View(Range(f));
Print(">"); end
);
####################################################################### ## #M PrintObj( <f> ) ## ## This function defines how Print prints a ## PathAlgebraMatModuleHomomorphism <f>. ##
InstallMethod( PrintObj, "for a PathAlgebraMatModuleHomomorphism",
true,
[ IsPathAlgebraMatModuleHomomorphism ], NICE_FLAGS + 1, function ( f );
Print("<",Source(f)," ---> ",Range(f),">"); end
);
####################################################################### ## #M Display( <f> ) ## ## This function defines how Display prints a ## PathAlgebraMatModuleHomomorphism <f>. ##
InstallMethod( Display, "for a PathAlgebraMatModuleHomomorphism",
true,
[ IsPathAlgebraMatModuleHomomorphism ], NICE_FLAGS + 1, function ( f )
local i;
Print(f);
Print("\nwith "); for i in [1..Length(DimensionVector(Source(f)))] do
Print("linear map for vertex number ",i,":\n");
PrintArray(f!.maps[i]);
od; end
);
####################################################################### ## #M Zero( <f> ) ## ## This function returns the zero mapping with the same source and ## range as <f>. ##
InstallMethod ( Zero, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local M, N, K, dim_M, dim_N, i, mats;
M := Source(f);
N := Range(f);
K := LeftActingDomain(Source(f));
dim_M := DimensionVector(M);
dim_N := DimensionVector(N);
mats := []; for i in [1..Length(dim_M)] do if dim_M[i] = 0then if dim_N[i] = 0then
Add(mats,NullMat(1,1,K)); else
Add(mats,NullMat(1,dim_N[i],K)); fi; else if dim_N[i] = 0then
Add(mats,NullMat(dim_M[i],1,K)); else
Add(mats,NullMat(dim_M[i],dim_N[i],K)); fi; fi;
od;
return RightModuleHomOverAlgebra(Source(f),Range(f),mats); end
);
####################################################################### ## #M ZeroMapping( <M>, <N> ) ## ## This function returns the zero mapping from the module <M> to the ## module <N>. ##
InstallMethod ( ZeroMapping, " between two PathAlgebraMatModule's ",
true,
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, N )
local A, K, dim_M, dim_N, i, mats;
A := RightActingAlgebra(M); if ( A = RightActingAlgebra(N) ) then
K := LeftActingDomain(M);
dim_M := DimensionVector(M);
dim_N := DimensionVector(N);
mats := []; for i in [1..Length(dim_M)] do if dim_M[i] = 0then if dim_N[i] = 0then
Add(mats,NullMat(1,1,K)); else
Add(mats,NullMat(1,dim_N[i],K)); fi; else if dim_N[i] = 0then
Add(mats,NullMat(dim_M[i],1,K)); else
Add(mats,NullMat(dim_M[i],dim_N[i],K)); fi; fi;
od;
return RightModuleHomOverAlgebra(M,N,mats); else
Error("the two modules entered are not modules of one and the same algebra, or they are not modules over the same (quotient of a) path algebra, "); fi; end
);
####################################################################### ## #M IdentityMapping( <M> ) ## ## This function returns the identity homomorphism from <M> to <M>. ##
InstallMethod ( IdentityMapping, "for a PathAlgebraMatModule",
true,
[ IsPathAlgebraMatModule ], 0, function( M )
local K, dim_M, i, mats; # # Representing the identity map from M to M with identity matrices # of the right size, including if dim_M[i] = 0, then the identity # is represented by a one-by-one identity matrix. #
K := LeftActingDomain(M);
dim_M := DimensionVector(M);
mats := []; for i in [1..Length(dim_M)] do if dim_M[i] = 0then
Add(mats,NullMat(1,1,K)); else
Add(mats,IdentityMat(dim_M[i],K)); fi;
od;
return RightModuleHomOverAlgebra(M,M,mats); end
);
####################################################################### ## #M \=( <f>, <g> ) ## ## This function returns true if the homomorphisms <f> and <g> have ## the same source, the same range and the matrices defining the ## homomorphisms are identitical. ##
InstallMethod ( \=, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism ], 0, function( f, g )
local a;
if ( Source(f) = Source(g) ) and ( Range(f) = Range(g) )
and ( f!.maps = g!.maps ) then
return true; else
return false; fi; end
);
####################################################################### ## #O SubRepresentationInclusion( <M>, <gen> ) ## ## This function returns the inclusion from the submodule of <M> ## generated by the elements <gen> to the module <M>. The function ## checks if all the elements on the list <gen> are elements of the ## module <M>. ##
InstallMethod( SubRepresentationInclusion, "for a path algebra module and list of its elements",
true,
[IsPathAlgebraMatModule, IsList], 0, function( M, gen )
local A, q, K, num_vert, basis_M, vertices, arrows_as_path, arrows_of_quiver,
newgen, g, v, submodspan, temp, new, V_list, m, V, basis_submod, submod_list,
dim_vect_sub, i, cnt, j, dim_size, s, t, big_mat, a, mat, dom_a, im_a, pd,
pi, arrow, submodule, dim_vect_M, dim_size_M, inclusion, map;
if not ForAll(gen, g -> g in M) then
Error("entered elements are not in the module <M>, "); fi;
A := RightActingAlgebra(M);
q := QuiverOfPathAlgebra(A);
K := LeftActingDomain(M);
num_vert := Length(VerticesOfQuiver(q));
basis_M := Basis(M); # # vertices, vertices as elements of algebra # arrows_as_path, arrows as elements of algebra # arrows, as arrows in the quiver # if Length(gen) = 0then
return ZeroMapping(ZeroModule(A),M); else
vertices := List(VerticesOfQuiver(q), x -> x*One(A));
arrows_as_path := List(ArrowsOfQuiver(q), x -> x*One(A));
arrows_of_quiver := GeneratorsOfQuiver(q){[1+num_vert..num_vert+Length(ArrowsOfQuiver(q))]}; # # Ensuring uniform generators #
newgen := []; for g in gen do for v in vertices do if g^v <> Zero(M) then
Add(newgen,g^v); fi;
od;
od; # # Finding the linear span of the submodule generated by gen in M #
submodspan := [];
temp := [];
new := newgen; while new <> [] do for m in new do for a in arrows_as_path do if m^a <> Zero(M) then
Add(temp,m^a); fi;
od;
od;
Append(submodspan,new);
new := temp;
temp := [];
od;
V_list := List(submodspan, x -> Coefficients(basis_M,x));
V := VectorSpace(K,V_list);
basis_submod := CanonicalBasis(V); # # Converting elements in basis_submod to a list of elements in M #
submod_list := List(basis_submod, x -> LinearCombination(basis_M,x)); # # Finding the dimension vector of the submodule of M #
dim_vect_sub:=[]; for i in [1.. num_vert] do
cnt := 0; for j in [1..Length(submod_list)] do if submod_list[j]^vertices[i] <> Zero(M) then
cnt:=cnt+1; fi;
od;
Add(dim_vect_sub,cnt);
od; if Dimension(V) <> Sum(dim_vect_sub) then
Error("Bug alert: Something is wrong in this code! Report this.\n"); fi; # # CanonicalBasis(V) gives the basis in "upper triangular form", so that # first comes the basis vectors for the vector space in vertex 1, in # vertex 2, ...., in vertex n. Next we find the intervals of the basis # vector [[?..?],[?..?],...,[?..?]]. Is no basis vectors for a vertex, [] is entered. #
dim_size := [];
s := 1;
t := 0; for i in [1..Length(vertices)] do
t := dim_vect_sub[i] + t; if t < s then
Add(dim_size,[]); else
Add(dim_size,[s..t]); fi;
s := t + 1;
od; # # Finding the submodule as a representation of the quiver #
big_mat := []; for a in arrows_as_path do
mat := []; for v in vertices do if v*a <> Zero(A) then
dom_a := v; fi;
od; for v in vertices do if a*v <> Zero(A) then
im_a := v; fi;
od;
pd := Position(vertices,dom_a);
pi := Position(vertices,im_a);
arrow := arrows_of_quiver[Position(arrows_as_path,a)]; if dim_vect_sub[pd] <> 0 and dim_vect_sub[pi] <> 0then for m in submod_list{dim_size[pd]} do
Add(mat,Coefficients(basis_submod,Coefficients(basis_M,m^a)){dim_size[pi]});
od;
Add(big_mat,[String(arrow),mat]); fi;
od;
if IsPathAlgebra(A) then
submodule := RightModuleOverPathAlgebra(A, dim_vect_sub, big_mat); else
submodule := RightModuleOverPathAlgebra(A, dim_vect_sub, big_mat); fi;
# # Finding inclusion map of submodule into M #
mat := []; for i in [1..Length(basis_submod)] do
Add(mat,basis_submod[i]);
od;
dim_vect_M := DimensionVector(M);
dim_size_M := [];
s := 1;
t := 0; for i in [1..Length(vertices)] do
t := dim_vect_M[i] + t; if t < s then
Add(dim_size_M,[]); else
Add(dim_size_M,[s..t]); fi;
s := t + 1;
od;
inclusion := []; for i in [1..Length(vertices)] do if dim_vect_sub[i] = 0then if dim_vect_M[i] = 0then
Add(inclusion,NullMat(1,1,K)); else
Add(inclusion,NullMat(1,dim_vect_M[i],K)); fi; else
Add(inclusion,mat{dim_size[i]}{dim_size_M[i]}); fi;
od;
return RightModuleHomOverAlgebra(submodule,M,inclusion); fi; end
);
####################################################################### ## #O SubRepresentation( <M>, <gen> ) ## ## This function returns a module isomorphic to the submodule of <M> ## generated by the elements <gen> to the module <M>. The function ## checks if all the elements on the list <gen> are elements of the ## module <M>. ##
InstallMethod( SubRepresentation, "for a path algebra module and list of its elements",
true,
[ IsPathAlgebraMatModule, IsList], 0, function( M, gen );
return Source(SubRepresentationInclusion(M,gen)); end
);
####################################################################### ## #O RadicalOfModuleInclusion( <M> ) ## ## This function returns the inclusion from the radical of <M> ## to the module <M>. ##
InstallMethod( RadicalOfModuleInclusion, "for a path algebra module",
true,
[ IsPathAlgebraMatModule ], 0, function( M )
local A, q, num_vert, arrows_as_path, basis_M, generators, a, b, run_time;
# # Checking if the algebra <A> is finite dimensional. If it is and is # a path algebra, then the radical is the ideal generated by the arrows. # If it is not a path algebra but an admissible quotient of a path algebra, # the radical is the ideal generated by the arrows, and this function # applies. #
A := RightActingAlgebra(M);
q := QuiverOfPathAlgebra(A); if not IsFiniteDimensional(A) then
TryNextMethod(); fi; if not IsPathAlgebra(A) and not IsAdmissibleQuotientOfPathAlgebra(A) then
TryNextMethod(); fi;
num_vert := Length(VerticesOfQuiver(q)); # # Note arrows_as_path will change if A is a quotient of a path algebra !!!! #
arrows_as_path := List(ArrowsOfQuiver(q), x -> x*One(A));
basis_M := Basis(M);
generators := []; for a in arrows_as_path do for b in basis_M do if b^a <> Zero(M) then
Add(generators,b^a); fi;
od;
od;
generators := Unique(generators);
return SubRepresentationInclusion(M,generators); end
);
####################################################################### ## #O RadicalOfModule( <M> ) ## ## This function returns a module isomorphic to the radical of <M>. ##
InstallMethod( RadicalOfModule, "for a path algebra module",
true,
[ IsPathAlgebraMatModule ], 0, function( M )
return Source(RadicalOfModuleInclusion(M)); end
);
####################################################################### ## #M IsInjective( <f> ) ## ## This function returns a module isomorphic to the radical of <M>. ##
InstallOtherMethod ( IsInjective, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local M, K, V_list, dim_K, dim_M, i, VS_list;
M := Source(f);
K := LeftActingDomain(M);
V_list := [];
dim_K := 0;
dim_M := DimensionVector(M); # # Computing the kernel of each f_i and making a vector space of Ker f_i with # basis given by the vectors supplied by NullspaceMat(f!.maps[i]). # for i in [1..Length(dim_M)] do if dim_M[i] <> 0then
dim_K := dim_K + Length(NullspaceMat(f!.maps[i])); fi;
od; if dim_K = 0then
SetIsInjective(f,true);
return true; else
SetIsInjective(f,false);
return false; fi; end
);
####################################################################### ## #O KernelInclusion( <f> ) ## ## This function returns the inclusion from a module isomorphic to the ## kernel of <f> to the module <M>. ##
InstallMethod ( KernelInclusion, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local M, dim_M, V_list, V_dim, i, dim_K, VS_list, A, K, vertices,
arrows, mats, kermats, a, apos, j, matrix, k, Kerf, kermap;
M := Source(f);
K := LeftActingDomain(M);
V_list := [];
dim_K := [];
dim_M := DimensionVector(M);
VS_list := []; # # Computing the kernel of each f_i and making a vector space of Ker f_i with # basis given by the vectors supplied by NullspaceMat(f!.maps[i]). # for i in [1..Length(dim_M)] do if dim_M[i] <> 0then
Add(V_list,NullspaceMat(f!.maps[i]));
Add(dim_K,Length(V_list[i])); if Length(V_list[i]) > 0then
Add(VS_list,VectorSpace(K,V_list[i],"basis")); else
Add(VS_list,TrivialSubmodule(VectorSpace(K,[[One(K)]]))); fi; else
Add(V_list,[]);
Add(dim_K,0);
Add(VS_list,TrivialSubmodule(VectorSpace(K,[[One(K)]]))); fi;
od;
V_list := List(VS_list, V -> Basis(V));
V_dim := Sum(dim_K);
A := RightActingAlgebra(M); if V_dim = 0then
SetIsInjective(f,true);
kermap := ZeroMapping(ZeroModule(A),Source(f)); else
vertices := VerticesOfQuiver(QuiverOfPathAlgebra(A));
arrows := ArrowsOfQuiver(QuiverOfPathAlgebra(A));
mats := MatricesOfPathAlgebraModule(M);
kermats := []; # # The matrices f_alpha of the representation M is used to compute # the induced action on the basis of Ker f_i. # for a in arrows do
i := Position(vertices,SourceOfPath(a));
j := Position(vertices,TargetOfPath(a)); if dim_K[i] <> 0 and dim_K[j] <> 0then
apos := Position(arrows,a);
matrix := []; for k in [1..Length(V_list[i])] do
Add(matrix,Coefficients(V_list[j],V_list[i][k]*mats[apos]));
od;
Add(kermats,[String(a),matrix]); fi;
od; # # Extracting the basis vectors of each Ker f_i, as a subspace of M_i, # which give the matrices of the inclusion of Ker f into M. # for i in [1..Length(dim_M)] do if Dimension(VS_list[i]) = 0then
V_list[i] := []; if dim_M[i] = 0then
Add(V_list[i],Zero(K)); else for j in [1..dim_M[i]] do
Add(V_list[i],Zero(K));
od; fi;
V_list[i] := [V_list[i]]; else
V_list[i] := BasisVectors(V_list[i]); fi;
od; if IsPathAlgebra(A) then
Kerf := RightModuleOverPathAlgebra(A, dim_K, kermats); else
Kerf := RightModuleOverPathAlgebra(A, dim_K, kermats); fi;
kermap := RightModuleHomOverAlgebra(Kerf,M,V_list); fi;
SetKernelOfWhat(kermap,f);
SetIsInjective(kermap,true);
return kermap; end
);
####################################################################### ## #M Kernel( <f> ) ## ## This function returns a module isomorphic to the kernel of <f>. ##
InstallOtherMethod ( Kernel, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
return Source(KernelInclusion(f)); end
);
####################################################################### ## #O ImageProjectionInclusion( <f> ) ## ## This function returns a projection from the source of <f> to a ## module isomorphic to the image of <f> and an inclusion from a ## module isomorphic to the image of <f> to the module <M>. ##
InstallMethod ( ImageProjectionInclusion, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local M, N, image, images, A, K, num_vert, vertices, arrows, gen_list, B, i,fam, n, s, v,
pos, dim_M, dim_N, V, W, projection, dim_image, basis_image, basis_M, basis_N, a, b, image_mat,
mat, mats, source_a, target_a, pos_a, bb, image_f, C, map, partmap,
inclusion, image_inclusion, image_projection, dimvecimage_f;
M := Source( f );
N := Range( f );
A := RightActingAlgebra( M );
K := LeftActingDomain( M );
num_vert := Length( VerticesOfQuiver( QuiverOfPathAlgebra( A ) ) ); #
vertices := List( VerticesOfQuiver( QuiverOfPathAlgebra( A ) ), x -> x * One( A ) ); # # Finding a basis for the vector space in each vertex for the image #
image := ImagesSet( f, Source( f ) );
gen_list := [ ]; for i in [ 1..Length( vertices ) ] do
Add( gen_list,[ ] );
od; if Length( image ) > 0then for n in image do for v in vertices do if n^v <> Zero( N ) then
pos := Position( vertices, v );
Add( gen_list[ pos ], ExtRepOfObj( n )![ 1 ][ pos ] ); fi;
od;
od;
dim_N := DimensionVector( N );
V := [];
W := [];
basis_image := [];
basis_N := []; for i in [ 1..Length( vertices ) ] do
V[ i ] := K^dim_N[ i ];
basis_N[ i ] := CanonicalBasis( V[ i ] );
W[ i ] := Subspace( V[ i ], gen_list[ i ] );
Add( basis_image, CanonicalBasis( W[ i ] ) );
od; # # Finding the matrices of the representation image #
arrows := ArrowsOfQuiver( QuiverOfPathAlgebra( A ) );
mats := MatricesOfPathAlgebraModule( N );
image_mat := [ ]; for a in arrows do
mat := [ ];
pos_a := Position( arrows, a );
source_a := Position( vertices, SourceOfPath( a ) * One( A ) );
target_a := Position( vertices, TargetOfPath( a ) * One( A ) ); if ( Length( basis_image[ source_a ]) <> 0 ) and ( Length( basis_image[ target_a ] ) <> 0 ) then for b in basis_image[ source_a ] do
Add( mat, Coefficients( basis_image[ target_a ], b * mats[ pos_a ] ) );
od;
Add( image_mat, [ String( a ), mat ] ); fi;
od;
dimvecimage_f := List( W, Dimension );
image_f := RightModuleOverPathAlgebra( A, dimvecimage_f, image_mat ); # # Finding inclusion map from the image to Range(f) #
inclusion := [ ]; for i in [ 1..num_vert ] do
mat := [ ]; if Length( basis_image[ i ] ) = 0then if dim_N[ i ] = 0then
Add( inclusion, NullMat( 1, 1, K ) ); else
Add( inclusion, NullMat( 1, dim_N[ i ], K ) ); fi; else
mat := [ ]; for b in basis_image[ i ] do
Add( mat, b );
od;
Add( inclusion, mat ); fi;
od;
image_inclusion := RightModuleHomOverAlgebra( image_f, Range( f ), inclusion );
SetImageOfWhat( image_inclusion, f );
SetIsInjective( image_inclusion, true ); # # Finding the projection for Source(f) to the image #
dim_M := DimensionVector(M);
basis_M := []; for i in [1..num_vert] do
Add(basis_M,CanonicalBasis(K^dim_M[i]));
od;
projection := []; for i in [1..num_vert] do
mat := []; if Length(basis_image[i]) = 0then if dim_M[i] = 0then
mat := NullMat(1,1,K); else
mat := NullMat(dim_M[i],1,K); fi;
Add(projection,mat); else for b in basis_M[i] do
Add(mat,Coefficients(basis_image[i],b*f!.maps[i]));
od;
Add(projection,mat); fi;
od;
image_projection := RightModuleHomOverAlgebra(Source(f),image_f,projection);
SetImageOfWhat(image_projection,f);
SetIsSurjective(image_projection,true);
return [image_projection,image_inclusion]; else
return [ZeroMapping(M,ZeroModule(A)),ZeroMapping(ZeroModule(A),N)]; fi; end
);
####################################################################### ## #O ImageProjection( <f> ) ## ## This function returns a projection from the source of <f> to a ## module isomorphic to the image of <f>. ##
InstallMethod ( ImageProjection, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f );
return ImageProjectionInclusion(f)[1]; end
);
####################################################################### ## #O ImageInclusion( <f> ) ## ## This function returns an inclusion from a module isomorphic to the ## image of <f> to the module <M>. ##
InstallMethod ( ImageInclusion, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f );
return ImageProjectionInclusion(f)[2]; end
);
####################################################################### ## #M ImagesSource( <f> ) ## ## This function returns a module isomorphic to the image of <f>. ## TODO: Should this delegate to ImagesSet as for the general GAP ## command? ##
InstallMethod ( ImagesSource, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f );
return Range(ImageProjectionInclusion(f)[1]); end
);
####################################################################### ## #M IsZero( <f> ) ## ## This function returns true if all the matrices of the homomorphism ## <f> are identically zero. ##
InstallMethod ( IsZero, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f );
return ForAll(f!.maps, IsZero); end
);
####################################################################### ## #M IsSurjective( <f> ) ## ## This function returns true if the homomorphism <f> is surjective. ##
InstallOtherMethod ( IsSurjective, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local image, dim_image, K, V;
image := ImagesSet(f,Source(f)); if Length(image) = 0then
dim_image := 0; else
image := List(image, x -> Flat(ExtRepOfObj(x)![1]));
K := LeftActingDomain(Source(f));
V := K^Length(image[1]);
dim_image := Dimension(Subspace(V,image)); fi; if dim_image = Dimension(Range(f)) then
SetIsSurjective(f,true);
return true; else
SetIsSurjective(f,false);
return false; fi; end
);
####################################################################### ## #M IsIsomorphism( <f> ) ## ## This function returns true if the homomorphism <f> is an ## isomorphism. ##
InstallMethod ( IsIsomorphism, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f );
return IsInjective(f) and IsSurjective(f); end
);
####################################################################### ## #O CoKernelProjection( <f> ) ## ## This function returns a projection from the range of <f> to a ## module isomorphic to the cokernel of <f>. ##
InstallMethod ( CoKernelProjection, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local M, N, image, A, K, num_vert, vertices, arrows, basis_list,i, n, v,
pos, dim_N, V, W, projection, coker, basis_coker, basis_N, a, b,
mat, mats, source_a, target_a, pos_a, bb, cokermat, C, map, partmap,
morph, dimvec_coker;
M := Source(f);
N := Range(f);
A := RightActingAlgebra(M);
K := LeftActingDomain(M);
num_vert := Length(VerticesOfQuiver(QuiverOfPathAlgebra(A))); #
vertices := List(VerticesOfQuiver(QuiverOfPathAlgebra(A)), x -> x*One(A)); # # Finding a basis for the vector space in each vertex for the cokernel #
image := ImagesSet(f,Source(f));
basis_list := []; for i in [1..Length(vertices)] do
Add(basis_list,[]);
od; for n in image do for v in vertices do if n^v <> Zero(N) then
pos := Position(vertices,v);
Add(basis_list[pos],ExtRepOfObj(n)![1][pos]); fi;
od;
od;
dim_N := DimensionVector(N);
V := [];
W := [];
projection := [];
basis_coker := [];
basis_N := [];
coker := []; for i in [1..Length(vertices)] do
V[i] := K^dim_N[i];
basis_N[i] := CanonicalBasis(V[i]);
W[i] := Subspace(V[i],basis_list[i]);
projection[i] := NaturalHomomorphismBySubspace(V[i],W[i]);
Add(basis_coker,Basis(Range(projection[i])));
coker[i] := Range(projection[i]);
od; # # Finding the matrices of the representation of the cokernel #
mats := MatricesOfPathAlgebraModule(N);
arrows := ArrowsOfQuiver(QuiverOfPathAlgebra(A));
cokermat := []; for a in arrows do
source_a := Position(vertices,SourceOfPath(a)*One(A));
target_a := Position(vertices,TargetOfPath(a)*One(A)); if Length(basis_coker[source_a]) <> 0 and Length(basis_coker[target_a]) <> 0then
mat := [];
pos_a := Position(arrows,a); for b in basis_coker[source_a] do
bb := PreImagesRepresentative(projection[source_a],b);
bb := bb*mats[pos_a]; # computing bb^a
Add(mat,Coefficients(basis_coker[target_a],Image(projection[target_a],bb)));
od;
Add(cokermat,[String(a),mat]); fi;
od;
if IsPathAlgebra(A) then
C := RightModuleOverPathAlgebra(A, dimvec_coker, cokermat); else
C := RightModuleOverPathAlgebra(A, dimvec_coker, cokermat); fi; # # Finding the map for Range(f) to the cokernel #
map := []; for i in [1..Length(vertices)] do
partmap := []; if dim_N[i] = 0then
partmap := NullMat(1,1,K); elif Length(basis_coker[i]) = 0then
partmap := NullMat(dim_N[i],1,K); else for b in basis_N[i] do
Add(partmap,Coefficients(basis_coker[i],Image(projection[i],b)));
od; fi;
Add(map,partmap);
od;
####################################################################### ## #O CoKernelOfAdditiveGeneralMapping( <f> ) ## ## This function returns a module isomorphic to the cokernel of <f>. ##
InstallMethod ( CoKernelOfAdditiveGeneralMapping, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ],
SUM_FLAGS+1, function( f )
return Range(CoKernelProjection(f)); end
);
####################################################################### ## #A TopOfModuleProjection( <M> ) ## ## This function computes the map from M to the top of M, ## M ---> M/rad(M). ##
InstallMethod( TopOfModuleProjection, "for a pathalgebramatmodule",
true,
[ IsPathAlgebraMatModule ], 0, function( M )
local K, A, Q, vertices, num_vert, incomingarrows, mats, arrows, subspaces,
i, a, dim_M, Vspaces, Wspaces, naturalprojections, index,
dim_top, matrices, topofmodule, topofmoduleprojection, W;
A := RightActingAlgebra(M); if Dimension(M) = 0then
return ZeroMapping(M,M); else
K := LeftActingDomain(A);
Q := QuiverOfPathAlgebra(A);
vertices := VerticesOfQuiver(Q);
num_vert := Length(vertices);
incomingarrows := List([1..num_vert], x -> IncomingArrowsOfVertex(vertices[x]));
mats := MatricesOfPathAlgebraModule(M);
arrows := ArrowsOfQuiver(Q);
subspaces := List([1..num_vert], x -> []); for i in [1..num_vert] do for a in incomingarrows[i] do
Append(subspaces[i], StructuralCopy(mats[Position(arrows,a)]));
od;
od;
dim_M := DimensionVector(M);
Vspaces := List([1..num_vert], x -> FullRowSpace(K,dim_M[x]));
Wspaces := List([1..num_vert], x -> []); for i in [1..num_vert] do if dim_M[i] <> 0then
Wspaces[i] := Subspace(Vspaces[i],subspaces[i]); else
Wspaces[i] := Subspace(Vspaces[i],[]); fi;
od;
naturalprojections := List([1..num_vert], x -> NaturalHomomorphismBySubspace(Vspaces[x],Wspaces[x]));
dim_top := List([1..num_vert], x -> Dimension(Range(naturalprojections[x])));
index := function( n ) if n = 0then
return 1; else
return n; fi; end;
matrices := []; for i in [1..num_vert] do if dim_top[i] <> 0then
Add(matrices, List(BasisVectors(Basis(Vspaces[i])), y -> ImageElm(naturalprojections[i],y))); else
Add(matrices, NullMat(index(dim_M[i]),1,K)); fi;
od;
topofmodule := RightModuleOverPathAlgebra(A,dim_top,[]);
topofmoduleprojection := RightModuleHomOverAlgebra(M,topofmodule,matrices);
SetTopOfModule(M,topofmodule);
return topofmoduleprojection; fi; end
);
####################################################################### ## #A TopOfModule( <M> ) ## ## This function computes the top M/rad(M) of the module M. ##
InstallMethod( TopOfModule, "for a pathalgebramatmodule",
true,
[ IsPathAlgebraMatModule ], 0, function( M )
return Range(TopOfModuleProjection(M)); end
);
InstallOtherMethod ( TopOfModule, "for a PathAlgebraMatModuleMap",
[ IsPathAlgebraMatModuleHomomorphism ], function( f )
local M, N, K, pi_M, pi_N, BTopM, dim_vector_TopM, dim_vector_TopN,
n, h, i, dim, matrix, j, b, btilde, bprime;
M := Source( f );
N := Range( f );
K := LeftActingDomain( M );
pi_M := TopOfModuleProjection( M );
pi_N := TopOfModuleProjection( N );
BTopM := BasisVectors( Basis( Range( pi_M ) ) );
dim_vector_TopM := DimensionVector( Range( pi_M ) );
dim_vector_TopN := DimensionVector( Range( pi_N ) );
n := Length( dim_vector_TopM );
h := [ ]; for i in [ 1..n ] do if dim_vector_TopM[ i ] > 0then if dim_vector_TopN[ i ] = 0then
Add( h, NullMat( dim_vector_TopM[ i ], 1, K ) ); else # # Assuming that the basisvectors of topM are listed as # first basisvectors for vertex 1, vertex 2, ..... #
dim := Sum( dim_vector_TopM{ [ 1..i - 1 ] } );
matrix := [ ]; for j in [ 1..dim_vector_TopM[ i ] ] do
b := BTopM[ dim + j ];
btilde := PreImagesRepresentative( pi_M, b );
bprime := ImageElm( pi_N, ImageElm( f, btilde ) );
Add( matrix, ExtRepOfObj( ExtRepOfObj( bprime ) )[ i ] );
od;
Add( h, matrix ); fi; else if dim_vector_TopN[ i ] = 0then
Add( h, NullMat( 1, 1, K ) ); else
Add( h, NullMat( 1, dim_vector_TopN[ i ], K ) ); fi; fi;
od;
return RightModuleHomOverAlgebra( Range( pi_M ), Range( pi_N ), h ); end
);
####################################################################### ## #M \+( <f>, <g> ) ## ## This function returns the sum of two homomorphisms <f> and <g>, ## when the sum is defined, otherwise it returns an error message. ##
InstallMethod( \+, "for two PathAlgebraMatModuleMap's",
true, # IsIdenticalObj,
[ IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism ], 0, function( f, g )
local i, num_vert, x, Fam;
if ( Source(f) = Source(g) ) and ( Range(f) = Range(g) ) then
num_vert := Length(f!.maps);
x := List([1..num_vert], y -> f!.maps[y] + g!.maps[y]);
return RightModuleHomOverAlgebra(Source(f),Range(f),x); else
Error("the two arguments entered do not live in the same homomorphism set, "); fi; end
);
####################################################################### ## #M \*( <f>, <g> ) ## ## This function returns the composition <f*g> of two homomorphisms ## <f> and <g>, that is, first the map <f> then followed by <g>, ## when the composition is defined, otherwise it returns an error ## message. ##
InstallMethod( \*, "for two PathAlgebraMatModuleMap's",
true,
[ IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism ], 0, function( f, g )
local i, num_vert, x;
if Range(f) = Source(g) then
num_vert := Length(f!.maps);
x := List([1..num_vert], y -> f!.maps[y]*g!.maps[y]);
return RightModuleHomOverAlgebra(Source(f),Range(g),x); else
Error("codomain of the first argument is not equal to the domain of the second argument, "); fi; end
);
####################################################################### ## #M \*( <a>, <g> ) ## ## This function returns the scalar multiple <a*g> of a scalar <a> ## with a homomorphism <g>, when this scalar multiplication is defined, ## otherwise it returns an error message. ##
InstallOtherMethod( \*, "for two PathAlgebraMatModuleMap's",
true,
[ IsScalar, IsPathAlgebraMatModuleHomomorphism ], 0, function( a, g )
local K, i, num_vert, x;
K := LeftActingDomain(Source(g)); if a in K then
num_vert := Length(g!.maps);
x := List([1..num_vert], y -> a*g!.maps[y]);
return RightModuleHomOverAlgebra(Source(g),Range(g),x); else
Error("the scalar is not in the same field as the algbra is over,"); fi; end
);
####################################################################### ## #M AdditiveInverseOp( <f> ) ## ## This function returns the additive inverse of the homomorphism ## <f>. ##
InstallMethod( AdditiveInverseOp, "for a morphism in IsPathAlgebraMatModuleHomomorphism",
[ IsPathAlgebraMatModuleHomomorphism ],
function ( f )
local i, num_vert, x;
num_vert := Length(f!.maps);
x := List([1..num_vert], y -> (-1)*f!.maps[y]);
return RightModuleHomOverAlgebra(Source(f),Range(f),x); end
);
####################################################################### ## #M \*( <f>, <a> ) ## ## This function returns the scalar multiple <f*a> of a homomorphism ## <f> and a scalar <a>. ##
InstallOtherMethod( \*, "for two PathAlgebraMatModuleMap's",
true,
[ IsPathAlgebraMatModuleHomomorphism, IsScalar ], 0, function( f, a )
local K, i, num_vert, x;
K := LeftActingDomain(Source(f)); if a in K then
num_vert := Length(f!.maps);
x := List([1..num_vert], y -> f!.maps[y]*a);
return RightModuleHomOverAlgebra(Source(f),Range(f),x); else
Error("the scalar is not in the same field as the algbra is over,"); fi; end
);
####################################################################### ## #O HomOverAlgebra( <M>, <N> ) ## ## This function computes a basis of the vector space of homomorphisms ## from the module <M> to the module <N>. The algorithm it uses is ## based purely on linear algebra. ##
InstallMethod( HomOverAlgebra, "for two representations of a quiver",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, N )
local A, F, dim_M, dim_N, num_vert, support_M, support_N, num_rows, num_cols,
block_rows, block_cols, block_intervals,
i, j, equations, arrows, vertices, v, a, source_arrow, target_arrow,
mats_M, mats_N, prev_col, prev_row, row_start_pos, col_start_pos,
row_end_pos, col_end_pos, l, m, n, hom_basis, map, mat, homs, x, y, k, b,
dim_hom, zero;
A := RightActingAlgebra(M); if A <> RightActingAlgebra(N) then
Print("The two modules entered are not modules over the same algebra.");
return fail; fi;
F := LeftActingDomain(A); # # Finding the support of M and N #
vertices := VerticesOfQuiver(QuiverOfPathAlgebra(OriginalPathAlgebra(A)));
dim_M := DimensionVector(M);
dim_N := DimensionVector(N);
num_vert := Length(dim_M);
support_M := [];
support_N := []; for i in [1..num_vert] do if (dim_M[i] <> 0) then
AddSet(support_M,i); fi; if (dim_N[i] <> 0) then
AddSet(support_N,i); fi;
od; # # Deciding the size of the equations, # number of columns and rows #
num_cols := 0;
num_rows := 0;
block_intervals := [];
block_rows := [];
block_cols := [];
prev_col := 0;
prev_row := 0; for i in support_M do
num_rows := num_rows + dim_M[i]*dim_N[i];
block_rows[i] := prev_row+1;
prev_row := num_rows; for a in OutgoingArrowsOfVertex(vertices[i]) do
source_arrow := Position(vertices,SourceOfPath(a));
target_arrow := Position(vertices,TargetOfPath(a)); if (target_arrow in support_N) and ( (source_arrow in support_N) or (target_arrow in support_M)) then
num_cols := num_cols + dim_M[source_arrow]*dim_N[target_arrow];
Add(block_cols,[a,prev_col+1,num_cols]); fi;
prev_col := num_cols;
od;
od; # # Finding the linear equations for the maps between M and N #
equations := NullMat(num_rows, num_cols, F);
arrows := ArrowsOfQuiver(QuiverOfPathAlgebra(OriginalPathAlgebra(A)));
mats_M := MatricesOfPathAlgebraModule(M);
mats_N := MatricesOfPathAlgebraModule(N);
prev_col := 0;
prev_row := 0; for i in support_M do for a in OutgoingArrowsOfVertex(vertices[i]) do
source_arrow := Position(vertices,SourceOfPath(a));
target_arrow := Position(vertices,TargetOfPath(a)); if (target_arrow in support_N) and ( (source_arrow in support_N) or (target_arrow in support_M)) then for j in [1..dim_M[source_arrow]] do
row_start_pos := block_rows[source_arrow] + (j-1)*dim_N[source_arrow];
row_end_pos := block_rows[source_arrow] - 1 + j*dim_N[source_arrow];
col_start_pos := prev_col + 1 + (j-1)*dim_N[target_arrow];
col_end_pos := prev_col + j*dim_N[target_arrow]; if (source_arrow in support_N) then
equations{[row_start_pos..row_end_pos]}{[col_start_pos..col_end_pos]} := mats_N[Position(arrows,a)]; fi; if (target_arrow in support_M) then for m in [1..DimensionsMat(mats_M[Position(arrows,a)])[2]] do for n in [1..dim_N[target_arrow]] do
b := block_rows[target_arrow]+(m-1)*dim_N[target_arrow];
equations[b+n-1][col_start_pos+n-1] := equations[b+n-1][col_start_pos+n-1]+(-1)*mats_M[Position(arrows,a)][j][m];
od;
od; fi;
od;
prev_col := prev_col + dim_M[source_arrow]*dim_N[target_arrow]; fi;
od;
od; # # Creating the maps between the module M and N #
homs := []; if (num_rows <> 0) and (num_cols <> 0) then
dim_hom := 0;
hom_basis := NullspaceMat(equations); for b in hom_basis do
map := [];
dim_hom := dim_hom + 1;
k := 1; for i in [1..num_vert] do if dim_M[i] = 0then if dim_N[i] = 0then
Add(map,NullMat(1,1,F)); else
Add(map,NullMat(1,dim_N[i],F)); fi; else if dim_N[i] = 0then
Add(map,NullMat(dim_M[i],1,F)); else
mat := NullMat(dim_M[i],dim_N[i], F); for y in [1..dim_M[i]] do for x in [1..dim_N[i]] do
mat[y][x] := b[k];
k := k + 1;
od;
od;
Add(map,mat); fi; fi;
od;
homs[dim_hom] := Objectify( NewType( CollectionsFamily( GeneralMappingsFamily(
ElementsFamily( FamilyObj( M ) ),
ElementsFamily( FamilyObj( N ) ) ) ),
IsPathAlgebraMatModuleHomomorphism and IsPathAlgebraMatModuleHomomorphismRep and IsAttributeStoringRep ), rec( maps := map ));
SetPathAlgebraOfMatModuleMap(homs[dim_hom], A);
SetSource(homs[dim_hom], M);
SetRange(homs[dim_hom], N);
SetIsWholeFamily(homs[dim_hom],true);
od;
return homs; else
homs := []; if Dimension(M) = 0 or Dimension(N) = 0then
return homs; else
dim_hom := 0;
zero := []; for i in [1..num_vert] do if dim_M[i] = 0then if dim_N[i] = 0then
Add(zero,NullMat(1,1,F)); else
Add(zero,NullMat(1,dim_N[i],F)); fi; else if dim_N[i] = 0then
Add(zero,NullMat(dim_M[i],1,F)); else
Add(zero,NullMat(dim_M[i],dim_N[i],F)); fi; fi;
od; for i in [1..num_vert] do if (dim_M[i] <> 0) and (dim_N[i] <> 0) then for m in BasisVectors(Basis(FullMatrixSpace(F,dim_M[i],dim_N[i]))) do
dim_hom := dim_hom + 1;
homs[dim_hom] := ShallowCopy(zero);
homs[dim_hom][i] := m;
od; fi;
od; for i in [1..dim_hom] do
homs[i] := Objectify( NewType( CollectionsFamily( GeneralMappingsFamily(
ElementsFamily( FamilyObj( M ) ),
ElementsFamily( FamilyObj( N ) ) ) ),
IsPathAlgebraMatModuleHomomorphism and IsPathAlgebraMatModuleHomomorphismRep and IsAttributeStoringRep ), rec( maps := homs[i] ));
SetPathAlgebraOfMatModuleMap(homs[i], A);
SetSource(homs[i], M);
SetRange(homs[i], N);
SetIsWholeFamily(homs[i],true);
od;
return homs; fi; fi; end
);
####################################################################### ## #O HomOverAlgebraWithBasisFunction( <M>, <N> ) ## ## This function returns a list with two entries. The first entry is ## a basis of the vector space of homomorphisms from the module <M> ## to the module <N>. The second entry is a function from the space ## of homomorphisms from <M> to <N> to the vector space with the ## given by the first entry. The algorithm it uses is based purely ## on linear algebra. ##
InstallMethod( HomOverAlgebraWithBasisFunction, "for two representations of a quiver",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, N )
local homs, F, basis, V, W, HomB, transfermat, coefficients;
homs := HomOverAlgebra( M, N );
F := LeftActingDomain( RightActingAlgebra( M ) );
if Length( homs ) > 0then
basis := List( homs, h -> Flat( h!.maps ) );
V := FullRowSpace( F, Length( basis[ 1 ] ) );
W := Subspace( V, basis, "basis" );
HomB := Basis( W );
transfermat := List( basis, b -> Coefficients( HomB, b ) );
coefficients := function( h )
local hflat, coeff;
return coeff * transfermat^(-1); end; else
coefficients := function( h );
return [ Zero( F ) ]; end; fi;
return [ homs, coefficients ]; end
);
####################################################################### ## #A EndOverAlgebra( <M>, <N> ) ## ## This function computes endomorphism ring of the module <M> and ## representing it as an general GAP algebra. The algorithm it uses is ## based purely on linear algebra. ##
InstallMethod( EndOverAlgebra, "for a representations of a quiver",
[ IsPathAlgebraMatModule ], 0, function( M )
local EndM, R, F, dim_M, alglist, i, j, r, maps, A;
EndM := HomOverAlgebra(M,M);
R := RightActingAlgebra(M);
F := LeftActingDomain(R);
dim_M := DimensionVector(M);
alglist := []; for i in [1..Length(dim_M)] do if dim_M[i] <> 0then
Add(alglist, MatrixAlgebra(F,dim_M[i])); fi;
od;
maps := []; for i in [1..Length(EndM)] do
maps[i] := NullMat(Dimension(M),Dimension(M),F);
r := 1; for j in [1..Length(dim_M)] do if dim_M[j] <> 0then
maps[i]{[r..r+dim_M[j]-1]}{[r..r+dim_M[j]-1]} := EndM[i]!.maps[j]; fi;
r := r + dim_M[j];
od;
od;
A := DirectSumOfAlgebras(alglist);
return SubalgebraWithOne(A,maps,"basis"); end
);
####################################################################### ## #A RightFacApproximation( <M>, <C> ) ## ## This function computes a right Fac<M>-approximation of the module ## <C>. ##
InstallMethod( RightFacApproximation, "for a representations of a quiver",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, C )
local homMC, i, generators;
homMC := HomOverAlgebra(M,C);
generators := []; for i in [1..Length(homMC)] do
Append(generators,ImagesSet(homMC[i],Source(homMC[i])));
od;
return SubRepresentationInclusion(C,generators); end
);
####################################################################### ## #O NumberOfNonIsoDirSummands( <M> ) ## ## This function computes the number of non-isomorphic indecomposable ## direct summands of the module <M>, and in addition returns the ## dimensions of the simple blocks of the semisimple ring ## End(M)/rad End(M). ##
InstallMethod( NumberOfNonIsoDirSummands, "for a representations of a quiver",
[ IsPathAlgebraMatModule ], 0, function( M )
local EndM, K, J, gens, I, A, top, AA, B, n,
i, j, genA, V, W, d;
EndM := EndOverAlgebra(M);
K := LeftActingDomain(M);
J := RadicalOfAlgebra(EndM);
gens := GeneratorsOfAlgebra(J);
I := Ideal(EndM,gens);
A := EndM/I;
top := CentralIdempotentsOfAlgebra(A);
return [Length(top),List(DirectSumDecomposition(EndM/I),Dimension)]; end
);
####################################################################### ## #A DualOfModuleHomomorphism( <f> ) ## ## This function computes the dual of a homomorphism from the module ## <M> to the module <N>. ##
InstallMethod ( DualOfModuleHomomorphism, "for a map between representations of a quiver",
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local mats, M, N;
mats := f!.maps;
mats := List(mats, x -> TransposedMat(x));
M := DualOfModule(Source(f));
N := DualOfModule(Range(f));
return RightModuleHomOverAlgebra(N,M,mats); end
);
####################################################################### ## #A SocleOfModuleInclusion( <M> ) ## ## This function computes the map from the socle of M to the module M, ## soc(M) ---> M. ##
InstallMethod( SocleOfModuleInclusion, "for a pathalgebramatmodule",
true,
[ IsPathAlgebraMatModule ], 0, function( M )
local A, K, Q, vertices, num_vert, outgoingarrows, mats, arrows, dim_M,
subspaces, i, a, j, socle, matrixfunction, dim_socle, socleofmodule,
socleinclusion, V, temp;
A := RightActingAlgebra(M); if Dimension(M) = 0then
return ZeroMapping(M,M); else
K := LeftActingDomain(A);
Q := QuiverOfPathAlgebra(A);
vertices := VerticesOfQuiver(Q);
num_vert := Length(vertices);
outgoingarrows := List([1..num_vert], x -> OutgoingArrowsOfVertex(vertices[x]));
dim_M := DimensionVector(M);
mats := MatricesOfPathAlgebraModule(M);
arrows := ArrowsOfQuiver(Q);
dim_socle := List([1..num_vert], x -> 0);
socle := List([1..num_vert], x -> []); for i in [1..num_vert] do if ( Length(outgoingarrows[i]) = 0 ) or ( dim_M[i] = 0 ) then
dim_socle[i] := dim_M[i]; if dim_M[i] = 0then
socle[i] := NullMat(1,1,K); else
socle[i] := IdentityMat(dim_M[i],K); fi; else
subspaces := List([1..dim_M[i]], y -> []); for a in outgoingarrows[i] do for j in [1..dim_M[i]] do
Append(subspaces[j], StructuralCopy(mats[Position(arrows,a)][j]));
od;
od;
V := FullRowSpace(K,dim_M[i]);
temp := NullspaceMat(subspaces);
dim_socle[i] := Dimension(Subspace(V,temp)); if dim_socle[i] = 0then
socle[i] := NullMat(1,dim_M[i],K); else
socle[i] := temp; fi; fi;
od;
socleofmodule := RightModuleOverPathAlgebra(A,dim_socle,[]);
socleinclusion := RightModuleHomOverAlgebra(socleofmodule,M,socle); # SetSocleOfModule(M,socleofmodule);
return socleinclusion; fi; end
);
####################################################################### ## #A SocleOfModule( <M> ) ## ## This function computes the socle soc(M) of the module M. ##
InstallMethod( SocleOfModule, "for a pathalgebramatmodule",
true,
[ IsPathAlgebraMatModule ], 0, function( M )
return Source(SocleOfModuleInclusion(M)); end
);
####################################################################### ## #O CommonDirectSummand( <M>, <N> ) ## ## This function is using the algorithm for finding a common direct ## summand presented in the paper "Gauss-Elimination und der groesste ## gemeinsame direkte Summand von zwei endlichdimensionalen Moduln" ## by K. Bongartz, Arch Math., vol. 53, 256-258, with the modification ## done by Andrzej Mroz found in "On the computational complexity of Bongartz's ## algorithm" (improving the complexity of the algorithm). ##
InstallMethod( CommonDirectSummand, "for two path algebra matmodules",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, N )
local HomMN, HomNM, mn, nm, m, n, l, zero, j, i, temp,
r, f, fnm, nmf;
if RightActingAlgebra( M ) <> RightActingAlgebra( N ) then
Print( "The two modules are not modules over the same algebra.\n" );
return fail; else
HomMN := HomOverAlgebra( M, N );
HomNM := HomOverAlgebra( N, M );
mn := Length( HomMN );
nm := Length( HomNM );
if mn = 0 or nm = 0then
return false; fi;
m := Maximum( DimensionVector( M ) );
n := Maximum( DimensionVector( N ) ); if n = m then
l := n; else
l := Minimum( [ n, m ] ) + 1; fi;
n := Int( Ceil( Log2( 1.0*( l ) ) ) );
zero := ZeroMapping( M, M );
for j in [ 1..nm ] do for i in [ 1..mn ] do if l > 1then# because hom^0 * hom => error!
temp := HomMN[ i ] * HomNM[ j ]; for r in [ 1..n ] do
temp := temp * temp;
od;
f := temp * HomMN[ i ]; else
f := HomMN[ i ]; fi;
fnm := f * HomNM[ j ];
if fnm <> zero then
nmf := HomNM[ j ] * f;
return [ Image( fnm ), Kernel( fnm ), Image( nmf ), Kernel( nmf ) ]; fi;
od;
od;
return false; fi; end
);
####################################################################### ## #O MaximalCommonDirectSummand( <M>, <N> ) ## ## This function is using the algorithm for finding a maximal common ## direct summand based on the algorithm presented in the paper ## "Gauss-Elimination und der groesste gemeinsame direkte Summand von ## zwei endlichdimensionalen Moduln" by K. Bongartz, Arch Math., ## vol. 53, 256-258, with the modification done by Andrzej Mroz found ## in "On the computational complexity of Bongartz's algorithm" ## (improving the complexity of the algorithm). ##
InstallMethod( MaximalCommonDirectSummand, "for two path algebra matmodules",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, N )
local U, V, maxcommon, L;
U := M;
V := N;
maxcommon := [];
repeat
L := CommonDirectSummand(U,V); if L <> false and L <> fail then
Add(maxcommon,L[1]);
U := L[2];
V := L[4]; if Dimension(L[2]) = 0 or Dimension(L[4]) = 0then
break; fi; fi;
until L = false or L = fail;
if Length(maxcommon) = 0then
return false; else
return [maxcommon,U,V]; fi; end
);
####################################################################### ## #O IsomorphicModules( <M>, <N> ) ## ## This function returns true if the modules <M> and <N> are ## isomorphic, an error message if <M> and <N> are not modules over ## the same algebra and false otherwise. ##
InstallMethod( IsomorphicModules, "for two path algebra matmodules",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, N )
local L;
if DimensionVector(M) <> DimensionVector(N) then
return false; elif Dimension(M) = 0 and Dimension(N) = 0then
return true; else
L := MaximalCommonDirectSummand(M,N); if L = false then
return false; else if Dimension(L[2]) = 0 and Dimension(L[3]) = 0then
return true; else
return false; fi; fi; fi; end
);
####################################################################### ## #O IsDirectSummand( <M>, <N> ) ## ## This function returns true if the module <M> is isomorphic to a ## direct of the module <N>, an error message if <M> and <N> are ## not modules over the same algebra and false otherwise. ##
InstallMethod( IsDirectSummand, "for two path algebra matmodules",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, N )
local L;
if not DimensionVectorPartialOrder(M,N) then
return false; else
L := MaximalCommonDirectSummand(M,N); if L = false then
return false; else if Dimension(L[2]) = 0then
return true; else
return false; fi; fi; fi; end
);
####################################################################### ## #O IsInAdditiveClosure( <M>, <N> ) ## ## This function returns true if the module <M> is in the additive ## closure of the module <N>, an error message if <M> and <N> are ## not modules over the same algebra and false otherwise. ##
InstallMethod( IsInAdditiveClosure, "for two path algebra matmodules",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, N )
local K, HomMN, HomNM, MM, i, j, HomMM, V_M;
if RightActingAlgebra(M) <> RightActingAlgebra(N) then
return fail; else # # Computing Hom(M,N) and Hom(N,M), finding the subspace in Hom(M,M) # spanned by Hom(M,N)*Hom(M,N), if they have the same dimension, then # the identity on M is in the linear span of Hom(M,N)*Hom(M,N) and # module M is in the additive closure of N. #
K := LeftActingDomain(M);
HomMN := HomOverAlgebra(M,N);
HomNM := HomOverAlgebra(N,M);
MM := []; for i in [1..Length(HomMN)] do for j in [1..Length(HomNM)] do
Add(MM,HomMN[i]*HomNM[j]);
od;
od;
MM := List(MM,x->x!.maps); for i in [1..Length(MM)] do
MM[i] := List(MM[i],x->Flat(x));
MM[i] := Flat(MM[i]);
od;
HomMM:=HomOverAlgebra(M,M); if Length(MM) = 0then
V_M := TrivialSubspace(K); else
V_M := VectorSpace(K,MM); fi; if Dimension(V_M) = Length(HomOverAlgebra(M,M)) then
return true; else
return false; fi; fi; end
);
####################################################################### ## #O MorphismOnKernel( <f>, <g>, <beta>, <alpha> ) ## ## Given the following commutative diagram ## B -- f --> C ## | | ## beta | | alpha ## V V ## B' - g --> C' ## this function finds the induced homomorphism on the kernels of ## f and g. ##
InstallMethod ( MorphismOnKernel, "for commutative diagram of PathAlgebraMatModuleMaps",
true,
[ IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism ], 0, function( f, g, beta, alpha )
local K, kerf, kerg, B, dim_vec_kerf, dim_vec_kerg, map, j, i, p, mat; # # Checking if a commutative diagram was entered # if f*alpha = beta*g then # #
K := LeftActingDomain(Source(f));
kerf := KernelInclusion(f);
kerg := KernelInclusion(g); # # Computing the information needed for lifting the morphism. #
B := BasisVectors(Basis(Source(kerf)));
B := List(B, x -> ImageElm(kerf*beta,x));
B := List(B, x -> PreImagesRepresentative(kerg,x)); # # Computing dimension vectors so that we can insert zero matrices of # the right size. #
dim_vec_kerf := DimensionVector(Source(kerf));
dim_vec_kerg := DimensionVector(Source(kerg));
map := [];
j := 0; for i in [1..Length(dim_vec_kerf)] do # # If the kernel of f is zero in vertex i, then insert a zero matrix of # the right size, do not use any of the lifting information. # if dim_vec_kerf[i] = 0then if dim_vec_kerg[i] = 0then
Add(map,NullMat(1,1,K)); else
Add(map,NullMat(1,dim_vec_kerg[i],K)); fi; else # # If the kernel of f is non-zero in vertex i, then use the lifting # information to compute the right matrix for the map from vertex i to i. #
mat := []; for p in [1..dim_vec_kerf[i]] do
j := j + 1;
Add(mat,ExtRepOfObj(ExtRepOfObj(B[j]))[i]);
od;
Add(map,mat); fi;
od;
return RightModuleHomOverAlgebra(Source(kerf),Source(kerg),map); else
return fail; fi; end
);
####################################################################### ## #O MorphismOnImage( <f>, <g>, <beta>, <alpha> ) ## ## Given the following commutative diagram ## B -- f --> C ## | | ## beta | | alpha ## V V ## B' - g --> C' ## this function finds the induced homomorphism on the images of ## f and g. ##
InstallMethod ( MorphismOnImage, "for commutative diagram of PathAlgebraMatModuleMaps",
true,
[ IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism ], 0, function( f, g, beta, alpha )
local K, imagef, imageg, B, dim_vec_imagef, dim_vec_imageg, map, j, i, p, mat; # # Checking if a commutative diagram was entered # if f*alpha = beta*g then # #
K := LeftActingDomain(Source(f));
imagef := ImageProjection(f);
imageg := ImageProjection(g); # # Computing the information needed for lifting the morphism. #
B := BasisVectors(Basis(Range(imagef)));
B := List(B, x -> PreImagesRepresentative(imagef,x));
B := List(B, x -> ImageElm(beta*imageg,x)); # # Computing dimension vectors so that we can insert zero matrices of # the right size. #
dim_vec_imagef := DimensionVector(Range(imagef));
dim_vec_imageg := DimensionVector(Range(imageg));
map := [];
j := 0; for i in [1..Length(dim_vec_imagef)] do # # If the image of f is zero in vertex i, then insert a zero matrix of # the right size, do not use any of the lifting information. # if dim_vec_imagef[i] = 0then if dim_vec_imageg[i] = 0then
Add(map,NullMat(1,1,K)); else
Add(map,NullMat(1,dim_vec_imageg[i],K)); fi; else # # If the cokernel of f is non-zero in vertex i, then use the lifting # information to compute the right matrix for the map from vertex i to i. #
mat := []; for p in [1..dim_vec_imagef[i]] do
j := j + 1;
Add(mat,ExtRepOfObj(ExtRepOfObj(B[j]))[i]);
od;
Add(map,mat); fi;
od;
return RightModuleHomOverAlgebra(Range(imagef),Range(imageg),map); else
return fail; fi; end
);
####################################################################### ## #O MorphismOnCoKernel( <f>, <g>, <beta>, <alpha> ) ## ## Given the following commutative diagram ## B -- f --> C ## | | ## beta | | alpha ## V V ## B' - g --> C' ## this function finds the induced homomorphism on the cokernels of ## f and g. ##
InstallMethod ( MorphismOnCoKernel, "for commutative diagram of PathAlgebraMatModuleMaps",
true,
[ IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism ], 0, function( f, g, beta, alpha )
local K, cokerf, cokerg, B, dim_vec_cokerf, dim_vec_cokerg, map, j, i, p, mat; # # Checking if a commutative diagram was entered # if f*alpha = beta*g then # #
K := LeftActingDomain(Source(f));
cokerf := CoKernelProjection(f);
cokerg := CoKernelProjection(g); # # Computing the information needed for lifting the morphism. #
B := BasisVectors(Basis(Range(cokerf)));
B := List(B, x -> PreImagesRepresentative(cokerf,x));
B := List(B, x -> ImageElm(alpha*cokerg,x)); # # Computing dimension vectors so that we can insert zero matrices of # the right size. #
dim_vec_cokerf := DimensionVector(Range(cokerf));
dim_vec_cokerg := DimensionVector(Range(cokerg));
map := [];
j := 0; for i in [1..Length(dim_vec_cokerf)] do # # If the cokernel of f is zero in vertex i, then insert a zero matrix of # the right size, do not use any of the lifting information. # if dim_vec_cokerf[i] = 0then if dim_vec_cokerg[i] = 0then
Add(map,NullMat(1,1,K)); else
Add(map,NullMat(1,dim_vec_cokerg[i],K)); fi; else # # If the cokernel of f is non-zero in vertex i, then use the lifting # information to compute the right matrix for the map from vertex i to i. #
mat := []; for p in [1..dim_vec_cokerf[i]] do
j := j + 1;
Add(mat,ExtRepOfObj(ExtRepOfObj(B[j]))[i]);
od;
Add(map,mat); fi;
od;
return RightModuleHomOverAlgebra(Range(cokerf),Range(cokerg),map); else
return fail; fi; end
);
####################################################################### ## #O LiftingMorphismFromProjective( <f>, <g> ) ## ## Given the following diagram ## P ## | ## | g ## f V ## B ----> C ## where P is a direct sum of indecomposable projective modules ## constructed via DirectSumOfQPAModules and f an epimorphism, ## this function finds a lifting of g to B. ##
InstallMethod ( LiftingMorphismFromProjective, "for two PathAlgebraMatModuleMaps",
true,
[ IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism ], 0, function( f, g )
local P, K, B, inclusions, projections, i, m, hmap; # # Checking if the input is as required #
P := Source(g); if not IsProjectiveModule(P) then
Error( "The source of the second map is not projective.\n" ); fi; if not IsSurjective(f) then
Error( "The first map is not surjective.\n" ); fi; if not ( Range(f) = Range(g) ) then
Error( "The entered maps do not have a common range.\n" ); fi; if IsZero( P ) then
return ZeroMapping( P, Source( f ) ); fi; if IsDirectSumOfModules(P) then # #
K := LeftActingDomain(P);
inclusions := DirectSumInclusions(P);
projections := DirectSumProjections(P);
hmap := []; # # First construct the lifting from each indecomposable direct summand of P. # for i in [1..Length(inclusions)] do
m := MinimalGeneratingSetOfModule(Source(inclusions[i]))[1]; if ImageElm(g,ImageElm(inclusions[i],m)) = Zero(Range(g)) then
Add(hmap,ZeroMapping(Source(inclusions[i]),Source(f))); else
m := PreImagesRepresentative(f,ImageElm(g,ImageElm(inclusions[i],m)));
Add(hmap,HomFromProjective(m,Source(f))); fi;
od; # # Make sure that the partial liftings start in the right modules/variables. #
hmap := List([1..Length(inclusions)], x -> RightModuleHomOverAlgebra(Source(inclusions[x]),Source(f),hmap[x]!.maps));
return projections*hmap; else
return fail; fi; end
);
####################################################################### ## #O LiftingInclusionMorphisms( <f>, <g> ) ## ## Given the following diagram ## A ## | ## | g ## f V ## B ----> C ## where f and g are inclusions, this function constructs a ## morphism (inclusion) from A to B, whenever the image of g is ## contained in the image of f. Otherwise the function returns fail. ##
InstallMethod ( LiftingInclusionMorphisms, "for two PathAlgebraMatModuleMaps",
true,
[ IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism ], 0, function( f, g )
local pi, K, B, dim_vec_sourcef, dim_vec_sourceg, map, i, j, mat, p; # # Checking if the image of g is contained in the image of f. #
pi := CoKernelProjection(f); if ( IsInjective(f) and IsInjective(g) ) and ( Range(f) = Range(g) ) and ( g*pi = ZeroMapping(Source(g),Range(pi)) ) then # #
K := LeftActingDomain(Source(g));
B := BasisVectors(Basis(Source(g)));
B := List(B, x -> PreImagesRepresentative(f,ImageElm(g,x))); # # Computing dimension vectors so that we can insert zero matrices of # the right size. #
dim_vec_sourceg := DimensionVector(Source(g));
dim_vec_sourcef := DimensionVector(Source(f));
map := [];
j := 0; for i in [1..Length(dim_vec_sourceg)] do # # If the source of g is zero in vertex i, then insert a zero matrix of # the right size, do not use any of the lifting information. # if dim_vec_sourceg[i] = 0then if dim_vec_sourcef[i] = 0then
Add(map,NullMat(1,1,K)); else
Add(map,NullMat(1,dim_vec_sourcef[i],K)); fi; else # # If the source of g is non-zero in vertex i, then use the lifting # information to compute the right matrix for the map from vertex i to i. #
mat := []; for p in [1..dim_vec_sourceg[i]] do
j := j + 1;
Add(mat,ExtRepOfObj(ExtRepOfObj(B[j]))[i]);
od;
Add(map,mat); fi;
od;
return RightModuleHomOverAlgebra(Source(g),Source(f),map); else
return fail; fi; end
);
####################################################################### ## #O IntersectionOfSubmodules( <f>, <g> ) ## ## f g ## Given two submodules/subrepresentations M ---> X and N ---> X of ## a module X by two monomorphism f and g, this function computes ## the intersection of the images of f and g in the sense that it ## computes the pullback of the diagram ## f' ## E ---> N ## | | ## g' | | g ## | | ## V f V ## M ---> X ## ## and it returns the maps [ f', g', g'*f ] ##
InstallOtherMethod ( IntersectionOfSubmodules, "for two IsPathAlgebraMatModuleHomomorphisms",
true,
[ IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism ], 0, function( f, g )
local pullback; # # Checking the input # if not IsInjective(f) then
Error("the first argument is not a monomorphism,"); fi; if not IsInjective(g) then
Error("the second argument is not a monomorphism,"); fi; if not ( Range(f) = Range(g) ) then
Error("must have two submodules of the same module,"); fi; # # Doing the computations #
pullback := PullBack(f,g);
return [pullback[1],pullback[2],pullback[2]*f]; end
);
####################################################################### ## #O IntersectionOfSubmodules( <args> ) ## ## f_i ## Given submodules/subrepresentations M_i -----> X for i = 1,...,n ## of a module X by n monomorphism f_i, this function computes ## the intersection of the images of f and g in the sense that it ## computes the pullbacks of the diagrams ## f_1' ## E_1 ----> N E_2 ---------> N ## | | | | ## f_2' | | f_2 f_3' | | f_3 and so on. ## | | | | ## V f_1 V V f_2'*f_1 V ## M -----> X E_1 ---------> X ## ## It returns the map f_n'*f_(n-1)* ... * f_2'*f_1. ##
InstallMethod ( IntersectionOfSubmodules, "for two IsPathAlgebraMatModuleHomomorphisms",
true,
[ IsDenseList ], 0, function( list )
local A, f, i; # # Checking the input # if IsEmpty( list ) then
Error( "<list> must be non-empty" ); fi;
A := RightActingAlgebra(Source(list[1])); for f in list do if RightActingAlgebra( Source(f) ) <> A then
Error( "all entries in <list> must be homomorphisms of modules over the same algebra"); fi;
od; if not ForAll(list, IsInjective) then
Error("not all the arguments are monomorphisms,"); fi;
A := Range(list[1]); if not ForAll(list, x -> Range(x) = A) then
Error("must have submodules of the same module,"); fi; # # Doing the computations. #
f := list[1]; for i in [2..Length(list)] do
f := IntersectionOfSubmodules(f,list[i])[3];
od;
return f; end
);
####################################################################### ## #O SumOfSubmodules( <f>, <g> ) ## ## f g ## Given two submodules/subrepresentations M ---> X and N ---> X of ## a module X by two monomorphism f and g, this function computes ## the sum of the images of f and g in the sense that it computes ## the submodule/subrepresentation M + N generated by the image of f ## and the image of g. It returns the maps M + N ---> X, M ---> M + N, ## N ---> M + N, in that order. ##
InstallOtherMethod ( SumOfSubmodules, "for two IsPathAlgebraMatModuleHomomorphisms",
true,
[ IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism ], 0, function( f, g )
local sumMN, inclusions, projections, F; # # Checking the input # if not IsInjective(f) then
Error("the first argument is not a monomorphism,"); fi; if not IsInjective(g) then
Error("the second argument is not a monomorphism,"); fi; if not ( Range(f) = Range(g) ) then
Error("must have two submodules of the same module,"); fi; # # Doing the computations #
sumMN := DirectSumOfQPAModules([Source(f),Source(g)]);
inclusions := DirectSumInclusions(sumMN);
projections := DirectSumProjections(sumMN);
F := ImageProjectionInclusion(projections[1]*f + projections[2]*g);
return [F[2],inclusions[1]*F[1],inclusions[2]*F[1]]; end
);
####################################################################### ## #O SumOfSubmodules( <args> ) ## ## f_i ## Given submodules/subrepresentations M_i -----> X for i = 1,...,n ## of a module X by n monomorphism f_i, this function computes ## the intersection of the images of f and g in the sense that it ## computes the pullbacks of the diagrams ## f_1' ## E_1 ----> N E_2 ---------> N ## | | | | ## f_2' | | f_2 f_3' | | f_3 and so on. ## | | | | ## V f_1 V V f_2'*f_1 V ## M -----> X E_1 ---------> X ## ## and it returns the map f_n'*f_(n-1)* ... * f_2'*f_1. ##
InstallMethod ( SumOfSubmodules, "for two IsPathAlgebraMatModuleHomomorphisms",
true,
[ IsDenseList ], 0, function( list )
local A, f, i; # # Checking the input # if IsEmpty( list ) then
Error( "<list> must be non-empty" ); fi;
A := RightActingAlgebra(Source(list[1])); for f in list do if RightActingAlgebra( Source(f) ) <> A then
Error( "all entries in <list> must be homomorphisms of modules over the same algebra"); fi;
od;
A := Range(list[1]); if not ForAll(list, x -> Range(x) = A) then
Error("must have submodules of the same module,"); fi; if not ForAll(list, IsInjective) then
Error("not all the arguments are monomorphisms,"); fi; # # Doing the computations #
f := list[1]; for i in [2..Length(list)] do
f := SumOfSubmodules(f,list[i])[1];
od;
return f; end
);
####################################################################### ## #O HomFactoringThroughProjOverAlgebra( <M>, <N> ) ## ## Given two modules M and N over a finite dimensional quotient ## of a path algebra, this function computes a basis of the homomorphisms ## that factor through a projective module. ##
InstallMethod ( HomFactoringThroughProjOverAlgebra, "for two PathAlgebraMatModule's",
true,
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, N )
local f, HomMP_N, homthroughproj, flathomthroughproj, K, V, B, dim_M,
dim_N, homs, hom, i, j, matrices, dimension, d1, d2, matrix; # # Testing input # if RightActingAlgebra(M) <> RightActingAlgebra(N) then
Error("the entered modules are not modules over the same algebra,"); fi; # # if one module is zero, return the empty list # if Dimension(M) = 0 or Dimension(N) = 0then
return []; fi; # # The maps factoring through projectives are those factoring through # the projective cover of N. #
f := ProjectiveCover(N);
HomMP_N := HomOverAlgebra(M,Source(f));
homthroughproj := List(HomMP_N, x -> x*f);
flathomthroughproj := List(homthroughproj, x -> Flat(x!.maps));
flathomthroughproj := Filtered(flathomthroughproj, x -> x <> Zero(x));
homthroughproj := []; if Length(flathomthroughproj) > 0then
K := LeftActingDomain(M);
V := VectorSpace(K, flathomthroughproj);
B := BasisVectors(Basis(V));
dim_M := DimensionVector(M);
dim_N := DimensionVector(N);
homs := []; for hom in B do
matrices := [];
dimension := 0; for i in [1..Length(dim_M)] do if dim_M[i] = 0then
d1 := 1; else
d1 := dim_M[i]; fi; if dim_N[i] = 0then
d2 := 1; else
d2 := dim_N[i]; fi;
matrix := []; for j in [1..d1] do
Add(matrix,hom{[dimension + 1..dimension + d2]});
dimension := dimension + d2;
od;
Add(matrices,matrix);
od;
Add(homs,matrices);
od;
homthroughproj := List(homs, x -> RightModuleHomOverAlgebra(M,N,x)); fi;
return homthroughproj; end
);
####################################################################### ## #O EndModuloProjOverAlgebra( <M>, <N> ) ## ## Given a module M over a finite dimensional quotient of a path ## algebra, this function computes the homomorphism from ## End(M) ----> End(M)/P(M,M), where P(M,M) is the ideal in End(M) ## generated by the morphisms factoring through projective modules. ##
InstallMethod ( EndModuloProjOverAlgebra, "for a PathAlgebraMatModule",
true,
[ IsPathAlgebraMatModule ], 0, function( M )
local EndM, factorproj, I;
if Dimension(M) = 0then
Error("zero module given as input for EndModuleProjOverAlgebra,"); else
EndM := EndOverAlgebra(M);
factorproj := HomFactoringThroughProjOverAlgebra(M,M);
factorproj := List(factorproj, x -> FromHomMMToEndM(x));
I := Ideal(EndM,factorproj);
return NaturalHomomorphismByIdeal(EndM,I); fi; end
);
####################################################################### ## #O FromHomMMToEndM( <f> ) ## ## This function gives a translation from endomorphisms of a module M ## to the corresponding enodomorphism represented in the algebra ## EndOverAlgebra(M). ##
InstallMethod ( FromHomMMToEndM, "for an endomorphism to an element of EndOverAlgebra",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local K, dim_vect, end_f, r, j;
K := LeftActingDomain(Source(f));
dim_vect := DimensionVector(Source(f));
end_f := NullMat(Dimension(Source(f)),Dimension(Source(f)),K);
r := 1; for j in [1..Length(dim_vect)] do if dim_vect[j] <> 0then
end_f{[r..r+dim_vect[j]-1]}{[r..r+dim_vect[j]-1]} := f!.maps[j];
r := r + dim_vect[j]; fi;
od;
return end_f; end
);
####################################################################### ## #O FromEndMToHomMM( <M>, <mat> ) ## ## This function gives a translation from an element in ## EndOverAlgebra(<M>) to an endomorphism of the module M. ##
InstallMethod ( FromEndMToHomMM, "for a subset of EndOverAlgebra to HomOverAlgebra",
true,
[ IsPathAlgebraMatModule, IsMatrix ], 0, function( M, mat )
local K, dim_vect, maps, i, r;
K := LeftActingDomain(M);
dim_vect := DimensionVector(M);
maps := [];
r := 1; for i in [1..Length(dim_vect)] do if dim_vect[i] = 0then
Add(maps,NullMat(1,1,K)); else
Add(maps,mat{[r..r+dim_vect[i]-1]}{[r..r+dim_vect[i]-1]});
r := r + dim_vect[i]; fi;
od;
return RightModuleHomOverAlgebra(M,M,maps); end
);
####################################################################### ## #P IsRightMinimal( <f> ) ## ## This function returns true is the homomorphism <f> is right ## minimal. ##
InstallMethod ( IsRightMinimal, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local B, C, BB, mat, Ann_f, radEndB;
B := Source(f);
C := Range(f);
BB := HomOverAlgebra(B,B);
mat := List(BB, x -> x*f);
mat := List(mat,x -> Flat(x!.maps));
Ann_f := NullspaceMat(mat);
Ann_f := List(Ann_f,x -> LinearCombination(BB,x));
radEndB := RadicalOfAlgebra(EndOverAlgebra(B));
Ann_f := List(Ann_f, x -> FromHomMMToEndM(x));
if ForAll(Ann_f, x -> x in radEndB) then
return true; else
return false; fi; end
);
####################################################################### ## #P IsLeftMinimal( <f> ) ## ## This function returns true is the homomorphism <f> is left ## minimal. ##
InstallMethod ( IsLeftMinimal, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local A, B, BB, mat, Ann_f, radEndB;
A := Source(f);
B := Range(f);
BB := HomOverAlgebra(B,B);
mat := List(BB, x -> f*x );
mat := List(mat,x -> Flat(x!.maps));
Ann_f := NullspaceMat(mat);
Ann_f := List(Ann_f,x -> LinearCombination(BB,x));
radEndB := RadicalOfAlgebra(EndOverAlgebra(B));
Ann_f := List(Ann_f, x -> FromHomMMToEndM(x));
if ForAll(Ann_f, x -> x in radEndB) then
return true; else
return false; fi; end
);
####################################################################### ## #A RightInverseOfHomomorphism( <f> ) ## ## This function returns false if the homomorphism <f> is not a ## splittable monomorphism, otherwise it returns a splitting of the ## split monomorphism <f>. ##
InstallMethod ( RightInverseOfHomomorphism, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local B, C, CB, id_B, mat, flat_id_B, split_f;
B := Source(f);
C := Range(f); if IsInjective(f) then
CB := HomOverAlgebra(C,B); if Length(CB) = 0then
return false; else
mat := [];
mat := List(CB, x -> f*x);
id_B := IdentityMapping(B);
mat := List(mat,x -> Flat(x!.maps));
flat_id_B := Flat(id_B!.maps);
split_f := SolutionMat(mat,flat_id_B);
if split_f <> fail then
split_f := LinearCombination(CB,split_f);
SetIsSplitEpimorphism(split_f,true);
SetIsSplitMonomorphism(f,true);
SetLeftInverseOfHomomorphism(split_f,f);
return split_f; else
SetIsSplitMonomorphism(f,false);
return false; fi; fi; else
return false; fi; end
);
####################################################################### ## #A LeftInverseOfHomomorphism( <f> ) ## ## This function returns false if the homomorphism <f> is not a ## splittable epimorphism, otherwise it returns a splitting of the ## split epimorphism <f>. ##
InstallMethod ( LeftInverseOfHomomorphism, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local B, C, CB, id_C, mat, flat_id_C, split_f;
B := Source(f);
C := Range(f); if IsSurjective(f) then
CB := HomOverAlgebra(C,B); if Length(CB) = 0then
return false; else
mat := List(CB, x -> x*f );
id_C := IdentityMapping(C);
mat := List(mat,x -> Flat(x!.maps));
flat_id_C := Flat(id_C!.maps);
split_f := SolutionMat(mat,flat_id_C);
if split_f <> fail then
split_f := LinearCombination(CB,split_f);
SetIsSplitMonomorphism(split_f,true);
SetIsSplitEpimorphism(f,true);
SetRightInverseOfHomomorphism(split_f,f);
return split_f; else
SetIsSplitEpimorphism(f,false);
return false; fi; fi; else
return false; fi; end
);
####################################################################### ## #P IsSplitMonomorphism( <f> ) ## ## This function returns false if the homomorphism <f> is not a ## splittable monomorphism, otherwise it returns a splitting of the ## homomorphism <f>. ##
InstallMethod ( IsSplitMonomorphism, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local B, C, CB, id_B, mat, flat_id_B, split_f;
B := Source(f);
C := Range(f); if IsInjective(f) then
CB := HomOverAlgebra(C,B); if Length(CB) = 0then
return false; else
mat := [];
mat := List(CB, x -> f*x);
id_B := IdentityMapping(B);
mat := List(mat,x -> Flat(x!.maps));
flat_id_B := Flat(id_B!.maps);
split_f := SolutionMat(mat,flat_id_B);
if split_f <> fail then
split_f := LinearCombination(CB,split_f);
SetLeftInverseOfHomomorphism(split_f,f);
SetRightInverseOfHomomorphism(f,split_f);
SetIsSplitEpimorphism(split_f,true);
return true; else
return false; fi; fi; else
return false; fi; end
);
####################################################################### ## #P IsSplitEpimorphism( <f> ) ## ## This function returns false if the homomorphism <f> is not a ## splittable epimorphism, otherwise it returns true. ##
InstallMethod ( IsSplitEpimorphism, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local B, C, CB, id_C, mat, flat_id_C, split_f;
B := Source(f);
C := Range(f); if IsSurjective(f) then
CB := HomOverAlgebra(C,B); if Length(CB) = 0then
return false; else
mat := List(CB, x -> x*f );
id_C := IdentityMapping(C);
mat := List(mat,x -> Flat(x!.maps));
flat_id_C := Flat(id_C!.maps);
split_f := SolutionMat(mat,flat_id_C);
if split_f <> fail then
split_f := LinearCombination(CB,split_f);
SetLeftInverseOfHomomorphism(f, split_f);
SetRightInverseOfHomomorphism(split_f,f);
SetIsSplitMonomorphism(split_f,true);
return true; else
return false; fi; fi; else
return false; fi; end
);
InstallMethod ( MoreRightMinimalVersion, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local B, g, A, HomBA, HomAA, n, i, j, gg, hh;
B := Source(f);
g := KernelInclusion(f);
A := Source(g);
HomBA := HomOverAlgebra(B,A); if Length(HomBA) = 0then
return f; else
HomAA := HomOverAlgebra(A,A);
n := Maximum(Concatenation(DimensionVector(A),DimensionVector(B))); for i in [1..Length(HomBA)] do for j in [1..Length(HomAA)] do
gg := (g*HomBA[i]*HomAA[j])^n; if gg <> ZeroMapping(A,A) then
hh := (HomBA[i]*HomAA[j]*g)^n;
return [KernelInclusion(hh)*f,ImageInclusion(hh)*f]; fi;
od;
od;
return f; fi; end
);
InstallMethod ( MoreLeftMinimalVersion, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local B, g, C, HomCB, HomCC, n, i, j, gg, hh, t;
B := Range(f);
g := CoKernelProjection(f);
C := Range(g);
HomCB := HomOverAlgebra(C,B); if Length(HomCB) = 0then
return f; else
HomCC := HomOverAlgebra(C,C);
n := Maximum(Concatenation(DimensionVector(B),DimensionVector(C))); for i in [1..Length(HomCC)] do for j in [1..Length(HomCB)] do
gg := (HomCC[i]*HomCB[j]*g)^n; if gg <> ZeroMapping(C,C) then
hh := (g*HomCC[i]*HomCB[j])^n; # t := IsSplitMonomorphism(KernelInclusion(hh));
t := RightInverseOfHomomorphism(KernelInclusion(hh));
return [f*t,f*ImageProjection(hh)]; fi;
od;
od;
return f; fi; end
);
####################################################################### ## #A RightMinimalVersion( <f> ) ## ## This function returns a right minimal version f' of the ## homomorphism <f> in addition to a list of modules B such that ## Source(f') direct sum the modules on the list B is isomorphic to ## Source(f). ##
InstallMethod ( RightMinimalVersion, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local Bprime, g, L;
Bprime := [];
g := f;
repeat
L := MoreRightMinimalVersion(g); if L <> g then
g := L[1];
Add(Bprime,Source(L[2])); fi;
until
L = g;
SetIsRightMinimal(g,true);
return [g,Bprime]; end
);
####################################################################### ## #A LeftMinimalVersion( <f> ) ## ## This function returns a left minimal version f' of the ## homomorphism <f> in addition to a list of modules B such that ## Range(f') direct sum the modules on the list B is isomorphic to ## Range(f). ##
InstallMethod ( LeftMinimalVersion, "for a PathAlgebraMatModuleMap",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local Bprime, g, L;
Bprime := [];
g := f;
repeat
L := MoreLeftMinimalVersion(g); if L <> g then
g := L[1];
Add(Bprime,Range(L[2])); fi;
until
L = g;
SetIsLeftMinimal(g,true);
return [g,Bprime]; end
);
####################################################################### ## #O HomFromProjective(<m>,<M>) ## ## This function checks if the element <m> is an element of <M> and ## if the element <m> is uniform. If so, the function constructs the ## map from the indecomposable projective generated by the vertex of ## support to the module <M> given by sending the vertex to the ## element <m>. ##
InstallMethod ( HomFromProjective, "for an element in a PathAlgebraMatModule and the PathAlgebraMatModule",
IsElmsColls,
[ IsRightAlgebraModuleElement, IsPathAlgebraMatModule ], 0, function( m, M )
local A, K, num_vert, support, pos, P, B, mats, zeros, i, f; # # Finding the algebra acting on M and the number of vertices. #
A := RightActingAlgebra(M);
K := LeftActingDomain(M);
num_vert := Length(m![1]![1]); # # Finding the support of m. #
support := SupportModuleElement(m); # # If the element m is uniform, we proceed to find the map. # if Length(support) = 1then # # And we need the "number of" the vertex ... #
pos := VertexPosition(support[1]); # # And the basis for the correct projective module, and the proj. module itself #
B := BasisOfProjectives(A)[pos];
P := ShallowCopy(IndecProjectiveModules(A)[pos]); # # Then we calculate the matrices for the homomorphism #
mats := List([1..num_vert],x -> List(B[x], y -> ExtRepOfObj(m^y)![1][x]));
zeros := Filtered([1..num_vert], x -> DimensionVector(P)[x] = 0); for i in zeros do if DimensionVector(M)[i] <> 0then
mats[i] := NullMat(1,DimensionVector(M)[i],K); else
mats[i] := NullMat(1,1,K); fi;
od; # # Construct the homomorphism #
f := RightModuleHomOverAlgebra(P,M,mats);
return f; else
return fail; fi; end
);
###################################################### ## #O InverseOfIsomorphism( <f> ) ## ## <f> is a map which is iso. ## ## Output is the map f^(-1), or the inverse of f. ##
InstallMethod( InverseOfIsomorphism,
[ IsPathAlgebraMatModuleHomomorphism ], function( f )
local maps, invmaps, m; if not(IsIsomorphism(f)) then
Error("entered map is not an isomorphism"); fi;
maps := f!.maps;
invmaps := []; for m in maps do if IsZero(m) then
Append(invmaps, [m]); else
Append(invmaps, [Inverse(m)]); fi;
od;
####################################################################### ## #O HomomorphismFromImages( <M>, <N>, <genImages> ) ## ## <M> and <N> are modules over the same algebra. This operation ## computes a homomorphism f: M ---> N such that the basis ## ## B := BasisVectors( Basis( M ) ); ## ## is sent to the list <genImages>, that is, B[i] is sent to genImages[i]. ## If this does not give a well-defined homomorphism, the final ## call to RightModuleHomOverAlgebra will fail. ##
InstallMethod( HomomorphismFromImages,
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule, IsList ], function( M, N, genImages )
local B, K, dim_vec_N, dim_vec_M, map, i, j, mat, p;
K := LeftActingDomain(M);
B := BasisVectors( Basis( M ) );
# # Checks that the element B[i] is sent to an element of N with support in # the same vertex as B[i]. # for i in [1..Length(B)] do if ( SupportModuleElement( B[i] ) <> SupportModuleElement( genImages[i] ) ) and
( not IsZero( genImages[i] ) ) then
Error("does not give a homomorphism -- wrong support,"); fi;
od;
# # Computing dimension vectors so that we can insert zero matrices of # the right size. #
dim_vec_M := DimensionVector(M);
dim_vec_N := DimensionVector(N);
map := [];
j := 0; for i in [1..Length(dim_vec_M)] do # # If M is zero in vertex i, then insert a zero matrix of # the right size, do not use any of the lifting information. # if dim_vec_M[i] = 0then if dim_vec_N[i] = 0then
Add(map,NullMat(1,1,K)); else
Add(map,NullMat(1,dim_vec_N[i],K)); fi; else # # If M is non-zero in vertex i, then use genImages # to compute the right matrix for the map from vertex i to i. #
mat := []; for p in [1..dim_vec_M[i]] do
j := j + 1; if not ( IsPathModuleElem(genImages[j]) ) then if IsList( ExtRepOfObj( genImages[j] ) ) then
Add(mat, ExtRepOfObj( genImages[j] )[i]); else
Add(mat, ExtRepOfObj(ExtRepOfObj(genImages[j]))[i]); fi; else
Add(mat,ExtRepOfObj(ExtRepOfObj(genImages[j]))[i]); fi;
od;
Add(map,mat); fi;
od;
return RightModuleHomOverAlgebra(M, N, map);
end
);
###################################################### ## #O MultiplyListsOfMaps( <projections>, <matrix>, <inclusions> ) ## ## <projections> is a list of m maps, <matrix> is a list of ## m lists of n maps, <inclusions> is a list of n maps. ## Considering <projections> as a 1xm-matrix, <matrix> as an ## mxn-matrix and and <inclusions> as an nx1-matrix, the ## matrix product is computed. Naturally, the maps in the ## matrices must be composable. ## ## Output is a map (not a 1x1-matrix). ## ## Utility method not supposed to be here, but there seemed ## to be no existing GAP method for this. ##
InstallMethod( MultiplyListsOfMaps,
[ IsList, IsList, IsList ], function( projections, matrix, inclusions )
local sum, list, n, m, i, j;
n := Length(projections);
m := Length(inclusions);
list := [1..m];
sum := 0;
for i in [1..m] do
list[i] := projections*matrix[i];
od;
sum := list*inclusions;
return sum; end);
####################################################################### ## #O IsomorphismOfModules( <M>, <N> ) ## ## Given two modules <M> and <N> over a (quotient of a) path algebra ## this function return an isomorphism from <M> to <N> is the two ## modules are isomorphic, and false otherwise. ##
InstallMethod ( IsomorphismOfModules, "for two PathAlgebraMatModules",
true,
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, N )
local K, dim_M, mats, i, maps, splittingmaps, fn, fsplit, gn, gsplit,
f_alpha, f_beta, g_alpha, g_beta, q, B, genImages, delta,
recursiveIOM; # # If M and N are not modules over the same algebra, # return an error message. # if RightActingAlgebra(M) <> RightActingAlgebra(N) then
return false; fi; # # If the dimension vectors of M and N are different, they # are not isomorphic, so return false. # if DimensionVector(M) <> DimensionVector(N) then
return false; fi; # # If both M and N are the zero module, return the zero map. # if Dimension(M) = 0 and Dimension(N) = 0then
return ZeroMapping(M,N); fi; # # If M and N are the same representations (i.e. with the # same vector spaces and defining matrices, then return the # "identity homomorphism". # if M = N then
K := LeftActingDomain(M);
dim_M := DimensionVector(M);
mats := []; for i in [1..Length(dim_M)] do if dim_M[i] = 0then
Add(mats,NullMat(1,1,K)); else
Add(mats,IdentityMat(dim_M[i],K)); fi;
od;
return RightModuleHomOverAlgebra(M,N,mats); fi; # # Finds a homomorphism from M to N and corresponding homomorphism # from N to M identifying a common non-zero direct summand of M # and N, if such exists. Otherwise it returns false. #
splittingmaps := function( M, N)
local K, HomMN, HomNM, mn, nm, n, m, i, j,
l, zero, f, fnm, nmf;
m := Maximum(DimensionVector(M));
n := Maximum(DimensionVector(N)); if n = m then
l := n; else
l := Minimum([n,m]) + 1; fi;
zero := ZeroMapping(M,M);
for j in [1..nm] do for i in [1..mn] do if l>1then# because hom^0*hom => error!
f := (HomMN[i]*HomNM[j])^(l-1)*HomMN[i]; else
f := HomMN[i]; fi;
fnm := f*HomNM[j];
if fnm <> zero then
nmf := HomNM[j]*f;
return [fnm, nmf, HomMN[i]]; fi;
od;
od;
return false; end;
maps := splittingmaps(M,N); # # No common non-zero direct summand, M and N are not isomorphic, # return false. # if maps = false then
return false; fi; # # M and N has a common non-zero direct summand, find the splitting of # the inclusion of this common direct summand in M and in N. #
fn := ImageInclusion(maps[1]); # fsplit := IsSplitMonomorphism(fn);
fsplit := RightInverseOfHomomorphism(fn);
gn := ImageInclusion(maps[2]); # gsplit := IsSplitMonomorphism(gn); # gsplit := LeftInverseOfHomomorphism(gn);
gsplit := RightInverseOfHomomorphism(gn); # # Find the idempotents corresponding to these direct summands. #
f_alpha := ImageInclusion(fsplit*fn);
f_beta := KernelInclusion(fsplit*fn);
g_alpha := ImageInclusion(gsplit*gn);
g_beta := KernelInclusion(gsplit*gn); # # If this direct summand is all of M and N, return the appropriate # isomorphism. # if Dimension(Source(f_beta)) = 0 and Dimension(Source(g_beta)) = 0then
return maps[1]*maps[3]; fi; # # If this direct summand is not all of M and N, recursively construct # a possible isomorphism between the complements of this common direct # summand in M and in N. #
q := f_alpha*maps[1]*maps[3];
B := BasisVectors(Basis(Source(q)));
genImages := List(B, x -> PreImagesRepresentative(g_alpha, ImageElm(q,x)));
####################################################################### ## #O EndOfModuleAsQuiverAlgebra( <M> ) ## ## The argument of this function is a PathAlgebraMatModule <M> over ## a quiver algebra over a field K. It checks if the endomorphism ring ## of <M> is K-elementary for some (finite) field K. If the endomorphism ## ring of <M> is K-elementary, then it returns a list of three elements, ## (i) the endomorphism ring of <M>, ## (ii) the adjacency matrix of the quiver of the endomorphism ring and ## (iii) the endomorphism ring as a quiver algebra. ##
InstallMethod( EndOfModuleAsQuiverAlgebra, "for a representations of a quiver",
[ IsPathAlgebraMatModule ], 0, function( M )
local EndM, EndMAsQuiverAlg;
EndM := EndOverAlgebra( M );
EndMAsQuiverAlg := AlgebraAsQuiverAlgebra( EndM );
if EndMAsQuiverAlg <> fail then
return [ EndM, AdjacencyMatrixOfQuiver( QuiverOfPathAlgebra( EndMAsQuiverAlg[ 1 ] ) ), EndMAsQuiverAlg[ 1 ] ]; else
return fail; fi; end
);
####################################################################### ## #O TraceOfModule( <M>, <N> ) ## ## This function computes trace of the module <M> in <N> by doing ## the following: computes a basis for Hom_A(M,N) and then computes ## the sum of all the images of the elements in this basis. This is ## also a minimal right Fac(M)-approximation. ##
InstallMethod( TraceOfModule, "for two PathAlgebraMatModules",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ],
function( M, N )
local homMN, B, trace; # # Checking if the modules <M> and <N> are modules over the same algebra. # if RightActingAlgebra(M) <> RightActingAlgebra(N) then
Error("the entered modules are not modules over the same algebra,\n"); fi; # # If <M> or <N> are zero, then the trace is the zero module. # if M = ZeroModule(RightActingAlgebra(M)) or N = ZeroModule(RightActingAlgebra(N)) then
return ZeroMapping(ZeroModule(RightActingAlgebra(N)),N); fi; # # Finding a basis for Hom(M,N), and taking the sum of all the images of these # homomorphisms from <M> to <N>. This is the trace of <M> in <N>. #
homMN := HomOverAlgebra(M,N); if Length(homMN) = 0then
return ZeroMapping(ZeroModule(RightActingAlgebra(N)),N); fi;
B := BasisVectors(Basis(M));
trace := Flat(List(B, b -> List(homMN, f -> ImageElm(f,b))));
return SubRepresentationInclusion(N,trace); end
);
####################################################################### ## #O RejectOfModule( <N>, <M> ) ## ## This function computes the reject of the module <M> in <N> by doing ## the following: computes a basis for Hom_A(N,M) and then computes ## the intersections of all the kernels of the elements in this basis. ##
InstallMethod( RejectOfModule, "for two PathAlgebraMatModules",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ],
function( N, M )
local homNM; # # Checking if the modules <M> and <N> are modules over the same algebra. # if RightActingAlgebra(M) <> RightActingAlgebra(N) then
Error("the entered modules are not modules over the same algebra,\n"); fi; # # If Hom( N, M ) is zero, then the reject is the identity homomorphism N ---> N. #
homNM := HomOverAlgebra( N, M ); if Length( homNM ) = 0then
return IdentityMapping( N ); fi; # # Using the basis we found for Hom( N, M ) above, and taking the intersection of # all the kernels of these homomorphisms in the basis. This is the reject of # <M> in <N>. # if Length( homNM ) = 1then
return KernelInclusion( homNM[ 1 ] ); fi; if Length( homNM ) > 1then
return IntersectionOfSubmodules( List( homNM, f -> KernelInclusion( f ) ) ); fi; end
);
####################################################################### ## #O AllSimpleSubmodulesOfModule( <M> ) ## ## Returns all the different simple submodules of a module given as ## inclusions into the module <M>. ## ## Algorithm used is based on one created by Didrik Fosse. ##
InstallMethod( AllSimpleSubmodulesOfModule, "for a representation",
[ IsPathAlgebraMatModule ], function( M )
local field, simples, socleinclusion, soc, blocks, b, s,
simp;
field := LeftActingDomain( M ); if not IsFinite( field ) then
Error( "The module is not a module over an algebra over a finite field.\n" ); fi; if IsZero( M ) or IsSimpleQPAModule( M ) then
return [ IdentityMapping( M ) ]; fi; # # Finding all simple submodules of M. #
simples := [ ];
socleinclusion := SocleOfModuleInclusion( M );
soc := Source( socleinclusion );
blocks := BlockSplittingIdempotents( soc );
blocks := List( blocks, b -> ImageInclusion( b ) ); for b in blocks do for s in Subspaces( Source( b ), 1 ) do
simp := SubRepresentationInclusion( Source( b ), BasisVectors( Basis( s ) ) );
Add( simples, simp * b * socleinclusion );
od;
od;
return simples; end
);
####################################################################### ## #O AllSubmodulesOfModule( <M> ) ## ## Returns all the different submodules of a module given as inclusions ## into the module <M>. ## ## Algorithm used is based on one created by Didrik Fosse. ##
InstallMethod( AllSubmodulesOfModule, "for a representation",
[IsPathAlgebraMatModule], function(M)
local field, submodules, length, simples, listofsubmodules,
previousstep, dim, dimsub, Vspaces, newsubmodules, U,
MmodU, allsimplesinU, s, newsubmodule, V;
field := LeftActingDomain( M ); if not IsFinite( field ) then
Error( "The module is not a module over an algebra over a finite field.\n" ); fi; if IsZero( M ) then
return [ IdentityMapping( M ) ]; fi;
submodules := [ SubRepresentationInclusion( M, [ ] ), IdentityMapping( M ) ]; if IsSimpleQPAModule( M ) then
return submodules; fi;
length := Dimension( M ); # # Finding all simple submodules of M. #
simples := AllSimpleSubmodulesOfModule( M );
listofsubmodules := [ ];
listofsubmodules[ 1 ] := [ SubRepresentationInclusion( M, [ ] ) ];
Add( listofsubmodules, simples );
previousstep := simples;
dim := Dimension( M );
dimsub := 1; while dimsub < dim do
dimsub := dimsub + 1;
Vspaces := [ ];
newsubmodules := [ ]; for U in previousstep do
MmodU := CoKernelProjection( U );
allsimplesinU := AllSimpleSubmodulesOfModule( Range( MmodU ) ); for s in allsimplesinU do
newsubmodule := PullBack( MmodU, s )[ 2 ];
V := Subspace( UnderlyingLeftModule( M ),
List( BasisVectors( Basis( Source( newsubmodule ) ) ), b -> ExtRepOfObj( ImageElm( newsubmodule, b ) ) ) ); if Length( newsubmodules ) = 0then
Add( newsubmodules, newsubmodule );
Add( Vspaces, V ); else if not ( V in Vspaces ) then
Add( newsubmodules, newsubmodule );
Add( Vspaces, V ); fi; fi;
od;
od;
Add( listofsubmodules, newsubmodules );
previousstep := newsubmodules;
od;
return listofsubmodules; end
);
####################################################################### ## #O RestrictionViaAlgebraHomomorphismMap( < f, h > ) ## ## Given an algebra homomorphism f : A ---> B and a homomorphism ## h : M ---> N of modules over B, this function returns the induced ## homomorphism h : M ---> N as a homomorphism of modules over A. ##
InstallMethod( RestrictionViaAlgebraHomomorphismMap, "for a IsAlgebraHomomorphism and a IsPathAlgebraMatModuleHomomorphism",
[ IsAlgebraHomomorphism, IsPathAlgebraMatModuleHomomorphism ], 0, function( f, h )
local M, N, K, A, B, vertices, VM, BVM, VN, BVN, mats,
mat, i, resM, resN;
M := Source( h );
N := Range( h );
K := LeftActingDomain( M );
A := Source( f );
B := Range( f ); if RightActingAlgebra( M ) <> B then
Error( "The entered homomorphism is not over the range of the algebra homomorphism.\n" ); fi;
vertices := One( A ) * VerticesOfQuiver( QuiverOfPathAlgebra( A ) );
VM := List( vertices, v -> List( BasisVectors( Basis( M ) ), m -> m ^ ImageElm( f, v ) ) );
VM := List( VM, W -> Filtered( W, w -> w <> Zero( w ) ) );
BVM := List( VM, function( W ) if IsEmpty(W) then return []; else return Basis( VectorSpace( K, W ) ); fi; end );
VN := List( vertices, v -> List( BasisVectors( Basis( N ) ), m -> m ^ ImageElm( f, v ) ) );
VN := List( VN, W -> Filtered( W, w -> w <> Zero( w ) ) );
BVN := List( VN, function( W ) if IsEmpty(W) then return []; else return Basis( VectorSpace( K, W ) ); fi; end );
mats := [ ]; for i in [ 1..Length( vertices ) ] do
mat := List( BasisVectors( BVM[ i ] ), b -> Coefficients( BVN[ i ], ImageElm( h, b ) ) );
Add( mats, mat );
od;
resM := RestrictionViaAlgebraHomomorphism( f, M );
resN := RestrictionViaAlgebraHomomorphism( f, N );
return RightModuleHomOverAlgebra( resM, resN, mats ); end
);
####################################################################### ## #O AllModulesOfLengthPlusOne( <M> ) ## ## Given a list of all modules of length <n> for an algebra, this ## function constructs all modules of length <n + 1> ##
InstallMethod( AllModulesOfLengthPlusOne, "for a representation",
[ IsList ], function( list )
local A, K, d, simples, firstsyzygysimples, extensions, S,
temp, M, ext, modules, t, i, u, j, s, coeff, h,
firstsyzygylist, nonisomodules, noniso;
if Length( list ) = 0then
Error( "List entered into AllModulesOfLengthPlusOne is empty.\n" ); fi;
A := RightActingAlgebra( list[ 1 ] );
K := LeftActingDomain( A ); if not IsFinite( K ) then
Error( "The algebra is not over a finite field.\n" ); fi; if not ForAll( list, m -> RightActingAlgebra( m ) = A ) then
Error( "List entered into AllModulesOfLengthPlusOne doesn't consist of modules over the same algebra.\n" ); fi;
d := Dimension( list[ 1 ] ); if not ForAll( list, m -> Dimension( m ) = d ) then
Error( "List entered into AllModulesOfLengthPlusOne doesn't have the same length.\n" ); fi;
simples := SimpleModules( A );
firstsyzygysimples := List( simples, s -> KernelInclusion( ProjectiveCover( s ) ) );
extensions := [ ]; for S in simples do
temp := [ ]; for M in list do
ext := ExtOverAlgebra( S, M );
Add( temp, ext[ 2 ] );
od;
Add( extensions, temp );
od;
modules := [ ];
t := Length( extensions ); # number of simples for i in [ 1..t ] do
u := Length( extensions[ i ] ); # number of elements in <list> for j in [ 1..u ] do
s := Length( extensions[ i, j ] ); # dimension of Ext-space if s = 1then
Add( modules, DirectSumOfQPAModules( [ list[ u ], simples[ i ] ] ) );
Add( modules, Range( PushOut( extensions[ i, j ][ 1 ], firstsyzygysimples[ i ] )[ 2 ] ) ); elif s > 1then for coeff in K^s do
h := LinearCombination( extensions[ i, j ], coeff );
Add( modules, Range( PushOut( h, firstsyzygysimples[ i ] )[ 2 ] ) );
od; fi;
od;
od;
modules := Unique( modules );
firstsyzygylist := List( list, m -> KernelInclusion( ProjectiveCover( m ) ) );
extensions := [ ]; for M in list do
temp := [ ]; for S in simples do
ext := ExtOverAlgebra( M, S );
Add( temp, ext[ 2 ] );
od;
Add( extensions, temp );
od;
t := Length( extensions ); # number of elements in <list> for i in [ 1..t ] do
u := Length( extensions[ i ] ); # number of simples for j in [ 1..u ] do
s := Length( extensions[ i, j ] ); # dimension of Ext-space if s = 1then
Add( modules, DirectSumOfQPAModules( [ list[ i ], simples[ j ] ] ) );
Add( modules, Range( PushOut( extensions[ i, j ][ 1 ], firstsyzygylist[ i ] )[ 2 ] ) ); elif s > 1then for coeff in K^s do
h := LinearCombination( extensions[ i, j ], coeff );
Add( modules, Range( PushOut( h, firstsyzygylist[ i ] )[ 2 ] ) );
od; fi;
od;
od;
modules := Unique( modules );
s := Length( modules );
nonisomodules := [ ];
Add( nonisomodules, modules[ 1 ] );
noniso := 1; for i in [ 2..s ] do if ForAll( [ 1..noniso ], j -> not IsomorphicModules( nonisomodules[ j ], modules[ i ] ) ) then
Add( nonisomodules, modules[ i ] );
noniso := noniso + 1; fi;
od;
return nonisomodules; end
);
####################################################################### ## #O AllModulesOfLengthAtMost( <A>, n ) ## ## Returns all the different modules over an algebra of length at most ## <n> over the algebra <A>. ##
InstallMethod( AllModulesOfLengthAtMost, "for an algebra and an integer",
[ IsQuiverAlgebra, IS_INT ], function( A, n )
local field, simples, allmodules, previousstep, i;
field := LeftActingDomain( A ); if not IsFinite( field ) then
Error( "The algebra is not over a finite field.\n" ); fi; if n < 0then
return [ ]; fi; if n = 0then
return [ ZeroModule( A ) ]; fi;
simples := SimpleModules( A );
allmodules := Concatenation( [ ZeroModule( A ) ], simples ); if n = 1then
return allmodules; fi;
previousstep := simples; for i in [ 2..n ] do
previousstep := AllModulesOfLengthPlusOne( previousstep );
allmodules := Concatenation( allmodules, previousstep );
od;
return allmodules; end
);
####################################################################### ## #O AllIndecModulesOfLengthAtMost( <A>, n ) ## ## Returns all the different indecomposable modules over an algebra ## of length at most <n> over the algebra <A>. ##
InstallMethod( AllIndecModulesOfLengthAtMost, "for an algebra and an integer",
[ IsQuiverAlgebra, IS_INT ], function( A, n )
local allmodules;
####################################################################### ## #A FromIdentityToDoubleStarHomomorphism( <M> ) ## ## Returns the homomorphism from M to M^{**} for module <M>. ##
InstallMethod( FromIdentityToDoubleStarHomomorphism, "for a path algebra module",
[ IsPathAlgebraMatModule ], function( M )
local A, Aop, K, P, num_vert, V, BV, BasisVflat, b,
Mstar, dim_vect_star, Pop, Vop, BVop, BasisVflatop,
Mdstar, dim_vect_dstar, BM, dimM, matrices, basisPop,
fam, i, temp, start, j, m, mats, l, mstar, h,
hflat, startpos, endpos; # # Setting up necessary infrastructure. #
A := RightActingAlgebra( M );
Aop := OppositeAlgebra( A );
K := LeftActingDomain( M );
P := IndecProjectiveModules( A );
num_vert := Length( P ); # # Finding the vector spaces in each vertex in the representation of # Hom_A(M,A) and making a vector space of the flatten matrices in # each basis vector in Hom_A(M,e_iA). #
V := List( P, p -> HomOverAlgebra( M, p ) );
BV := List( V, v -> List( v, x ->
Flat( MatricesOfPathAlgebraMatModuleHomomorphism( x ) ) ) );
BasisVflat := []; for b in BV do if Length( b ) <> 0then
Add( BasisVflat,
Basis( Subspace( FullRowSpace( K, Length( b[ 1 ] ) ), b, "basis"), b ) ); else
Add( BasisVflat, Basis( TrivialSubspace( K^1 ) ) ); fi;
od; # # Computing M^*. #
Mstar := StarOfModule( M );
dim_vect_star := DimensionVector( Mstar ); # # Finding the vector spaces in each vertex in the representation of # Hom_Aop(M^*,Aop) and making a vector space of the flatten matrices in # each basis vector in Hom_Aop(M^*,e^op_iAop). #
Pop := IndecProjectiveModules( Aop );
Vop := List( Pop, p -> HomOverAlgebra( Mstar, p ) );
BVop := List( Vop, v -> List( v, x ->
Flat( MatricesOfPathAlgebraMatModuleHomomorphism( x ) ) ) );
BasisVflatop := []; for b in BVop do if Length( b ) <> 0then
Add( BasisVflatop,
Basis( Subspace( FullRowSpace( K, Length( b[ 1 ] ) ), b, "basis"), b ) ); else
Add( BasisVflatop, Basis( TrivialSubspace( K^1 ) ) ); fi;
od; # # Computing M^{**} #
Mdstar := StarOfModule( Mstar );
dim_vect_dstar := DimensionVector( Mdstar ); # # Computing the morphism from M ----> M^** #
BM := BasisVectors( Basis( M ) );
dimM := DimensionVector( M );
matrices := [ ];
basisPop := List( BasisOfProjectives( Aop ), b -> Flat( b ) );
basisPop := List( basisPop, b -> Basis( Subspace( Aop, b, "basis" ) ) );
fam := ElementsFamily( FamilyObj( A ) ); for i in [ 1..num_vert ] do if dimM[ i ] = 0then if dim_vect_dstar[ i ] = 0then
Add( matrices, NullMat( 1, 1, K ) ); else
Add( matrices, NullMat( 1, dim_vect_dstar[ i ], K ) ); fi; else if dim_vect_dstar[ i ] = 0then
Add( matrices, NullMat( dimM[ i ], 1, K ) ); else # # For each m in M[ i ] construct the map from M^* ---> A given by g |---> g( m ) #
temp := [ ];
start := Sum( dimM{ [ 1..i - 1 ] } ); for j in [ 1..dimM[ i ] ] do
m := BM[ start + j ];
mats := [ ]; for l in [ 1..num_vert ] do if Length( V[ l ] ) = 0then if DimensionVector( Pop[ i ] )[ l ] = 0then
Add( mats, NullMat( 1, 1, K ) ); else
Add( mats, NullMat( 1, DimensionVector( Pop[ i ] )[ l ], K ) ); fi; else if DimensionVector( Pop[ i ] )[ l ] = 0then
Add( mats, NullMat( Length( V[ l ] ), 1, K ) ); else
mstar := List( V[ l ], g -> ImageElm( g, m ) ); if IsPathAlgebra( A ) then
mstar := List( mstar, w -> ElementInIndecProjective( A, w, l ) ); else
mstar := List( mstar, w -> ElementOfQuotientOfPathAlgebra( fam, ElementInIndecProjective( A, w, l ), false ) ); fi;
mstar := List( mstar, w -> OppositePathAlgebraElement( w ) );
mstar := List( mstar, w -> Coefficients( basisPop[ i ], w ) );
mstar := List( mstar, w -> LinearCombination( Basis( Pop[ i ] ), w ) );
mstar := List( mstar, w -> ExtRepOfObj( ExtRepOfObj( w ) )[ l ] );
Add( mats, mstar ); fi; fi;
od;
h := RightModuleHomOverAlgebra( Mstar, Pop[ i ], mats );
hflat := Flat( MatricesOfPathAlgebraMatModuleHomomorphism( h ) );
mstar := Coefficients( BasisVflatop[ i ], hflat );
startpos := Sum( dim_vect_dstar{ [ 1..i - 1 ] } ) + 1;
endpos := startpos + dim_vect_dstar[ i ] - 1;
mstar := LinearCombination( BasisVectors( Basis( Mdstar ) ){ [ startpos..endpos ] }, mstar );
mstar := ExtRepOfObj( ExtRepOfObj( mstar ) )[ i ];
Add( temp, mstar );
od;
Add( matrices, temp ); fi; fi;
od;
return RightModuleHomOverAlgebra( M, Mdstar, matrices ); end
);
####################################################################### ## #O MatrixOfHomomorphismBetweenProjectives( <f> ) ## ## Given a homomorphism <f> from <P = \oplus v_iA> to <P' = \oplus w_iA> ## where <v_i> and <w_i> are vertices, this function finds the ## homomorphism as a matrix in <\oplus v_iAw_i>. ##
InstallMethod( MatrixOfHomomorphismBetweenProjectives, "for a homomorphism between projectives",
true,
[ IsPathAlgebraMatModuleHomomorphism ], 0, function( f )
local zero, projections, inclusions, A, imageofgenerators,
l, indexofprojectives;
zero := Zero( OriginalPathAlgebra( RightActingAlgebra( Source( f ) ) ) ); if IsZero( Range( f ) ) then
return [ [ zero ] ]; fi;
projections := DirectSumProjections( Range( f ) ); if IsZero( Source( f ) ) then
return [ List( [ 1..Length( projections ) ], i -> zero ) ]; fi;
inclusions := DirectSumInclusions( Source( f ) ); if not IsDirectSumOfModules( Source( f ) ) or not IsDirectSumOfModules( Range( f ) ) then
Error( "The enter projectives are not a direct sum indecomposable projectives.\n" ); fi;
A := RightActingAlgebra( Source( f ) );
imageofgenerators := List( inclusions, x -> ImageElm( x, MinimalGeneratingSetOfModule( Source( x ) )[ 1 ] ) );
imageofgenerators := List( imageofgenerators, x -> ImageElm( f, x ) );
l := Length( projections );
imageofgenerators := List( imageofgenerators, x -> List( projections, p -> ImageElm( p, x ) ) );
indexofprojectives := List( projections, x -> SupportModuleElement( MinimalGeneratingSetOfModule( Range( x ) )[ 1 ] )[ 1 ] );
indexofprojectives := List( indexofprojectives, x -> VertexPosition( x ) );
imageofgenerators := List( imageofgenerators, x -> List( [ 1..l ],
y -> ElementInIndecProjective( A, x[ y ], indexofprojectives[ y ] ) ) );
return TransposedMat( imageofgenerators ); end
);
InstallMethod( FromMatrixToHomomorphismOfProjectives, "for a matrix of elements in a quotient of a path algebra, and two list of vertices",
true,
[ IsQuiverAlgebra, IsMatrix, IsHomogeneousList, IsHomogeneousList ], 0, function( A, mat, vert1, vert0 )
local m, P0vert, supprows, rowcount, row, tempsupp, r, test, P1vert,
suppcolumns, P1, P1projections, P0, P0inclusions, newmat, P,
dimmat, i, temp, j, fam, vfam, elem;
for m in mat do if not ForAll( m, a -> a in A ) then
Error( "The entered matrix is not a homogeneous matrix in one and the same algebra.\n" ); fi;
od;
P0vert := [ ];
supprows := List( mat, row -> List( row, r -> LeftSupportOfQuiverAlgebraElement( A, r ) ) );
rowcount := 0; for row in supprows do
rowcount := rowcount + 1;
tempsupp := []; for r in row do if r <> [] then if Length( r ) > 1then
Error( "The entered matrix is not given by uniform elements.\n" ); else
Add( tempsupp, r[ 1 ] ); fi; fi;
od; if Length( tempsupp ) > 0then
test := tempsupp[ 1 ]; if not ForAll( tempsupp, t -> t = test ) then
Error( "The entered matrix is not row homogeneous.\n" ); fi; fi; if tempsupp = [] then
Add( P0vert, vert0[ rowcount ] ); else
Add( P0vert, test ); fi;
od;
P1vert := [ ];
suppcolumns := List( TransposedMat( mat ), row -> List( row, r -> RightSupportOfQuiverAlgebraElement( A, r ) ) );
rowcount := 0; for row in suppcolumns do
rowcount := rowcount + 1;
tempsupp := []; for r in row do if r <> [] then if Length( r ) > 1then
Error( "The entered matrix is not given by uniform elements.\n" ); else
Add( tempsupp, r[ 1 ] ); fi; fi;
od; if Length( tempsupp ) > 0 and not ForAll( tempsupp, t -> t = tempsupp[ 1 ] ) then
Error( "The entered matrix is not column homogeneous.\n" ); fi; if tempsupp = [] then
Add( P1vert, vert1[ rowcount ] ); else
Add( P1vert, tempsupp[ 1 ] ); fi;
od;
if ( P1vert <> vert1 ) or ( P0vert <> vert0 ) then
Error( "Discrepancy between entered list of vertices and support in the entered matrix.\n" ); fi;
P1 := DirectSumOfQPAModules( List( vert1, v -> IndecProjectiveModules( A )[ v ] ) );
P1projections := DirectSumProjections( P1 );
P0 := DirectSumOfQPAModules( List( vert0, v -> IndecProjectiveModules( A )[ v ] ) );
P0inclusions := DirectSumInclusions( P0 );
newmat := [];
P := IndecProjectiveModules( A );
dimmat := DimensionsMat( mat ); for i in [ 1..dimmat[ 1 ] ] do
temp := []; for j in [ 1..dimmat[ 2 ] ] do
r := mat[ i ][ j ]; if IsZero( r ) then
Add( temp, ZeroMapping( Range( P1projections[ j ] ), Source( P0inclusions[ i ] ) ) ); else
fam := FamilyObj( Zero( Source( P0inclusions[ i ] ) )![ 1 ] );
vfam := FamilyObj( Zero( Source( P0inclusions[ i ] ) ) );
elem := ElementIn_vA_AsElementInIndecProj( A, r );
elem := ExtRepOfObj( ExtRepOfObj( elem ) );
elem := ObjByExtRep(vfam, PathModuleElem( fam, elem ) );
Add( temp, HomFromProjective( elem, Source( P0inclusions[ i ] ) ) ); fi;
od;
Add( newmat, temp );
od;
for i in [ 1..dimmat[ 1 ] ] do for j in [ 1..dimmat[ 2 ] ] do
newmat[ i ][ j ] := P1projections[ j ] * newmat[ i ][ j ] * P0inclusions[ i ];
od;
od;
return Sum( Flat( newmat ) ); end
);
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.92Angebot
¤
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.