"""Check selection and CM identities independently in exact arithmetic."""
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
import json
from catalogue import candidates,selected,algebraic,label
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**2-24*b4;disc=-b2**2*b8-8*b4**3-27*b6**2+9*b2*b4*b6
assert c4**3*(t-27)**3==disc*t*(t+216)**3
corpus=numberdb.table('T129')['Numbers']
rows=[]
for item in candidates():
 v=algebraic(item);j=v*(v+216)**3/(v-27)**3
 H=hilbert_class_polynomial(item['D'])
 assert H(j)==0,(item['key'],item['D'])
 corpus_entry=corpus[str(item['D'])]
 corpus_polynomial=corpus_entry.get('number') if isinstance(corpus_entry,dict) else corpus_entry
 assert H.parent()(corpus_polynomial)==H
 rows.append({'t':item['key'],'D':item['D'],'row':item['row'],'interior':bool(-1<v<27),'positive':bool(v>0),'label':label(item),'hilbert_polynomial':str(H)})
assert len(selected())==10
print(json.dumps({'symbolic_j_invariant':True,'hilbert_polynomials_match_T129':True,'cm_checks':rows,'selected':[x['key'] for x in selected()]},indent=2))
