mixedmath

Explorations in math and programming
David Lowry-Duda



Explicit equations for cubic surfaces

I want to look at smooth cubic surfaces in $\mathbb{P}^3\DeclareMathOperator{\Gal}{Gal}$ defined over $\mathbb{Z}$ (or equivalently, over $\mathbb{Q}$). By ''cubic surface'' here, I will always mean a smooth cubic surface in $\mathbb{P}^3$. Every smooth cubic surface has exactly $27$ lines. This is a famous fact that appears in many algebraic geometry books, but whose proof I only know mechanically. These lines are distinct, so there is no multiplicity-shenanigans going on. In general these lines won't be defined over $\mathbb{Z}$, they're defined over some number field $K / \mathbb{Q}$. It is a remarkable fact that as long as the surface is defined over $\mathbb{Q}$, the lines are defined over a number field $K$ of degree at most $51840$ over $\mathbb{Q}$.

In this note, I clarify some reasoning around cubic surfaces and their explicit computation as a blowup of $6$ points in $\mathbb{P}^2$.

Also available as a note

I wrote this first as a note and converted it for presentation here. The note is available here.

First Example

Every cubic surface is the blow up of $\mathbb{P}^2$ at $6$ points. All $27$ lines come from the $6$ points.

  1. There are $6$ lines coming from exceptional divisors (i.e. the free lines we get by blowing up $\mathbb{P}^2$ at each point).

  2. There are ${6 \choose 2} = 15$ lines coming from lines between two of the points.

  3. There are ${6 \choose 5} = 6$ lines coming from conics passing through $5$ of the six points.

Given six points in general position, we can write down one expression for the cubic surface by taking the subspace of cubic homogenous polynomials in three variables on $\mathbb{P}^2$ that vanish on those $6$ points.

Let's use the points $P_1, \ldots, P_6$ given by \[\begin{array}{lll} [1 : 1 : 0], & [1 : -1 : 0], & [1 : 0 : \sqrt{2}], \\ [1 : 0 : -1], & [0 : 1: 1], & [1 : 1 : 1]. \end{array}\]

We first begin with the $10$ dimensional space of cubic homogeneous polynomials in three variables on $\mathbb{P}^2$, written generically as \begin{equation*} F(x, y, z) = \sum_{i + j + k = 3} a_{ijk} x^i y^j z^k. \end{equation*} I fix an ordering of the monomials in order to do this completely concretely. I use dictionary ordering, with $x < y < z$, i.e. the $10$ basis monomials in order are \begin{equation*} x^3, x^2 y, x^2 z, x y^2, xyz, xz^2, y^3, y^2z, yz^2, z^3. \end{equation*} To find the subspace consisting of cubic homogenous polynomials that vanish at the $6$ given points, we compute the right kernel of the corresponding linear map. For example, vanishing at the point $[1 : 1 : 0]$ is equivalent to having $0$ dot product with the vector \begin{equation*} (1, 1, 0, 1, 0, 0, 1, 0, 0, 0) \end{equation*} (again, given in the order specified above). One such vector, for example, is $(1, 0, 0, -1, 1, -1, 0, 0, 0, 0)$.

Because I am forgetful, let's spell this out completely. We compute each monomial, in order, at $[1 : 1 : 0]$. For example, $x^3 = 1, x^2 y = 1, x^2 z = 0, x y^2 = 1$, which is why the vector begins $(1, 1, 0, 1, \ldots)$. Any vector that has $0$ dot product with this vector will then vanish: the claimed vector is $x^3 - xy^2 + xyz - xz^2$ (again, using the very specific ordering of monomials I fixed above). At $[1 : 1 : 0]$, this is $1 - 1 + 0 - 0 = 0$.

In total, we want to compute the (right) kernel of the matrix \begin{equation*} \begin{pmatrix} 1 & 1 & 0 & 1 & 0 & 0 & 1 & 0 & 0 & 0 \\ 1 & -1 & 0 & 1 & 0 & 0 & -1 & 0 & 0 & 0 \\ 1 & 0 & \sqrt{2} & 0 & 0 & 2 & 0 & 0 & 0 & 2 \sqrt{2} \\ 1 & 0 & -1 & 0 & 0 & 1 & 0 & 0 & 0 & -1 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \end{pmatrix}. \end{equation*} I do this in sage.

K.<sqrt2> = NumberField(x^2 - 2, embedding=1)
print(n(sqrt2))
# 1.41421...
mat = [
  [1, 1, 0, 1, 0, 0, 1, 0, 0, 0],
  [1, -1, 0, 1, 0, 0, -1, 0, 0, 0],
  [1, 0, sqrt2, 0, 0, 2, 0, 0, 0, 2 * sqrt2],
  [1, 0, -1, 0, 0, 1, 0, 0, 0, -1],
  [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
  [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
A = matrix(K, mat)
rk = A.right_kernel()
rk

This gives \begin{equation} {\small \mathrm{RowSpan}\left(\begin{array}{rrrrrrrrrr} 1 & 0 & 0 & -1 & -\frac{1}{2} \mathit{sqrt}_{2} + \frac{3}{2} & \frac{1}{2} \mathit{sqrt}_{2} - \frac{3}{2} & 0 & 0 & -\frac{1}{2} \mathit{sqrt}_{2} + \frac{1}{2} & \frac{1}{2} \mathit{sqrt}_{2} - \frac{1}{2} \\ 0 & 1 & 0 & 0 & -1 & 0 & -1 & 0 & 1 & 0 \\ 0 & 0 & 1 & 0 & \frac{1}{2} \mathit{sqrt}_{2} - 2 & -\frac{1}{2} \mathit{sqrt}_{2} + 1 & 0 & 0 & \frac{1}{2} \mathit{sqrt}_{2} & -\frac{1}{2} \mathit{sqrt}_{2} \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & -1 & 0 \end{array}\right) } \end{equation}

The four dimensional kernel has basis given by the four basis vectors above. We translate these using the monomial ordering. I'll do this in sage too.

order = ("x^3", "x^2 y", "x^2 z", "x y^2", "xyz",
         "x z^2", "y^3", "y^2 z", "y z^2", "z^3")

def prettify(row):
    ret = []
    for c, label in zip(row, order):
        if c:
            if c == 1:
                c = ''
            elif c == -1:
                c = '-'
            ret.append(f"{c}{label}")
    return " + ".join(ret)

for row in rk.matrix():
    prettify(row)

This gives the four basis elements \begin{align*} F_0 &= x^3 + -x y^2 + (-\tfrac12\sqrt2 + \tfrac32)xyz + (\tfrac12\sqrt2 - \tfrac32)x z^2 \\ &\quad + (-\tfrac12\sqrt2 + \tfrac12)y z^2 + (\tfrac12\sqrt2 - \tfrac12)z^3 \\ F_1 &= x^2 y + -xyz + -y^3 + y z^2 \\ F_2 &= x^2 z + (\tfrac12\sqrt2 - 2)xyz + (-\tfrac12\sqrt2 + 1)x z^2 + \tfrac12\sqrt2y z^2 + -\tfrac12\sqrt2z^3 \\ F_3 &= y^2 z + -y z^2. \end{align*} The corresponding cubic surface is (the Zariski closure of) the points \begin{equation*} [F_0(x, y, z) : F_1(x, y, z) : F_2(x, y, z) : F_3(x, y, z)] \subset \mathbb{P}^3, \end{equation*} ranging across points $(x : y : z) \in \mathbb{P}^2 \setminus \{ P_1, \ldots, P_6 \}$.

Proofs that show that blowing up $\mathbb{P}^2$ at six points yield a cubic surface will show that the map from $\mathbb{P}^2 \to [F_0 : F_1 : F_2 : F_3] \subset \mathbb{P}^3$ can be extended in a standard way to a map from the blowup $\mathrm{Blowup}_6(\mathbb{P}^2)$ to $\mathbb{P}^3$, and this extended map gives an isomorphism from the blowup to the cubic surface. A lot of the proof really seems to be just making sure that dimensions work out.

Galois action

The field of definition for the $6$ points in this example is $\mathbb{Q}(\sqrt{2})$. This has obvious Galois group $C_2$, with only nontrivial automorphism $\sigma:\sqrt{2} \mapsto - \sqrt{2}$.

Observe that $\sigma$ acts on the $6$ points $P_1, \ldots, P_6$. The only point with nontrivial Galois action is $P_3 = [1 : 0 : \sqrt{2}]$, which is sent to $P_3^\sigma = [1 : 0 : -\sqrt{2}]$. This gives a new set of $6$ points and leads to a different cubic surface.

In general, this shows that the Galois group of the field where the lines are defined acts on the space of cubic surfaces, sometimes sending one cubic surface to a different cubic surface. Initially this confused me — I thought that the Galois group was supposed to permute the lines and wanted to compute a little example where that happened. But here, it fixes $16$ lines and sends the other $11$ to completely different lines.

The underlying statement that the Galois action permutes the lines is true for rational surfaces, i.e. those cubic surfaces that are defined over $\mathbb{Q}$. And for these surfaces, it is true that each element of the Galois group simply permutes the lines. As a corollary, the surface defined over the points $P_1, \ldots, P_6$ is not rational.

This is hard to see because it's not obvious how the generators $F_0, \ldots, F_3$ relate to the surface. It's clear that if each of the generators is rational, then the surface is rational. We study the converse relationship now.

Generic rational cubic surfaces don't have rational generators

It seems nontrivial to state nice conditions on the generators to guarantee that the surface is rational. It's even harder to state nice conditions on the initial set of $6$ points to guarantee that the surface is rational.

We will prove the following.1 1I don't know if this appears in the literature. I don't speak algebraic geometry well enough to casually read the literature. But this is probably known and is probably obvious for deep reasons.

A generic rational cubic surface doesn't have rational generators $F_0, F_1, F_2, F_3$.

In practice, this tells that trying to enumerate rational cubic surfaces by enumerating nice collections of $6$ points and their resulting generators is probably not the right approach.

We will prove this proposition by proving the following partial contrapositive.

Let $X$ be a smooth cubic surface with rational generators $F_0, \ldots, F_3$. Suppose the minimal field of definition for the $27$ lines is $K$. Then $\Gal(K)$ is a subgroup of $S_6$.

A similar result is due to Arav Karighattam, who had been doing an MIT-PRIMES project with Yongyi Chen. I found Arav's slides [Kar-slides] very helpful when first thinking about this material. I don't know Arav's proof, but I imagine it was similar.

To apply this proposition, I first need to describe the group of automorphisms of configurations of the $27$ lines.

Aside from Hartshorne on configurations of lines

I summarize Remark 4.10.1 of Chapter 5 of [Hartshorne], and surrounding discussion.

By a configuration of $27$ lines, we mean a set of $27$ elements that I will label $E_i, F_{ij}, G_j$ and the incidence relations they satisfy. We do not track the surface, or indeed the actual intersection points (or even potential triple intersection points). The labels have the following meaning:

  1. The $E_i$ are $6$ mutually skew lines. $E_i$ does not meet $E_j$ for $i \neq j$.

  2. The $F_{jk}$ are 15 lines (choose $j$ and $k$ from $1$ to $6$, and order doesn't matter). The line $F_{jk}$ meets $E_i$ if and only if $i = j$ or $i = k$. The line $F_{ij}$ meets $F_{k\ell}$ if and only if all of $i, j, k, \ell$ are distinct.

  3. The $G_i$ are $6$ lines. The line $G_i$ meets $E_j$ if and only if $i \neq j$. The line $G_i$ meets $F_{jk}$ if and only if $i = j$ or $i = k$.

Choosing the mutually skew lines $E_1, \ldots, E_6$ fixes all other labellings. Counting the number of choices of $6$ mutually skew lines shows that the total number of possible automorphisms is equal to the size of $W(E_6)$, the Weyl group of type $E_6$. (Note the notation $W(E_6)$ is unrelated to the line $E_6$). In fact, this automorphism group is isomorphic to $W(E_6)$. This might have been proved by Jordan in the 1800s. It's been reproved by many people now.

Let $X$ be a cubic surface defined over a number field $F$. Suppose $K$ is the minimal extension over $F$ where the $27$ lines in $F$ are defined. Then $\Gal(K/F)$ embeds into the automorphism group of configurations of lines.

It is clear that $\Gal(K/F)$ acts on the lines and fixes the cubic surface. It suffices to show that the only element that acts like the identity permutation on the lines is the identity element in $\Gal(K/F)$.

Suppose for the sake of contradiction that $\sigma \in \Gal(K/F)$ (with $\sigma \neq 1$) fixes each of the $27$ lines. Then the equations for each of the $27$ lines are also fixed by $\sigma$, and therefore also by the subgroup generated by $\sigma$.

But then Galois theory says that the $27$ lines are defined over the fixed field of $\sigma$, which is a smaller field than $K$. This contradicts the minimality of $K$.

There is also a very general, much more high power result here.

For a generic rational cubic surface $X$, the Galois group of the field of definition of its $27$ lines is all of $W(E_6)$.

This is a well-known result. (I haven't studied the proof).

Proof of Propositions

Let's now prove our propositions.

First we prove Proposition 2.


In order for the generators $F_0, \ldots, F_3$ to be rational, the defining points $P_1, \ldots, P_6$ must be invariant as a set under $\Gal(\overline{\mathbb{Q}}/\mathbb{Q})$. In particular, the six exceptional lines coming from the six points of the blowup, $E_1, \ldots, E_6$, are also invariant as a set.

As described above, fixing the $6$ skew lines determines the rest of the automorphism of the configuration of $27$ lines. Thus the embedding from $\Gal(K)$ into $W(E_6)$ factors through $S_6$ (where $K$ is the minimal field of definition of the lines).$\diamondsuit$


Now the proof of Proposition 1 is immediate. If the generators $F_0, \ldots, F_1$ of a smooth cubic surface $X$ are rational, then the cubic surface is rational and its associated Galois group is a subgroup of $S_6$. But a generic smooth rational cubic surface has associated Galois group $W(E_6)$. Thus almost all smooth rational cubic surfaces don't have rational generators. $\diamondsuit$

The analogous statements where the base field is a number field instead of $\mathbb{Q}$ are also true (with rational replaced by $K$-rational), with essentially identical proofs. We didn't use rationality anywhere, and the high powered theorem is generic.

Computing the surface

We have now claimed that the surface isn't rational for Galois reasons. Let's actually compute the equation for the surface we get from blowing up the six points \begin{equation*} \begin{array}{lll} [1 : 1 : 0], & [1 : -1 : 0], & [1 : 0 : \sqrt{2}], \\ [1 : 0 : -1], & [0 : 1: 1], & [1 : 1 : 1]. \end{array} \end{equation*} A general cubic surface in $\mathbb{P}^3$ will be the zero set of a homogenous cubic polynomial of the form \begin{equation*} \sum_{\substack{i, j, k, \ell \\ i + j + k + \ell = 3}} a_{ijk\ell} X^i Y^j Z^k W^\ell. \end{equation*}

We will show that it's the surface defined by \begin{align*} X^2 W &+ (\tfrac{1}{2} \sqrt{2} - 2) XYW + (1 - \sqrt{2}) XZW + (\sqrt{2} - 3) X W^2 \\ &- Y^2 Z + Y Z^2 + (\tfrac{1}{2} \sqrt{2} - \tfrac{7}{2}) YZW - \tfrac{1}{2} \sqrt{2} Y W^2 \\ &+ (\tfrac{3}{2} - \tfrac{1}{2}\sqrt{2}) Z^2 W + (2 \sqrt{2} - 4) Z W^2 - W^3 = 0. \end{align*}

This is actually an exercise in understanding what things are and basic linear algebra — but what isn't?

As computed previously, the resulting four generators are \begin{align*} F_0 &= x^3 + -x y^2 + (-\tfrac12\sqrt2 + \tfrac32)xyz + (\tfrac12\sqrt2 - \tfrac32)x z^2 \\ &\quad + (-\tfrac12\sqrt2 + \tfrac12)y z^2 + (\tfrac12\sqrt2 - \tfrac12)z^3 \\ F_1 &= x^2 y + -xyz + -y^3 + y z^2 \\ F_2 &= x^2 z + (\tfrac12\sqrt2 - 2)xyz + (-\tfrac12\sqrt2 + 1)x z^2 + \tfrac12\sqrt2y z^2 + -\tfrac12\sqrt2z^3 \\ F_3 &= y^2 z + -y z^2. \end{align*}

Our strategy to determine a defining cubic homogeneous polynomial for this surface is very basic: we're going to generate lots of random points that must sit on this surface.

In slightly more detail: generate lots of points $Q = (X : Y : Z)$, compute the resulting points $P = (F_1(Q) : F_2(Q) : F_3(Q) : F_4(Q))$ that lie on our surface, think of the monomials $X^i Y^j Z^k W^\ell$ as a basis and evaluate each of these points along our basis to build our matrix. If we chose $19$ points in general position, this would uniquely determine our system. But I don't want to worry about general position, so instead I'll just compute $30$ or so. (This is enough in practice). The resulting matrix should have rank $19$, and the kernel should have rank $1$. The kernel will then give our surface.

I do this in sage.

First we recreate the right kernel from before.

K.<sqrt2> = NumberField(x^2 - 2, embedding=1)
print(n(sqrt2))
# 1.41421...
mat = [
  [1, 1, 0, 1, 0, 0, 1, 0, 0, 0],
  [1, -1, 0, 1, 0, 0, -1, 0, 0, 0],
  [1, 0, sqrt2, 0, 0, 2, 0, 0, 0, 2 * sqrt2],
  [1, 0, -1, 0, 0, 1, 0, 0, 0, -1],
  [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
  [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
A = matrix(K, mat)
rk = A.right_kernel()
fmat = rk.matrix()

Instead of working with polynomials, we'll use vectors in increasing dictionary order. We need both $\mathbb{P}^3$ indices (using $X < Y < Z < W$) and $\mathbb{P}^2$ indices (using $X < Y < Z$). I make both of these orderings in python using python's itertools. (This is actually very straightforward, but I know that itertools looks like programming nonsense from the outside).

import itertools
indices = list(
    index for index in
    itertools.product(range(4), repeat=4)
    if sum(index) == 3
)
indices.reverse()

findices = list(
    index for index in
    itertools.product(range(4), repeat=3)
    if sum(index) == 3
)
findices.reverse()

Now findices is the list \begin{equation*} (3, 0, 0), (2, 1, 0), (2, 0, 1), (1, 2, 0), (1, 1, 1), (1, 0, 2), (0, 3, 0), (0, 2, 1), (0, 1, 2), (0, 0, 3), \end{equation*} which are the powers of $X, Y, Z$ respectively in increasing dictionary order. Similarly, indices is the list of $4$-tuples in increasing dictionary order, \begin{equation*} (3, 0, 0, 0), (2, 1, 0, 0), \ldots, (0, 0, 1, 2), (0, 0, 0, 3). \end{equation*} Given a point $(X : Y : Z) \in \mathbb{P}^2$, I evaluate each of the $10$ monomials at this point and store them in a vector.

def p2_to_f_vector_input(x, y, z):
    if x == 0 and y == 0 and z == 0:
        raise ValueError("All cannot be zero")
    ret = []
    for i, j, k in findices:
        ret.append([x^i * y^j * z^k])
    return matrix(K, ret)

# Example - evaluate at (1 : 2 : 3)
v = p2_to_f_vector_input(1, 2, 3)
# (1, 2, 3, 4, 6, 9, 8, 12, 18, 27)  # (as a 2d matrix)

One can check by hand that the monomials, in order, at the point $(1 : 2 : 3)$ yield the vector \begin{equation*} (1, 2, 3, 4, 6, 9, 8, 12, 18, 27). \end{equation*} For example, $X^3 = 1^3 = 1, X^2 Y = 1^2 \cdot 2 = 2$, and so on. This is the vector $v$ above, which I include only for demonstration.

The value of the generators $[F_0 : F_1 : F_2 : F_3]$ at $(1 : 2 : 3)$ is then given by $\mathrm{fmat} \cdot v$ in my notation above. (It's just matrix multiplication, and I'm being pedantic because I had to think it through for a second).

Given a point $[X : Y : Z : W] \in \mathbb{P}^3$, I similarly want to evaluate it at each of the $20$ monomials there. I write this snippet to work with the outputs of p2_to_f_vector_input, so it will take in a matrix.

def p3_to_row(p3mat):
    x, y, z, w = p3mat.transpose()[0]
    ret = []
    for i, j, k, ell in indices:
        ret.append(x^i * y^j * z^k * w^ell)
    return ret

Finally, we assemble it all together. I generate $30$ random points in $\mathbb{P}^2$, compute the values of $F_i$ at those points, build the associated matrix, and check that its rank is $19$.

rows = []
for _ in range(30):
    rows.append(
        p3_to_row(fmat * p2_to_f_vector_input(
            randint(1,20), randint(1,20), randint(1,20)
        ))
    )
smat = matrix(K, rows)
print(smat.rank())
# 19 on this run — note there is randomness!
# You could in principle get unlucky.

# The cubic surface is encoded in the (right) kernel of this matrix.
print(smat.right_kernel())

Here, the right kernel is one-dimensional and generated by \begin{equation*} {\small (0,0,0,1,0,0,\tfrac12\sqrt{2} - 2,0,-\sqrt{2} + 1,\sqrt{2} - 3, 0,-1,0,1,\tfrac12\sqrt{2} - \tfrac72,-\tfrac12\sqrt{2},0,-\tfrac12\sqrt{2} + \tfrac32, 2\sqrt{2}- 4,-1). } \end{equation*} This is exactly the claimed equation: \begin{align*} X^2 W &+ (\tfrac{1}{2} \sqrt{2} - 2) XYW + (1 - \sqrt{2}) XZW + (\sqrt{2} - 3) X W^2 \\ &- Y^2 Z + Y Z^2 + (\tfrac{1}{2} \sqrt{2} - \tfrac{7}{2}) YZW - \tfrac{1}{2} \sqrt{2} Y W^2 \\ &+ (\tfrac{3}{2} - \tfrac{1}{2}\sqrt{2}) Z^2 W + (2 \sqrt{2} - 4) Z W^2 - W^3 = 0. \end{align*}

We confirm that this isn't rational.

Second example

Let's use the $6$ points $P_1, \ldots, P_6$ given by \begin{equation*} \begin{array}{lll} [1 : 1 : 0], & [1 : -1 : 0], & [1 : 0 : \sqrt{2}], \\ [1 : 0 : -\sqrt{2}], & [0 : 1: 1], & [1 : 1 : 1]. \end{array} \end{equation*} The set of these points are fixed under the action of the Galois group of the defining field $\mathbb{Q}(\sqrt 2)$. Analogous code (changing only the line of the matrix corresponding to $P_4$) gives the generators

\begin{align*} F_0 &= x^3 + -x y^2 + \tfrac12xyz + -\tfrac12x z^2 \\ F_1 &= x^2 y + -xyz + -y^3 + y z^2 \\ F_2 &= x^2 z + -xyz + \tfrac12y z^2 + -\tfrac12z^3 \\ F_3 &= y^2 z + -y z^2. \end{align*}

The map $\mathbb{P}^2 \longrightarrow [F_0 : F_1 : F_2 : F_3] \subset \mathbb{P}^3$ is now obviously birational (as is the extended map from the blowup at $6$ points).

The induced automorphism on the configuration of lines from $\sigma : \sqrt{2} \mapsto - \sqrt{2}$ is exactly the configuration change that comes from transposing $P_3 = [ 1 : 0 : \sqrt{2} ]$ and $P_4 = [ 1 : 0 : -\sqrt{2} ]$ (with a corresponding transformation of the other lines coming from swapping the $3$ and $4$ indices). This corresponds to an obvious embedding of $C_2$ into $S_{27}$.

Continuing as above (generating $30$ random points, assembling the matrix, verifying that the rank is $19$, and then taking a basis for the kernel) shows that the surface is given by \begin{align*} X^2 W &- XYW - XZW - X W^2 - Y^2 Z + Y Z^2 \\ &- \tfrac{5}{2} YZW - \tfrac{1}{2} YW^2 + Z^2 W - Z W^2 - \tfrac{3}{4} W^3 = 0. \end{align*}

This is a rational surface.

Bibliography


Leave a comment

Info on how to comment

To make a comment, please send an email using the button below. Your email address won't be shared (unless you include it in the body of your comment). If you don't want your real name to be used next to your comment, please specify the name you would like to use. If you want your name to link to a particular url, include that as well.

bold, italics, and plain text are allowed in comments. A reasonable subset of markdown is supported, including lists, links, and fenced code blocks. In addition, math can be formatted using $(inline math)$ or $$(your display equation)$$.

Please use plaintext email when commenting. See Plaintext Email and Comments on this site for more. Note also that comments are expected to be open, considerate, and respectful.

Comment via email