postfill.py

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

2852 bytes, as of the version from 2026-11-02 18:57 (current). Recorded here, not run.

"""Read T683 back, verify its generator and independently check stored claims."""
import sys,json,re
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.rings.real_mpfr import RealField
from numberdb._compare import _claim,_complex_parts
from numberdb._generate import _stored_entries
from fractions import Fraction
from generate import ROSTER, CriticalNewformLValues, algebra, orbit_values
from checks import independent_values
key=sys.stdin.read().strip()
if re.match(r'^[A-Z_][A-Z0-9_]*\s*=',key):key=key.split('=',1)[1].strip().strip('"\'')
numberdb.configure(api_key=key)
g=CriticalNewformLValues()

stored=numberdb.table('T683');flat=_stored_entries(stored)
records=[{'params':dict(zip(('form','s'),key.split(','))),'number':value} for key,value in flat.items()];assert len(records)==418
R=RealBallField(800);C=ComplexBallField(800)
def exact(v):
 q=Fraction(v);return QQ(q.numerator)/QQ(q.denominator)
def component(text):
 center,radius=_claim(text)
 return R(exact(center),exact(radius))
def parse(text):
 parts=_complex_parts(text)
 if parts is None: return C(component(text))
 return C(component(parts[0]),component(parts[1]))
vals={(r['params']['form'],int(r['params']['s'])):parse(r['number']) for r in records}
assert len(vals)==418
compared=fe=conj=0
for row in ROSTER:
 independent=independent_values(row)
 root_data=algebra(row['label'])[2]
 for full,(root,is_real) in root_data.items():
  cc=[name for name,(r,real) in root_data.items() if r==root.conjugate()];assert len(cc)==1
  twin=cc[0];eps=orbit_values(row['label'],220)[full]['root_number']
  for s in range(1,row['weight']):
   ball=vals[full,s];v=independent[full]['values'][s]
   assert (ball.real().is_finite() and ball.imag().is_finite()) and ball.rad()<RealField(800)('1e-95')
   assert v.real() in ball.real() and v.imag() in ball.imag(),(full,s,'independent value outside stored interval')
   compared+=1
   assert ball.overlaps(vals[twin,s].conjugate()),(full,s,'stored conjugation')
   conj+=1
   k=row['weight'];N=row['level']
   import math
   left=R(N)**(QQ(s)/2)*math.factorial(s-1)/(2*R.pi())**s*ball
   right=C(eps)*R(N)**(QQ(k-s)/2)*math.factorial(k-s-1)/(2*R.pi())**(k-s)*vals[twin,k-s]
   assert all(part.is_finite() for part in (left.real(),left.imag(),right.real(),right.imag()))
   assert left.overlaps(right),(full,s,'stored functional equation')
   fe+=1
 print('STORED CHECKED',row['label'],flush=True)
report=g.verify(sample=None);print('VERIFY',str(report),flush=True);assert report.ok
print('POSTFILL '+json.dumps({'table':'T683','verified':418,'independent_stored_claims':compared,'stored_functional_equations':fe,'stored_conjugation_identities':conj,'exact_zeros':sum(r['number']=='0' for r in records)}),flush=True)