repair-checks.py

back to table · edit · history · where entries came from · files · download

3980 bytes, as of the version from 2026-10-26 23:52 (current). Recorded here, not run.

"""Read-only checks for the T532 first-mention link repair.
Run: sage -python repair-checks.py beside the unchanged attached generate.py.
Set NUMBERDB_API_KEY for this private draft, or pipe the key on stdin with
NUMBERDB_KEY_FROM_STDIN=1. Optional T532-before.json and link-target.json files
use archived API documents instead of fetching the current documents.
Instruction manifest:
agents/runs/20261026T234446Z-repair-skills/manifest.json
SHA-256 d03b756eaa1cd22ce39c8cee78fb3a44b052146786d6371925ac7bc9dec564f3.
"""
import json
from decimal import Decimal
from pathlib import Path
import importlib.metadata
import numberdb.sage as numberdb
from sage.rings.rational_field import QQ
from sage.rings.complex_arb import ComplexBallField
from sage.rings.real_arb import RealBallField
from sage.env import SAGE_VERSION
from generate import AiryDerivativeZeta, read_key_if_requested

work=Path(__file__).resolve().parent
read_key_if_requested()
def document(filename, identifier):
    path=work/filename
    return json.loads(path.read_text()) if path.exists() else numberdb.table(identifier)
doc=document('T532-before.json','T532')
target=document('link-target.json','Local_extrema_of_the_Airy_function_Ai')
C=ComplexBallField(640)
B=RealBallField(640)
def exact_decimal(text):
    d=Decimal(text); s,digits,e=d.as_tuple()
    c=QQ((-1 if s else 1)*int(''.join(map(str,digits)))) * QQ(10)**e
    return c,QQ(10)**e

def quotient(numerator,denominator,degree):
    out=[]
    for k in range(degree+1):
        v=numerator[k] if k<len(numerator) else 0
        v-=sum((denominator[j]*out[k-j] for j in range(1,min(k,len(denominator)-1)+1)),0)
        out.append(v/denominator[0])
    return out

control=quotient([QQ(1),QQ(2)],[QQ(1),QQ(-1)],20)
assert control == [QQ(1)]+[QQ(3)]*20
ai,aip,_,_=C(0).airy()
assert ai.real()>0 and aip.real()<0
# Ai(z)/Ai'(0), generated by the LINEAR Airy equation a_(m+2)=a_(m-1)/((m+2)(m+1)).
a=[ai/aip,C(1),C(0)]
for m in range(1,20): a.append(a[m-1]/QQ((m+2)*(m+1)))
f=[QQ(j+1)*a[j+1] for j in range(21)]
h=quotient(a,f,18)
z={n:((-1)**(n-1)*h[n-2]).real() for n in range(2,21)}
assert z[3] == 1
rows=doc['Numbers']; assert [str(k) for k in rows]==[str(n) for n in range(2,21)]
g=AiryDerivativeZeta(); assert list(g.enumerate())==[{'n':str(n)} for n in range(2,21)]
results=[]
for n in range(2,21):
    raw=rows[str(n)]; raw=raw['number'] if isinstance(raw,dict) else raw
    value=z[n]; assert value.is_finite() and value>0
    generated=g.value({'n':str(n)},100)
    generated=generated['number'] if isinstance(generated,dict) else generated
    assert value.overlaps(B(generated))
    if n==3:
        assert str(raw)=='1' and generated==QQ(1)
        results.append({'n':n,'exact':1});continue
    centre,ulp=exact_decimal(str(raw))
    assert value > B(centre-ulp) and value < B(centre+ulp)
    assert B(value.rad()) < abs(value)*B(2)**(-580)
    results.append({'n':n,'stored_interval_contains_independent_ball':True,'relative_radius_less_than_2_to_minus_580':True,'independent_ball':str(value)})
roots=[]
for k in ('1','2','3'):
    raw=target['Numbers'][k]; raw=raw['number'] if isinstance(raw,dict) else raw
    centre,ulp=exact_decimal(str(raw)); endpoints=[C(centre-ulp).airy_ai_prime().real(),C(centre+ulp).airy_ai_prime().real()]
    assert all(v.is_finite() for v in endpoints)
    signs=[1 if v>0 else -1 if v<0 else 0 for v in endpoints]
    assert signs[0]*signs[1]==-1
    roots.append({'n':int(k),'endpoint_signs':signs,'sign_change_at_stored_decimal_interval':True})
result={'skill_manifest':'agents/runs/20261026T234446Z-repair-skills/manifest.json','skill_manifest_sha256':'d03b756eaa1cd22ce39c8cee78fb3a44b052146786d6371925ac7bc9dec564f3','sage':SAGE_VERSION,'numberdb':importlib.metadata.version('numberdb'),'working_bits':640,'control_nonzero_quotient_passed':True,'default_enumeration_matches':True,'independent_moments':results,'target_derivative_zero_brackets':roots,'all_passed':True}
print(json.dumps(result,indent=2))