Recognition Physics Institute

Independent research · Austin

What to run

Screen a target, build polynomials, label their groups and check the published field properties. These four programs run with Python 3 and PARI/GP. No Magma license or account is required.

Screen takes a cell or a base and returns the bases that could write it. Aim takes a base, a square class and a signature and returns degree-24 polynomials. Label takes 24 coefficients and returns a group name, a real-root count and a margin. Verify takes a published row and returns a pass, a rejection, or an unchecked verdict.

Use any program on its own, or follow the sequence to produce a field record another reader can check.

All four in one clone

git clone https://github.com/jonwashburn/galois
cd galois && cat README.txt

The four programs, their tables, a README each, and the open-cell worklist. Every file is also fetchable one at a time below.

1 · Check which bases a target permits

Give the screen a base to find the real-root counts its group permits, or give it a target cell to find permitted bases. It performs a group calculation without constructing a number field. A refusal rules out that base for the target; permission leaves the arithmetic construction to be done.

curl -O https://recognitionphysics.org/igp24/tools/reach/reach.py
curl -O https://recognitionphysics.org/igp24/tools/reach/walkscreen.py
curl -O https://recognitionphysics.org/igp24/tools/reach/archscreen.py
curl -O https://recognitionphysics.org/igp24/tools/reach/walktable.json.gz
curl -O https://recognitionphysics.org/igp24/tools/reach/reach_by_base.json

python3 reach.py --label 243 --r 0      # what a target cell needs
python3 reach.py --deg 12 --r1 12       # what a base can write
$ python3 reach.py --label 243 --r 0
24T243 at r=0 needs one of these bases:
base degree   base group    real places    complex   step on top
2             2T1           2 of 2         0         degree 12
4             4T1           4 of 4         0         degree 6
6             6T10          6 of 6         0         degree 4
8             8T7           0 of 8         4         degree 3
12            12T41         12 of 12       0         degree 2

A degree-12 base finishes this with one square root. r = 24 - 4s - 2w, so the
radicand must be negative at 12 of the base's real places.

Every open cell already has that run against it, in one file, at open cells.

A totally real degree-12 base can write every even count from 0 to 24, but not for every group. 24T10301 from that base reaches 0, 4, 8, 12, 16, 20, 24.

Complex conjugation is an involution in the degree-24 group. Over a block system it fixes as many blocks as the base has real places, which fixes what it can fix upstairs. That is the walk, and it is checked against the contest's own admissibility list, which owes the table nothing.

What it was checked against

On all 24,995 imprimitive labels the union of its real counts equals exactly the signatures the contest admits, missing none and inventing none. Of 26,856 recorded base-and-field incidences it allows 26,829, and the 27 refusals are annotation defects.

InstrumentRefuses
Archimedean bound alone59.4%
Walk88.6%
Of the draws the bound lets through, the walk then refuses71.9%
Decoy (every even count allowed): refuses on labels where the walk refuses on zero11,636 of 11,647
It fails open

A primitive or uncensused label returns no opinion, never a refusal. The five primitive labels are 24T7817, 24T10255, 24T24680, 24T24999, 24T25000. A filter that refused what it had not measured would throw away exactly the work nobody has done yet.

README.txt · walktable.json.gz

Fingerprint of the table

walktable.json.gz is 712,213 bytes as served, SHA-256 ad86d39070edd3ba75d2e5326f73a2b6613ee35aecc7de1300913a962f488fab

2 · Write the polynomials

Over a base you already have, the aimer solves for a square class and a signature, then constructs the polynomial. The group is identified afterwards. A chosen 24Tn label is not an input to this solve.

curl -O https://recognitionphysics.org/igp24/compiler/worked-12t11.gp
gp -q worked-12t11.gp

Needs PARI/GP 2.13 or later. The file prepares one totally real 12T11 base, solves for signature 24 in a named square class, and prints nine degree-24 polynomials. It stops at polynomials and does not name the group. That run finished in 0.86 seconds; the nine fields, labelled separately, were eight 24T10301 and one 24T5392.

Hosted, if you would rather not install PARI: POST /v1/aim to api.vimarshini.com/igp24, then GET /v1/jobs/<id>. That host will not take more than 64 fields in one aim.

worked-12t11.gp · worked-12t11.json · README.txt · the input object and the by-hand PARI are in that README

3 · Identify the proposed group

A degree-24 polynomial in, a group name and a real-root count out, with a margin. This is Chebotarev evidence and not a proof. Magma's GaloisGroup and Oscar's exact route return certificates; this returns a name and a margin, on free software, in seconds. Accept at 5 nats or more and refuse below that rather than guess. Two groups with the same cycle-type law are a tie at any prime count.

curl -s https://api.vimarshini.com/igp24/v1/label \
  -H 'content-type: application/json' \
  -d '{"coeffs":[-4337,-14388,3142,34144,14133,-13068,-7174,1452,1044,-44,-56,0,1,0,0,0,0,0,0,0,0,0,0,0,1]}'

curl -O https://recognitionphysics.org/igp24/labeller/label_degree24.py
curl -O https://recognitionphysics.org/igp24/labeller/shape_laws_24T.jsonl.gz
gunzip shape_laws_24T.jsonl.gz
export IGP24_SHAPE_LAWS=$PWD/shape_laws_24T.jsonl
python3 label_degree24.py polys.txt --primes 1000 --min-margin 5

For each of the 25,000 transitive groups of degree 24 the conjugacy classes give a probability distribution over cycle types. That table ships here, because it is a fact about the groups and not about our search. On the field side, walk the primes from 3, admit a prime when the factorization is squarefree and the degrees still total 24, stop at 1,000 admitted primes, and score each group by the sum of count times log rate. The signature is polsturm, taken directly.

The accept bar is 5 nats. At 1,000 primes the thinnest of the 100 organizer-labelled gate fields was 19 nats and the nine fields of the worked instance ran 229.9 to 276.2. At 300 primes one row fell to 0.76, still correct and still refused. 100 of 100 gate fields correct, 77 of 77 planted-wrong inputs returned the planted group, all 87 same-base pairs separated.

Labelling the nine polynomials from section 2 took 1.30 seconds, most of it loading the cycle-type table once.

label_degree24.py · shape_laws_24T.jsonl.gz · README.txt · table manifest. The README names the GAP script that rebuilds the table, if you would rather not take ours.

Fingerprint of the cycle-type table

shape_laws_24T.jsonl.gz is 2,849,148 bytes served and 41,460,118 unpacked, SHA-256 b201ae4963ada8eb3496c6f1a866348d0f9180018ae29ef9fbdc77aca614086b

4 · Recheck anything we published

Every claim in a published row is recomputed from the coefficients alone, by the same checker we run against our own output. First run the deliberately corrupted records. The checker must reject them before its results can be relied on.

python3 verify_rows.py --fields fields.jsonl --sample 400 --mutate   # must reject every row
python3 verify_rows.py --fields fields.jsonl --sample 400 --workers 150

Measured on the published table: 400 of 400 real rows reproduce with none unchecked, and 400 of 400 corrupted rows are rejected across all five corruption kinds. Each row is handed to PARI with only its coefficients, and the script recomputes degree and irreducibility, polsturm against the published real-root count, polredabs against the published polynomial where the row claims canonical form, the unfactored part of the discriminant under the published prime bound, and nfdisc where the row states one. A row that outruns the budget is reported as unchecked, which is neither a pass nor a fail.

The one thing it cannot check is the Galois group: polgalois stops at degree 11, so naming 24Tn takes section 3 against the same polynomial. The checker says so rather than passing over it.

What each axis of a row asserts

label_axis is how the group was named. Every row here is Chebotarev and none is exact, so what a row asserts is that this group's class-rate law fits the observed cycle types better than each of the other 24,999 by the stated margin. A margin below 5 nats is not published. The exact value sits in the schema because the distinction is real and a later run can fill it.

reduced distinguishes polredabs, which is canonical, so two fields agree exactly when their polynomials agree, from polredbest, which is a real reduction but not canonical, so equal fields can still look different.

disc_axis is unconditional when the polynomial discriminant factored completely below the recorded prime bound, so the order is provably maximal; conditional when a cofactor survived, which the row records; undetermined when the factorization did not finish, in which case the row states no discriminant. That is a fact about the computation, not about the field. maximal_axis tracks it exactly, because whether the order is maximal is the question of whether that cofactor is trivial.

The four fields record separate properties. A polynomial can be canonical while its discriminant remains undetermined, or have an unconditional discriminant without an exact group label. Check the property your calculation needs; one completed check does not complete the others.

verify_rows.py · verify_row.gp · fields.schema.json · README.txt · fields.jsonl.gz · MANIFEST.json. The table and every by-group shard are byte-identical across builds from the same source, so those hashes can be reproduced rather than merely trusted.