def apply(self, f, i, evaluation): 'Root[f_, i_]' try: if not f.has_form('Function', 1): raise sympy.PolynomialError body = f.leaves[0] poly = body.replace_slots([f, Symbol('_1')], evaluation) idx = i.to_sympy() - 1 # Check for negative indeces (they are not allowed in Mathematica) if idx < 0: evaluation.message('Root', 'iidx', i) return r = sympy.CRootOf(poly.to_sympy(), idx) except sympy.PolynomialError: evaluation.message('Root', 'nuni', f) return except TypeError: evaluation.message('Root', 'nint', i) return except IndexError: evaluation.message('Root', 'iidx', i) return return from_sympy(r)
def to_sympy(self, expr, **kwargs): try: if not expr.has_form('Root', 2): return None f = expr.leaves[0] if not f.has_form('Function', 1): return None body = f.leaves[0].replace_slots([f, Symbol('_1')], None) poly = body.to_sympy(**kwargs) i = expr.leaves[1].get_int_value(**kwargs) if i is None: return None return sympy.CRootOf(poly, i) except: return None