Elliptic Curve Rank Leaderboard

API

All numbers are exact integers or rationals (e.g. "49/4"), passed as strings to avoid precision loss. ainvs may be the short [a4, a6] or full [a1, a2, a3, a4, a6] Weierstrass form. The POST endpoints require an Authorization: Bearer <token> header — create a token on your profile page. The JSON downloads are public.

POST /api/submit

Submits a curve with a set of witness points. The points are checked to lie on the curve, and their Néron–Tate height-pairing matrix is checked to be positive definite (so they are independent in E(ℚ), proving rank ≥ #points). On success the curve is recorded on the leaderboard, attributed to you. Accepted curves and witness points are stored in the curve's global minimal model. Body: { ainvs, points }, where points is a list of [x, y].

The discriminant and Faltings height are recorded for every curve (neither needs the primes). Optionally include primes: the primes of bad reduction, equivalently the primes dividing the minimal discriminant. If they check out, the conductor is computed and recorded — no factoring needed — along with the verified prime list itself (deduplicated, sorted, extraneous good primes dropped). Re-submitting an existing curve with primes backfills the conductor even if the rank is unchanged.

Optionally include commentary: a string recorded as the curve's initial commentary, attributed to you. It is applied only when the curve has no commentary yet — if the curve already exists and already has commentary, this field is ignored (use POST /curve/:id/commentary to edit existing commentary).

curl -X POST https://elliptic-rank.icarm.cloud/api/submit \
  -H 'content-type: application/json' \
  -H 'authorization: Bearer erank_...' \
  -d '{
    "ainvs": ["0","0","1","-6349808647","193146346911036"],
    "points": [["49421","200114"], ["49493","333458"], ...],
    "primes": ["2","3","211",...],
    "commentary": "Found by Mestre (1982)."
  }'

Returns 200 with the result below, 422 if the submission is invalid (singular curve, point off curve, or not independent), 401 without a valid token, 413 if the request body is too large, 429 if your account is submitting too quickly, or 400 if the body isn't JSON. independence.rankLowerBound is the proven bound, canonical.key identifies the curve up to -isomorphism, and the leaderboard field reports the outcome — status is "created", "improved" (with previousRank), or "unchanged" (a curve's record only changes when a witness proves a strictly higher rank).

{
  "ok": true,
  "curve":   { "ainvs": [...], "c4": "...", "c6": "...", "discriminant": "...", "nonsingular": true },
  "canonical": { "c4": "...", "c6": "...", "key": "304790815056:-166878443731135320" },
  "points":  [ { "point": ["49421","200114"], "onCurve": true }, ... ],
  "allPointsOnCurve": true,
  "independence": {
    "independent": true, "rankLowerBound": 12,
    "regulator": "...", "minEigenvalue": "...",
    "precisionDigits": 62, "stable": true, "method": "..."
  },
  "height": { "naiveLogHeight": "79.3286..." },
  "faltingsHeight": "...",
  "conductor": "...",           // only if primes were supplied/recovered
  "badPrimes": ["2","3","211", ...],  // ditto: the verified primes, sorted
  "leaderboard": { "status": "created", "rank": 12 }
}

POST /api/curve/:id/primes

Backfill the conductor of an already-recorded curve from its primes of bad reduction — the programmatic equivalent of the primes form on a curve's page, and an alternative to re-submitting through /api/submit. (The discriminant and Faltings height are already recorded at submission.) Send { primes: [...] } with the primes of bad reduction (each a prime, together dividing the minimal discriminant to a unit), or { "mode": "auto" } to attempt bounded trial division (which gives up on hard factorizations). No factoring of large discriminants is performed otherwise.

curl -X POST https://elliptic-rank.icarm.cloud/api/curve/123/primes \
  -H 'content-type: application/json' \
  -H 'authorization: Bearer erank_...' \
  -d '{ "primes": ["2","3","211"] }'   # or: { "mode": "auto" }

Returns 200 with the computed invariants below. If the conductor is already recorded it is a no-op — { "ok": true, "alreadyRecorded": true } (fetch /curve/:id.json for the stored values). Returns 422 if the primes are invalid or incomplete (with errors and note), 404 if there is no such curve, 401 without a valid token, 413 if the body is too large, or 400 if the body isn't JSON or the id isn't an integer.

{
  "ok": true,
  "id": 123,
  "alreadyRecorded": false,
  "conductor": "...",
  "badPrimes": ["2","3","211"]
}

GET /database.json

The entire database as one JSON download: { count, curves }, each curve with its global-minimal a-invariants, transformed witness points, discriminant (the minimal discriminant), rank lower bound, naive height, Faltings height, and (when recorded) conductor, bad_primes (the verified primes of bad reduction — the factorization of the conductor's support), submitter, and commentary. No auth required.

GET /curve/:id.json

A single curve as JSON — the same shape as one entry of the database.json curves array. No auth required.

POST /curve/:id/commentary

Edit a curve's commentary. Form-encoded content; an empty value clears it. Each edit is kept in the curve's commentary history.

curl -X POST https://elliptic-rank.icarm.cloud/curve/123/commentary \
  -H 'authorization: Bearer erank_...' \
  --data-urlencode 'content=Found by Mestre (1982).'