How would you advise a student who has talents in both the computational and theoretical aspects of algebraic number theory? There is no hard border between computational and theoretical algebraic number theory, but there is a definite computational number theory community with its own norms and expectations. While I interact with this world, I am not a part of it, and so I don’t necessarily have the best practical advice to offer such a student. So instead of just guessing, I emailed a few people (including Drew Sutherland and John Voight) who graciously sent me a number of suggestions. Below is a lightly edited version of Drew’s email (incorporating some of John’s responses), posted with permission: I think there is some great advice here for both students and advisors! One comment I would like to amplify is the idea of spending time engaging with experts in the field. This is a useful suggestion for anyone in mathematics. It can certainly be terrifying for a fresh graduate student to put themselves out there and talk to the famous experts, but that of course is why it is important for senior people to make the effort to interact with junior people. (No doubt some areas of mathematics have more approachable famous people than others; computational number theory seems to be a pretty friendly place.) Finally, it is incumbent upon me as an advisor to note that my student Shiva Chidambaram (expected graduation 2021) will indeed be giving a talk at ANTS this year. If you are (virtually) attending ANTS this year, please consider both going to this talk and also saying hello to Shiva!
- Learn how to use Magma, Pari/GP, and Sage well. Each of these tools has particular strengths and there will almost certainly come a time when you want to be able to take direct advantage of them. In addition to your own research, if you are marketing yourself as a computational person you need to be prepared for random computational requests that may fall well outside your mathematical expertise; if you know the right button to push you can still come out looking like a genius.
- Should I be using a low level programming language like C/C++ and learning how to exploit libraries like GMP, Pari, FLINT, or NTL?
This might eventually become important, but unless you have a project that would benefit from some serious computational horsepower, I wouldn’t burn a lot of time writing (or learning to write) low level code right now. But if you do have such a project (or have an advisor who can suggest one), then by all means, swing for the fences! Nothing better demonstrates your computational chops than computing something no one else has been able to compute. But I should note that this doesn’t necessarily require writing any low level code, a better algorithm that cleverly leverages functionality built in to Magma, Pari/GP, or Sage may achieve the same result. - Make it your goal to deliver a talk at a major workshop or conference focused on computational number theory or explicit methods, such as the Algorithmic Number Theory Symposium (ANTS). Your future employer probably won’t be represented there, but you will get a chance to join a network of people who can really help you, both with your immediate job search and in the longer term. ANTS VIII was my first mathematics conference, and looking at the participant list twelve years later I can count at least twenty names of people who have played a direct role in my career as co-authors, co-editors, co-organizers, or mentors in some form. Ideally your talk will also lead to or be based on a publication, but making connections is really the crucial thing when you are getting started, I can trace eight of the papers I wrote in the years immediately following ANTS VIII directly to conversations or people I met there.
It’s worth noting that as a young computational number theorist you are an ideal collaborator; you have the ability to make the mathematical ideas of others explicit in a way they may not be able to, and you likely have more time to devote to new projects than more senior collaborators (they will have other projects in progress, students to supervise, and myriad administrative obligations). But to make this work in your favor you have to network, and you need to be able to take a project and run with it.
- In order to achieve (3) you need an interesting research result to present. A good way to get started is to attend a project-based summer school or research workshop (not a conference), ideally one that has a mix of graduate students, post-docs, and more senior people. There are usually a few of these each year, often at places like MSRI or ICERM; one to keep an eye out for is the IAS/PCMI summer program on Number Theory Informed by Computation, which was meant to take place this summer but is now likely to happen in the summer of 2021 or 2022.
- Create a professional webpage that showcases your work and research interests, especially things you have computed. Don’t rely on the profile page you might have on your institution’s web site; you will soon be leaving and you need to establish your own brand. Every mathematician looking to attract invitations to give talks and eventually a job offer should do this, but if you are going to sell yourself as someone with computational expertise it is especially important that you have a credible web presence.
- Deposit your code and results on GitHub. Here I am simply going to repeat the excellent advice of my colleague John Voight: “this signals a level of seriousness, transparency, and a desire to share that is important in a collaborative working environment”.
- Prove theorems! If you are going to call yourself a mathematician this should go without saying, but it is worth emphasizing. As John Voight has also noted, proving theorems about your algorithms not only establishes results that may be of independent mathematical interest, it makes your algorithms better. For me, writing a paper is always (at least) a four step process: (a) come up with a new idea for computing something new, or computing something old in a new way; (b) implement the algorithm to see if it actually works and return to step (a) if it does not; (c) state and prove precise theorems showing that the algorithm does what it is supposed to do, and that it does so efficiently; (d) re-implement the algorithm to reflect all the ideas necessary to complete step (c), which will often make the code both clearer and faster.
One more suggestion. Team up with a number theorist who likes to compute things but doesn’t have your skills.
I used to use low level languages like Fortran, and Algol, and C. Now I use high level languages like Buhler, and Elkies, and Stein.
This is an excellent point. I got interested in Sato-Tate distributions largely because Kiran Kedlaya and Nick Katz were both interested in computing them but had reached the limits of what they could easily do in Sage/Magma (Kiran) or Mathematica (Nick). In fact Nick initially tried to use the Stein ianguage, but William was kind enough to redirect him to me.
I’ve also had occasion to use the Elkies interface, very powerful!
One of my colleagues used to say that the language he programmed in was Graduate Student