cm_checks.py

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

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

"""Exact CM and convention checks for T651, run with SageMath."""
import numberdb.sage as numberdb
from sage.rings.rational_field import QQ
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
from sage.schemes.elliptic_curves.cm import hilbert_class_polynomial
from catalogue import items,exact
import json
from pathlib import Path
source_rows=json.loads(Path(__file__).with_name("source-table1.json").read_text())
source_coefficients={int(r[0]):(int(r[3]),int(r[4])) for r in source_rows if r[0].isdigit() and int(r[0])>=13}
R=PolynomialRing(QQ,'t');t=R.gen()
a2=-27*t**2;a4=216*t**3*(t-27);a6=-432*t**4*(t-27)**2
b2=4*a2;b4=2*a4;b6=4*a6;b8=4*a2*a6-a4**2
c4=b2*b2-24*b4;disc=-b2*b2*b8-8*b4**3-27*b6*b6+9*b2*b4*b6
assert c4**3*(t-27)**3==disc*t*(t+216)**3
corpus=numberdb.table('T129')['Numbers'];checks=[]
for item in items():
    assert source_coefficients[item['row']]==(item['a'],item['b'])
    H=hilbert_class_polynomial(item['D']);entry=corpus[str(item['D'])]
    assert H.parent()(entry['number'] if isinstance(entry,dict) else entry)==H
    for conjugate in (False,True):
        v=exact(item,conjugate);j=v*(v+216)**3/(v-27)**3
        assert H(j)==0
        assert v.minpoly().degree()==2
        checks.append({'t':item['conjugate'] if conjugate else item['key'],'D':item['D'],'interior':bool(-1<v<27),'positive':bool(v>0),'H':str(H),'exact_CM_check':True})
assert len(checks)==30 and sum(c['interior'] for c in checks)==9
print(json.dumps({'versions':{'numberdb':numberdb.__version__,'sage':__import__('sage.env',fromlist=['SAGE_VERSION']).SAGE_VERSION},'source_coefficient_transcription':True,'symbolic_j_formula':True,'hilbert_polynomials_match_T129':True,'checks':checks},indent=2))