checks.py

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

3008 bytes, as of the version from 2026-11-02 20:37 (current). Recorded here, not run.

"""Checks for Petersson norms -- numberdb.org/T684.
Run: sage -python checks.py, with generator attachments beside it.
The independent eta-product integration is in quadrature.py.
"""
import sys,json,time
from collections import Counter
from pathlib import Path
import numberdb.sage as numberdb
from sage.libs.pari import pari
from sage.rings.real_mpfr import RealField
from generate import PeterssonNorms,ROSTER,orbit_norms,index
from forms import algebra
from check import exactness,measure,names_its_rings


def main():
    pari.allocatemem(200000000)
    print('VERSIONS',numberdb.__version__,str(pari('version()')),flush=True)
    # Published PARI control, run before measuring this table.
    bits=numberdb.bits(160,losing=32);pari.set_real_precision(172)
    d=pari.mfDelta();dm=pari.mfinit(d,0)
    control=RealField(bits)(pari.mfpetersson(pari.mfsymbol(dm,d,precision=bits)))
    expected=RealField(bits)('0.0000010353620568043209223478168122251645932')
    assert abs(control-expected)<RealField(bits)('1e-43')
    print('CONTROL_DELTA',str(control),flush=True)
    counts=Counter();spaces={}
    for row in ROSTER:
        counts[row['group']]+=row['degree']
        key=(row['level'],row['weight'],row['character_discriminant'])
        spaces[key]=spaces.get(key,0)+row['degree']
    specs=[(N,4,1) for N in range(2,31)]+[(N,6,1) for N in range(2,16)]+[(N,3,-N) for N in (3,4,7,8,11,15,19,20,23,24,31,35,39,40)]
    for spec in specs: assert int(pari.mfdim(list(spec),0))==spaces.get(spec,0),spec
    assert counts=={'A':61,'B':27,'C':50}
    vals={};maxerr=0;maxconj=0
    for row in ROSTER:
        t=time.time();lo=orbit_norms(row['label'],160);hi=orbit_norms(row['label'],220)
        em=algebra(row['label'])[2]
        for label,(root,is_real) in em.items():
            conjugate=[name for name,(z,r) in em.items() if z==root.conjugate()]
            assert len(conjugate)==1
            err=abs(lo[label]-hi[label])/hi[label];maxerr=max(maxerr,err)
            conjerr=abs(hi[label]-hi[conjugate[0]])/hi[label];maxconj=max(maxconj,conjerr)
            assert err<RealField(800)('1e-140');assert conjerr<RealField(800)('1e-200')
            for convention in ('integral','index-normalized'):
                p={'form':label,'normalization':convention}
                vals[(label,convention)]=PeterssonNorms().value(p,100)
        print('ORBIT',json.dumps({'label':row['label'],'seconds':time.time()-t,'lo':{f:str(v) for f,v in lo.items()},'hi':{f:str(v) for f,v in hi.items()}}),flush=True)
    assert len(vals)==276
    assert not exactness(vals);assert not names_its_rings(str(Path(__file__).with_name('generate.py')))
    print('EVIDENCE',json.dumps({'entries':len(vals),'orbits':len(ROSTER),'embeddings':dict(counts),'space_dimensions_checked':len(specs),'max_relative_precision_difference':str(maxerr),'max_relative_conjugation_difference':str(maxconj),'measure':{k:str(v) for k,v in measure(vals).items()},'control_delta':str(control)}),flush=True)

if __name__=='__main__':main()