####################################################################### ## #O PushOut(<f>, <g>) ## ## This function finds the pushout of the homomorphisms ## f ## A ---------> B ## | | ## | g | g' ## | | ## V f' V ## C ---------> E ## in that it returns the homomorphisms [f', g']. ##
InstallMethod( PushOut, "for two homomorphisms starting in a common module over a path algebra",
[ IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism ], 0, function( f, g )
local B, C, CplusB, inclusions, projections, h;
if Source(f) = Source(g) then
B := Range(f);
C := Range(g);
CplusB := DirectSumOfQPAModules([C,B]);
inclusions := DirectSumInclusions(CplusB);
h := f*inclusions[2]-g*inclusions[1];
h := CoKernelProjection(h);
return [inclusions[1]*h,inclusions[2]*h]; else
Print("Error: The two maps entered don't start in the same module.\n");
return fail; fi; end
);
####################################################################### ## #O PullBack(<f>, <g>) ## ## This function finds the pullback of the homomorphisms ## f' ## E ---------> C ## | | ## | g' | g ## | | ## V f V ## A ---------> B ## in that it returns the homomorphisms [f', g']. ##
InstallMethod( PullBack, "for two homomorphisms ending in a common module over a path algebra",
[ IsPathAlgebraMatModuleHomomorphism, IsPathAlgebraMatModuleHomomorphism ], 0, function( f, g )
local A, C, AplusC, projections, h;
if Range(f) = Range(g) then
A := Source(f);
C := Source(g);
AplusC := DirectSumOfQPAModules([A,C]);
projections := DirectSumProjections(AplusC);
h := projections[1]*f-projections[2]*g;
h := KernelInclusion(h);
return [h*projections[2],h*projections[1]]; else
Print("Error: The two maps entered don't end in the same module.\n");
return fail; fi; end
);
####################################################################### ## #O IsOmegaPeriodic( <M>, <n> ) ## ## This function tests if the module <M> is \Omega-periodic, that is, ## if M \simeq \Omega^i(M) when i ranges over the set {1,2,...,n}. ## Otherwise it returns false. ##
InstallMethod( IsOmegaPeriodic, "for a path algebra matmodule and an integer",
[ IsPathAlgebraMatModule, IS_INT ], 0, function( M, n )
local N0, N1, i;
N0 := M; for i in [1..n] do
Print("Computing syzygy number: ",i,"\n");
N1 := 1stSyzygy(N0); if IsomorphicModules(M,N1) then
return i; else
N0 := N1; fi;
od;
return false; end
);
####################################################################### ## #O IsTauPeriodic( <M>, <n> ) ## ## This function tests if the module <M> is \tau-periodic, that is, ## if M \simeq \tau^i(M) when i ranges over the set {1,2,...,n}. ## Otherwise it returns false. ##
InstallMethod( IsTauPeriodic, "for a path algebra matmodule and an integer",
[ IsPathAlgebraMatModule, IS_INT ], 0, function( M, n )
local N0, N1, i;
N0 := M; for i in [1..n] do
N1 := DTr(N0); if IsomorphicModules(M,N1) then
return i; else
N0 := N1; fi;
od;
return false; end
);
####################################################################### ## #O 1stSyzygy( <M> ) ## ## This function computes the first syzygy of the module <M> by first ## finding a minimal set of generators for <M>, then finding the ## projective cover and computing the first syzygy as a submodule of ## this module. ##
InstallMethod( 1stSyzygy, "for a path algebra",
[ IsPathAlgebraMatModule ], 0, function( M );
if Dimension( M ) = 0then
return ZeroModule( RightActingAlgebra( M ) ); else
return Kernel( ProjectiveCover( M ) ); fi; end
);
####################################################################### ## #O NthSyzygy( <M>, <n> ) ## ## This function computes the <n>-th syzygy of the module <M>. ##
InstallMethod( NthSyzygy, "for a path algebra module and a positive integer",
[ IsPathAlgebraMatModule, IsInt ], 0, function( M, n )
local projres, diff;
if n < 0then
Error( "Entered integer is negative.\n" ); fi; if n = 0then
return M; fi;
projres := ProjectiveResolution( M );
diff := DifferentialOfComplex( projres, n - 1 );
return Kernel( diff ); end
);
####################################################################### ## #O RightApproximationByAddM( <M>, <C> ) ## ## This function computes a right add<M>-approximation of the module ## <C>, and the approximation is not necessarily minimal. ##
InstallMethod ( RightApproximationByAddM, "for two PathAlgebraMatModules",
true,
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, C )
local K, HomMC, EndM, radEndM, radHomMC, i, j, FlatHomMC,
FlatradHomMC, V, BB, W, f, VoverW, B, gens, approx, approxmap;
if RightActingAlgebra(M) <> RightActingAlgebra(C) then
Error(" the two modules entered into MinimalRightApproximation are not modules over the same algebra.");
return fail; fi; if Dimension(C) = 0then
return ZeroMapping(ZeroModule(RightActingAlgebra(M)),C); fi;
K := LeftActingDomain(M);
HomMC := HomOverAlgebra(M,C); if Length(HomMC) = 0then
return ZeroMapping(ZeroModule(RightActingAlgebra(M)),C); else
EndM := EndOverAlgebra(M);
radEndM := RadicalOfAlgebra(EndM);
radEndM := BasisVectors(Basis(radEndM));
radEndM := List(radEndM, x -> FromEndMToHomMM(M,x));
radHomMC := []; for i in [1..Length(HomMC)] do for j in [1..Length(radEndM)] do
Add(radHomMC,radEndM[j]*HomMC[i]);
od;
od;
FlatHomMC := List(HomMC, x -> Flat(x!.maps));
FlatradHomMC := List(radHomMC, x -> Flat(x!.maps));
V := VectorSpace(K,FlatHomMC,"basis");
BB := Basis(V,FlatHomMC);
W := Subspace(V,FlatradHomMC);
f := NaturalHomomorphismBySubspace( V, W );
VoverW := Range(f);
B := BasisVectors(Basis(VoverW));
gens := List(B, x -> PreImagesRepresentative(f,x));
gens := List(gens, x -> Coefficients(BB,x));
gens := List(gens, x -> LinearCombination(HomMC,x));
approx := List(gens, x -> Source(x));
approx := DirectSumOfQPAModules(approx);
approxmap := ShallowCopy(DirectSumProjections(approx));
approxmap := List([1..Length(approxmap)], x -> approxmap[x]*gens[x]);
approxmap := Sum(approxmap);
return approxmap; fi; end
);
####################################################################### ## #O MinimalRightApproximation( <M>, <C> ) ## ## This function computes the minimal right add<M>-approximation of the ## module <C>. TODO/CHECK: If one can modify the algorithm as indicated ## below with ####. ##
InstallMethod ( MinimalRightApproximation, "for two PathAlgebraMatModules",
true,
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, C )
local f;
f := RightApproximationByAddM( M, C );
return RightMinimalVersion( f )[ 1 ]; end
);
####################################################################### ## #O LeftApproximationByAddM( <C>, <M> ) ## ## This function computes a left add<M>-approximation of the module ## <C>. ##
InstallMethod ( LeftApproximationByAddM, "for two PathAlgebraMatModules",
true,
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( C, M )
local K, HomCM, EndM, radEndM, radHomCM, i, j, FlatHomCM,
FlatradHomCM, V, BB, W, f, VoverW, B, gens,
approx, approxmap;
if RightActingAlgebra(M) <> RightActingAlgebra(C) then
Error(" the two modules entered into LeftApproximationByAddM are not modules over the same algebra.");
return fail; fi; if Dimension(C) = 0then
return ZeroMapping(C, ZeroModule(RightActingAlgebra(M))); fi;
K := LeftActingDomain(M);
HomCM := HomOverAlgebra(C,M); if Length(HomCM) = 0then
return ZeroMapping(C,ZeroModule(RightActingAlgebra(M))); else
EndM := EndOverAlgebra(M);
radEndM := RadicalOfAlgebra(EndM);
radEndM := BasisVectors(Basis(radEndM));
radEndM := List(radEndM, x -> FromEndMToHomMM(M,x));
radHomCM := []; for i in [1..Length(HomCM)] do for j in [1..Length(radEndM)] do
Add(radHomCM,HomCM[i]*radEndM[j]);
od;
od;
FlatHomCM := List(HomCM, x -> Flat(x!.maps));
FlatradHomCM := List(radHomCM, x -> Flat(x!.maps));
V := VectorSpace(K,FlatHomCM,"basis");
BB := Basis(V,FlatHomCM);
W := Subspace(V,FlatradHomCM);
f := NaturalHomomorphismBySubspace( V, W );
VoverW := Range(f);
B := BasisVectors(Basis(VoverW));
gens := List(B, x -> PreImagesRepresentative(f,x));
gens := List(gens, x -> Coefficients(BB,x));
gens := List(gens, x -> LinearCombination(HomCM,x));
approx := List(gens, x -> Range(x));
approx := DirectSumOfQPAModules(approx);
approxmap := ShallowCopy(DirectSumInclusions(approx)); for i in [1..Length(approxmap)] do
approxmap[i] := gens[i]*approxmap[i];
od;
approxmap := Sum(approxmap);
return approxmap; fi; end
);
####################################################################### ## #O MinimalLeftApproximation( <C>, <M> ) ## ## This function computes the minimal left add<M>-approximation of the ## module <C>. ##
InstallMethod ( MinimalLeftApproximation, "for two PathAlgebraMatModules",
true,
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( C, M )
local f;
f := LeftApproximationByAddM( C, M );
return LeftMinimalVersion( f )[ 1 ]; end
);
####################################################################### ## #O ProjectiveCover(<M>) ## ## This function finds the projective cover P(M) of the module <M> ## in that it returns the map from P(M) ---> M. ##
InstallMethod ( ProjectiveCover, "for a PathAlgebraMatModule",
true,
[ IsPathAlgebraMatModule ], 0, function( M )
local mingen, maps, PN, projections;
if Dimension(M) = 0then
return ZeroMapping(ZeroModule(RightActingAlgebra(M)), M); else
mingen := MinimalGeneratingSetOfModule(M);
maps := List(mingen, x -> HomFromProjective(x,M));
PN := List(maps, x -> Source(x));
PN := DirectSumOfQPAModules(PN);
projections := DirectSumProjections(PN);
return projections*maps;; fi; end
);
####################################################################### ## #A InjectiveEnvelope(< M >) ## ## This function finds the injective envelope I(M) of the module <M> ## in that it returns the map from M ---> I(M). ##
InstallMethod ( InjectiveEnvelope, "for a PathAlgebraMatModule",
true,
[ IsPathAlgebraMatModule ], 0, function( M );
return DualOfModuleHomomorphism( ProjectiveCover( DualOfModule( M ) ) ); end
);
####################################################################### ## #O ExtOverAlgebra(<M>,<N>) ## ## This function returns a list of three elements: (1) the kernel of ## the projective cover Omega(<M>) --> P(M), (2) a basis of ## Ext^1(<M>,<N>) inside Hom(Omega(<M>),<N>) and (3) a function ## that takes as an argument a homomorphism in Hom(Omega(<M>),<N>) ## and returns the coefficients of this element when written in ## terms of the basis of Ext^1(<M>,<N>), if the group is non-zero. ## Otherwise it returns an empty list. ##
InstallMethod( ExtOverAlgebra, "for two PathAlgebraMatModule's",
true,
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, N )
local index, fromflatHomToHom, K, f, g, PM, syzygy, G, H, Img1, zero,
genssyzygyN, VsyzygyN, Img, gensImg, VImg, pi, ext, preimages,
homvecs, dimsyz, dimN, vec, t, l, i, H2, coefficients; # # Defining functions for later use. #
index := function( n ) if n = 0then
return 1; else
return n; fi; end;
fromflatHomToHom := function( flat, dim, dim2 )
local totalmat, matrix, i, start, j, d, d2;
d := List(dim, index);
d2 := List(dim2, index);
start := 0;
totalmat := []; for i in [1..Length(dim)] do
matrix := []; for j in [1..d[i]] do
Add(matrix, flat{[start+1..start+d2[i]]});
start := start+d2[i];
od;
Add(totalmat,matrix);
od;
return totalmat; end; # # Test of input. # if RightActingAlgebra(M) <> RightActingAlgebra(N) then
Error(" the two modules entered are not modules over the same algebra.\n"); else
K := LeftActingDomain(M); # # creating a short exact sequence 0 -> Syz(M) -> P(M) -> M -> 0 # f: P(M) -> M, g: Syz(M) -> P(M) #
f := ProjectiveCover(M);
g := KernelInclusion(f);
PM := Source(f);
syzygy := Source(g); # # using Hom(-,N) on the s.e.s. above #
G := HomOverAlgebra(PM,N);
H := HomOverAlgebra(syzygy,N); # # Making a vector space of Hom(Syz(M),N) # by first rewriting the maps as vectors #
genssyzygyN := List(H, x -> Flat(x!.maps)); if Length(genssyzygyN) = 0then
return [ g, [ ], [ ] ]; else
VsyzygyN := VectorSpace(K, genssyzygyN); # # finding a basis for im(g*) # first, find a generating set of im(g*) #
Img1 := g*G; # # removing 0 maps by comparing to zero = Zeromap(syzygy,N) #
zero := ZeroMapping(syzygy,N);
Img := Filtered(Img1, x -> x <> zero); # # Rewriting the maps as vectors #
gensImg := List(Img, x -> Flat(x!.maps)); # # Making a vector space of <Im g*>
VImg := Subspace(VsyzygyN, gensImg); # # Making the vector space Ext1(M,N) #
pi := NaturalHomomorphismBySubspace(VsyzygyN, VImg);
ext := Range(pi); if Dimension(Range(pi)) = 0then
return [ g, [ ], [ ] ]; else # # Sending elements of ext back to Hom(Syz(M),N) #
preimages := List(BasisVectors(Basis(ext)), x -> PreImagesRepresentative(pi,x)); # # need to put the parentheses back in place #
homvecs := []; # to store all lists of matrices, one list for each element (homomorphism)
dimsyz := DimensionVector(syzygy);
dimN := DimensionVector(N);
homvecs := List(preimages, x -> fromflatHomToHom(x,dimsyz,dimN)); # # Making homomorphisms of the elements #
H2 := List(homvecs, x -> RightModuleHomOverAlgebra(syzygy,N,x));
coefficients := function( map )
local vector, B;
vector := ImageElm(pi,Flat(map!.maps));
B := Basis(Range(pi));
return Coefficients(B,vector); end;
return [g,H2,coefficients]; fi; fi; fi; end
);
####################################################################### ## #O ExtAlgebraGenerators(<M>,<n>) ## ## This function computes a set of generators of the Ext-algebra Ext^*(M,M) ## up to degree <n>. It returns a list of three elements, where the ## first element is the dimensions of Ext^[0..n](M,M), the second element ## is the number of a set generators in the degrees [0..n], and the ## third element is the generators in these degrees. TODO: Create a ## minimal set of generators. Needs to take the radical of the degree ## zero part into account. ##
InstallMethod( ExtAlgebraGenerators, "for a module over a quotient of a path algebra",
[ IsPathAlgebraMatModule, IS_INT ], 0, function( M, n )
local N, projcovers, f, i, EndM, J, gens, extgroups, dim_ext_groups,
generators, productelements, j, induced, k, liftings, products,
l, m, productsinbasis, W, V, K, extalggenerators, p, tempgens,
I, g, templist, idealsquare;
K := LeftActingDomain(M);
N := M;
projcovers := []; for i in [1..n] do
f := ProjectiveCover(N);
Add(projcovers,f);
N := Kernel(f);
od;
extgroups := []; # # Computing Ext^i(M,M) for i = 0, 1, 2,...., n. # for i in [0..n] do if i = 0then
EndM := EndOverAlgebra(M);
J := RadicalOfAlgebra(EndM);
gens := GeneratorsOfAlgebra(J);
Add(extgroups, [[],List(gens, x -> FromEndMToHomMM(M,x))]); elif i = 1then
Add(extgroups, ExtOverAlgebra(M,M)); else
Add(extgroups, ExtOverAlgebra(Kernel(projcovers[i-1]),M)); fi;
od;
dim_ext_groups := List(extgroups, x -> Length(x[2])); # Print(Dimension(EndM) - Dimension(J)," generators in degree 0.\n"); # # Computing Ext^j(M,M) x Ext^(i-j)(M,M) for j = 1..i-1 and i = 2..n. #
generators := List([1..n + 1], x -> 0);
extalggenerators := List([1..n + 1], x -> []); for i in [1..n] do
productelements := []; for j in [0..i] do if ( dim_ext_groups[i+1] <> 0 ) and ( dim_ext_groups[j+1] <> 0 ) and ( dim_ext_groups[i-j+1] <> 0 ) then
induced := ShallowCopy(extgroups[i-j+1][2]); for k in [1..j] do
liftings := List([1..dim_ext_groups[i-j+1]], x -> projcovers[i-j+k]*induced[x]);
liftings := List([1..dim_ext_groups[i-j+1]], x -> LiftingMorphismFromProjective(projcovers[k],liftings[x]));
induced := List([1..dim_ext_groups[i-j+1]], x -> MorphismOnKernel(projcovers[i-j+k],projcovers[k],liftings[x],induced[x]));
od;
products := []; for l in [1..dim_ext_groups[j+1]] do for m in [1..dim_ext_groups[i-j+1]] do
Add(products,induced[m]*extgroups[j+1][2][l]);
od;
od;
productsinbasis := List(products, x -> extgroups[i+1][3](x));
productsinbasis := Filtered(productsinbasis, x -> x <> Zero(x)); if Length(productsinbasis) <> 0then
Append(productelements,productsinbasis); fi; fi;
od; if Length(productelements) <> 0then
W := FullRowSpace(K,Length(extgroups[i+1][2]));
V := Subspace(W,productelements); if dim_ext_groups[i+1] > Dimension(V) then
generators[i+1] := Length(extgroups[i+1][2]) - Dimension(V);
p := NaturalHomomorphismBySubspace(W,V);
tempgens := List(BasisVectors(Basis(Range(p))), x -> PreImagesRepresentative(p,x));
extalggenerators[i+1] := List(tempgens, x -> LinearCombination(extgroups[i+1][2],x)); # Print(Length(extgroups[i+1][2]) - Dimension(V)," new generator(s) in degree ",i,".\n"); fi; elif dim_ext_groups[i+1] <> 0then
generators[i+1] := Length(extgroups[i+1][2]);
extalggenerators[i+1] := extgroups[i+1][2]; # Print(Length(extgroups[i+1][2])," new generator(s) in degree ",i,".\n"); fi;
od;
dim_ext_groups[1] := Dimension(EndM);
templist := []; for i in [1..Length(gens)] do for j in [1..Dimension(EndM)] do
Add(templist,BasisVectors(Basis(EndM))[j]*gens[i]);
od;
od;
templist := Filtered(templist, x -> x <> Zero(x));
idealsquare := []; for i in [1..Length(templist)] do for j in [1..Length(gens)] do
Add(idealsquare,gens[j]*templist[i]);
od;
od;
I := Ideal(EndM,idealsquare);
g := NaturalHomomorphismByIdeal(EndM,I);
extalggenerators[1] := List(BasisVectors(Basis(Range(g))), x -> FromEndMToHomMM(M,PreImagesRepresentative(g,x)));
generators[1] := Length(extalggenerators[1]);
return [dim_ext_groups,generators,extalggenerators]; end
);
####################################################################### ## #O PartialIyamaGenerator( <M> ) ## ## Given a module <M> this function returns the submodule of <M> ## given by the radical of the endomorphism ring of <M> times <M>. ## If <M> is zero, then <M> is returned. ##
InstallMethod( PartialIyamaGenerator, "for a path algebra",
[ IsPathAlgebraMatModule ], 0, function( M )
local B, EndM, radEndM, Brad, subgens, b, r;
if Dimension(M) = 0then
return M; fi;
B := CanonicalBasis(M);
EndM := EndOverAlgebra(M);
radEndM := RadicalOfAlgebra(EndM);
Brad := BasisVectors(Basis(radEndM));
Brad := List(Brad, x -> FromEndMToHomMM(M,x));
subgens := []; for b in B do for r in Brad do
Add(subgens, ImageElm(r,b));
od;
od;
return SubRepresentation(M,subgens); end
);
####################################################################### ## #O IyamaGenerator( <M> ) ## ## Given a module <M> this function returns a module N such that ## <M> is a direct summand of N and such that the global dimension ## of the endomorphism ring of N is finite. ##
InstallMethod( IyamaGenerator, "for a path algebra",
[ IsPathAlgebraMatModule ], 0, function( M )
local iyamagen, N, IG, L;
iyamagen := [];
N := M;
repeat
Add(iyamagen,N);
N := PartialIyamaGenerator(N);
until
Dimension(N) = 0;
IG := DirectSumOfQPAModules(iyamagen); if IsFinite(LeftActingDomain(M)) then
L := DecomposeModuleWithMultiplicities(IG);
IG := DirectSumOfQPAModules(L[1]); fi;
return IG; end
);
####################################################################### ## #O GlobalDimensionOfAlgebra( <A>, <n> ) ## ## Returns the global dimension of the algebra <A> if it is less or ## equal to <n>, otherwise it returns false. ##
InstallMethod ( GlobalDimensionOfAlgebra, "for a finite dimensional quotient of a path algebra",
true,
[ IsQuiverAlgebra, IS_INT ], 0, function( A, n )
local simples, S, projres, dimension, j;
if not IsFiniteDimensional(A) then
TryNextMethod(); fi; if HasGlobalDimension(A) then
return GlobalDimension(A); fi; if Trace(AdjacencyMatrixOfQuiver(QuiverOfPathAlgebra(A))) > 0then
SetGlobalDimension(A,infinity);
return infinity; fi;
simples := SimpleModules(A);
dimension := 0; for S in simples do
projres := ProjectiveResolution(S);
j := 0; while ( j < n + 1 ) and ( Dimension(ObjectOfComplex(projres,j)) <> 0 ) do
j := j + 1;
od; if ( j < n + 1 ) then
dimension := Maximum(dimension, j - 1 ); else if ( Dimension(ObjectOfComplex(projres,n + 1)) <> 0 ) then
return false; else
dimension := Maximum(dimension, n ); fi; fi;
od;
SetGlobalDimension(A,dimension);
return dimension; end
);
####################################################################### ## #O DominantDimensionOfModule( <M>, <n> ) ## ## Returns the dominant dimension of the module <M> if it is less or ## equal to <n>. If the module <M> is injective and projective, then ## it returns infinity. Otherwise it returns false. ##
InstallMethod ( DominantDimensionOfModule, "for a finite dimensional quotient of a path algebra",
true,
[ IsPathAlgebraMatModule, IS_INT ], 0, function( M, n )
local A, Mop, resop, dimension, j;
A := RightActingAlgebra(M); # # If the algebra A is not a finite dimensional, try another method. # if not IsFiniteDimensional(A) then
TryNextMethod(); fi; # # If the module <M> is injective and projective, then the dominant dimension of # <M> is infinite. if IsInjectiveModule( M ) and IsProjectiveModule( M ) then
return infinity; fi;
Mop := DualOfModule( M ); # # Check how far out the modules in the minimal projective resolution of Mop # is injective. #
resop := ProjectiveResolution( Mop );
dimension := 0;
j := 0; while ( j < n ) and ( IsInjectiveModule( ObjectOfComplex( resop, j ) ) ) do
j := j + 1;
od; if ( j < n ) then# if this happens, then j-th projective is not injective and domdim equal to j for <M>.
dimension := Maximum( dimension, j ); else# if this happens, then j = n. if not IsInjectiveModule( ObjectOfComplex( resop, n ) ) then# then domdim is n of <M>.
dimension := Maximum( dimension, n ); else# then domdim is > n for <M>.
return false; fi; fi;
# SetDominantDimension(M,dimension);
return dimension; end
);
####################################################################### ## #O DominantDimensionOfAlgebra( <A>, <n> ) ## ## Returns the dominant dimension of the algebra <A> if it is less or ## equal to <n>. If the algebra <A> is selfinjectiv, then it returns ## infinity. Otherwise it returns false. ##
InstallMethod ( DominantDimensionOfAlgebra, "for a finite dimensional quotient of a path algebra",
true,
[ IsQuiverAlgebra, IS_INT ], 0, function( A, n )
local P, domdimlist, pos_infinite, pos_false, pos_finite; # # If the algebra <A> is not a finite dimensional, try another method. # if not IsFiniteDimensional( A ) then
TryNextMethod( ); fi; # # If the algebra <A> is selfinjective, then the dominant dimension of # <A> is infinite. if IsSelfinjectiveAlgebra( A ) then
return infinity; fi;
P := IndecProjectiveModules( A );
domdimlist := List( P, p -> DominantDimensionOfModule( p, n ) ); # Checking the dominant dimension of each indec. projective module.
pos_infinite := Positions( domdimlist, infinity ); # positions of the indec. projective modules with infinite domdim.
pos_false := Positions( domdimlist, false ); # positions of the indec. projective modules with bigger dom.dim. than n.
pos_finite := [ 1..Length( P ) ];
SubtractSet( pos_finite, Union( pos_infinite, pos_false ) ); # positions of the indec. projective modules with domdim less or equal to n.
if Length( pos_finite ) = 0then
return false; else
return Minimum( domdimlist{ pos_finite } ); fi; end
);
####################################################################### ## #O ProjDimensionOfModule( <M>, <n> ) ## ## Returns the projective dimension of the module <M> if it is less ## or equal to <n>, otherwise it returns false. ##
InstallMethod ( ProjDimensionOfModule, "for a PathAlgebraMatModule",
true,
[ IsPathAlgebraMatModule, IS_INT ], 0, function( M, n )
local projres, i;
if HasProjDimension(M) then if ProjDimension(M) > n then
return false; else
return ProjDimension(M); fi; fi;
projres := ProjectiveResolution(M);
i := 1; while i < n + 2do if Dimension(ObjectOfComplex(projres,i)) = 0then# the projective dimension is i - 1.
SetProjDimension(M, i - 1);
return i-1; fi;
i := i + 1;
od;
return false; end
);
####################################################################### ## #O GorensteinDimensionOfAlgebra( <A>, <n> ) ## ## Returns the Gorenstein dimension of the algebra <A> if it is less ## or equal to <n>, otherwise it returns false. ##
InstallMethod ( GorensteinDimensionOfAlgebra, "for a quiver algebra",
true,
[ IsQuiverAlgebra, IS_INT ], 0, function( A, n )
local Ilist, dimension_right, I, projdim, Ilistop, dimension_left;
# # If <A> has finite global dimension, then the Gorenstein # dimension of <A> is equal to the global dimension of <A>. # if HasGlobalDimension(A) then if GlobalDimension(A) <> infinity then
SetGorensteinDimension(A, GlobalDimension(A));
return GlobalDimension(A); fi; fi; if HasGorensteinDimension(A) then
return GorensteinDimension(A); fi; # # First checking the injective dimension of the indecomposable # projective left <A>-modules. #
Ilist := IndecInjectiveModules(A);
dimension_right := 0; for I in Ilist do
projdim := ProjDimensionOfModule(I,n); if projdim = false then# projective dimension of I is bigger than n.
return false; else# projective dimension of I is less or equal to n.
dimension_right := Maximum(dimension_right, projdim ); fi;
od; # # Secondly checking the injective dimension of the indecomposable # projective right <A>-modules. #
Ilistop := IndecInjectiveModules(OppositeAlgebra(A));
dimension_left := 0; for I in Ilistop do
projdim := ProjDimensionOfModule(I,n); if projdim = false then# projective dimension of I is bigger than n.
return false; else# projective dimension of I is less or equal to n.
dimension_left := Maximum(dimension_left, projdim ); fi;
od; if dimension_left <> dimension_right then
Print("You have a counterexample to the Gorenstein conjecture!\n\n"); fi;
SetGorensteinDimension(A, Maximum(dimension_left, dimension_right));
return Maximum(dimension_left, dimension_right); end
);
####################################################################### ## #O N_RigidModule( <M>, <n> ) ## ## Returns true if the module <M> is n-rigid, otherwise false. ##
InstallMethod ( N_RigidModule, "for a PathAlgebraMatModule",
true,
[ IsPathAlgebraMatModule, IS_INT ], 0, function( M, n )
local i, N;
i := 1;
N := M; while i < n + 1do if Length(ExtOverAlgebra(N,M)[2]) > 0then# Ext^i(M,M) <> 0.
return false; else# Ext^i(M,M) = 0.
i := i + 1;
N := NthSyzygy(N,1); fi;
od;
return true; end
);
####################################################################### ## #O LeftFacMApproximation( <C>, <M> ) ## ## This function computes a left, not necessarily left minimal, ## Fac<M>-approximation of the module <C> by doing the following: ## p ## P(C) -------> C (projective cover) ## | | ## f | | g - the returned homomorphism ## V V ## M^{P(C)} ----> E ##
InstallMethod( LeftFacMApproximation, "for a representations of a quiver",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( C, M )
local p, f; # # Checking if the modules <C> and <M> are modules over the same algebra. # if RightActingAlgebra(C) <> RightActingAlgebra(M) then
Error("the entered modules are not modules over the same algebra,\n"); fi;
p := ProjectiveCover(C);
f := MinimalLeftAddMApproximation(Source(p),M);
return PushOut(p,f)[2]; end
);
####################################################################### ## #O MinimalLeftFacMApproximation( <C>, <M> ) ## ## This function computes a minimal left Fac<M>-approximation of the ## module <C>. ##
InstallMethod( MinimalLeftFacMApproximation, "for a representations of a quiver",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( C, M );
return LeftMinimalVersion(LeftFacMApproximation(C,M))[1]; end
);
####################################################################### ## #O RightSubMApproximation( <M>, <C> ) ## ## This function computes a right, not necessarily a right minimal, ## Sub<M>-approximation of the module <C> by doing the following: ## ## E -----> M^{I(C)} (minimal right Add<M>-approximation) ## | | ## g | | f g - the returned homomorphism ## V i V ## C -------> I(C) (injective envelope) ##
InstallMethod( RightSubMApproximation, "for a representations of a quiver",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, C )
local iop, i, f; # # Checking if the modules <M> and <C> are modules over the same algebra. # if RightActingAlgebra(M) <> RightActingAlgebra(C) then
Error("the entered modules are not modules over the same algebra,\n"); fi;
iop := ProjectiveCover(DualOfModule(C));
i := DualOfModuleHomomorphism(iop);
f := MinimalRightAddMApproximation(M, Range(i));
return PullBack(i,f)[2]; end
);
####################################################################### ## #O MinimalRightSubMApproximation( <M>, <C> ) ## ## This function computes a minimal right Sub<M>-approximation of the module ## <C>. ##
InstallMethod( MinimalRightSubMApproximation, "for a representations of a quiver",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( M, C );
return RightMinimalVersion(RightSubMApproximation(M,C))[1]; end
);
####################################################################### ## #O LeftSubMApproximation( <C>, <M> ) ## ## This function computes a minimal left Sub<M>-approximation of the ## module <C> by doing the following: ## f ## C -------> M^{C} = the minimal left Add<M>-approxiamtion ## ## Returns the natural projection C --------> Im(f). ##
InstallMethod( LeftSubMApproximation, "for a representations of a quiver",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( C, M )
local f; # # Checking if the modules <C> and <M> are modules over the same algebra. # if RightActingAlgebra(C) <> RightActingAlgebra(M) then
Error("the entered modules are not modules over the same algebra,\n"); fi;
f := MinimalLeftAddMApproximation(C,M);
return ImageProjection(f); end
);
####################################################################### ## #O InjDimensionOfModule( <M>, <n> ) ## ## Returns the injective dimension of the module <M> if it is less ## or equal to <n>, otherwise it returns false. ##
InstallMethod ( InjDimensionOfModule, "for a PathAlgebraMatModule and a positive integer",
true,
[ IsPathAlgebraMatModule, IS_INT ], 0, function( M, n )
local DM, projresop, i;
if HasInjDimension(M) then if InjDimension(M) > n then
return false; else
return InjDimension(M); fi; fi;
DM := DualOfModule(M); if HasProjDimension(DM) then
return ProjDimension(DM); fi;
projresop := ProjectiveResolution(DM);
i := 1; while i < n + 2do if Dimension(ObjectOfComplex(projresop,i)) = 0then# the projective dimension of DM is i - 1.
SetInjDimension(M, i - 1);
return i-1; fi;
i := i + 1;
od;
return false; end
);
####################################################################### ## #O HaveFiniteCoresolutionInAddM( <N>, <M>, <n> ) ## ## This function checks if the module <N> has a finite coresolution ## in add<M> of length at most <n>. If it does, then this ## coresoultion is returned, otherwise false is returned. ##
InstallMethod( HaveFiniteCoresolutionInAddM, "for two PathAlgebraMatModules and a positive integer",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule, IS_INT ],
function( N, M, n )
local U, differentials, g, f, i, cat, coresolution; # # Checking if <N> and <M> 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 n = 0, then this is the same as N being in add M. # # Computing successive minimal left add<M>-approximation to produce # a coresolution of <N> in add<M>. # cat := CatOfRightAlgebraModules(RightActingAlgebra(M));
U := N;
differentials := [];
g := IdentityMapping(U);
f := MinimalLeftAddMApproximation(U,M); if n = 0then if IsIsomorphism( f ) then
return FiniteComplex(cat, 0, [ f ] ); else
return false; fi; fi; for i in [0..n] do if not IsInjective(f) then
return false; fi;
Add(differentials, g*f);
g := CoKernelProjection(f); if Dimension(Range(g)) = 0then
break; fi;
f := MinimalLeftAddMApproximation(Range(g),M);
od;
differentials := Reversed(differentials);
coresolution := FiniteComplex(cat, -Length(differentials) + 1, differentials);
return coresolution; end
);
####################################################################### ## #O TiltingModule( <M>, <n> ) ## ## This function checks if the module <M> is a tilting module of ## projective dimension at most <n>. ##
InstallMethod( TiltingModule, "for a PathAlgebraMatModule and a positive integer",
[ IsPathAlgebraMatModule, IS_INT ],
function( M, n )
local m, N, i, P, t, coresolution, temp; # # Checking if the module has projective dimension at most <n>. # if HasProjDimension(M) then if ProjDimension(M) > n then
return false; fi; else if not IS_INT(ProjDimensionOfModule(M,n)) then
return false; fi; fi; # # Now we know that the projective dimension of <M> is at most <n>. # Next we check if the module <M> is selforthogonal. #
m := ProjDimension(M);
N := M;
i := 0;
repeat if Length(ExtOverAlgebra(N,M)[2]) <> 0then
return false; fi;
i := i + 1; if i < m then
N := NthSyzygy(N,1); fi;
until i = m + 1; # # Now we know that the projective dimension of <M> is at most <n>, # and that the module <M> is selforthogonal. Next we check if all the # indecomposable projectives can be coresolved in add<M>. #
P := IndecProjectiveModules(RightActingAlgebra(M));
t := Length(P);
coresolution := []; for i in [1..t] do
temp := HaveFiniteCoresolutionInAddM(P[i], M, m); if temp = false then
return false; fi;
Add(coresolution, temp);
od; # # Now we know that the module <M> is a tilting module of projective # dimension m. #
SetIsTiltingModule(M, true);
return [m, coresolution]; end
);
####################################################################### ## #O HaveFiniteResolutionInAddM( <N>, <M>, <n> ) ## ## This function checks if the module <N> has a finite resolution ## in add<M> of length at most <n>. If it does, then this ## resolution is returned, otherwise false is returned. ##
InstallMethod( HaveFiniteResolutionInAddM, "for two PathAlgebraMatModules and a positive integer",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule, IS_INT ],
function( N, M, n )
local U, differentials, g, f, i, cat, resolution; # # Checking if <N> and <M> 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 n = 0, then this is the same as N being in add M. # # Computing successive minimal right add<M>-approximation to produce # a resolution of <N> in add<M>. #
U := N;
differentials := [];
g := IdentityMapping(U);
f := MinimalRightAddMApproximation(M,U); if n = 0then if IsIsomorphism( f ) then
return true; else
return false; fi; fi; for i in [0..n] do if not IsSurjective(f) then
return false; fi;
Add(differentials, f*g);
g := KernelInclusion(f); if Dimension(Source(g)) = 0then
break; fi;
f := MinimalRightAddMApproximation(M, Source(g));
od; cat := CatOfRightAlgebraModules(RightActingAlgebra(M));
resolution := FiniteComplex(cat, 1, differentials);
return resolution; end
);
####################################################################### ## #O CotiltingModule( <M>, <n> ) ## ## This function checks if the module <M> is a cotilting module of ## projective dimension at most <n>. ##
InstallMethod( CotiltingModule, "for a PathAlgebraMatModule and a positive integer",
[ IsPathAlgebraMatModule, IS_INT ],
function( M, n )
local m, N, i, I, t, resolution, temp; # # Checking if the module has injective dimension at most <n>. # if HasInjDimension(M) then if InjDimension(M) > n then
return false; fi; else if not IS_INT(InjDimensionOfModule(M,n)) then
return false; fi; fi; # # Now we know that the injective dimension of <M> is at most <n>. # Next we check if the module <M> is selforthogonal. #
m := InjDimension(M);
N := M;
i := 0;
repeat if Length(ExtOverAlgebra(N,M)[2]) <> 0then
SetIsCotiltingModule(M, false);
return false; fi;
i := i + 1; if i < m then
N := NthSyzygy(N,1); fi;
until i = m + 1; # # Now we know that the injective dimension of <M> is at most <n>, # and that the module <M> is selforthogonal. Next we check if all the # indecomposable injectives can be resolved in add<M>. #
I := IndecInjectiveModules(RightActingAlgebra(M));
t := Length(I);
resolution := []; for i in [1..t] do
temp := HaveFiniteResolutionInAddM(I[i], M, m); if temp = false then
return false; fi;
Add(resolution, temp);
od; # # Now we know that the module <M> is a cotilting module of injective # dimension <M>. #
SetIsCotiltingModule(M, true);
return [m, resolution]; end
);
####################################################################### ## #O AllComplementsOfAlmostCompleteTiltingModule( <M>, <X> ) ## ## This function constructs all complements of an almost complete ## tilting module <M> given a complement <X> of <M>. The ## complements are returned as a long exact sequence (whenever possible) ## of minimal left and minimal right add<M>-approximations. ##
InstallMethod( AllComplementsOfAlmostCompleteTiltingModule, "for two PathAlgebraMatModules",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ],
function( M, X)
local U, leftdifferentials, g, f, cat, resolution,
rightdifferentials, coresolution; # # Checking if <M> and <X> are modules over the same algebra. # if RightActingAlgebra(M) <> RightActingAlgebra(X) then
Error("the entered modules are not modules over the same algebra,\n"); fi; # # Computing successive minimal right add<M>-approximation to produce # a resolution of <X> in add<M>. #
U := X;
leftdifferentials := [];
g := IdentityMapping(U);
f := MinimalRightAddMApproximation(M,U); while IsSurjective(f) do
Add(leftdifferentials, f*g);
g := KernelInclusion(f); if Dimension(Source(g)) = 0then
break; fi;
f := MinimalRightAddMApproximation(M, Source(g));
od; cat := CatOfRightAlgebraModules(RightActingAlgebra(M)); if Length(leftdifferentials) = 0then
resolution := []; else
Add(leftdifferentials, KernelInclusion(leftdifferentials[Length(leftdifferentials)]));
resolution := FiniteComplex(cat, 1, leftdifferentials); fi; # # Computing successive minimal left add<M>-approximation to produce # a coresolution of <X> in add<M>. #
U := X;
rightdifferentials := [];
g := IdentityMapping(U);
f := MinimalLeftAddMApproximation(U,M); while IsInjective(f) do
Add(rightdifferentials, g*f);
g := CoKernelProjection(f);
f := MinimalLeftAddMApproximation(Range(g),M);
od;
####################################################################### ## #A FaithfulDimension( <M> ) ## ## This function computes the faithful dimension of a module <M>. ##
InstallMethod( FaithfulDimension, "for a PathAlgebraMatModules",
[ IsPathAlgebraMatModule ],
function( M )
local P, lengths, p, tempdim, U, g, f;
P := IndecProjectiveModules(RightActingAlgebra(M)); # # For all indecomposable projective A-modules computing successive # minimal left add<M>-approximation to produce find the faithful # dimension <M> has with respect to that indecomposable # projective. #
lengths := []; for p in P do
tempdim := 0;
U := p;
f := MinimalLeftAddMApproximation( U, M ); if not IsInjective( f ) then
return 0; fi; while IsInjective( f ) do
tempdim := tempdim + 1;
g := CoKernelProjection( f ); if Dimension( Range( g ) ) = 0then
Add( lengths, infinity );
break; else
f := MinimalLeftAddMApproximation( Range( g ), M ); fi;
od; if Dimension( Range( g ) ) <> 0then
Add( lengths, tempdim ); fi;
od;
return Minimum( lengths ); end
);
####################################################################### ## #O NumberOfComplementsOfAlmostCompleteTiltingModule( <M> ) ## ## This function computes the number complements of an almost ## complete tilting/cotilting module <M>, assuming that <M> ## is an almost complete tilting module. ##
InstallMethod( NumberOfComplementsOfAlmostCompleteTiltingModule, "for a PathAlgebraMatModules",
[ IsPathAlgebraMatModule ],
function( M );
return FaithfulDimension(M) + 1; end
);
####################################################################### ## #O LeftMutationOfTiltingModuleComplement( <M>, <N> ) ## ## This function computes the left mutation of a complement <N> of ## an almost complete tilting module <M>, assuming that <M> is an ## almost complete tilting module. If it doesn't exist, then the ## function returns false. ##
InstallMethod( LeftMutationOfTiltingModuleComplement, "for a PathAlgebraMatModules",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ],
function( M, N )
local f;
f := MinimalLeftAddMApproximation(N, M); if IsInjective(f) then
return CoKernel(f); else
return false; fi; end
);
####################################################################### ## #O RightMutationOfTiltingModuleComplement( <M>, <N> ) ## ## This function computes the right mutation of a complement <N> of ## an almost complete tilting module <M>, assuming that <M> is an ## almost complete tilting module. If it doesn't exist, then the ## function returns false. ##
InstallMethod( RightMutationOfTiltingModuleComplement, "for a PathAlgebraMatModules",
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ],
function( M, N )
local f;
f := MinimalRightAddMApproximation(M, N); if IsSurjective(f) then
return Kernel(f); else
return false; fi; end
);
########################################################################## ## #P DeclareProperty( "IsHereditaryAlgebra", [ A ] ) ## ## The function is defined for an admissible quotient <A> of a path ## algebra, and it returns true if <A> is a hereditary algebra and ## false otherwise. ##
InstallMethod( IsHereditaryAlgebra, "for an algebra",
[ IsAdmissibleQuotientOfPathAlgebra ],
function( A )
local test;
if HasGlobalDimension(A) then
return GlobalDimension(A) < 2; fi;
test := GlobalDimensionOfAlgebra(A, 1); # # test = false => gldim(A) > 1 # test = infinity => gldim(A) = infinity # test = integer > 1 => gldim(A) > 1 # if all these are not true, then gldim(A) < 1, and A is hereditary. # if IsBool(test) or ( test = infinity ) or ( IS_INT(test) and test > 1 ) then
return false; else
return true; fi; end
);
####################################################################### ## #O RightApproximationByPerpT( <T>, <M> ) ## ## Returns the minimal right $\widehat{\add T}$-approximation of the ## module <M>. It checks if <T> is a cotilting module, and if not ## it returns an error message. ##
InstallMethod ( RightApproximationByPerpT, "for a cotilting PathAlgebraMatModule and a PathAlgebraMatModule",
true,
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( T, M )
local n, projres, exactsequences, f, i, beta, g, h,
alpha, fprime;
if not IsCotiltingModule( T ) then
Error("the first argument is not a cotilting module,\n"); fi; if IsZero( M ) then
return ZeroMapping( ZeroModule( RightActingAlgebra( M ) ), M ); fi;
n := InjDimension( T );
projres := ProjectiveResolution( M );
ObjectOfComplex( projres, n);
exactsequences := List( [ 0..n - 1 ], i -> [ KernelInclusion(DifferentialOfComplex(projres, i)),
ImageProjection(DifferentialOfComplex(projres, i)) ]);
f := MinimalLeftApproximation( Source( exactsequences[ n ][ 1 ] ), T ); for i in [ 1..n ] do
beta := IsomorphismOfModules( Source( exactsequences[ n + 1 - i ][ 1 ] ), Source( f ) );
f := beta * f;
g := PushOut( exactsequences[ n + 1 - i ][ 1 ], f )[ 1 ];
h := CoKernelProjection( g );
alpha := IsomorphismOfModules( Range( h ), Range( exactsequences[ n + 1 - i ][ 2 ] ) );
h := h * alpha; if i < n then
fprime := MinimalLeftApproximation( Source( h ), T );
f := PushOut( fprime, h )[ 1 ]; fi;
od;
return RightMinimalVersion( h )[ 1 ]; end
);
####################################################################### ## #O LeftApproximationByAddTHat( <T>, <M> ) ## ## Returns the minimal left $\widehat{\add T}$-approximation of the ## module <M>. It checks if <T> is a cotilting module, and if not ## it returns an error message. ##
InstallMethod ( LeftApproximationByAddTHat, "for a cotilting PathAlgebraMatModule and a PathAlgebraMatModule",
true,
[ IsPathAlgebraMatModule, IsPathAlgebraMatModule ], 0, function( T, M )
local n, projres, exactsequences, currentsequences, f, i, g,
h, alpha, t, fprime;
if not IsCotiltingModule( T ) then
Error("the first argument is not a cotilting module,\n"); fi; if IsZero( M ) then
return ZeroMapping( M, ZeroModule( RightActingAlgebra( M ) ) ); fi;
n := InjDimension( T );
projres := ProjectiveResolution( M );
ObjectOfComplex( projres, n);
exactsequences := List( [ 0..n - 1 ], i -> [ KernelInclusion(DifferentialOfComplex(projres, i)),
ImageProjection(DifferentialOfComplex(projres, i)) ]);
f := MinimalLeftApproximation( Source( exactsequences[ n ][ 1 ] ), T ); for i in [ 1..n ] do
g := PushOut( exactsequences[ n + 1 - i ][ 1 ], f )[ 1 ];
h := CoKernelProjection( g );
alpha := IsomorphismOfModules( Range( h ), Range( exactsequences[ n + 1 - i ][ 2 ] ) );
h := h * alpha;
fprime := MinimalLeftApproximation( Source( h ), T );
f := PushOut( fprime, h )[ 1 ];
od;
return LeftMinimalVersion( f )[ 1 ]; end
);
InstallMethod( IsNthSyzygy, "for a PathAlgebraMatModule",
true,
[ IsPathAlgebraMatModule, IS_INT ], 0, function( M, n )
local N;
N := NthSyzygy( DualOfModule( NthSyzygy( DualOfModule( M ), n ) ), n );
N := DirectSumOfQPAModules( [ N, Source( ProjectiveCover( M ) ) ] );
return IsDirectSummand( M, N ); end
);
####################################################################### ## #O RightApproximationByAddM( <L>, <C> ) ## ## Given a list of module <L> over a finite dimensional quotient A of ## a path algebra and a module <C> over A, this function computes ## a right approximation of <C> in the additive closure of the modules ## in the list <L>. ##
InstallMethod ( RightApproximationByAddM, "for a list of modules and one module",
true,
[ IsList, IsPathAlgebraMatModule ], 0, function( L, C )
local A, K, approximation, i, homL_iC, homL_ilessthanL_i,
homL_iapproxC, endL_i, radendL_i, RadendL_i, radmaps,
generators, radgenerators, generatorshomL_iC, g, V,
t, M, projections, f;
A := RightActingAlgebra( C ); if Length( L ) = 0then
return ZeroMapping( ZeroModule( A ), C ); fi; if not ForAll( L, l -> RightActingAlgebra( l ) = A ) then
Error( "Not all modules in the list of modules entered are modules over the same algebra.\n" ); fi;
K := LeftActingDomain( A );
approximation := [ ]; for i in [ 1..Length( L ) ] do
homL_iC := HomOverAlgebra( L[ i ], C ); if Length( homL_iC ) > 0then
homL_ilessthanL_i := List( [ 1..Length(approximation) ], r -> HomOverAlgebra( L[ i ], Source( approximation[ r ] ) ) );
homL_iapproxC := Flat( List( [ 1..Length(approximation) ], r -> homL_ilessthanL_i[ r ] * approximation[ r ] ) );
homL_iapproxC := Filtered( homL_iapproxC, h -> not IsZero( h ) );
endL_i := EndOverAlgebra( L[ i ] );
radendL_i := RadicalOfAlgebra( endL_i );
RadendL_i := List( BasisVectors( Basis( radendL_i ) ), x -> FromEndMToHomMM( L[i], x) );
radmaps := Flat( List( homL_iC, h -> RadendL_i * h ) );
generators := List( homL_iapproxC, h -> Flat( MatricesOfPathAlgebraMatModuleHomomorphism( h ) ) );
radgenerators := List( radmaps, h -> Flat( MatricesOfPathAlgebraMatModuleHomomorphism( h ) ) );
Append( generators, radgenerators );
generatorshomL_iC := List( homL_iC, h -> Flat( MatricesOfPathAlgebraMatModuleHomomorphism( h ) ) ); if Length( generators ) = 0then
generators := [ Flat( MatricesOfPathAlgebraMatModuleHomomorphism( ZeroMapping( L[ i ],C ) ) ) ]; fi; for g in generatorshomL_iC do
V := VectorSpace( K, generators ); if not g in V then
Add( generators, g );
t := Position( generatorshomL_iC, g );
Add( approximation, homL_iC[ t ] ); fi;
od; fi;
od;
M := DirectSumOfQPAModules( List( approximation, Source ) );
projections := DirectSumProjections( M );
f := Sum( List( [ 1..Length( projections ) ], i -> projections[ i ] * approximation[ i ] ) );
return f; end
);
InstallMethod ( RadicalRightApproximationByAddM, "for a list of modules and a module",
true,
[ IsList, IsInt ], 0, function( modulelist, t )
local length, moduleset, N, f, K, M, endoN, radendoN,
BradendoN, gen_NtoM, radhomNN, Vgen_NtoM, VradhomNN,
U, pi, addhoms, i, newM, projections, homs;
length := Length( modulelist ); if not t in [ 1..length ] then
Error( "The entered integer is not in the correct interval.\n" ); fi;
moduleset := [ 1..length ];
RemoveSet( moduleset, t );
N := modulelist[ t ];
f := RightApproximationByAddM( modulelist{ moduleset }, N );
K := LeftActingDomain( N );
M := Source( f );
endoN := EndOverAlgebra( N );
radendoN := RadicalOfAlgebra( endoN );
BradendoN := Basis( radendoN );
gen_NtoM := List( HomOverAlgebra( N, M ), h -> h * f );
radhomNN := List( BradendoN, b -> FromEndMToHomMM( N, b ) ); if Length( radhomNN ) > 0then
Vgen_NtoM := List( gen_NtoM, h -> Flat( MatricesOfPathAlgebraMatModuleHomomorphism( h ) ) );
VradhomNN := List( radhomNN, h -> Flat( MatricesOfPathAlgebraMatModuleHomomorphism( h ) ) );
U := FullRowSpace( K, Length( VradhomNN[ 1 ] ) );
pi := NaturalHomomorphismBySubspace( U, Subspace( U, Vgen_NtoM ) );
addhoms := [ ]; for i in [ 1..Length( VradhomNN ) ] do if not IsZero( ImageElm( pi, VradhomNN[ i ] ) ) then
Add( addhoms, i ); fi;
od;
newM := [ M ]; for i in addhoms do
Add( newM, N );
od;
M := DirectSumOfQPAModules( newM );
projections := DirectSumProjections( M );
homs := [ f ]; for i in addhoms do
Add( homs, radhomNN[ i ] );
od;
f := Sum( List( [ 1..Length( projections ) ], i -> projections[ i ] * homs[ i ] ) ); fi;
return f; end
);
InstallMethod ( ProjectiveResolutionOfSimpleModuleOverEndo, "for a list of modules, an index of the list, and an integer",
true,
[ IsList, IsInt, IsInt ], 0, function( modulelist, t, length )
local f, syzygies, n, U, m, test;
if length < 0then
Error( "The entered length is less than zero.\n" ); fi;
f := RadicalRightApproximationByAddM( modulelist, t );
syzygies := [ ]; for n in [ 1..length - 2 ] do if Dimension( Source( f ) ) = 0then
return [ n - 1, syzygies ]; fi; if IsInjective( f ) then
return [ n, syzygies ]; fi;
U := Kernel( f ); for m in modulelist do
repeat
test := CommonDirectSummand( U, m ); if test <> false then
U := test[ 2 ]; fi;
until
test = false;
od; if Dimension( U ) = 0then
return [ n + 1, syzygies ]; fi;
Add( syzygies, U );
f := RightApproximationByAddM( modulelist, U );
od;
return [ Concatenation( "projdim > ", String( t ) ), syzygies ]; end
);
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.111Bemerkung:
(vorverarbeitet am 2026-10-13)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.