"""The selected degree-two catalogue, Samart--Tao v3 Table 1 rows 13--27.
Every tuple is (source row, rational part, radical coefficient, radicand,
CM discriminant). Both radical signs are inspected with exact AA comparison.
Keys match the ordinary companion T649; source row is not a parameter.
"""
import numberdb.sage as numberdb
from sage.rings.rational_field import QQ
from sage.rings.qqbar import AA
CATALOGUE = (
 (13,'108','54',2,-24), (14,'18','6',3,-36),
 (15,'270','162',3,-4), (16,'729','405',3,-48),
 (17,'-27/2','-27/2',5,-15), (18,'3375/2','1485/2',5,-60),
 (19,'-4320','-1944',5,-75), (20,'32','2',6,-72),
 (21,'3672','1458',6,-8), (22,'-864','-216',17,-51),
 (23,'-163296','-35640',21,-147), (24,'4','-4',33,-99),
 (25,'-16740','-2916',33,-11), (26,'-55296','-8640',41,-123),
 (27,'-13500000','-1431000',89,-267),
)

def candidates():
 for t,D in [('-216',-3),('24',-27),('54',-12)]:
  yield dict(key=t,a=QQ(t),b=QQ(0),d=1,D=D,row=None)
 for row,a,b,d,D in CATALOGUE:
  for sign in [1,-1]:
   aa,bb=QQ(a),sign*QQ(b)
   key=str(aa)+('+' if bb>0 else '-')+str(abs(bb))+'*sqrt('+str(d)+')'
   yield dict(key=key,a=aa,b=bb,d=d,D=D,row=row)

def algebraic(item):
 return AA(item['a'])+AA(item['b'])*AA(item['d']).sqrt()

def selected():
 return [item for item in candidates() if -1<algebraic(item)<27]

def label(item):
 def rat(q):
  return str(q) if q.denominator()==1 else r'\frac{'+str(q.numerator())+'}{'+str(q.denominator())+'}'
 if item['b']==0:return '$'+rat(item['a'])+'$'
 return '$'+rat(item['a'])+('+' if item['b']>0 else '-')+rat(abs(item['b']))+r'\sqrt{'+str(item['d'])+'}$'
