back to table · edit · history · where entries came from · files · download
3048 bytes, as of the version from 2026-11-02 09:34 (current). Recorded here, not run.
"""Exact checks for the T673 editorial repair.
With generate.py, eta-data.json, before.json, related-2.json and standards.json
beside this script, run: sage -python repair_checks.py
The website generator and its source dependencies are not modified.
"""
import numberdb.sage as numberdb
from sage.rings.integer_ring import ZZ
import hashlib
import json
from pathlib import Path
from generate import ThompsonCoefficients
from sage.env import SAGE_VERSION
root = Path(__file__).resolve().parent
document = json.loads((root/'before.json').read_text())
degrees = json.loads((root/'related-2.json').read_text())['Numbers']['Th']
standards = json.loads((root/'standards.json').read_text())
def integer(value):
return ZZ(value['number'] if isinstance(value, dict) else value)
generator = ThompsonCoefficients()
identities = [{'g':g,'n':str(n)} for g, grades in document['Numbers'].items() for n in grades]
assert list(generator.enumerate()) == identities
for params in identities:
assert integer(generator.value(params,100)) == integer(document['Numbers'][params['g']][params['n']])
# These six decompositions come from Harvey--Rayhaun Table 2.
# Character degrees are read independently from the live companion table.
cases = [(0, [2], 1, 248), (4, [4,5], 1, 27000),
(5, [9,10], -1, 85995), (8, [17,18], 1, 1707264),
(9, [22,23], -1, 4096000), (12, [40,40], 1, 44330496)]
checked=[]
for grade, indices, sign, degree in cases:
degree_values = [integer(degrees[str(i)]) for i in indices]
assert all(d == degree for d in degree_values)
expected = sign * sum(degree_values)
stored = integer(document['Numbers']['1A'][str(grade)])
assert stored == expected
assert stored != expected + 1 # Deliberately perturbed control.
checked.append({'grade':grade, 'character_indices':indices,
'degrees':list(map(str,degree_values)), 'sign':sign,
'stored':str(stored),'expected':str(expected)})
assert integer(generator.value({'g':'3A','n':'205'},100)) == ZZ(26523498870)
result={'table':'T673','checks_passed':True,'sage_version':SAGE_VERSION,
'enumerated_and_recomputed':len(identities),'representation_identities':checked,
'program_example':'26523498870','perturbed_controls_rejected':6,
'method':'Exact Sage integers; all stored values recomputed by the unchanged generator; six representation identities checked against live character degrees and the cited primary source. This is repair verification, not a new independent critique.',
'new_values':0,'argument_uncertainty':'None: conjugacy classes and integer grades are exact discrete indices.',
'skill_manifest':standards['skill_manifest'], 'skill_manifest_sha256':standards['skill_manifest_sha256'],
'skill_versions':standards['skill_versions'],
'inputs_sha256':{name:hashlib.sha256((root/name).read_bytes()).hexdigest() for name in
['before.json','related-2.json','generate.py','eta-data.json']}}
print(json.dumps(result,indent=2))