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