Stop Staring and Compute! Automorphism Groups of Rational Curves

Let’s compute the automorphism groups of some curves. There are many ways to do this! We will be using 3 different algorithms for this.

Directly into your terminal using SageMath

Let’s start with the most straightforward one. Run sage and type this into your terminal, hitting enter after each line.


Technical P.S.: For sufficiently high degree curves, this will throw a segmentation fault. One must then narrow down where it is coming from. There are three hidden steps before the endomorphism basis calculation, so look for which it is throwing an error:

_ = S.homology_basis() # [1]
_ = S.cohomology_basis() # [2]
_ = S.period_matrix() # [3]

Sage Function for Rational Curves

Let’s start with the most straightforward one. Save this file, and start sage in the same folder. Then, load(“file.sage”) will run the program. This is just a rephrasing of the previous method.

from sage.schemes.riemann_surfaces.riemann_surface import RiemannSurface, RiemannSurfaceSum
R.<x,y> = QQ[]
def aut(f):
        S = RiemannSurface(f, prec = 100)
            	G = S.symplectic_automorphism_group()
                print("OH LAWD ITS COMING")
#any plane curve goes here
f = y^8 - x*(x-1)^4

Alternative code

We can also do:

f2 = any plane curve
f1 = hyperelliptic curve of same genus
S1 = RiemannSurface(f1, prec = 100)
T = RiemannSurfaceSum([ S1 ])
T.tau = S2.riemann_matrix()

Finding Group Structure of Output Set

We get the following matrix output. Then, we clean the matrix output, and declare it to be a group in GAP (gap-core as a linux package). GAP then returns a structure description.

([ 0 0 1 -1]
[ 0 0 -1 0]
[ 0 1 1 0]
[ 1 1 0 1], [ 1 0 -1 1]
[ 0 1 1 0]
[ 0 -1 0 0]
[-1 -1 0 0], [ 1 1 0 1]
[-1 0 1 -1]
[ 0 -1 -1 1]
[-1 -1 -1 0], [ 0 -1 -1 1]
[ 1 1 1 0]
[-1 -1 0 -1]
[-1 0 1 -1], [ 0 0 0 -1]
[ 0 0 -1 1]
[ 1 1 1 0]
[ 1 0 0 1], [ 1 0 0 1]
[ 0 1 1 -1]
[-1 -1 0 0]
[-1 0 0 0], [ 0 0 -1 1]
[ 0 0 0 -1]
[ 1 0 0 1]
[ 1 1 1 0], [ 0 0 -1 0]
[ 0 0 1 -1]
[ 1 1 0 1]
[ 0 1 1 0], [ 1 1 1 0]
[ 0 -1 -1 1]
[-1 0 1 -1]
[-1 -1 0 -1], [ 1 0 -1 1]
[-1 -1 0 -1]
[ 1 1 1 0]
[ 0 1 1 -1], [ 0 -1 -1 1]
[-1 0 0 -1]
[ 1 0 0 0]
[ 1 1 0 0], [ 0 1 1 0]
[ 1 0 -1 1]
[-1 -1 0 0]
[ 0 -1 0 0], [0 1 0 0]
[1 0 0 0]
[0 0 0 1]
[0 0 1 0], [-1 0 0 0]
[ 1 1 0 0]
[ 0 -1 -1 1]
[ 1 0 0 1], [ 1 0 0 1]
[-1 -1 -1 0]
[ 0 0 1 -1]
[ 0 0 0 -1])

We clean this output with regex, or manually as follows:

  1. find ], [ replace ]],[[
  2. find /n, replace ,
  3. find doublespace, replace space
  4. find [space, replace [
  5. find space replace ,
  6. find ,, replace ,
  7. find [, replace [
  8. change ([ and )] to ([[ and ]]) resp.
  9. Open gap and plug in:
G := Group([[0,0,1,-1],[0,0,-1,0],[0,1,1,0],[1,1,0,1]],[[1,0,-1,1],[0,1,1,0],[0,-1,0,0],[-1,-1,0,0]],[[1,1,0,1],[-1,0,1,-1],[0,-1,-1,1],[-1,-1,-1,0]],[[0,-1,-1,1],[1,1,1,0],[-1,-1,0,-1],[-1,0,1,-1]],[[0,0,0,-1],[0,0,-1,1],[1,1,1,0],[1,0,0,1]],[[1,0,0,1],[0,1,1,-1],[-1,-1,0,0],[-1,0,0,0]],[[0,0,-1,1],[0,0,0,-1],[1,0,0,1],[1,1,1,0]],[[0,0,-1,0],[0,0,1,-1],[1,1,0,1],[0,1,1,0]],[[1,1,1,0],[0,-1,-1,1],[-1,0,1,-1],[-1,-1,0,-1]],[[1,0,-1,1],[-1,-1,0,-1],[1,1,1,0],[0,1,1,-1]],[[0,-1,-1,1],[-1,0,0,-1],[1,0,0,0],[1,1,0,0]],[[0,1,1,0],[1,0,-1,1],[-1,-1,0,0],[0,-1,0,0]],[[0,1,0,0],[1,0,0,0],[0,0,0,1],[0,0,1,0]],[[-1,0,0,0],[1,1,0,0],[0,-1,-1,1],[1,0,0,1]],[[1,0,0,1],[-1,-1,-1,0],[0,0,1,-1],[0,0,0,-1]]); StructureDescription(G);

Check that this structure description matches the order claimed by this sage program. For context on how this works, see section 5.1 of this paper The reason numerical approximation is sound is listed in 5.3.

If you’d like to go even further, and compute the period matrix as well, the code for that is here., and section 5.2 of this paper

Sage Program for Superelliptic (only?) Curves

This is much faster than the previous code, was implemented by Bruin-Sijsling-Zotine, and is based on this algorithm from Molin-Neuhror . Unfortunately, I also find it quite finnicky sometimes, which is why I list it second.

Magma Program for Superelliptic Curves

Magma doesn’t throw segmentation faults as often. So, to use this, one must have magma on your machine (not just the magma calculation) as it is necessary to concurrently use must download this package of Edgar Costa.

SetVerbose("EndoFind", 0);
SetVerbose("CurveRec", 0);
prec := 300;
F := RationalsExtra(prec);
CC := F`CC;
R<x> := PolynomialRing(F);
p := x^4 - x;
e := 3;
// Construct superelliptic curve y^3 = x^4 - x
S := RiemannSurface(p, e : Precision := Precision(CC));
P := BigPeriodMatrix(S);
P := ChangeRing(P, CC);
GeoEndoRepCC := GeometricEndomorphismRepresentationCC(P);
GeoEndoRep := GeometricEndomorphismRepresentation(P, F);
print GeoEndoRep;

Old posts are being manually restored

During an update to the server in September and an issue with the backup system, the site was corrupted. Some posts have been totally lost. All previous comments have been totally lost.

I have been running this blog regularly since 2013. I am manually restoring the posts one by one. If you have a post you’d like to reference in particular, email me and I will prioritize putting that up.

The contents are somewhat available on the wayback machine in the meantime.

Honda, Taira, On the Formal Structure of the Jacobian Variety of the Fermat Curve over a \(p\)-adic Integer Ring

On the Formal Structure of the Jacobian Variety of the Fermat Curve over a \(p\)-adic Integer Ring, Symposia Mathematica Volume XI (Volume 11).

This paper of Honda was very hard for me to track down. It was not previously available digitally. I found it in a retired library volume in a thrift store in England. Hopefully, this digital copy will make it easier for others to enjoy Honda’s incredible insight and understanding of how to create power series in one variable with high amounts of arithmetic information, and in general of higher height formal group laws.

If the pdfviewer isn’t working, here is the link.

Hidden Structure

Beauty wilts
and love will flucture
what remains
is hidden structure

blushing primes
sly chiding knots
betwixt our thoughts

lives to create
chipping from
the ob’lisk slate

talk amoungst
our little selves
filling shelves

search we will
and see we’ll not
blindness is
our earthly lot

but the voice
of the void is vast
notice it
through the nets we cast

Fiber Bundles of Formal Disks

Here is an incomplete proof that varieties are fiber bundles of formal disks over their deRham Stacks. The fact makes intuitive sense, the deRham stack is the variety without infinitesimal data, and then by adding the infinitesimal data (formal disks) back in, you recover the result. However, the fact that you can build anything non infinitesimal out of formal disks fills me with confusion and awe.

Acknowledgements: This is the result of a working group with Dan Fletcher, Adam Holeman, and me as part of the Northwestern Homotopy Working Seminar (started by Matthew Weatherly, Grigory Kondyrev, and me). The working session in which Adam and I figured out the proof, Dan was not there, which is why his name is not mentioned, but he was very helpful in understanding the claim. This proof is the result of Yaroslav Khromenkov coming up with the idea of it, and Adam and I understanding and correcting his solution during a working session.

If the pdf viewer doesn’t work, here is a link to the paper.

Automorphisms of the Jacobian

Read our arxiv paper:

Here, \(A\) is any abelian variety. This post consists of the backstory of this paper, and something interesting I learned about the relationship between the size of \(Aut(A)\), and the number of principal polarizations \(A\) has.


In the summer of 2017, I wanted to compute a period matrix of a particular genus 3 curve, and I found a wonderful team of low dimensional geometers: Dami Lee and Matthias Weber. After they helped me, I read Dami’s work out of curiosity, and found her calculations of automorphism groups of curves fascinating due to their geometric simplicity. Further, it seemed that her methods of using a tesselation to compute or visualize and automorphism group would generalize naturally to higher dimensions. So, we set to work trying to figure that out. This led us to generalize her prior work on automorphism groups of curves (with equal weight weierstrass points) to a broader class of curves (with nonequal weight weierstrass points).

I was interested in her lovely descriptions of the automorphism groups and their actions as I was trying to use her work to model the action of a subgroup of the Morava Stabilizer group acting on Lubin Tate space. Turns out I will likely have to do this separately, because so much information changes about the automorphism group when you base change your curve from \(\mathbb{C}\) to \(\mathbb{F}_p\), and her methods only work of \(\mathbb{C}\) (relying on properties of Weierstrass points and so on).

In the interim, I separately looked into other ways to compute automorphisms of curves and their Jacobians, and ran into the work of Magma and Sage contributors Edgar Costa, John Voight, Nicolas Mascot, and Jeroen Sijsling. They had a program and paper to compute endomorphism groups of Jacobians, and I wanted to calculate automorphism groups (because, in the end, this is all for modeling subgroups of the Morava Stabilizer group, the automorphism group of a height n formal group law in char p). Together, we wrote a program that calculates the automorphism group of a Jacobian, given its period matrix. Several glitches later, and we realized that we were finding several different automorphism groups for the same Jacobian (as a period matrix), because there were several different automorphism groups — for the different principal polarizations. So, I found the “correct one” by putting in the information of the original plane curve as well. But this detour led us to find several interesting different principal polarizations….

Automorphism Groups and Narasimhan-Nori

…It also led me to learn about the following magic relationship between the size of an automorphism group of an abelian variety \(A\) and the number of its principle polarizations (this is from a paper of Lange: Abelian varieties with several principal polarizations).

I still do not understand the computability of the order of the set of interest \(\Pi(A)\) (the number of principal polarizations up to iso of \(A\)) according to Theorem 1.5:
Some notation:
Fix a principal polarization \(L_0: A \to \hat{A}\) ,
Given a map \(r \in Aut(A)\), let \(\hat{r}\) be the dual map in \(Aut(\hat{A})\)
Let \(’\) indicate the Rosati involution wrt \(L_0\), that is \(r’ := L_0^{-1} \circ r^ \circ L_0\)

Let us first look at the set of \(r \in Aut(A)\) such that the following two conditions are met:

(1) \(r’ = r\) (i.e., \(r\) is preserved under the Rosati involution wrt \(L_0\))
(2) the zeros of the minimal polynomial of \(r\) (wrt the rational embedding) are all positive.

Side comment:
(1) \(\Leftrightarrow\) \((r^g) = g!\) [lemma 1.2] (2) \(\Leftrightarrow\) \((L_0^{g-i} \cdot r^i) > 0\) [lemma 1.3] These conditions give us that \(r\) is a principal polarization by lemma 1.1

Once we have this set, call it \(U(A)\), let \(Aut(A)\) act on it:

\(Aut(A) \times U(A) \to U(A)\)
\((g, a) \mapsto g’ a g\)

where \(’\) indicates the rosati involution wrt \(L_0\).

We mod out the set \(U(A)\) by the above action of \(Aut(A)\), call this set \(\Pi(A)\).

And there we are!