def test_special_printers(): from sympy.printing.lambdarepr import IntervalPrinter def intervalrepr(expr): return IntervalPrinter().doprint(expr) expr = sqrt(sqrt(2) + sqrt(3)) + S.Half func0 = lambdify((), expr, modules="mpmath", printer=intervalrepr) func1 = lambdify((), expr, modules="mpmath", printer=IntervalPrinter) func2 = lambdify((), expr, modules="mpmath", printer=IntervalPrinter()) mpi = type(mpmath.mpi(1, 2)) assert isinstance(func0(), mpi) assert isinstance(func1(), mpi) assert isinstance(func2(), mpi) # To check Is lambdify loggamma works for mpmath or not exp1 = lambdify(x, loggamma(x), 'mpmath')(5) exp2 = lambdify(x, loggamma(x), 'mpmath')(1.8) exp3 = lambdify(x, loggamma(x), 'mpmath')(15) exp_ls = [exp1, exp2, exp3] sol1 = mpmath.loggamma(5) sol2 = mpmath.loggamma(1.8) sol3 = mpmath.loggamma(15) sol_ls = [sol1, sol2, sol3] assert exp_ls == sol_ls
def intervalrepr(expr): return IntervalPrinter().doprint(expr)
def isolate(alg, eps=None, fast=False): """ Find a rational isolating interval for a real algebraic number. Examples ======== >>> from sympy import isolate, sqrt, Rational >>> print(isolate(sqrt(2))) # doctest: +SKIP (1, 2) >>> print(isolate(sqrt(2), eps=Rational(1, 100))) (24/17, 17/12) Parameters ========== alg : str, int, :py:class:`~.Expr` The algebraic number to be isolated. Must be a real number, to use this particular function. However, see also :py:meth:`.Poly.intervals`, which isolates complex roots when you pass ``all=True``. eps : positive element of :ref:`QQ`, None, optional (default=None) Precision to be passed to :py:meth:`.Poly.refine_root` fast : boolean, optional (default=False) Say whether fast refinement procedure should be used. (Will be passed to :py:meth:`.Poly.refine_root`.) Returns ======= Pair of rational numbers defining an isolating interval for the given algebraic number. See Also ======== .Poly.intervals """ alg = sympify(alg) if alg.is_Rational: return (alg, alg) elif not alg.is_real: raise NotImplementedError( "complex algebraic numbers are not supported") func = lambdify((), alg, modules="mpmath", printer=IntervalPrinter()) poly = minpoly(alg, polys=True) intervals = poly.intervals(sqf=True) dps, done = mp.dps, False try: while not done: alg = func() for a, b in intervals: if a <= alg.a and alg.b <= b: done = True break else: mp.dps *= 2 finally: mp.dps = dps if eps is not None: a, b = poly.refine_root(a, b, eps=eps, fast=fast) return (a, b)
def test_IntervalPrinter(): ip = IntervalPrinter() assert ip.doprint(x**Rational(1, 3)) == "x**(mpi('1/3'))" assert ip.doprint(sqrt(x)) == "x**(mpi('1/2'))"