def __classcall__(cls, group = HeckeTriangleGroup(3), base_ring = ZZ, prec=ZZ(10), fix_d=False, set_d=None, d_num_prec=ZZ(53)): r""" Return a (cached) instance with canonical parameters. In particular in case ``fix_d = True`` or if ``set_d`` is set then the ``base_ring`` is replaced by the common parent of ``base_ring`` and the parent of ``set_d`` (resp. the numerical value of ``d`` in case ``fix_d=True``). EXAMPLES:: sage: MFSeriesConstructor() == MFSeriesConstructor(3, ZZ, 10, False, None, 53) True sage: MFSeriesConstructor(base_ring = CC, set_d=CC(1)) == MFSeriesConstructor(set_d=CC(1)) True sage: MFSeriesConstructor(group=4, fix_d=True).base_ring() == QQ True sage: MFSeriesConstructor(group=5, fix_d=True).base_ring() == RR True """ if (group==infinity): group = HeckeTriangleGroup(infinity) else: try: group = HeckeTriangleGroup(ZZ(group)) except TypeError: group = HeckeTriangleGroup(group.n()) prec=ZZ(prec) #if (prec<1): # raise Exception("prec must be an Integer >=1") fix_d = bool(fix_d) if (fix_d): n = group.n() d = group.dvalue() if (group.is_arithmetic()): d_num_prec = None set_d = 1/base_ring(1/d) else: d_num_prec = ZZ(d_num_prec) set_d = group.dvalue().n(d_num_prec) else: d_num_prec = None if (set_d is not None): base_ring=(base_ring(1)*set_d).parent() #elif (not base_ring.is_exact()): # raise NotImplementedError return super(MFSeriesConstructor,cls).__classcall__(cls, group, base_ring, prec, fix_d, set_d, d_num_prec)