Pisot Conjecture

API

Create an API token on your profile page and pass it as a bearer token.

Submit a substitution

curl -X POST https://pisot-conjecture.icarm.cloud/api/submit \
  -H "Authorization: Bearer pis_..." \
  -H "Content-Type: application/json" \
  -d '{"substitution": ["01", "02", "0"]}'

substitution is an array of images (letter i maps to the i-th string, letters written as digits 08), an object {"a": "ab", "b": "a"}, or a string in the same format as the web form. The response reports the canonical form, the invariants, the score, and what happened in the database:

{
  "ok": true,
  "canonical": { "rules": "0 → 01, 1 → 02, 2 → 0", "images": ["01", "02", "0"], "size": 3, "length": 5 },
  "invariants": { "charPoly": "x^3 - x^2 - x - 1", "perron": 1.8392867552, "unit": true, ... },
  "score": { "value": 0.9343, "num": 1735, "den": 1857, "n": 928, "N": 1000 },
  "coincidence": { "n": 1, "checkedTo": 1 },
  "outcome": { "status": "record", "substitutionId": 12, "size": 3, "score": 0.9343, "previousScore": 0.9512 }
}

outcome.status is record (best score for its alphabet size), created (stored, not a record), duplicate (the canonical form is already stored), or not_tracked (verified but not stored; two-letter alphabets). An optional commentary string (at most 4,000 characters) becomes the first comment on a newly stored substitution’s page — a good place to say how it was found.

Rejected submissions return ok: false with the failing check (not primitive, reducible characteristic polynomial, Perron root not Pisot, or the complexity could not be certified within the word-length cap). Limits: 9 letters, total length 300, 6 submissions per minute.

Verify without storing

curl -X POST https://pisot-conjecture.icarm.cloud/api/verify \
  -H "Content-Type: application/json" \
  -d '{"substitution": "0 -> 011, 1 -> 100"}'

Runs the same checks and returns the same shape without outcome; no token required, same rate limit per client.

Read the database

curl https://pisot-conjecture.icarm.cloud/database.json           # every substitution (without profiles)
curl https://pisot-conjecture.icarm.cloud/substitution/12.json    # one substitution, with p(n), q(n) for n ≤ 1000