"""Read-only comparisons with downloaded live T80, T215, T323 and T683."""
import numberdb.sage as numberdb
from numberdb._compare import _claim
from sage.rings.real_mpfr import RealField
from sage.rings.rational_field import QQ
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
from sage.rings.qqbar import AA,_init_qqbar
from sage.libs.pari import pari
from pathlib import Path
import json,math
_init_qqbar();BASE=Path(__file__).parent;R=RealField(700);P=PolynomialRing(QQ,'x')
roster=json.loads((BASE/'roster.json').read_text());polys=json.loads((BASE/'polynomials.json').read_text())
docs={t:json.loads((BASE/(t+'.json')).read_text()) for t in ['T80','T215','T323','T683']}
counts={t:0 for t in docs};maxulp=R(0)
for row,pp in zip(roster,polys):
 assert (row['N'],row['k'],row['i'])==(pp['N'],pp['k'],pp['i'])
 N,k,i=row['N'],row['k'],row['i'];tid='T323' if N==1 else 'T683'
 if N>1 and not row['companion_label']:continue
 nums=docs[tid]['Numbers'][str(k)][str(i)] if N==1 else docs[tid]['Numbers'][row['companion_label']]
 for s0,entry in nums.items():
  if s0=='comment':continue
  s=int(s0);text=entry['number'] if isinstance(entry,dict) else entry
  assert 'i' not in text
  centre,radius=_claim(text);value=R(pp['mellin_moments'][str(s)])*(2*R.pi())**s/R(math.factorial(s-1))
  if radius==0:assert centre==0 and abs(value)<R('1e-180')
  else:
   ulp=abs(value-R(str(centre)))/R(str(radius));assert ulp<=1,(N,k,i,s,str(ulp));maxulp=max(maxulp,ulp)
  counts[tid]+=1
 if N==1:
  F=P(row['field_poly']);low,high=map(QQ,row['root_interval']);z=next(r for r in F.roots(AA,multiplicities=False) if low<r<high)
  a2=P([QQ(c) for c in row['coefficients'][2]])(z)
  h=docs['T215']['Numbers'][str(k)]['2'];h=h['number'] if isinstance(h,dict) else h
  assert P(h)(a2)==0;counts['T215']+=1
coeffs=pari.mfcoefs(pari.mfDelta(),100)
for n in range(101):assert str(coeffs[n])==docs['T80']['Numbers'][str(n)];counts['T80']+=1
print('COMPANION_EVIDENCE '+json.dumps({'table':'T694','comparisons':counts,'max_difference_in_stored_ulps':str(maxulp)}))
