Independent research · Austin
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.
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.
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.
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.
| Instrument | Refuses |
|---|---|
| Archimedean bound alone | 59.4% |
| Walk | 88.6% |
| Of the draws the bound lets through, the walk then refuses | 71.9% |
| Decoy (every even count allowed): refuses on labels where the walk refuses on zero | 11,636 of 11,647 |
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
walktable.json.gz is 712,213 bytes as served, SHA-256
ad86d39070edd3ba75d2e5326f73a2b6613ee35aecc7de1300913a962f488fab
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
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.
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.
shape_laws_24T.jsonl.gz is 2,849,148 bytes served and 41,460,118
unpacked, SHA-256
b201ae4963ada8eb3496c6f1a866348d0f9180018ae29ef9fbdc77aca614086b
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.
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.