69 The MeatAxe

This chapter describes the main functions of the MeatAxe (Version 2.0) share library for computing with finite field matrices, permutations, matrix groups, matrix algebras, and their modules.

For the installation of the package, see Installing the MeatAxe Package.

The chapter consists of seven parts.

First the idea of using the MeatAxe via GAP3 is introduced (see More about the MeatAxe in GAP, GapObject), and an example shows how the programs can be used (see Using the MeatAxe in GAP. An Example).

The second part describes functions and operations for single MeatAxe matrices (see MeatAxe Matrices, MeatAxeMat, Operations for MeatAxe Matrices, Functions for MeatAxe Matrices, BrauerCharacterValue).

The third part describes functions and operations for single MeatAxe permutations (see MeatAxe Permutations, MeatAxePerm, Operations for MeatAxe Permutations, Functions for MeatAxe Permutations).

The fourth part describes functions and operations for groups of MeatAxe matrices (see MeatAxe Matrix Groups, Functions for MeatAxe Matrix Groups).

(Groups of MeatAxe permutations are not yet supported.)

The fifth part describes functions and operations for algebras of MeatAxe matrices (see MeatAxe Matrix Algebras, Functions for MeatAxe Matrix Algebras).

The sixth part describes functions and operations for modules for MeatAxe matrix algebras (see MeatAxe Modules, Set Theoretic Functions for MeatAxe Modules, Vector Space Functions for MeatAxe Modules, Module Functions for MeatAxe Modules).

The last part describes the data structures (see MeatAxe Object Records).

If you want to use the functions in this package you must load it using

```    gap> RequirePackage( "meataxe" );
#I  The MeatAxe share library functions are available now.
#I  All files will be placed in the directory
#I     '/var/tmp/tmp.017545'
#I  Use 'MeatAxe.SetDirectory( <path> )' if you want to change. ```

69.1 More about the MeatAxe in GAP

The MeatAxe can be used to speed up computations that are possible also using ordinary GAP3 functions. But more interesting are functions that are not (or not yet) available in the GAP3 library itself, such as that for the computation of submodule lattices (see Module Functions for MeatAxe Modules).

The syntax of the functions is the usual GAP3 syntax, so it might be useful to read the chapters about algebras and modules in GAP3 (see chapters Algebras, Modules) if you want to work with MeatAxe modules.

The main idea is to let the MeatAxe functions do the main work, and use GAP3 as a shell. Since in MeatAxe philosophy, each object is contained in its own file, GAP3's task is mainly to keep track of these files. For example, for GAP3 a MeatAxe matrix is a record containing at least information about the file name, the underlying finite field, and the dimensions of the matrix (see MeatAxe Matrices). Multiplying two such matrices means to invoke the multiplication program of MeatAxe, to store the result in a new file, and notify this to GAP3.

This idea is used not only for basic calculations but also to access elaborate and powerful algorithms, for example the program to compute the composition factors of a module, or the submodule lattice (see Module Functions for MeatAxe Modules).

In order to avoid conversion overhead the MeatAxe matrices are read into GAP3 only if the user explicitly applies `GapObject` (see GapObject), or applies an operator (like multiplication) to a MeatAxe matrix and an ordinary GAP3 object.

Some of the functions, mainly `CompositionFactors`, print useful information if the variable `InfoMeatAxe` is set to the value `Print`. The default of `InfoMeatAxe` is `Print`, if you want to suppress the information you should set `InfoMeatAxe` to `Ignore`.

For details about the implementation of the standalone functions, see Rin93.

69.2 GapObject

`GapObject( mtxobj )`

returns the GAP3 object corresponding to the MeatAxe object mtxobj which may be a MeatAxe matrix, a MeatAxe permutation, a MeatAxe matrix algebra, or a MeatAxe module.

Applied to an ordinary GAP3 object, `GapObject` simply returns this object.

```    gap> m:= [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] * GF(2).one;;
gap> mam:= MeatAxeMat( m, "file2" );;
#I  calling 'maketab' for field of size 2
gap> GapObject( mam );
[ [ 0*Z(2), Z(2)^0, 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0 ],
[ Z(2)^0, 0*Z(2), 0*Z(2) ] ]
gap> map:= MeatAxePerm( (1,2,3), 3 );;
gap> perm:= GapObject( map );
(1,2,3)
gap> GapObject( perm );
(1,2,3) ```

69.3 Using the MeatAxe in GAP. An Example

In this example we compute the 2-modular irreducible representations and Brauer characters of the alternating group A5. Perhaps it will raise the question whether one uses the MeatAxe in GAP3 or GAP3 for the MeatAxe.

First we take a permutation representation of A5 and convert the generators into MeatAxe matrices over the field GF(2).

```    gap> a5:= Group( (1,2,3,4,5), (1,2,3) );;
gap> Size( a5 );
60
gap> f:= GF(2);;
gap> m1:= MeatAxeMat( a5.1, f, [5,5] );
MeatAxeMat( "/var/tmp/tmp.017545/a", GF(2), [ 5, 5 ] )
gap> m2:= MeatAxeMat( a5.2, f, [5,5] );; ```

`m1` and `m2` are records that know about the files where the matrices are stored. Let's look at such a matrix (without reading the file into GAP3).

```    gap> Display( m1 );
MeatAxe.Matrix := [
[0,1,0,0,0],
[0,0,1,0,0],
[0,0,0,1,0],
[0,0,0,0,1],
[1,0,0,0,0]
]*Z(2); ```

Next we inspect the 5 dimensional permutation module over GF(2). It contains a trivial submodule `fix`, its quotient is called `quot`.

```    gap> a:= UnitalAlgebra( f, [ m1, m2 ] );;
gap> nat:= NaturalModule( a );;
gap> fix:= FixedSubmodule( nat );;
gap> Dimension( fix );
1
gap> quot:= nat / fix;; ```

The action on `quot` is described by an algebra of 4× 4 matrices, the corresponding module turns out to be absolutely irreducible. Of course the action on `fix` would yield 1× 1 matrices, the generators being the identity. So we found already two of the four absolutely irreducible representations.

```    gap> op:= Operation( a, quot );
UnitalAlgebra( GF(2),
[ MeatAxeMat( "/var/tmp/tmp.017545/t/g.1", GF(2), [ 4, 4 ], a.1 ),
MeatAxeMat( "/var/tmp/tmp.017545/t/g.2", GF(2), [ 4, 4 ], a.2 ) ] )
gap> nm:= NaturalModule( op );;
gap> IsIrreducible( nm );
true
gap> IsAbsolutelyIrreducible( nm );
true
gap> deg4:= nm.ring;; ```

Now we form the tensor product of the 4 dimensional module with itself, and compute the composition factors.

```    gap> tens:= KroneckerProduct( nm, nm );;
gap> comp:= CompositionFactors( tens );;
#I   Name Mult  SF
#I     1a    4   1
#I     4a    1   1
#I     4b    2   2
#I
#I  Ascending composition series:
#I  4a  1a  4b  1a  1a  4b  1a
gap> IsIrreducible( comp );
true
gap> IsAbsolutelyIrreducible( comp );
false ```

The information printed by `CompositionFactors` told that there is an irreducible but not absolutely irreducible factor `4b` of dimension 4, and we will enlarge the field in order to split this module.

```    gap> sf:= SplittingField( comp );
GF(2^2)
gap> new:= UnitalAlgebra( sf, [ comp.ring.1, comp.ring.2 ] );;
#I  calling 'maketab' for field of size 4
gap> nat:= NaturalModule( new );;
gap> comp:= CompositionFactors( nat );;
#I   Name Mult  SF
#I     2a    1   1
#I     2b    1   1
#I
#I  Ascending composition series:
#I  2a  2b
gap> deg2:= List( comp, x -> x.ring );; ```

Now the representations are known. Let's calculate the Brauer characters. For that, we need representatives of the 2-regular conjugacy classes of A5.

```    gap> repres:= [ a.1^0, a.1 * a.2 * a.1^3, a.1, a.1^2 ];;
gap> List( repres, OrderMeatAxeMat );
[ 1, 3, 5, 5 ] ```

The expression of the representatives of each irreducible representation in terms of the generators can be got using `MappedExpression`.

```    gap> abstracts:= List( repres, x -> x.abstract );
[ a.one, a.1*a.2*a.1^3, a.1, a.1^2 ]
gap> mapped:= List( [ 1 .. 4 ],
>   x-> MappedExpression( abstracts[x],
>       a.freeAlgebra.generators, deg4.generators ) );;
gap> List( mapped, OrderMeatAxeMat );
[ 1, 3, 5, 5 ]
gap> List( mapped, BrauerCharacterValue );
[ 4, 1, -1, -1 ]
gap> mapped:= List( [ 1 .. 4 ],
>   x-> MappedExpression( abstracts[x],
>       a.freeAlgebra.generators, deg2.generators ) );;
gap> List( mapped, BrauerCharacterValue );
[ 2, -1, E(5)^2+E(5)^3, E(5)+E(5)^4 ] ```

The Brauer character of the trivial module is well-known, and that of the other 2-dimensional module is a Galois conjugate of the computed one, so we computed the 2-modular Brauer character table of A5.

It is advisable to remove all the MeatAxe files before leaving GAP3. Call `MeatAxe.Unbind();` (see MeatAxe.Unbind).

69.4 MeatAxe Matrices

MeatAxe matrices behave similar to lists of lists that are regarded as matrices by GAP3, e.g., there are functions like `Rank` or `Transposed` that work for both types, and one can multiply or add two MeatAxe matrices, the result being again a MeatAxe matrix. But one cannot access rows or single entries of a MeatAxe matrix mat, for example `mat` will cause an error message.

MeatAxe matrices are constructed or notified by MeatAxeMat `MeatAxeMat`.

`IsMeatAxeMat( obj )`

returns `true` if obj is a MeatAxe matrix, and `false` otherwise.

69.5 MeatAxeMat

`MeatAxeMat( mat [, F ] [, abstract ] [, filename ] )`

returns a MeatAxe matrix corresponding to the matrix mat, viewed over the finite field F, or over the field of all entries of mat.

If mat is already a MeatAxe matrix then the call means that it shall now be viewed over the field F which may be smaller or larger than the field mat was viewed over.

The optional argument abstract is an element of a free algebra (see chapter Finitely Presented Algebras) that represents the matrix in terms of generators.

If the optional argument filename is given, the MeatAxe matrix is written to the file with this name; a matrix constructed this way will not be removed by a call to `MeatAxe.Unbind`. Otherwise GAP3 creates a temporary file under the directory `MeatAxe.direc`.

`MeatAxeMat( perm, F, dim [,abstract][,filename] )`

does the same for a permutation perm that shall be converted into a permutation matrix over the field F, with `dim` rows and `dim` columns.

`MeatAxeMat( file, F, dim [, abstract ] )`

is the MeatAxe matrix stored on file file, viewed over the field F, with dimensions dim, and representation abstract. This may be used to make a shallow copy of a MeatAxe matrix, or to notify MeatAxe matrices that were not produced by GAP3. Such matrices are not removed by calls to `MeatAxe.Unbind`.

Note: No field change is allowed here.

```    gap> f:= GF(2);;
gap> m:= [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] * f.one;;
gap> m1:= MeatAxeMat( m, "file2" );
MeatAxeMat( "/var/tmp/tmp.005046/file2", GF(2), [ 3, 3 ] )
gap> p:= (1,2,3);;
gap> m2:= MeatAxeMat( p, f, [ 3, 3 ], "file" );
MeatAxeMat( "/var/tmp/tmp.005046/file", GF(2), [ 3, 3 ] )
gap> Display( m2 );
MeatAxe.Matrix := [
[0,1,0],
[0,0,1],
[1,0,0]
]*Z(2);
gap> n:= MeatAxeMat( "file", f, [ 3, 3 ] );; # just notify a matrix ```

69.6 Operations for MeatAxe Matrices

Comparisons of MeatAxe Matrices

`m1 = m2`:

evaluates to `true` if the two MeatAxe matrices have the same entries and are viewed over the same field, and to `false` otherwise. The test for equality uses a shell script that is produced when it is needed for the first time.

`m1 < m2`:

evaluates to `true` if and only if this relation holds for the file names of the two MeatAxe matrices.

Arithmetic Operations of MeatAxe Matrices

The following arithmetic operations are admissible for MeatAxe matrices.

`m1 + m2`:

sum of the two MeatAxe matrices m1, m2

`m1 - m2`:

difference of the two MeatAxe matrices m1, m2

`m1 * m2`:

product of the two MeatAxe matrices m1, m2

`m1 ^ m2`:

conjugation of the MeatAxe matrix m1 by m2

`m1 ^ n`:

n-th power of the MeatAxe matrix m1, for an integer n

69.7 Functions for MeatAxe Matrices

The following functions that work for ordinary matrices in GAP3 also work for MeatAxe matrices.

`UnitalAlgebra( F, gens )` :

returns the unital F-algebra generated by the MeatAxe matrices in the list gens.

`Base( mtxmat )`:

returns a MeatAxe matrix whose rows form a vector space basis of the row space; the basis is in semi-echelon form.

`BaseNullspace( mtxmat )`:

returns a MeatAxe matrix in semi-echelon form whose rows are a basis of the nullspace of the MeatAxe matrix mtxmat.

`CharacteristicPolynomial( mtxmat )` :

returns the characteristic polynomial of the MeatAxe matrix mtxmat. The factorization of this polynomial is stored.

`Dimensions( mtxmat )` :

returns the list `[ nrows, ncols ]` where nrows is the number of rows, ncols is the number of columns of the MeatAxe matrix mtxmat.

`Display( mtxmat )` :

displays the MeatAxe matrix mtxmat (without reading into GAP3).

`Group( m1, m2, \ldots mn )`

`Group( gens, id )` :

returns the group generated by the MeatAxe matrices m1, m2, ... mn, resp. the group generated by the MeatAxe matrices in the list gens, where id is the appropriate identity MeatAxe matrix.

`InvariantForm( mtxmats )` :

returns a MeatAxe matrix M such that Xtr M X = M for all MeatAxe matrices in the list mtxmats if such a matrix exists, and `false` otherwise. Note that the algebra generated by mtxmats must act irreducibly, otherwise an error is signalled.

`KroneckerProduct( m1, m2 )` :

returns a MeatAxe matrix that is the Kronecker product of the MeatAxe matrices m1, m2.

`Order( MeatAxeMatrices, mtxmat )` :

returns the multiplicative order of the MeatAxe matrix mtxmat, if this exists. This can be computed also by `OrderMeatAxeMat( mtxmat )`.

`Rank( mtxmat )`:

returns the rank of the MeatAxe matrix mtxmat.

`SumIntersectionSpaces( mtxmat1, mtxmat2 )` :

returns a list of two MeatAxe matrices, both in semi-echelon form, whose rows are a basis of the sum resp. the intersection of row spaces generated by the MeatAxe matrices m1 and m2, respectively.

`Trace( mtxmat )` :

returns the trace of the MeatAxe matrix mtxmat.

`Transposed( mtxmat )` :

returns the transposed matrix of the MeatAxe matrix mtxmat.

69.8 BrauerCharacterValue

`BrauerCharacterValue( mtxmat )`

returns the Brauer character value of the MeatAxe matrix mtxmat, which must of course be an invertible matrix of order relatively prime to the characteristic of its entries.

```    gap> g:= MeatAxeMat( (1,2,3,4,5), GF(2), [ 5, 5 ] );;
gap> BrauerCharacterValue( g );
0 ```

(This program was originally written by Jürgen Müller.)

69.9 MeatAxe Permutations

MeatAxe permutations behave similar to permutations in GAP3, e.g., one can multiply two MeatAxe permutations, the result being again a MeatAxe permutation. But one cannot map single points by a MeatAxe permutation using the exponentiation operator `^`.

MeatAxe permutations are constructed or notified by MeatAxePerm `MeatAxePerm`.

`IsMeatAxePerm( obj )`

returns `true` if obj is a MeatAxe permutation, and `false` otherwise.

69.10 MeatAxePerm

`MeatAxePerm( perm, maxpoint )`
`MeatAxePerm( perm, maxpoint, filename )`

return a MeatAxe permutation corresponding to the permutation perm, acting on the points `[ 1 .. maxpoint ]`. If the optional argument filename is given, the MeatAxe permutation is written to the file with this name; a permutation constructed this way will not be removed by a call to `MeatAxe.Unbind`. Otherwise GAP3 creates a temporary file under the directory `MeatAxe.direc`.

`MeatAxePerm( file, maxpoint )`

is the MeatAxe permutation stored on file file. This may be used to notify MeatAxe permutations that were not produced by GAP3. Such permutations are not removed by calls to `MeatAxe.Unbind`.

```    gap> p1:= MeatAxePerm( (1,2,3), 3 );
MeatAxePerm( "/var/tmp/tmp.005046/a", 3 )
gap> p2:= MeatAxePerm( (1,2), 3, "perm2" );
MeatAxePerm( "/var/tmp/tmp.005046/perm2", 3 );
gap> p:= p1 * p2;
MeatAxePerm( "/var/tmp/tmp.005046/b", 3 )
gap> Display( p );
MeatAxe.Perms := [
(2,3)
]; ```

69.11 Operations for MeatAxe Permutations

Comparisons of MeatAxe Permutations

`m1 = m2`:

evaluates to `true` if the two MeatAxe permutations are equal as permutations, and to `false` otherwise. The test for equality uses a shell script that is produced when it is needed for the first time.

`m1 < m2`:

evaluates to `true` if and only if this relation holds for the file names of the two MeatAxe permutations.

Arithmetic Operations of MeatAxe Permutations

The following arithmetic operations are admissible for MeatAxe permutations.

`m1 * m2`:

product of the two MeatAxe permutations m1, m2

`m1 ^ m2`:

conjugation of the MeatAxe permutation m1 by m2

`m1 ^ n`:

n-th power of the MeatAxe permutation m1, for an integer n

69.12 Functions for MeatAxe Permutations

The following functions that work for ordinary permutations in GAP3 also work for MeatAxe permutations.

`Display( mtxperm )` :

displays the MeatAxe permutation mtxperm (without reading the file into GAP3).

`Order( MeatAxePermutations, mtxperm )` :

returns the multiplicative order of the MeatAxe permutation mtxperm. This can be computed also by `OrderMeatAxePerm( mtxperm )`.

69.13 MeatAxe Matrix Groups

Groups of MeatAxe matrices are constructed using the usual `Group` command.

Only very few functions are available for MeatAxe matrix groups. For most of the applications one is interested in matrix algebras, e.g., matrix representations as computed by `Operation` when applied to an algebra and a module. For a permutation representation of a group of MeatAxe matrices, however, it is necessary to call `Operation` with a group as first argument (see Functions for MeatAxe Matrix Groups).

69.14 Functions for MeatAxe Matrix Groups

The following functions are overlaid in the operations record of MeatAxe matrix groups.

`Operation( G, M )` :

Let M a MeatAxe module acted on by the group G of MeatAxe matrices. `Operation( G, M )` returns a permutation group with action on the points equivalent to that of G on the vectors of the module M.

`RandomOrders( G )` :

returns a list with the orders of 120 random elements of the MeatAxe matrix group G.

It should be noted that no set theoretic functions (such as `Size`) are provided for MeatAxe matrix groups, and also group theoretic functions (such as `SylowSubgroup`) will not work.

69.15 MeatAxe Matrix Algebras

Algebras of MeatAxe matrices are constructed using the usual `Algebra` or `UnitalAlgebra` commands.

Note that all these algebras are regarded to be unital, that is, also if you construct an algebra by calling `Algebra` you will get a unital algebra.

MeatAxe matrix algebras are used to construct and describe MeatAxe modules and their structure (see MeatAxe Modules).

For functions for MeatAxe matrix algebras see Functions for MeatAxe Matrix Algebras.

69.16 Functions for MeatAxe Matrix Algebras

The following functions are overlaid in the operations record of MeatAxe matrix algebras.

`Fingerprint( A )`

`Fingerprint( A, list )` :

returns the fingerprint of A, i.e., a list of nullities of six ``standard'' words in A (for 2-generator algebras only) or of the words with numbers in list.

```    gap> f:= GF(2);;
gap> a:= UnitalAlgebra( f, [ MeatAxeMat( (1,2,3,4,5), f, [5,5] ),
>                            MeatAxeMat( (1,2)      , f, [5,5] ) ] );;
gap> Fingerprint( a );
[ 1, 1, 1, 3, 0, 1 ] ```

`Module( matalg, gens )` :

returns the module generated by the rows of the MeatAxe matrix gens, and acted on by the MeatAxe matrix algebra matalg. Such a module will usually contain the vectors of a basis in the `base` component.

`NaturalModule( matalg )` :

returns the n-dimensional space acted on by the MeatAxe matrix algebra matalg which consists of n × n MeatAxe matrices.

`Operation( A, M )` :

Let M be a MeatAxe module acted on by the MeatAxe matrix algebra A. `Operation( A, M )` returns a MeatAxe matrix algebra of n × n matrices (where n is the dimension of M), with action on its natural module equivalent to that of A on M.
Note\: If M is a quotient module, it must be a quotient of the entire space.

`RandomOrders( A )` :

returns a list with the orders of 120 random elements of the MeatAxe matrix algebra A, provided that the generators of A are invertible.

It should be noted that no set theoretic functions (such as `Size`) and vector space functions (such as `Base`) are provided for MeatAxe matrix algebras, and also algebra functions (such as `Centre`) will not work.

69.17 MeatAxe Modules

MeatAxe modules are vector spaces acted on by MeatAxe matrix algebras. In the MeatAxe standalone these modules are described implicitly because the matrices contain all the necessary information there. In GAP3 the modules are the concrete objects whose properties are inspected (see Module Functions for MeatAxe Modules).

Note that most of the usual set theoreic and vector space functions are not provided for MeatAxe modules (see Set Theoretic Functions for MeatAxe Modules, Vector Space Functions for MeatAxe Modules).

69.18 Set Theoretic Functions for MeatAxe Modules

`Size( M )` :

returns the size of the MeatAxe module M.

`Intersection( M1, M2 )` :

returns the intersection of the two MeatAxe modules M1, M2 as a MeatAxe module.

69.19 Vector Space Functions for MeatAxe Modules

`Base( M )` :

returns a MeatAxe matrix in semi-echelon form whose rows are a vector space basis of the MeatAxe module M.

`Basis( M, mtxmat )` :

returns a basis record for the MeatAxe module M with basis vectors equal to the rows of mtxmat.

`Dimension( M )` :

returns the dimension of the MeatAxe module M.

`SemiEchelonBasis( M )` :

returns a basis record of the MeatAxe module M that is semi-echelonized (see SemiEchelonBasis).

69.20 Module Functions for MeatAxe Modules

`CompositionFactors( M )` :

For a MeatAxe module M that is acted on by the algebra A, this returns a list of MeatAxe modules which are the actions of A on the factors of a composition series of M. The factors occur with same succession (and multiplicity) as in the composition series. The printed information means the following (for this example, see Using the MeatAxe in GAP. An Example).

```    gap> tens:= KroneckerProduct( nm, nm );;
gap> comp:= CompositionFactors( tens );;
#I   Name Mult  SF
#I     1a    4   1
#I     4a    1   1
#I     4b    2   2
#I
#I  Ascending composition series:
#I  4a  1a  4b  1a  1a  4b  1a  ```

:

The column with header `Name` lists the different composition factors by a name consisting of the dimension and a letter to distinguish different modules of same dimension, the `Mult` columns lists the multiplicities of the composition factor in the module, and the `SF` columns lists the exponential indices of the fields of definition in the splitting fields. In this case there is one 1-dimensional module `1a` with multiplicity 4 that is absolutely irreducible, also one 4-dimensional absolutely irreducible module `4a` of dimension 4, and with multiplicity 2 we have a 4-dimensional module `4b` that is not absolutely irreducible, with splitting field of order p2n when the field of definition had order pn.

`FixedSubmodule( M )` :

returns the submodule of fixed points in the MeatAxe module M under the action of the generators of `M.ring`.

`GeneratorsSubmodule( L, nr )` :

returns a MeatAxe matrix whose rows are a vector space basis of the nr-th basis of the module with submodule lattice L. The lattice can be computed using the `Lattice` command (see below).

`GeneratorsSubmodules( M )` :

returns a list of MeatAxe matrices, one for each submodule of the MeatAxe module M, whose rows are a vector space basis of the submodule. This works only if M is a natural module.

`IsAbsolutelyIrreducible( M )` :

returns `true` if the MeatAxe module M is absolutely irreducible, `false` otherwise.

`IsEquivalent( M1, M2 )` :

returns `true` if the irreducible MeatAxe modules M1 and M2 are equivalent, and `false` otherwise. If both M1 and M2 are reducible, an error is signalled.

`IsIrreducible( M )` :

returns `true` if the MeatAxe module M is irreducible, `false` otherwise.

`KroneckerProduct( M1, M2 )` :

returns the Kronecker product of the MeatAxe modules M1, M2. It is not checked that the acting rings are compatible.

`Lattice( M )` :

returns a list of records, each describing a component of the submodule lattice of M; it has the components `dimensions` (a list, at position i the dimension of the i-th submodule), `maxes` (a list, at position i the list of indices of the maximal submodules of submodule no. i), `weights` (a list of edge weights), and `XGAP` (a list used to display the submodule lattice in \sf XGAP). Note that M must be a natural module.

`SplittingField( M )` :

returns the splitting field of the MeatAxe module M.

`StandardBasis( M, seed )` :

returns a standard basis record for the MeatAxe module M.

69.21 MeatAxe.Unbind

`MeatAxe.Unbind( obj1, obj2, ..., objn )`
`MeatAxe.Unbind( listofobjects )`

Called without arguments, this removes all files and directories constructed by calls of `MeatAxeMat` and `Group`, provided they are still notified in `MeatAxe.files`, `MeatAxe.dirs` and `MeatAxe.fields`.

Otherwise all those files in `MeatAxe.files`, `MeatAxe.dirs` and `MeatAxe.fields` are removed that are specified in the argument list.

Before leaving GAP3 after using the MeatAxe functions you should always call

` gap> MeatAxe.Unbind(); `

69.22 MeatAxe Object Records

MeatAxe matrix records

A MeatAxe matrix in GAP3 is a record that has necessarily the components

`isMeatAxeMat`:

always true,

`isMatrix`:

always true,

`domain`:

the record `MeatAxeMatrices`,

`file` :

the name of the file that contains the matrix in MeatAxe format,

`field`:

the (finite) field the matrix is viewed over,

`dimensions`:

list containing the numbers of rows and columns,

`operations`:

the record `MeatAxeMatOps`.

Optional components are

`structure`:

algebra or group that contains the matrix,

`abstract`:

an element of a free algebra (see FreeAlgebra) representing the construction of the matrix in terms of generators.

Furthermore the record is used to store information whenever it is computed, e.g., the rank, the multiplicative order, and the inverse of a MeatAxe matrix.

MeatAxe permutation records

A MeatAxe permutation in GAP3 is a record that has necessarily the components

`isMeatAxePerm`:

always true,

`isPermutation`:

always true,

`domain`:

the record `MeatAxePermutations`,

`file`:

the name of the file that contains the permutation in MeatAxe format,

`maxpoint`:

an integer n that means that the permutation acts on the point set `[ 1 .. n ]`

`operations`:

the record `MeatAxePermOps`.

Optional components are

`structure`:

group that contains the permutation, and

`abstract`:

an element of a free algebra (see FreeAlgebra) representing the construction of the permutation in terms of generators.

Furthermore the record is used to store information whenever it is computed, e.g., the multiplicative order, and the inverse of a MeatAxe permutation.

MeatAxe

`MeatAxe` is a record that contains information about the usage of the MeatAxe with GAP3. Currently it has the following components.

`PATH`:

the path name of the directory that contains the MeatAxe executables ,

`fields`:

a list where position i is bound if and only if the field of order i has already been constructed by the `maketab` command; in this case it contains the name of the `pxxx.zzz` file,

`files`:

a list of all file names that were constructed by calls to MeatAxe (for allowing to make clean),

`dirs`:

a list of all directory names that were constructed by calls to MeatAxe (for allowing to make clean),

`gennames`:

list of strings that are used as generator names in `abstract` components of MeatAxe matrices,

`alpha`:

alphabet over which `gennames` entries are formed,

`direc`:

directory that contains all the files that are constructed using MeatAxe functions,

`EXEC` :

function of arbitrary many string arguments that calls `Exec` for the concatenation of these arguments in the directory `MeatAxe.direc`.

`Maketab`:

function that produces field information files,

`SetDirecory`:

function that sets the `direc` component,

`TmpName`:

function of zero arguments that produces file names in the directory `MeatAxe.direc`,

`Unbind`:

function to delete files (see MeatAxe.Unbind).

Furthermore some components are bound intermediately when MeatAxe output files are read. So you should better not use the `MeatAxe` record to store your own objects.

Field information

The correspondence between the MeatAxe numbering and the GAP3 numbering of the elements of a finite field F is given by the function `FFList` (see FFList). The element of F corresponding to MeatAxe number n is `FFList( F )[ n+1 ]`, and the MeatAxe number of the field element z is `Position( FFList( F ), z ) -1`.

gap3-jm
11 Mar 2019