# Chow - A Sage library for computations in intersection theory

## Description

*Chow* is a SAGE package for computations in
intersection theory, written together with Manfred
Lehn. It is inspired and
based on the beautiful Maple library
*Schubert*, of
*Sheldon Katz* and *Stein Arild Strømme*.

*Chow* is written in python and makes essential use of
*Singular* via its interface to SAGE.
Working with Singular and Sage instead of Maple considerable simplifies
the algorithms and in particular allows to compute the
Chow ring of a blowup by
generators and relations.

We have written then used the package to compute the Euler number of the compact holomorphicially symplectic manifold of dimension eight constructed in Twisted cubics on cubic fourfolds.

Even though inspired by Schubert, this package was written pretty much
from scratch.
Whereas we are quite sure that the computation of the above Euler number is
correct and that we tested quite carefully the methods of this package it is of
course possible if not likely that some bugs remain. If you find one, please
contact the authors. In short: *use at your own risk*!

If you use
*Macaulay2*, use the package
*Schubert2*!

## Steiner’s question

A classical example is to compute the number of smooth plane conics
tangent to five general conics (this was a question of Steiner in 1848).
Each tangency is a degree \(6\) condition on the \(\mathbb{P}^5\) of *all* conics.
To handle double lines, one blows up the Veronese surface in this \(\mathbb{P}^5\),
then computes the integral of \((6H-2E)^5 \) where \(E\) is the exceptional
divisor. In Chow this is done as follows:

```
sage: P2 = Proj(2, 'k')
sage: P5 = Proj(5, 'h')
sage: f = P2.hom(['2*k'], P5)
sage: g = Blowup(f)
sage: B = g.codomain()
sage: (e, h) = B.chowring().gens()
sage: ((6*h - 2*e)^5).integral()
3264
```

Note that \(g\) is the morphism corresponding to the blow up and that the blow up itself it hence its codomain.

\[\begin{array}{ccc} E&\xrightarrow{g}&B\\ \downarrow&&\downarrow\scriptstyle{\sigma}{}\\ \mathbb{P}^2 & \xrightarrow{f} & \mathbb{P}^5 \end{array} \]

By the way, generators and relations as well as the tangent bundle can be retrieved as follows.

```
sage: B.chowring().gens()
(e, h)
sage: B.chowring().rels()
[h^6, e*h^3, e^3 - 9/2*e^2*h + 15/2*e*h^2 - 4*h^3]
sage: B.tangent_bundle().chern_classes()
[1, -2*e + 6*h, -15/2*e*h + 15*h^2, 9/2*e^2*h - 93/4*e*h^2 + 28*h^3, 27/4*e^2*h^2 + 27*h^4, 12*h^5]
sage: B.betti_numbers()
[1, 2, 3, 3, 2, 1]
sage: B.tangent_bundle().chern_classes()[5].integral() # The Euler number
12
```

## Twisted cubics on quintic threefolds

A more challenging example is the computation of the number of twisted cubics on a general quintic threefold.

According to a conjecture of Clemens [C, 1981], the number \(n_d\) of rational curves of degree \(d\) on a general quintic threefold is finite. As far as I understand, this is known thanks to work of S. Katz for \(d\leq 7\) [K], Johnson and Kleiman for \(d\leq 9\) [JK] and Cotteril for \(d=10\) [C1] and \(d=11\) [C2]. Using methods of string theory, Candelas et al [COGP] predicted in 1991 the virtual number of such curves for any \(d\). This has been proven in 1996 by Givental [G] using Gromov-Witten theory (the virtual number and \(n_d\) coincide for all \(d\) where the Clemens conjecture holds).

Here is how these numbers can be computed with /Chow/ for \(d=1, 2, 3\).
For \(d=1\) this number is classical; for \(d=2\) it is due to Katz
[K] and
for \(d=3\) to Ellingsrud and Stromme
[ES]. Especially this last
computation is challenging, even though straightforward now, thanks to the
ability of *Chow* to compute the full Chow ring of a blowup and its tangent
bundle.

Let \(\mathcal{H}_d\) be the component of the Hilbert scheme parameterizing rational degree \(d\) curves in \(\mathbb{P}^4\) (and their degenerations). If \(\mathcal{C}\subset\mathcal{H}_d\times\mathbb{P}^4\) is the universal curve and \(p\) and \(q\) are the projections, then the short exact sequence \(0\to\mathcal{I}_\mathcal{C}\to\mathcal{O}_{\mathcal{H_d}\times\mathbb{P}^4}\to \mathcal{O}_\mathcal{C}\to 0\) twisted by \(q^*(\mathcal{O}_{\mathbb{P}^4}(5))\) induces the short exact sequence

\[0\to p_*\mathcal{I}_\mathcal{C}(5)\to H^0(\mathbb{P}^4,\mathcal{O}_{\mathbb{P}^4}(5))\otimes_{\mathbb{C}} \mathcal{O}_{\mathcal{H}_d}\to p_*\mathcal{O}_\mathcal{C}(5)\to R^1p_*\mathcal{I}_\mathcal{C}(5)\to 0. \]

If \(s\in H^0(\mathbb{P}^4,\mathcal{O}_{\mathbb{P}^4}(5))\), then the induced section in \(p_*\mathcal{O}_\mathcal{C}(5)\) vanishes precisely in those curves [C] of \(\mathcal{H}_d\) contained in the quintic defined by \(s\). Suppose \(d\leq 3\). Then \(R^1p_*\mathcal{I}_\mathcal{C}(5)=0\) and \(p_*\mathcal{O}_\mathcal{C}(5)\) is a vector bundle of rank \(\dim\mathcal{H}\) hence

\[\]

If \(d=1\) then \(\mathcal{H}_1\) is the Grassmannian of lines in \(\mathbb{P}^4\) and \(p_*\mathcal{O}_\mathcal{C}(5)=S^5Q\) where \(Q\) is the canonical rank \(2\) quotient bundle:

```
sage: H = Grass(5, 2) # lines in P4
sage: Q = H.sheaves["universal_quotient"]
sage: Q.symm(5).chern_classes()[H.dimension()].integral()
2875
```

If \(d=2\), as every conic [\(C\)] \(\in\mathcal{H}_2\) spans a unique plane \(\langle C\rangle\subset\mathbb{P}^4\), there is a map \(f\) to the Grassmannian of 2-planes in \(\mathbb{P}^4\) with fibres the conics in the corresponding \(\mathbb{P}^2\). Hence \(\mathcal{H}_2=\mathbb{P}(S^2Q^*)\) where \(Q\) is the canonical rank \(3\) quotient bundle. Katz showed that \(p_*\mathcal{O}_\mathcal{C}(5)=f^*S^5Q\,\diagup\,(f^*S^3Q\otimes\mathcal{H}_2(-1))\):

```
sage: G = Grass(5, 3) # 2-planes in P4
sage: Q = G.sheaves["universal_quotient"]
sage: H = ProjBundle(Q.symm(2).dual())
sage: f = H.base_morphism() # H -> G
sage: A = f.upperstar(Q.symm(5)) - f.upperstar(Q.symm(3)) * H.o(-1)
sage: A.chern_classes()[H.dimension()].integral()
609250
```

If \(d=3\), every (generalized) twisted cubic [\(C\)] \(\in\mathcal{H}_3\) spans a hyperplane in \(\mathbb{P}^4\), hence there is a map \(\mathcal{H}_3\to\mathbb{P}^{4\vee}\) with fibres the component \(H_3\) of the Hilbert scheme parameterizing (generalized) twisted cubics in the corresponding \(\mathbb{P}^3\).

The component \(H_3\) had been previously described by Ellingsrud, Piene and Stromme: any curve [\(C\)] \(\in H_3\) determines a net \(H^0(\mathbb{P}^3,\mathcal{I}_C(2)) \subset H^0(\mathbb{P}^3,\mathcal{O}_{\mathbb{P}^3}(2))\) of quadrics. Hence, if \(X\subset Grass(3,H^0(\mathbb{P}^3,\mathcal{O}_{\mathbb{P}^3}(2))\) denotes the image, we get a map \(\sigma:H_3\to X\). Then \(\sigma\) is identified in [EPS] as the blowup of \(X\) along an incidence variety \(I\subset X\). This construction can be made relative to \(\mathcal{H}_3\to\mathbb{P}^{4\vee}\) and the resulting description is used to compute the above top Chern class.

In *Chow* we wrote a library, twisted
cubics, which defines
\(X\), \(I\) and \(f:I\to X\) relative to any base:

```
sage: P = Grass(1, 5, 'w')
sage: W = P.sheaves["universal_quotient"]
sage: f = map_incidence_to_nets_of_quadrics(W)
```

In order to obtain \(\mathcal{H}\) it is then sufficient to compute the blowup of \(f\):

```
sage: g = Blowup(f)
sage: Exc, H = g.domain(), g.codomain()
```

Finally it is enough to use the exact sequence (6-1)

\[0\to g_*\mathcal{A}_{Exc}\to\sigma^*\mathcal{A}_X \to p_*\mathcal{O}_\mathcal{C}(5)\to 0 \]

of [ES] and the explicit description of \(\mathcal{A}_{Exc}\) and \(\mathcal{A}_X\) given there to compute as follows:

```
sage: K1, K2 = I.sheaves["K1"], I.sheaves["K2"]
sage: L1, L2 = I.sheaves["L1"], I.sheaves["L2"]
sage: Q = L1 + K2.dual()
sage: Exc_Q = Exc.base_morphism().upperstar(Q)
sage: Exc_K1 = Exc.base_morphism().upperstar(K1)
sage: AExc = Exc_Q.symm(2) * Exc_K1.determinant() * Exc.o(-1)
sage: AExcH = g.lowerstar(AExc, normal_bundle=Exc.o(-1))
sage: E, F = X.sheaves["E"], X.sheaves["F"]
sage: XW = X.base_morphism().upperstar(W)
sage: AX = (F * XW.symm(2)) - (E * XW.symm(3)) + XW.symm(5)
sage: AXH = H.base_morphism().upperstar(AX)
sage: (AXH - AExcH).chern_classes()[H.dimension()].integral()
317206375
```

## Installation

Chow is now a branch in the sage source code. Installation may be done as follows:

```
$ git clone git://github.com/sagemath/sage.git
Cloning into ...
$ cd sage
$ git checkout master
$ git remote add trac git://trac.sagemath.org/sage.git -t master
$ git fetch trac u/gh-sorger-c/chow
$ git checkout -b t/27228/chow FETCH_HEAD
$ git merge master
$ make
```

The last command compiles sage, hence takes a lot of time. Once compiled, you may test that chow works as expected by running all its tests.

```
$ ./sage -t src/sage/schemes/chow
[Running tests...]
```

## Documentation

As the documentation ware generated automatically through python’s `docstrings`

,
the html and pdf files are produced at the same time. In particular the pdf file
gets quite long this way (around 100 pages) even if the heart of the
documentation is shorter. This documentation is from the initial release but
still valid.

As all packages of Sage and Sage itself, /Chow/ is modular and easy to extend with your preferred manifold or method. Send me a patch to integrate it.