ZZZZZZZZZZZZZZZZZZZ                           tttt                           
Z:::::::::::::::::Z                        ttt:::t                           
Z:::::::::::::::::Z                        t:::::t                           
Z:::ZZZZZZZZ:::::Z                         t:::::t                           
ZZZZZ     Z:::::Z     eeeeeeeeeeee   ttttttt:::::ttttttt     aaaaaaaaaaaaa   
        Z:::::Z     ee::::::::::::ee t:::::::::::::::::t     a::::::::::::a  
       Z:::::Z     e::::::eeeee:::::et:::::::::::::::::t     aaaaaaaaa:::::a 
      Z:::::Z     e::::::e     e:::::tttttt:::::::tttttt              a::::a 
     Z:::::Z      e:::::::eeeee::::::e     t:::::t             aaaaaaa:::::a 
    Z:::::Z       e:::::::::::::::::e      t:::::t           aa::::::::::::a 
   Z:::::Z        e::::::eeeeeeeeeee       t:::::t          a::::aaaa::::::a 
ZZZ:::::Z     ZZZZe:::::::e                t:::::t    ttttta::::a    a:::::a 
Z::::::ZZZZZZZZ:::e::::::::e               t::::::tttt:::::a::::a    a:::::a 
Z:::::::::::::::::Ze::::::::eeeeeeee       tt::::::::::::::a:::::aaaa::::::a 
Z:::::::::::::::::Z ee:::::::::::::e         tt:::::::::::tta::::::::::aa:::a
ZZZZZZZZZZZZZZZZZZZ   eeeeeeeeeeeeee           ttttttttttt   aaaaaaaaaa  aaaa

                                                                Version 0.2.1
                             by
                                 Tobias Rossmann
  

Contents

  1. Description
  2. Download and setup
  3. Basic usage
    1. Creating algebras
    2. Computing topological zeta functions
    3. The built-in database of examples
    4. Modules and algebras with operators
  4. Advanced usage
  5. References
  6. License
  7. Contact

1. Description

Zeta provides methods for computing topological zeta functions arising from the enumeration of subalgebras, ideals, submodules, and representations of suitable algebraic structures. For theoretical background and descriptions of the methods used, see [1,2,3]. Zeta is distributed as a Python-package for the computer algebra system Sage.

This work is supported by the DFG Priority Programme “Algorithmic and Experimental Methods in Algebra, Geometry and Number Theory” (SPP 1489).

2. Download and setup

Requirements

This software requires a recent version of Sage. It is untested on anything but 64-bit Linux (x86) systems.

Installation

In order to install Zeta, download Zeta-0.2.1.tar.bz2 and extract it into some directory, $DIR say. This will create a subdirectory $DIR/Zeta. Please make sure that any previous version of Zeta is either overwritten or removed beforehand. If Sage is started from within $DIR or if $DIR is among the directories listed in $SAGE_PATH, then Zeta can be imported via


        import Zeta

If $DIR is not listed in $SAGE_PATH, you can permanently include it by adding a line


        export SAGE_PATH="$DIR:$SAGE_PATH"

to $HOME/.bashrc (if you use bash), where $DIR is replaced by the actual directory name from above; having applied this change, you will want to start a new shell. Alternatively, for a temporary solution, after executing


        sys.path.append('$DIR')

from within Sage, you should be able to import Zeta.

Releases

The following table lists all versions of Zeta released so far.

File Released
Zeta-0.2.1.tar.bz2 19/06/2015
Zeta-0.2.tar.bz2 06/03/2015
Zeta-0.1.tar.bz2 17/09/2014

You might also be interested in the list of algebras and associated topological zeta functions computed using Zeta.

Warning messages

If you receive a warning about Normaliz being absent, it is strongly recommended that you install it. In order to be found by Zeta, the executable file normaliz should be either somewhere in your $PATH or within $DIR/Zeta, where $DIR is as above.

If you receive a warning about Zeta being unable to load a C extension, it is strongly recommended that you run


        make clean ; make install

from within $DIR/Zeta.

Zeta will be fully functional but often much slower if Normaliz or the C extension is missing.

3. Basic usage

3.1. Creating algebras

By an algebra, we mean a free $\mathbf Z$-module of finite rank endowed with a biadditive multiplication; we do not require this multiplication to be associative or Lie. Given a $\mathbf Z$-basis $x_1,\dotsc,x_d$ of an algebra $L$, define $\alpha_{ije}\in \mathbf Z$ by

\[ x_i x_j = \sum_{e=1}^d \alpha_{ije} x_e. \]

The numbers $\alpha_{ije}$ are the structure constants of $L$ with respect to the chosen basis $(x_1,\dotsc,x_d)$. The principal method for specifying an algebra in Zeta is to provide structure constants as a nested list

\[ \begin{matrix} [[ (\alpha_{111},\dotsc,\alpha_{11d}), & \dotsc & (\alpha_{1d1},\dotsc,\alpha_{1dd}) ]\phantom], \\ \vdots & & \vdots \\ \phantom[[ (\alpha_{d11},\dotsc,\alpha_{d1d}), & \dotsc & (\alpha_{dd1},\dotsc,\alpha_{ddd}) ]] \\ \end{matrix} \]

as the first argument of Zeta.Algebra. (We note that the table of structure constants of an instance of Zeta.Algebra is stored in the table attribute.)

3.2. Computing topological zeta functions

Given an algebra obtained via Zeta.Algebra, the function Zeta.topological_zeta_function can be used to attempt to compute an associated topological zeta function. Specifically, Zeta.topological_zeta_function(L, 'subalgebras') will attempt to compute the topological subalgebra zeta function of $L$ as a rational function in $s$, while Zeta.topological_zeta_function(L, 'ideals') will do the same for ideals. If $L$ is a nilpotent Lie algebra, then Zeta.topological_zeta_function(L, 'reps') will attempt to compute the topological representation zeta function of the unipotent algebraic group over $\mathbf Q$ corresponding to $L\otimes_{\mathbf Z} \mathbf Q$.

In general, such computations are not guaranteed to succeed. If the method for computing topological zeta functions from [1,2] (for subalgebras and ideals) or [3] (for representations) fails, Zeta.topological_zeta_function will raise an exception of type Zeta.ReductionError. Disregarding bugs in Zeta, Sage, or elsewhere, whenever Zeta.topological_zeta_function does finish succesfully, its output is supposed to be correct.

Example (subalgebras and ideals)

To illustrate the computation of topological subobject zeta functions, consider the commutative algebra $L = \mathbf Z[X]/X^3$. As a $\mathbf Z$-basis of $L$, we choose $(1,x,x^2)$, where $x$ is the image of $X$ in $L$. The associated nested list of structure constants is

\[ \begin{matrix} [[(1, 0, 0), & (0, 1, 0), & (0, 0, 1)]\phantom],\\ \phantom[ [(0, 1, 0), & (0, 0, 1), & (0, 0, 0)]\phantom],\\ \phantom[[(0, 0, 1), & (0, 0, 0), & (0, 0, 0)]]. \end{matrix} \]

The following documents a complete Sage session leading to the computation of the topological subalgebra and ideal zeta functions of $L$.


sage: import Zeta
sage: L = Zeta.Algebra([[(1, 0, 0), (0, 1, 0), (0, 0, 1)], [(0, 1, 0), (0, 0,1), (0, 0, 0)], [(0, 0, 1), (0, 0, 0), (0, 0, 0)]])
sage: Zeta.topological_zeta_function(L, 'subalgebras')
2*(15*s - 8)/((5*s - 4)*(3*s - 2)^2*s)
sage: Zeta.topological_zeta_function(L, 'ideals')
1/((3*s - 2)*(2*s - 1)*s)

Example (representations)

We illustrate the computation of topological representation zeta functions of unipotent algebraic groups (over $\mathbf Q$) using the familiar example of the Heisenberg group $\mathbf H$. The first step is to construct a $\mathbf Z$-form of its Lie algebra. We choose the natural $\mathbf Z$-form $L = \mathbf Z x_1 \oplus \mathbf Z x_2 \oplus \mathbf Z x_3$ with $[x_1,x_2] = x_3$, $[x_2,x_1] = -x_3$ and $[x_i,x_j] = 0$ in the remaining cases. The list of structure constants of $L$ with respect to the basis $(x_1,x_2,x_3)$ is

\[ \begin{matrix} [[(0, 0, \phantom-0), & (0, 0, 1), & (0, 0, 0)]\phantom],\\ \phantom[ [(0, 0, -1), & (0, 0, 0), & (0, 0,0)]\phantom],\\ \phantom[[(0, 0, \phantom-0), & (0, 0, 0), & (0, 0, 0)]]. \end{matrix} \]

The following documents a complete Sage session leading to the computation of the topological representation zeta function of $\mathbf H$.

sage: import Zeta
sage: L = Zeta.Algebra([[(0, 0, 0), (0, 0, 1), (0, 0, 0)], [(0, 0,-1), (0, 0, 0), (0, 0, 0)], [(0, 0, 0), (0, 0, 0), (0, 0, 0)]])
sage: Zeta.topological_zeta_function(L, 'reps')
s/(s - 1)

3.3. The built-in database of examples

Accessing the database

Zeta includes a “database” of algebras. When topological zeta functions associated with an algebra in the database have been succesfully computed using Zeta, these are stored as well.

Each algebra stored in Zeta can be referred to using its unique identification number or one of finitely many names. Access to these algebras is provided using the function Zeta.lookup.

If Zeta.lookup is called with precisely one argument entry, then entry should be either an identification number or a name of an algebra, $L$ say, in the database. In this case, Zeta.lookup will return $L$. An optional second argument to Zeta.lookup can be used to access other information about $L$:

When called without arguments, Zeta.lookup returns a list of pairs (i,names), where i ranges over the identification numbers of all algebras in the database and names is a possibly empty list of names associated with the ith algebra.

Example

The algebra $L = \mathbf Z[X]/X^3$ from Section 3.1 is known to Zeta under the name 'ZZ[X]/X^3'; it can be retrieved via L = Zeta.lookup('ZZ[X]/X^3'). We may recover the pre-computed topological zeta functions of $L$ as follows:


sage: Zeta.lookup('ZZ[X]/X^3', 'subalgebras')
2*(15*s - 8)/((5*s - 4)*(3*s - 2)^2*s)
sage: Zeta.lookup('ZZ[X]/X^3', 'ideals')
1/((3*s - 2)*(2*s - 1)*s)

Algebras and their names

Apart from self-explanatory names such as 'sl(2,ZZ)' and 'gl(2,ZZ)', Zeta also includes algebras $L_{d,i}$, $L_{d,i}(\varepsilon)$, $L^i$, $L^i_a$, $M^i$, and $M^i_a$ taken from de Graaf's tables of nilpotent and soluble Lie algebras; their corresponding names in Zeta are of the form 'L(d,i)', 'L(d,i;eps)', 'L^i', 'L^i(a)', 'M^i', and 'M^i(a)'. For the infinite families among these algebras, we only included selected specialisations of the parameters. Recall [1, Prop. 5.19(ii)] that the topological subalgebra and ideal zeta functions of an algebra $L$ (over $\mathbf Z$) only depend on the $\mathbf C$-isomorphism type of $L\otimes_{\mathbf Z}\mathbf C$; a similar statement holds for topological representation zeta functions by [3, Prop. 4.3].

Similar to Woodward's tables, we use the notation 'g(...)' to refer to $\mathbf Z$-forms of algebras from Seeley's list of 7-dimensional nilpotent Lie algebras over $\mathbf C$; for example 'g(147A)' is a $\mathbf Z$-form of the algebra $1,4,7_A$ in Seeley's list.

The algebras 'N_i^(8,d)' are taken from the lists of Ren and Zhu, and Yan and Deng.

The algebras called 'C(d,i)' and 'C(d,i;eps)' in Zeta are “commutative versions” of the nilpotent Lie rings 'L(d,i)' and 'L(d,i;eps)' respectively: they were obtained by inverting the signs of all entries underneath the diagonal in the matrices of structure constants.

An algebra called 'name[eps]' in Zeta is obtained by tensoring 'name' with the dual numbers as in [3, §6].

Listing algebras, topological zeta functions, and their properties

The function Zeta.examples.printall generates a text-based list of

and writes these to an optional file-like object (which defaults to stdout). The output of this function is also available for download.

By the essential value of a rational function $Z\in \mathbf Q(s)$ at a point $w\in \mathbf C$, we mean the value of $Z/(s-w)^m$ at $s = w$, where $m$ is the order of $Z$ at $w$; similarly, for $w = \infty$. The output of Zeta.examples.printall (and hence the content of the file linked to above) contains the essential values of topological zeta functions at $0$ and $\infty$; these are related to Conjectures IV–V from [1,2].

3.4. Modules and algebras with operators

In [1,2], (topological) ideal zeta functions were treated as special cases of submodule zeta functions. In Zeta, we regard modules as special cases of algebras with operators. Namely, each algebra $L$ in Zeta is endowed with a possibly empty set $\Omega$ of operators, i.e. $\Omega$ consists of additive endomorphisms of $L$. The topological subalgebra and ideal zeta functions of $L$ are always understood to be those arising from the enumeration of $\Omega$-invariant subalgebras or ideals, respectively. Thus, if the multiplication of $L$ is trivial, then the $\Omega$-invariant subalgebras (and ideals) of $L$ are precisely the submodules of $L$ under the action of the enveloping associative ring of $\Omega$ within $\mathrm{End}(L)$.

In practice, $\Omega$ is given by a finite list of matrices (or nested lists of integers representing those matrices) corresponding to the defining basis of $L$. This list is then supplied to Zeta.Algebra using the keyword parameter operators. For algebras with zero multiplication, instead of entering structure constants, you can provide a keyword argument rank to Zeta.Algebra which intialises all structure constants to zero.

Example

We illustrate the computation of the topological submodule zeta function arising from the enumeration of sublattices within $\mathbf Z^3$ invariant under the matrix \[ \begin{bmatrix} 1 & 1 & -1 \\ 0 & 1 & 1 \\ 0 & 0 & 1 \end{bmatrix} \]


sage: M = Zeta.Algebra(rank=3, operators=[ [[1,1,-1],[0,1,1],[0,0,1]] ])
sage: Zeta.topological_zeta_function(M)
1/((3*s - 2)*(2*s - 1)*s)

In the database included with Zeta, for examples of algebras with trivial multiplication but non-empty lists of operators, we did not include ideal zeta functions; they coincide with the corresponding subalgebra and submodule zeta functions.

4. Advanced usage

More on the creation of algebras

As an integral version of terminology used by Evseev, we say that a $\mathbf Z$-basis $(x_1,\dotsc,x_d)$ of an algebra $L$ is simple if each product $x_ix_j$ is of the form $\varepsilon_{ij} x_{a_{ij}}$ for $\varepsilon_{ij} \in \{-1,0,1\}$. In this case, the structure constants of $L$ with respect to $(x_1,\dotsc,x_d)$ are determined by the matrix $A = [\varepsilon_{ij} a_{ij}]_{i,j=1,\dotsc,d}$. Zeta supports the creation of algebras from such a matrix $A$ by passing simple_basis=True and matrix=$A$ as arguments to Zeta.Algebra.

For example, the Heisenberg Lie ring with $\mathbf Z$-basis $(x_1,x_2,x_3)$ and non-trivial products $[x_1,x_2] = x_3$ and $[x_2,x_1] = -x_3$ from above can be defined in Zeta via Zeta.Algebra(simple_basis=True, matrix=[[0,3,0], [-3,0,0], [0,0,0] ]) .

Changing bases

(The following only applies to the computation of topological subalgebra and ideal zeta functions.) Computations using Zeta are usually very sensitive to the choice of the basis used to define the structure constants of the algebra under consideration. If a particular zeta function cannot be directly computed using Zeta, it might be useful to consider different bases. Given an algebra L of rank $d$ and an invertible $d\times d$ matrix A over $\mathbf Z$, the algebra obtained from $L$ by taking the rows of A as a basis (relative to the original one) can be constructed via L.change_basis(A).

If Zeta.topological_zeta_function is called with the keyword argument optimise_basis=True, then Zeta will attempt to find a basis of the algebra, $L$ say, in question such that the associated toric datum is “small”. Currently, Zeta simply loops over permutations of the defining basis of $L$.

Verbosity

If Zeta.topological_zeta_function is called with the keyword argument verbose=True, then detailed information on the various stages of computations will be displayed. Apart from illustrating the key steps explained in [1,2,3], this can often be helpful when it comes to estimating the feasibility of the intended computation.

Computational resources

An upper bound on the number of CPUs used by Zeta.topological_zeta_function can be enforced by providing a numerical value for the keyword parameter ncpus.

During computations of topological zeta functions, Zeta uses various temporary files. Be warned that for some computations carried out by the author, the combined size of these files exceeded 50 GB.

Zeta can also be quite demanding when it comes to system memory. If computations run out of memory, you can try reducing the number of CPUs used as indicated above or try setting the keyword parameter profile of Zeta.topological_zeta_function to Zeta.Profile.SAVE_MEMORY. Setting profile=Zeta.Profile.SPEED will result in slightly better performance at the cost of increased memory use.

Reduction strategies

(The following only applies to the computation of topological subalgebra and ideal zeta functions.) The reduction step explained in [2] depends on a strategy for chosing “reduction candidates”. The default choice of a strategy is the one explained in the paper. Alternative choices can be made using the keyword parameter strategy of Zeta.topological_zeta_function. In particular, setting strategy=Zeta.Strategy.NONE disables reduction completely, thus turning Zeta.topological_zeta_function into an implementation of [1] only. Passing strategy=Zeta.Strategy.PREEMPTIVE will result in a more aggressive reduction strategy which tries to anticipate and remove causes of singularity in advance. While often slower than the default, this strategy is needed to reproduce some of the computations recorded in the database (Section 3.3).

5. References

[1] T. Rossmann. Computing topological zeta functions of groups, algebras, and modules, I. Proc. Lond. Math. Soc. (3) 110 (2015), no. 5, 1099–1134. (PDF)

[2] T. Rossmann. Computing topological zeta functions of groups, algebras, and modules, II. (preprint)

[3] T. Rossmann. Topological representation zeta functions of unipotent groups. (preprint)

6. License

Copyright © 2014, 2015 Tobias Rossmann.

Zeta is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

Zeta is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with Zeta. If not, see http://www.gnu.org/licenses.

7. Contact

Tobias Rossmann
Fakultät für Mathematik
Universität Bielefeld
Postfach 100131
D-33501 Bielefeld
Germany

tobias.rossmann (at) googlemail.com

last modified: Jun 19, 2015