# Weeks 8-10 (July 11-31)

In the last three weeks, my primary focus has been working on learning the background for and implementing resolution of singularities functionality for algebraic curves in Sage. There are just two weeks left in GSoC 2016 before the final evaluation week, August 15-23.

In the first week, I worked on trying to improve the efficiency of the ordinary model functionality in ticket #20895. The approach that’s being tested now is to use resultants to avoid needing to explicitly compute the points at which curve intersects the exceptional lines when testing whether the curve is in excellent position. It still needs some more testing, but if it’s working properly, it will allow the ordinary model functionality to work for curves defined over number fields, rather than requiring them to be defined over the algebraic closure of the rationals, $\overline{\mathbb{Q}}$, which is costly to work over in Sage. The function that computes the ordinary models still depends on some QQbar computations when finding singular points, and it seems it would be helpful to implement a function to compute a “splitting field” for a zero-dimensional subscheme over a number field, that is, an extension of the base field over which all rational points of the subscheme can be found.

However, the highest priority right now, and for the last two weeks, has been to implement functionality to compute nonsingular models of curves. The most practical approach to doing this seems to be to repeatedly blow up the singularities of a curve until they are resolved. This first requires that functionality for blowing up a curve at a point is implemented.

Blowing up a variety along a subvariety can be defined generally as follows: suppose $X$ is a variety, and $Y\subseteq X$ is a subvariety. Suppose $I(Y) = (f_{0},\ldots,f_{m})$ for some $f_{i}\in A(X)$, where $A(X)$ is the coordinate ring of $X$. Define the map $\phi : X\rightarrow \mathbb{P}^{m}$ by $x\mapsto (f_{0}(x) : \ldots : f_{m}(x))$ for each $x\in X$. This is a rational map (regular when restricted to $X\setminus Y$). Define the blow up of $X$ along $Y$ to be $B_{Y}(X) = \overline{\{(x,y)\in (X\setminus Y)\times\mathbb{P}^{m}\mid x\in X, y = \phi(x)\}}\subseteq X\times\mathbb{P}^{m}$, that is, the closure of the graph of $\phi$ in the product space $X\times\mathbb{P}^{m}$. This construction can be shown to be independent of the choice of generators for $I(Y)$.

To illustrate this in a specific case, consider the example of blowing up affine space $\mathbb{A}^{n}$ at the origin $O$. Our map $\phi$ would be defined $(x_{1},\ldots,x_{n})\mapsto (x_{1} : \ldots : x_{n})$, and the closure of its graph in $\mathbb{A}^{n}\times\mathbb{P}^{n-1}$ would be the zero locus of the polynomials $x_{i}y_{j} - x_{j}y_{i}$ for $i\in\{1,\ldots,n\}$ where the $y_{i}$ are homogeneous coordinates for $\mathbb{P}^{n-1}$. We can consider the projection map $\pi : B_{O}(\mathbb{A}^{n})\rightarrow \mathbb{A}^{n}$ defined $(x,y)\mapsto x$. When restricted to the graph of $\phi$, the map $\pi$ is a bijection. Outside of the graph, $B_{O}(\mathbb{A}^{n})$ contains a copy of $\mathbb{P}^{n-1}$, that is, $\pi^{-1}(O) = O\times\mathbb{P}^{n-1}$. In general, for a blow up $B_{Y}(X)$ as defined earlier, this inverse image is known as the exceptional divisor of the blow up. Intuitively, blowing up $\mathbb{A}^{n}$ at the origin has the effect of replacing the origin with a copy of $\mathbb{P}^{n-1}$.

Next consider the example of blowing up the curve $y^2 - x^3$ in $\mathbb{A}^{2}$ at the origin. We can describe the blow up as the zero locus of $y^2 - x^3$ and $xt - yu$ in $\mathbb{A}^{2}\times\mathbb{P}^{1}$, where $u,t$ are homogeneous coordinates for $\mathbb{P}^{1}$. To visualize what’s happening, we can use the two standard affine charts of $\mathbb{A}^{2}\times\mathbb{P}^{1}$ corresponding to $u\neq 0$ and $t\neq 0$. When $u\neq 0$, we can set $u = 1$, and so we have that $y = xt$, and thus that $x^2t^2 - x^3 = 0$. Factoring this we have $x^2(t^2 - x)$, thus the blow up in this affine chart is the union of the curves $x^2$ and $t^2 - x$ in $\mathbb{A}^{2}$ with coordinates $x,t$. The curve $x^2$ corresponds to the exceptional divisor. Repeating this for the affine chart $t\neq 0$ yields the curves $y^2$, $1 - yu^3$ in $\mathbb{A}^{2}$ with coordinates $y,u$. Note that both $t^2 - x$ and $1 - yu$ are both nonsingular curves; thus blowing up had the effect of resolving the singularity that $y^2 - x^3$ has at the origin.

This approach of using affine charts to represent the blow up of a curve at a point is the approach that’s we’re currently trying for resolution of singularities. The ticket for implementing blow ups for curves is #21085. Progress so far has been to implement the blow up functionality for affine curves only. Using the current implementation to blow up the curve $y^2 - x^3$ at $(0,0)$ gives:

sage: A.<x,y> = AffineSpace(QQ, 2)
sage: C = Curve([y^2 - x^3], A)
sage: Q = A([0,0])
sage: C.blowup(Q)
([Affine Plane Curve over Rational Field defined by z1^2 - z0,
Affine Plane Curve over Rational Field defined by -z0*z1^3 + 1],
[[Scheme endomorphism of Affine Space of dimension 2 over Rational Field
Defn: Defined on coordinates by sending (z0, z1) to (z0, z1),
Scheme endomorphism of Affine Space of dimension 2 over Rational Field
Defn: Defined on coordinates by sending (z0, z1) to (z0*z1, 1/z1)],
[Scheme endomorphism of Affine Space of dimension 2 over Rational Field
Defn: Defined on coordinates by sending (z0, z1) to (z0*z1, 1/z1),
Scheme endomorphism of Affine Space of dimension 2 over Rational Field
Defn: Defined on coordinates by sending (z0, z1) to (z0, z1)]])
The maps in the second element of the tuple that’s returned are the transition maps between the affine charts. These indicate how the charts should be glued together in order to get a single variety representing the blow up. This is the main issue that we currently face: what information is necessary to support multiple blow ups using this affine chart approach.
For projective curves, there’s another option for representing the blow up. The blow up of a projective variety can be represented as a subvariety of a product of projective spaces, and in turn can be realized as a projective variety by using the Segre embedding. However, doing this quickly becomes impractical for applying multiple blow ups since the dimension of the projective ambient space will grow quickly.
Other than resolution of singularities, the second major goal for the remaining time in GSoC is to implement functionality for computing rational parameterizations of rational curves. It can be proven that any projective (resp. affine) curve with geometric genus zero is birational to $\mathbb{P}^{1}$ (resp. $\mathbb{A}^{1}$). Such curves are called rational. In the case of projective curves, such a map from $\mathbb{P}^{1}$ to the curve can be given by a tuple of homogeneous polynomials in two indeterminants, and these polynomials give a parameterization of the curve. For an affine curve, the map from $\mathbb{A}^{1}$ can be given by a tuple of elements of the fraction field of a polynomial ring in one indeterminant.
Our task is to, given a rational projective/affine curve, compute a parameterization for it. It turns out that an algorithm for doing so has already been implemented in Singular, and this implementation appears to be working well so the hard work has already been done. The goal of ticket #21137 is to add this functionality to Sage, and maybe implement some additional functionality for working with parameterizations, such as given a parameterization, compute the defining ideal of the curve it defines (this can be done with elimination theory).
Here’s some examples of the current projective/affine functionality in #21137:
sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: C = Curve([y^2*z - x^3], P)
sage: C.rational_parameterization()
(s^2*t, s^3, t^3)
sage: A.<x,y> = AffineSpace(QQ, 2)
sage: C = Curve([(x^2 + y^2 - 2*x)^2 - x^2 - y^2], A)
sage: C.rational_parameterization()
((-12*t^4 + 6*t^3 + 4*t^2 - 2*t)/(-25*t^4 + 40*t^3 - 26*t^2 + 8*t - 1),
(-9*t^4 + 12*t^3 - 4*t + 1)/(-25*t^4 + 40*t^3 - 26*t^2 + 8*t - 1))