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, , 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 is a variety, and is a subvariety. Suppose for some , where is the coordinate ring of . Define the map by for each . This is a rational map (regular when restricted to ). Define the blow up of along to be , that is, the closure of the graph of in the product space . This construction can be shown to be independent of the choice of generators for .

To illustrate this in a specific case, consider the example of blowing up affine space at the origin . Our map would be defined , and the closure of its graph in would be the zero locus of the polynomials for where the are homogeneous coordinates for . We can consider the projection map defined . When restricted to the graph of , the map is a bijection. Outside of the graph, contains a copy of , that is, . In general, for a blow up as defined earlier, this inverse image is known as the exceptional divisor of the blow up. Intuitively, blowing up at the origin has the effect of replacing the origin with a copy of .

Next consider the example of blowing up the curve in at the origin. We can describe the blow up as the zero locus of and in , where are homogeneous coordinates for . To visualize what’s happening, we can use the two standard affine charts of corresponding to and . When , we can set , and so we have that , and thus that . Factoring this we have , thus the blow up in this affine chart is the union of the curves and in with coordinates . The curve corresponds to the exceptional divisor. Repeating this for the affine chart yields the curves , in with coordinates . Note that both and are both nonsingular curves; thus blowing up had the effect of resolving the singularity that 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 at 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)]])

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))