admcycles Tutorial

To use the module, the first thing you need to do is import it:

sage: from admcycles import *

Then many functions become available. For example you can entering tautological classes as combinations of divisors (here on M_{3,4}):

sage: t1=3*sepbdiv(1,(1,2),3,4)-psiclass(4,3,4)^2

And here on M_{2,1}:

sage: g=2;n=1
sage: reset_g_n(g, n)
sage: t2=-1/3*irrbdiv()*lambdaclass(1)

Entering tautological classes - listing generators in given degree:

sage: list_tautgens(2,0,2) #generators of R^2(\Mbar_{2,0})
[0] : Graph :      [2] [[]] []
Polynomial : 1*(kappa_2^1 )_0
[1] : Graph :      [2] [[]] []
Polynomial : 1*(kappa_1^2 )_0
[2] : Graph :      [1, 1] [[2], [3]] [(2, 3)]
Polynomial : 1*(kappa_1^1 )_0
[3] : Graph :      [1, 1] [[2], [3]] [(2, 3)]
Polynomial : 1*psi_2^1
[4] : Graph :      [1] [[2, 3]] [(2, 3)]
Polynomial : 1*(kappa_1^1 )_0
[5] : Graph :      [1] [[2, 3]] [(2, 3)]
Polynomial : 1*psi_2^1
[6] : Graph :      [0, 1] [[3, 4, 5], [6]] [(3, 4), (5, 6)]
Polynomial : 1*
[7] : Graph :      [0] [[3, 4, 5, 6]] [(3, 4), (5, 6)]
Polynomial : 1*
sage: L=tautgens(2,0,2);
sage: t3=2*L[3]+L[4]
sage: t3
Graph :      [1, 1] [[2], [3]] [(2, 3)]
Polynomial : 2*psi_2^1

Graph :      [1] [[2, 3]] [(2, 3)]
Polynomial : 1*(kappa_1^1 )_0

Entering a stable graph manually (the graph has two genus 1 components, connected by an edge):

sage: stgraph([1,1],[[2],[3]],[(2,3)])
[1, 1] [[2], [3]] [(2, 3)]

Basic operations with tautclasses:

sage: s1=psiclass(3,1,3)^2 # psi_3 on \Mbar_{1,3}
sage: s1.forgetful_pushforward([3]) # pi_* (psi_3) under map pi: \Mbar_{1,3} -> \Mbar_{1,2} forgetting marking 3
Graph :      [1] [[1, 2]] []
Polynomial : 1*(kappa_1^1 )_0

sage: s2=psiclass(2,1,2)
sage: s2.forgetful_pullback([3]) # pi^* (psi_2) under map pi: \Mbar_{1,3} -> \Mbar_{1,2}
Graph :      [1] [[1, 2, 3]] []
Polynomial : 1*psi_2^1

Graph :      [1, 0] [[1, 4], [5, 3, 2]] [(4, 5)]
Polynomial : (-1)*


sage: s3=psiclass(2,1,3)*psiclass(3,1,3)^2
sage: s3.evaluate() # compute the degree of the zero cycle s3=psi_2*(psi_3)^2 on \Mbar_{1,3}
1/12

sage: s4=psiclass(2,1,2)^2+psiclass(1,1,2)*psiclass(2,1,2)
sage: s4.evaluate()
1/12

A basis of the tautological ring and tautological relations:

sage: generating_indices(2,0,2) # gives list of indices of tautgens(2,0,2) forming a basis of R^2(\Mbar_{2,0})
[0, 1]
sage: t3.toTautbasis(2,0,2) # expresses class t3 in terms of this basis
(-48, 22)

Verifying the divisor relation kappa - psi + delta_0 on bar M_{1,4}:

sage: g=1;n=4;
sage: reset_g_n(g,n)
sage: bgraphs=[bd for bd in list_strata(g,n,1) if bd.numvert()>1]
sage: del0=sum([bd.to_tautclass() for bd in bgraphs]) # sum of boundary classes with separating node
sage: psisum=sum([psiclass(i) for i in range(1,n+1)]) # sum of psi-classes
sage: rel=kappaclass(1)-psisum+del0
sage: rel.is_zero()
True

Pulling back tautological classes to a boundary divisor:

sage: bdry=stgraph([2,2],[[1],[2]],[(1,2)])
sage: generator=tautgens(4,0,2)[3]
sage: generator
Graph :      [1, 3] [[2], [3]] [(2, 3)]
Polynomial : 1*psi_3^1
sage: pullback=bdry.boundary_pullback(generator);
sage: pullback.totensorTautbasis(2)
[
                           [-3]
                           [ 1]
                  [0 0 0]  [-3]
                  [0 0 0]  [ 7]
[-3  1 -3  7  1], [0 0 0], [ 1]
]
sage: pullback.totensorTautbasis(2,vecout=true)
(-3, 1, -3, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 1, -3, 7, 1)

Computing the cycle of the hyperelliptic locus in genus 3:

sage: H=Hyperell(3,0,0)   # not tested

The cycle of hyperell. curves of genus 3 with 0 marked fixed points of the involution and 0 marked pairs of conjugate points:

sage: H.toTautbasis() # not tested

We compare with the known expression H=9*lambda-delta_0-3*delta_1:

sage: g=3; n=0;
sage: reset_g_n(g, n)
sage: H2=9*lambdaclass(1)-(1/2)*irrbdiv()-3*sepbdiv(1,()) # not tested
sage: H2.toTautbasis() # not tested

Specifying Hurwitz cycles:

sage: G=PermutationGroup([(1,2)]) # G=Z/2Z
sage: H=HurData(G,[G[1],G[1]]) # not tested # this means there are two ramification points with stabilizer generated by G[1], the generator of G

The following identify the locus of bielliptic curves (C,p,q) with marked ramification points p,q in Mbar_{2,2} in terms of the generating set tautgens(2,2,3) of R^3(bar M_{2,2}):

sage: vbeta=Hidentify(2,H,vecout=true) # not tested
sage: vector(vbeta) # not tested

sage: H2=HurData(G,[G[1],G[1],G[0]]) # not tested

sage: G=PermutationGroup([(1,2)]) # not tested
sage: H=HurData(G,[G[1],G[1]]) # not tested

Identify the locus of bielliptic curves C, remembering none of the marked ramification points, inside bar M_{2,0}:

sage: Biell=Hidentify(2,H,markings=[]) # not tested
sage: Biell.toTautbasis(2,0,1) # not tested

sage: g=2;n=0
sage: reset_g_n(g, n)
sage: Biell2=3/4*irrbdiv()+ 3*sepbdiv(1,()) # not tested # this is the formula for the bielliptic locus known from the literature
sage: Biell2.toTautbasis(2,0,1) # not tested

Computing the Hurwitz Hodge integral int_[bar B_{2,2,0}] lambda_2:

sage: (Biell*lambdaclass(2,2,0)).evaluate() # not tested # = 1/48