def _eval_(self, n, z): """ EXAMPLES:: sage: lambert_w(6.0) 1.43240477589830 sage: lambert_w(1) lambert_w(1) sage: lambert_w(x+1) lambert_w(x + 1) There are three special values which are automatically simplified:: sage: lambert_w(0) 0 sage: lambert_w(e) 1 sage: lambert_w(-1/e) -1 sage: lambert_w(SR(0)) 0 The special values only hold on the principal branch:: sage: lambert_w(1,e) lambert_w(1, e) sage: lambert_w(1, e.n()) -0.532092121986380 + 4.59715801330257*I TESTS: When automatic simplification occurs, the parent of the output value should be either the same as the parent of the input, or a Sage type:: sage: parent(lambert_w(int(0))) <... 'int'> sage: parent(lambert_w(Integer(0))) Integer Ring sage: parent(lambert_w(e)) Symbolic Ring """ if not isinstance(z, Expression): if n == 0 and z == 0: return s_parent(z)(0) elif n == 0: if z.is_trivial_zero(): return s_parent(z)(Integer(0)) elif (z-const_e).is_trivial_zero(): return s_parent(z)(Integer(1)) elif (z+1/const_e).is_trivial_zero(): return s_parent(z)(Integer(-1))
def _eval_(self, n, z): """ EXAMPLES:: sage: lambert_w(6.0) 1.43240477589830 sage: lambert_w(1) lambert_w(1) sage: lambert_w(x+1) lambert_w(x + 1) There are three special values which are automatically simplified:: sage: lambert_w(0) 0 sage: lambert_w(e) 1 sage: lambert_w(-1/e) -1 sage: lambert_w(SR(0)) 0 The special values only hold on the principal branch:: sage: lambert_w(1,e) lambert_w(1, e) sage: lambert_w(1, e.n()) -0.532092121986380 + 4.59715801330257*I TESTS: When automatic simplification occurs, the parent of the output value should be either the same as the parent of the input, or a Sage type:: sage: parent(lambert_w(int(0))) <... 'int'> sage: parent(lambert_w(Integer(0))) Integer Ring sage: parent(lambert_w(e)) Symbolic Ring """ if not isinstance(z, Expression): if n == 0 and z == 0: return s_parent(z)(0) elif n == 0: if z.is_trivial_zero(): return s_parent(z)(Integer(0)) elif (z - const_e).is_trivial_zero(): return s_parent(z)(Integer(1)) elif (z + 1 / const_e).is_trivial_zero(): return s_parent(z)(Integer(-1))
def _evalf_(self, x, parent=None, algorithm=None): """ EXAMPLES:: sage: erf(2).n() 0.995322265018953 sage: erf(2).n(200) 0.99532226501895273416206925636725292861089179704006007673835 sage: erf(pi - 1/2*I).n(100) 1.0000111669099367825726058952 + 1.6332655417638522934072124547e-6*I TESTS: Check that PARI/GP through the GP interface gives the same answer:: sage: gp.set_real_precision(59) # random 38 sage: print(gp.eval("1 - erfc(1)")); print(erf(1).n(200)) 0.84270079294971486934122063508260925929606699796630290845994 0.84270079294971486934122063508260925929606699796630290845994 Check that for an imaginary input, the output is also imaginary, see :trac:`13193`:: sage: erf(3.0*I) 1629.99462260157*I sage: erf(33.0*I) 1.51286977510409e471*I """ R = parent or s_parent(x) import mpmath return mpmath_utils.call(mpmath.erf, x, parent=R)
def _evalf_(self, x, parent=None, algorithm=None): """ EXAMPLES:: sage: erfinv(0.2) 0.179143454621292 sage: erfinv(1/5).n(100) 0.17914345462129167649274901663 """ R = parent or s_parent(x) import mpmath return mpmath_utils.call(mpmath.erfinv, x, parent=R)
def _evalf_(self, x, parent=None, algorithm=None): """ EXAMPLES:: sage: erfc(4).n() 1.54172579002800e-8 sage: erfc(4).n(100) 1.5417257900280018852159673487e-8 sage: erfc(4*I).n(100) 1.0000000000000000000000000000 - 1.2969597307176392315279409506e6*I """ R = parent or s_parent(x) import mpmath return mpmath_utils.call(mpmath.erfc, x, parent=R)
def _evalf_(self, x, y, parent=None, algorithm='mpmath'): """ EXAMPLES:: sage: gamma_inc_lower(3,2.) 0.646647167633873 sage: gamma_inc_lower(3,2).n(200) 0.646647167633873081060005050275155... sage: gamma_inc_lower(0,2.) +infinity """ R = parent or s_parent(x) # C is the complex version of R # prec is the precision of R if R is float: prec = 53 C = complex else: try: prec = R.precision() except AttributeError: prec = 53 try: C = R.complex_field() except AttributeError: C = R if algorithm == 'pari': try: v = ComplexField(prec)(x).gamma() - ComplexField(prec)( x).gamma_inc(y) except AttributeError: if not (is_ComplexNumber(x)): if is_ComplexNumber(y): C = y.parent() else: C = ComplexField() x = C(x) v = ComplexField(prec)(x).gamma() - ComplexField(prec)( x).gamma_inc(y) else: import mpmath v = ComplexField(prec)(mpmath_utils.call(mpmath.gammainc, x, 0, y, parent=R)) if v.is_real(): return R(v) else: return C(v)
def _evalf_(self, x, parent=None, algorithm=None): """ EXAMPLES:: sage: erfi(2.) 18.5648024145756 sage: erfi(2).n(100) 18.564802414575552598704291913 sage: erfi(-2*I).n(100) -0.99532226501895273416206925637*I """ R = parent or s_parent(x) import mpmath return mpmath_utils.call(mpmath.erfi, x, parent=R)
def _evalf_(self, n, z, parent=None, algorithm=None): """ EXAMPLES:: sage: N(lambert_w(1)) 0.567143290409784 sage: lambert_w(RealField(100)(1)) 0.56714329040978387299996866221 SciPy is used to evaluate for float, RDF, and CDF inputs:: sage: lambert_w(RDF(1)) 0.5671432904097838 sage: lambert_w(float(1)) 0.5671432904097838 sage: lambert_w(CDF(1)) 0.5671432904097838 sage: lambert_w(complex(1)) (0.5671432904097838+0j) sage: lambert_w(RDF(-1)) # abs tol 2e-16 -0.31813150520476413 + 1.3372357014306895*I sage: lambert_w(float(-1)) # abs tol 2e-16 (-0.31813150520476413+1.3372357014306895j) """ R = parent or s_parent(z) if R is float or R is RDF: from scipy.special import lambertw res = lambertw(z, n) # SciPy always returns a complex value, make it real if possible if not res.imag: return R(res.real) elif R is float: return complex(res) else: return CDF(res) elif R is complex or R is CDF: from scipy.special import lambertw return R(lambertw(z, n)) else: import mpmath return mpmath_utils.call(mpmath.lambertw, z, n, parent=R)
def _evalf_(self, x, y, parent=None, algorithm='mpmath'): """ EXAMPLES:: sage: gamma_inc_lower(3,2.) 0.646647167633873 sage: gamma_inc_lower(3,2).n(200) 0.646647167633873081060005050275155... sage: gamma_inc_lower(0,2.) +infinity """ R = parent or s_parent(x) # C is the complex version of R # prec is the precision of R if R is float: prec = 53 C = complex else: try: prec = R.precision() except AttributeError: prec = 53 try: C = R.complex_field() except AttributeError: C = R if algorithm == 'pari': try: v = ComplexField(prec)(x).gamma() - ComplexField(prec)(x).gamma_inc(y) except AttributeError: if not (is_ComplexNumber(x)): if is_ComplexNumber(y): C = y.parent() else: C = ComplexField() x = C(x) v = ComplexField(prec)(x).gamma() - ComplexField(prec)(x).gamma_inc(y) else: import mpmath v = ComplexField(prec)(mpmath_utils.call(mpmath.gammainc, x, 0, y, parent=R)) if v.is_real(): return R(v) else: return C(v)
def _evalf_(self, x, parent=None, algorithm=None): """ EXAMPLES:: sage: erf(2).n() 0.995322265018953 sage: erf(2).n(200) 0.99532226501895273416206925636725292861089179704006007673835 sage: erf(pi - 1/2*I).n(100) 1.0000111669099367825726058952 + 1.6332655417638522934072124547e-6*I TESTS: Check that PARI/GP through the GP interface gives the same answer:: sage: gp.set_real_precision(59) # random 38 sage: print(gp.eval("1 - erfc(1)")); print(erf(1).n(200)) 0.84270079294971486934122063508260925929606699796630290845994 0.84270079294971486934122063508260925929606699796630290845994 Check that for an imaginary input, the output is also imaginary, see :trac:`13193`:: sage: erf(3.0*I) 1629.99462260157*I sage: erf(33.0*I) 1.51286977510409e471*I Check that real ball evaluation is fixed :trac:`28061`:: sage: RealBallField(128)(erf(5)) [0.99999999999846254020557196514981165651 +/- 7.33e-39] """ R = parent or s_parent(x) if isinstance(R, RealBallField): # NOTE: erf exists on complex balls but not on real ones C = R.complex_field() return C(x).erf().real() else: import mpmath y = mpmath_utils.call(mpmath.erf, x, parent=R) return y
def _evalf_(self, x, y, parent=None, algorithm='pari'): """ EXAMPLES:: sage: gamma_inc(0,2) -Ei(-2) sage: gamma_inc(0,2.) 0.0489005107080611 sage: gamma_inc(0,2).n(algorithm='pari') 0.0489005107080611 sage: gamma_inc(0,2).n(200) 0.048900510708061119567239835228... sage: gamma_inc(3,2).n() 1.35335283236613 TESTS: Check that :trac:`7099` is fixed:: sage: R = RealField(1024) sage: gamma(R(9), R(10^-3)) # rel tol 1e-308 40319.99999999999999999999999999988898884344822911869926361916294165058203634104838326009191542490601781777105678829520585311300510347676330951251563007679436243294653538925717144381702105700908686088851362675381239820118402497959018315224423868693918493033078310647199219674433536605771315869983788442389633 sage: numerical_approx(gamma(9, 10^(-3)) - gamma(9), digits=40) # abs tol 1e-36 -1.110111598370794007949063502542063148294e-28 Check that :trac:`17328` is fixed:: sage: gamma_inc(float(-1), float(-1)) (-0.8231640121031085+3.141592653589793j) sage: gamma_inc(RR(-1), RR(-1)) -0.823164012103109 + 3.14159265358979*I sage: gamma_inc(-1, float(-log(3))) - gamma_inc(-1, float(-log(2))) # abs tol 1e-15 (1.2730972164471142+0j) Check that :trac:`17130` is fixed:: sage: r = gamma_inc(float(0), float(1)); r 0.21938393439552029 sage: type(r) <... 'float'> """ R = parent or s_parent(x) # C is the complex version of R # prec is the precision of R if R is float: prec = 53 C = complex else: try: prec = R.precision() except AttributeError: prec = 53 try: C = R.complex_field() except AttributeError: C = R if algorithm == 'pari': v = ComplexField(prec)(x).gamma_inc(y) else: import mpmath v = ComplexField(prec)(mpmath_utils.call(mpmath.gammainc, x, y, parent=R)) if v.is_real(): return R(v) else: return C(v)