back to table · edit · history · where entries came from · files · download
3599 bytes, as of the version from 2026-10-30 12:33 (current). Recorded here, not run.
"""Read-only checks for T624's editorial repair, using downloaded live documents.
Run: sage -python repair_check.py (document-before.json, sphere-document.json and
unchanged generate.py beside this file). No API key or website write is used.
"""
import json, hashlib
from decimal import Decimal
from pathlib import Path
import numberdb.sage as numberdb
from sage.rings.rational_field import QQ
from sage.rings.real_arb import RealBallField
from sage.env import SAGE_VERSION
from generate import StiefelVolumes
w=Path(__file__).resolve().parent
D=json.loads((w/'document-before.json').read_text())
S=json.loads((w/'sphere-document.json').read_text())
R=RealBallField(600)
def endpoint(s):
t=Decimal(s).as_tuple(); a=QQ(int(''.join(map(str,t.digits)))*(-1 if t.sign else 1)); return a*QQ(10)**int(t.exponent), QQ(10)**int(t.exponent)
def contains(s,b):
c,u=endpoint(s)
if '.' not in s and 'e' not in s.lower(): return b == c
return bool(b > R(c-u) and b < R(c+u))
def raw(x): return x['number'] if isinstance(x,dict) else x
def sphere(d):
a=QQ(d+1)/2
return 2*R.pi()**a/R(a).gamma()
assert sphere(0).is_finite() and sphere(0).overlaps(R(2)) and sphere(0).accuracy()>550
assert sphere(1).overlaps(2*R.pi())
assert sphere(2).overlaps(4*R.pi())
assert not contains('6.2831853071795864769', 3*R.pi())
g=StiefelVolumes(); acc=[]; guard_acc=[]; rows=[]; sphere_matches=0
for field,ns in D['Numbers'].items():
beta={'real':1,'complex':2}[field]
for n,ks in ns.items():
for k,entry in ks.items():
n1,k1=int(n),int(k); s=raw(entry)
v=R(2)**(QQ(beta*k1*(k1-1))/4)
for j in range(k1): v*=sphere(beta*(n1-j)-1)
assert v.is_finite() and v>0
if (field,n1,k1)==('real',1,1):
assert s=='2' and v.overlaps(R(2)) and v.accuracy()>550
else:
assert contains(s,v), (field,n,k,'independent gamma formula')
if (field,n1,k1)!=('real',1,1):
assert v.accuracy()>550; acc.append(int(v.accuracy()))
params={'field':field,'n':n1,'k':k1}; got=g.value(params,100); got=got['number'] if isinstance(got,dict) else got
assert contains(s,got), (field,n,k,'generating ball')
if hasattr(got,'accuracy'): guard_acc.append(int(got.accuracy()))
if k1==1:
sd=beta*n1-1
if sd==0:
assert raw(S['Numbers'][str(sd)])=='2' and v.overlaps(R(2))
else:
assert contains(raw(S['Numbers'][str(sd)]),v), (field,n,k,'sphere table')
sphere_matches+=1
rows.append(params)
assert rows==list(g.enumerate()) and len(rows)==272 and sphere_matches==32
print(json.dumps({'table':'T624','run':'20261030T113658Z-repair','skill_manifest':'agents/runs/20261030T113658Z-repair-skills/manifest.json','skill_sha256_local':'28ecbeeccb0c5e5d6eb541b5a5b0f88aec47b154374d909085116d34f5629199','skill_sha256_live':'28ecbeeccb0c5e5d6eb541b5a5b0f88aec47b154374d909085116d34f5629199','sage':SAGE_VERSION,'numberdb':numberdb.__version__,'generator_sha256':hashlib.sha256((w/'generate.py').read_bytes()).hexdigest(),'approximate_intervals_contain_direct_gamma_balls':len(acc),'exact_integer_checked':True,'stored_intervals_contain_generating_balls':len(rows),'one_column_intervals_match_T28':sphere_matches,'minimum_direct_accuracy_bits':min(acc),'minimum_generator_accuracy_bits':min(guard_acc),'enumeration_matches':True,'known_answer_controls':3,'corruption_control_passed':True,'all_inputs_exact':True,'scope':'No numerical values changed. Exact integer and half-integer inputs are enclosed by Arb, propagating all arithmetic uncertainty. Direct gamma products check the stored intervals independently of the generator recurrence, not independently of the stated volume formula.'},indent=2))