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()