Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
| Download
GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
Project: cocalc-sagemath-dev-slelievre
Views: 418346############################################################################# ## #W fplsa.g GAP library Thomas Breuer ## #Y Copyright (C) 1997, Lehrstuhl D fuer Mathematik, RWTH Aachen, Germany ## ## This file contains the interface from {\GAP} to the `fplsa4' package ## by Gerdt and Kornyak. ## ############################################################################# ## #V FPLSA ## ## `FPLSA' is the global record used by the functions in the fplsa package. ## Besides components that describe parameters, the following are used. ## ## `progname' ## the file name of the executable, ## ## `T' ## structure constants table of the algebra under consideration, ## ## `words' ## list of elements in the free Lie algebra that correspond to the ## basis elements, ## ## `rels' ## list of relators in the free Lie algebra that are used to express ## redundant algebra generators in terms of the basis. ## BindGlobal( "FPLSA", rec( Relation_size := 2500000, Lie_monomial_table_size := 1000000, Node_Lie_term_size := 2000000, Node_scalar_factor_size := 2000, Node_scalar_term_size := 20000, progname := "fplsa4" ) ); ############################################################################# ## #F PrintDataFileForFPLSA( <L>, <relators>, <weight>, <file> ) ## BindGlobal( "PrintDataFileForFPLSA", function( L, relators, weight, file ) local stringword, # local function, compute bracket notation of list nrgens, # no. of generators of `L' i,u, # loop over `gens' or a word rel; # loop over relators stringword:= function( word ) if IsInt( word ) then return Concatenation( "x", String( word ) ); else return Concatenation( "[", stringword( word[1] ), ",", stringword( word[2] ), "]" ); fi; end; nrgens:= Length( GeneratorsOfAlgebra( L ) ); AppendTo( file, "Generators:" ); for i in [ 1 .. nrgens ] do AppendTo( file, " x" ); AppendTo( file, String( i ) ); if i < nrgens then AppendTo( file, "\n" ); fi; od; AppendTo( file, ";\n\n" ); AppendTo( file, "Weights:" ); for i in [ 1 .. nrgens ] do AppendTo( file, " 1"); od; AppendTo( file, ";\n\n" ); AppendTo( file, "Limiting weight: " ); AppendTo( file, String( weight ) ); AppendTo( file, ";\n" ); AppendTo( file, "Relations, N = " ); AppendTo( file, String( Length( relators ) ) ); AppendTo( file, ":\n" ); for u in [1..Length(relators)] do rel:= relators[u]; rel:= ExtRepOfObj( rel )[2]; for i in [ 2, 4 .. Length( rel ) ] do if rel[i] < 0 then if rel[i] = -1 then AppendTo( file, "-" ); else AppendTo( file, String( rel[i] ) ); AppendTo( file, " " ); fi; else if i <> 2 then AppendTo( file, "+" ); fi; if rel[i] <> 1 then AppendTo( file, String( rel[i] ) ); AppendTo( file, " " ); fi; fi; AppendTo( file, stringword( rel[ i-1 ] ) ); #AppendTo( file, "\n"); od; if u <> Length( relators ) then AppendTo( file, ";\n" ); fi; od; AppendTo( file, "." ); end ); ############################################################################# ## #F PrintInitFileForFPLSA( <filename>, <nrgens>, <table>, <words>, <rels>, #F <tmpdir> ) ## ## produces an initialization file <filename> for an algebra with <nrgens> ## generators. ## <table> and <words> are booleans. ## If <table> is `true' then the s.c. table of the result is output. ## If <words> is `true' then the words in the f.p. algebra corresponding to ## the basis elements of the result are output. ## If <rels> is `true' then the reduced relations are output. ## BindGlobal( "PrintInitFileForFPLSA", function( filename, nrgens, table, words, rels, tmpdir ) if table then table:= "Yes"; else table:= "No"; fi; if words then words:= "Yes"; else words:= "No"; fi; if rels then rels := "Yes"; else rels := "No"; fi; PrintTo( filename, "Crude time : No\n", "Echo input file : No\n", "Put program heading : No\n", "Put initial relations : No\n", # <* Print read relations *> "Put reduced relations : No\n", "Put basis elements : No\n", # <* Print basis of algebra *> "Put commutators : No\n", # <* Print non-zero commutators *> "Put Hilbert series : No\n", # <* Print dimensions of # homogeneous components *> "Put non-zero coefficients : No\n", # <* Print table of non-zero # parametric coefficients *> "Put statistics : No\n", "Left normed output : No\n", # <* Left normed notation for Lie # monomials, otherwise standard # bracket notation *> "GAP output basis : ", # <* Convey basis words of ordinary words, "\n", # finite-dimensional Lie algebra # to GAP *> "GAP output commutators : ", # <* Convey commutator table of table, "\n", # ordinary finite-dimensional # Lie algebra to GAP *> "GAP output relations : ", # <* Convey relations of ordinary rels, "\n", # finite-dimensional Lie algebra # to GAP *> "GAP algebra name : FPLSA.T\n", # <* Name of algebra # conveyed to GAP *> "GAP basis name : FPLSA.words\n", # <* Name of basis words list # conveyed to GAP *> "GAP relations name : FPLSA.rels\n", # <* Name of relations conveyed # to GAP *> "Coefficient sum table size : 16\n", # <* Size of table for\n", # non-zero parametric sums *> "Generator max. number : ", # <* Max. no. of input generators *> nrgens, "\n", "Input integer size : 32\n", # <* Maximum number of LIMBs # for input integers *> "Input string size : 8192\n", # <* String for reading input # portion *> "Line length : 76\n", # <* Width of 2D output page *> "Name length : ", # <* Max. length of object name *> LogInt( nrgens, 10 ) + 2, "\n", "Relation size : ", # <* Size of array Relation *> FPLSA.Relation_size, "\n", "Lie monomial table size : ", FPLSA.Lie_monomial_table_size, "\n", "Node Lie term size : ", # <* Size of pool NodeLT for Lie FPLSA.Node_Lie_term_size, "\n", # term nodes *> "Node scalar factor size : ", # <* Size of pool NodeSF FPLSA.Node_scalar_factor_size, "\n", # for scalar factor nodes *> "Node scalar term size : ", # <* Size of pool NodeST FPLSA.Node_scalar_term_size, "\n", # for scalar term nodes *> "OutLine size : 256\n", # <* String for preparing 2D # output portion *> "Parameter max. number : 0\n", # <* Max. no. of input parameters *> "Even basis symbol : E\n", # <* Even basis element name *> "Odd basis symbol : O\n", # <* Odd basis element name *> "Input directory : ", Filename(tmpdir,""), "\n", # <* Directory containing input #files *> "" ); end ); ############################################################################# ## #F SCAlgebraInfoOfFpLieAlgebra( <L>, <relators>, <limit_weight>, #F <words>, <rels> ) ## ## computes a s.c. algebra isomorphic to the Lie algebra `<L> / <relators>' ## if this is possible using Lie monomials of length at most <limit_weight>. ## ## The function calls the external program `fplsa4'. ## ## <L> must be a free Lie algebra, <relators> a list of elements in <L>, ## <limit_weight> a positive integer. ## ## <words> is a boolean, if it is `true' then a list of elements in <L> ## is constructed that correspond to the basis elements. ## ## <rels> is a boolean, if it is `true' then a list of reduced relators in ## <L> is constructed that describes how algebra generators are expressed ## in terms of the basis elements if they are not themselves basis elements. ## BindGlobal( "SCAlgebraInfoOfFpLieAlgebra", function( L, relators, limitweight, words, rels ) local progname, # filename of the executable tmpdir, # directory in that the standalone is called inputfile, # file with input inifile, # file with parameter definitions output, # output file proc, # process to be run info, # result record Fam; # elements family of the algebra # Check that `L' is a Lie algebra over the rationals. if not ( IsLieAlgebra( L ) and IsMagmaRingModuloRelations( L ) and LeftActingDomain( L ) = Rationals ) then Error( "<L> must be a free Lie algebra over the rationals" ); fi; # Choose the executable of the standalone. progname:= Filename( DirectoriesPackagePrograms( "fplsa" ), FPLSA.progname ); if progname = fail then Error( "did not find the executable" ); fi; # Write the file with the data. tmpdir:= DirectoryTemporary(); inputfile:= Filename( tmpdir, "input.in" ); PrintDataFileForFPLSA( L, relators, limitweight, inputfile ); # Write the file with options. inifile:= Filename( tmpdir, Concatenation( FPLSA.progname, ".ini" ) ); PrintInitFileForFPLSA( inifile, Length( GeneratorsOfAlgebra( L ) ), true, words, rels, tmpdir ); # Call the standalone function. output:= OutputTextFile( Filename( tmpdir, "output" ), false ); proc:= Process( tmpdir, progname, InputTextNone(), output, [ "input.in" ] ); CloseStream( output ); if proc <> 0 then Error( "process did not succeed" ); fi; # Read the output file. Unbind( FPLSA.T ); Unbind( FPLSA.words ); Unbind( FPLSA.rels ); Read( Filename( tmpdir, "output" ) ); # Check whether the maximal weight was big enough to compute # a finite dimensional Lie algebra. if not IsBound( FPLSA.T ) then return fail; fi; # Construct and return the algebra. info:= rec( sc:= LieAlgebraByStructureConstants( Rationals, FPLSA.T ) ); if words then Fam:= ElementsFamily( FamilyObj( L ) ); info.words:= List( FPLSA.words, w -> ObjByExtRep( Fam, [ 0, [ w, 1 ] ] ) ); fi; if rels then Fam:= ElementsFamily( FamilyObj( L ) ); info.rels:= List( FPLSA.rels, w -> ObjByExtRep( Fam, [ 0, w ] ) ); fi; return info; end ); ############################################################################# ## #F IsomorphicSCAlgebra( <K>[ ,<bound>] ) ## ## computes a s.c. algebra isomorphic to the finitely presented ## Lie algebra <K>. ## If the optional parameter <bound> is specified the computation will ## be carried out using monomials of degree at most <bound>. ## If <bound> is not specified, then it will initially be set to ## 10000. If this does not suffice to calculate a multiplication tabel ## of the algebra, then the bound will be increased until a multiplication ## table is found. ## ## If the computation was succesful a structure constants algebra ## will be returned isomorphic to <K>. Otherwise `fail' ## will be returned. ## BindGlobal( "IsomorphicSCAlgebra", function( arg ) local K, # fp Lie algebra bound, # bound on the degree of the monomials in the calculation fam, # elements family of K L, # free Lie algebra corresponding to K rels, # relators corresponding to K sca; # structure constants algebra. if Length( arg ) = 1 and IsSubalgebraFpAlgebra( arg[1] ) then K:= arg[ 1 ]; bound:= "infinity"; elif Length( arg ) = 2 and IsSubalgebraFpAlgebra( arg[1] ) and IsPosInt( arg[2] ) then K:= arg[1]; bound:= arg[2]; else Error( "usage: IsomorphicSCAlgebra( <K> [,<bound>] ),\n", "where <K> is a f.p. Lie algebra and <bound> a pos. integer" ); fi; fam:= ElementsFamily( FamilyObj( K ) ); L:= fam!.freeAlgebra; rels:= fam!.relators; if IsPosInt( bound ) then sca:= SCAlgebraInfoOfFpLieAlgebra( L, rels, bound, false, false ); if sca = fail then return sca; else return sca.sc; fi; else bound:= 10000; while true do sca:= SCAlgebraInfoOfFpLieAlgebra( L, rels, bound, false, false ); if sca <> fail then return sca.sc; else bound:= bound + 1000; fi; od; fi; end ); ############################################################################# ## #E