arb – real numbers

class flint.arb(mid=None, rad=None)

Represents a real number \(x\) by a midpoint \(m\) and a radius \(r\) such that \(x \in [m \pm r] = [m-r, m+r]\). The midpoint and radius are both floating-point numbers. The radius uses a fixed, implementation-defined precision (30 bits). The precision used for midpoints is controlled by ctx.prec (bits) or equivalently ctx.dps (digits).

The constructor accepts a midpoint mid and a radius rad, either of which defaults to zero if omitted. The arguments can be tuples \((a, b)\) representing exact floating-point data \(a 2^b\), integers, floating-point numbers, rational strings, or decimal strings. If the radius is nonzero, it might be rounded up to a slightly larger value than the exact value passed by the user.

>>> arb(10.25)
10.2500000000000
>>> print(1 / arb(4))  # exact
0.250000000000000
>>> print(1 / arb(3))  # approximate
[0.333333333333333 +/- 3.71e-16]
>>> print(arb("3.0"))
3.00000000000000
>>> print(arb("0.1"))
[0.100000000000000 +/- 2.23e-17]
>>> print(arb("1/10"))
[0.100000000000000 +/- 2.23e-17]
>>> print(arb("3.14159 +/- 0.00001"))
[3.1416 +/- 2.01e-5]
>>> ctx.dps = 50
>>> print(arb("1/3"))
[0.33333333333333333333333333333333333333333333333333 +/- 3.78e-51]
>>> ctx.default()

Converting to or from decimal results in some loss of accuracy. See arb.str() for details.

abs_lower(self)

Lower bound for the absolute value of self. The output is an arb holding an exact floating-point number that has been rounded down to the current precision.

>>> print(arb("-5 +/- 2").abs_lower().str(5, radius=False))
3.0000
abs_upper(self)

Upper bound for the absolute value of self. The output is an arb holding an exact floating-point number that has been rounded up to the current precision.

>>> print(arb("-5 +/- 2").abs_upper().str(5, radius=False))
7.0000
acos(s)

Inverse cosine \(\operatorname{acos}(s)\).

>>> showgood(lambda: arb(0).acos(), dps=25)
1.570796326794896619231322
acosh(s)

Inverse hyperbolic cosine \(\operatorname{acosh}(s)\).

>>> showgood(lambda: arb(2).acosh(), dps=25)
1.316957896924816708625046
agm(s, t=1)

The arithmetic-geometric mean \(M(s,t)\), or \(M(s) = M(s,1)\) if no extra parameter is passed.

>>> showgood(lambda: arb(2).sqrt().agm(), dps=25)
1.198140234735592207439922
>>> showgood(lambda: arb(2).agm(100), dps=25)
29.64467336236643624632443
>>> showgood(lambda: arb(0).agm(0), dps=25)
0
>>> showgood(arb(0).agm, dps=25)
0
>>> showgood(arb(-2).agm, dps=25)   # not defined for negatives
Traceback (most recent call last):
  ...
ValueError: no convergence (maxprec=960, try higher maxprec)

This function is undefined for negative input. Use acb.agm() for the complex extension.

airy(s)

Computes the Airy function values \(\operatorname{Ai}(s)\), \(\operatorname{Ai}'(s)\), \(\operatorname{Bi}(s)\), \(\operatorname{Bi}'(s)\) simultaneously, returning a tuple.

>>> showgood(lambda: arb(-1).airy(), dps=10)
(0.5355608833, -0.01016056712, 0.1039973895, 0.5923756264)
airy_ai(s, int derivative=0)

Airy function \(\operatorname{Ai}(s)\), or \(\operatorname{Ai}'(s)\) if derivative is 1.

>>> showgood(lambda: arb(-1).airy_ai(), dps=25)
0.5355608832923521187995166
>>> showgood(lambda: arb(-1).airy_ai(derivative=1), dps=25)
-0.01016056711664520939504547
static airy_ai_zero(n, int derivative=0)

For positive integer n, returns the zero \(a_n\) of the Airy function \(\operatorname{Ai}(s)\), or the corresponding zero \(a'_n\) of \(\operatorname{Ai}'(s)\) if derivative is 1.

>>> showgood(lambda: arb.airy_ai_zero(1), dps=25)
-2.338107410459767038489197
>>> showgood(lambda: arb.airy_ai_zero(1000), dps=25)
-281.0315196125215528353364
>>> showgood(lambda: arb.airy_ai_zero(1, derivative=1), dps=25)
-1.018792971647471089017325
airy_bi(s, int derivative=0)

Airy function \(\operatorname{Bi}(s)\), or \(\operatorname{Bi}'(s)\) if derivative is 1.

>>> showgood(lambda: arb(-1).airy_bi(), dps=25)
0.1039973894969446118886900
>>> showgood(lambda: arb(-1).airy_bi(derivative=1), dps=25)
0.5923756264227923508167792
static airy_bi_zero(n, int derivative=0)

For positive integer n, returns the zero \(b_n\) of the Airy function \(\operatorname{Bi}(s)\), or the corresponding zero \(b'_n\) of \(\operatorname{Bi}'(s)\) if derivative is 1.

>>> showgood(lambda: arb.airy_bi_zero(1), dps=25)
-1.173713222709127924919980
>>> showgood(lambda: arb.airy_bi_zero(1000), dps=25)
-280.9378112034152401578834
>>> showgood(lambda: arb.airy_bi_zero(1, derivative=1), dps=25)
-2.294439682614123246622459
asin(s)

Inverse sine \(\operatorname{asin}(s)\).

>>> showgood(lambda: arb(1).asin(), dps=25)
1.570796326794896619231322
asinh(s)

Inverse hyperbolic sine \(\operatorname{asinh}(s)\).

>>> showgood(lambda: arb(1000).asinh(), dps=25)
7.600902709541988611523290
atan(s)

Inverse tangent \(\operatorname{atan}(s)\).

>>> showgood(lambda: arb(1).atan(), dps=25)
0.7853981633974483096156608
static atan2(s, t)

Two-argument inverse tangent \(\operatorname{atan2}(s,t)\).

>>> showgood(lambda: arb.atan2(-10,-5), dps=25)
-2.034443935795702735445578
atanh(s)

Inverse hyperbolic tangent \(\operatorname{atanh}(s)\).

>>> showgood(lambda: arb("0.99").atanh(), dps=25)
2.646652412362246197705061
static bell_number(n)

Computes the Bell number \(B_n\) as an arb, where n is a given integer.

>>> showgood(lambda: arb.bell_number(1), dps=25)
1.000000000000000000000000
>>> showgood(lambda: arb.bell_number(10), dps=25)
115975.0000000000000000000
>>> showgood(lambda: arb.bell_number(10**20), dps=25)
5.382701131762816107395343e+1794956117137290721328
static bernoulli(n)

Computes the Bernoulli number \(B_n\) as an arb, where n is a given integer.

>>> showgood(lambda: arb.bernoulli(1), dps=25)
-0.5000000000000000000000000
>>> showgood(lambda: arb.bernoulli(2), dps=25)
0.1666666666666666666666667
>>> showgood(lambda: arb.bernoulli(10**7), dps=25)
-4.983176441416329828329241e+57675260
>>> showgood(lambda: arb.bernoulli(10**30), dps=25)
-5.048207707665410387507573e+28767525649738633122783863898083
bernoulli_poly(s, ulong n)

Returns the value of the Bernoulli polynomial \(B_n(s)\).

>>> showgood(lambda: arb("3.141").bernoulli_poly(5), dps=25)
113.5165117028492010000000
bessel_i(self, n, bool scaled=False)

Bessel function \(I_n(z)\), where the argument z is given by self and the order n is passed as an extra parameter. Optionally a scaled Bessel function can be computed.

>>> showgood(lambda: arb(5).bessel_i(1), dps=25)
24.33564214245052719914305
>>> showgood(lambda: arb(5).bessel_i(1, scaled=True), dps=25)
0.1639722669445423569261229
bessel_j(self, n)

Bessel function \(J_n(z)\), where the argument z is given by self and the order n is passed as an extra parameter.

>>> showgood(lambda: arb(5).bessel_j(1), dps=25)
-0.3275791375914652220377343
bessel_k(self, n, bool scaled=False)

Bessel function \(K_n(z)\), where the argument z is given by self and the order n is passed as an extra parameter. Optionally a scaled Bessel function can be computed.

>>> showgood(lambda: arb(5).bessel_k(1), dps=25)
0.004044613445452164208365022
>>> showgood(lambda: arb(5).bessel_k(1, scaled=True), dps=25)
0.6002738587883125829360457
bessel_y(self, n)

Bessel function \(Y_n(z)\), where the argument z is given by self and the order n is passed as an extra parameter.

>>> showgood(lambda: arb(5).bessel_y(1), dps=25)
0.1478631433912268448010507
beta_lower(self, a, b, int regularized=0)

Lower incomplete beta function \(B(a,b;z)\). The argument z is given by self and the parameters a and b are passed as extra function arguments. Optionally the regularized version of this function can be computed.

>>> showgood(lambda: arb("0.9").beta_lower(1, 2.5), dps=25)
0.3987350889359326482672004
>>> showgood(lambda: arb("0.9").beta_lower(1, 2.5, regularized=True), dps=25)
0.9968377223398316206680011
bin(s, ulong k)

Binomial coefficient \({s \choose k}\). Currently k is limited to an integer; this restriction will be removed in the future by using the gamma function.

>>> print(arb(10).bin(5))
252.000000000000
>>> showgood(lambda: arb.pi().bin(100), dps=25)
5.478392395095119521549286e-9
static bin_uiui(ulong n, ulong k)

Binomial coefficient \({n \choose k}\).

>>> print(arb.bin_uiui(10, 5))
252.000000000000
ceil(s)

Ceiling function \(\lceil s \rceil\).

>>> print(arb.pi().ceil())
4.00000000000000
>>> print((arb.pi() - arb.pi()).ceil().str(more=True))
[0.500000000000000 +/- 0.501]
chebyshev_t(s, n)

Chebyshev function of the first kind \(T_n(s)\).

>>> showgood(lambda: (arb(1)/3).chebyshev_t(3), dps=25)
-0.8518518518518518518518519
chebyshev_u(s, n)

Chebyshev function of the second kind \(U_n(s)\).

>>> showgood(lambda: (arb(1)/3).chebyshev_u(3), dps=25)
-1.037037037037037037037037
chi(s)

Hyperbolic cosine integral \(\operatorname{Chi}(s)\).

>>> showgood(lambda: arb(3).chi(), dps=25)
4.960392094765609760297918
ci(s)

Cosine integral \(\operatorname{Ci}(s)\).

>>> showgood(lambda: arb(3).ci(), dps=25)
0.1196297860080003276264723
static const_catalan()

Catalan’s constant.

>>> showgood(arb.const_catalan, dps=25)
0.9159655941772190150546035
static const_e()

The constant \(e\).

>>> showgood(arb.const_e, dps=25)
2.718281828459045235360287
static const_euler()

Euler’s constant \(\gamma\).

>>> showgood(arb.const_euler, dps=25)
0.5772156649015328606065121
static const_glaisher()

Glaisher’s constant.

>>> showgood(arb.const_glaisher, dps=25)
1.282427129100622636875343
static const_khinchin()

Khinchin’s constant \(K\).

>>> showgood(arb.const_khinchin, dps=25)
2.685452001065306445309715
static const_log10()

The constant \(\log(10)\).

>>> showgood(arb.const_log10, dps=25)
2.302585092994045684017991
static const_log2()

The constant \(\log(2)\).

>>> showgood(arb.const_log2, dps=25)
0.6931471805599453094172321
static const_sqrt_pi()

The constant \(\sqrt{\pi}\).

>>> showgood(arb.const_sqrt_pi, dps=25)
1.772453850905516027298167
contains(self, other)
cos(s)

Cosine function \(\cos(s)\).

>>> showgood(lambda: arb(1).cos(), dps=25)
0.5403023058681397174009366
cos_pi(s)

Cosine function \(\cos(\pi s)\).

>>> showgood(lambda: arb(0.75).cos_pi(), dps=25)
-0.7071067811865475244008444
>>> showgood(lambda: arb(0.5).cos_pi(), dps=25)
0
static cos_pi_fmpq(fmpq s)

Returns the algebraic cosine value \(\cos(\pi s)\).

>>> showgood(lambda: arb.cos_pi_fmpq(fmpq(3,4)), dps=25)
-0.7071067811865475244008444
cosh(s)

Hyperbolic cosine \(\cosh(s)\).

>>> showgood(lambda: arb(1).cosh(), dps=25)
1.543080634815243778477906
cot(s)

Cotangent function \(\cot(s)\).

>>> showgood(lambda: arb(1).cot(), dps=25)
0.6420926159343307030064200
cot_pi(s)

Cotangent function \(\cot(\pi s)\).

>>> showgood(lambda: arb(0.125).cot_pi(), dps=25)
2.414213562373095048801689
>>> showgood(lambda: arb(0.5).cot_pi(), dps=25)
0
coth(s)

Hyperbolic cotangent \(\coth(s)\).

>>> showgood(lambda: arb(1).coth(), dps=25)
1.313035285499331303636161
csc(s)

Cosecant function \(\operatorname{csc}(s)\).

>>> showgood(lambda: arb(1).csc(), dps=25)
1.188395105778121216261599
csch(s)

Hyperbolic cosecant \(\operatorname{csch}(s)\).

>>> showgood(lambda: arb(1).csch(), dps=25)
0.8509181282393215451338428
digamma(s)

Digamma function \(\psi(s)\).

>>> showgood(lambda: arb(1).digamma(), dps=25)
-0.5772156649015328606065121
ei(s)

Exponential integral \(\operatorname{Ei}(s)\).

>>> showgood(lambda: arb(3).ei(), dps=25)
9.933832570625416558008336
erf(s)

Error function \(\operatorname{erf}(s)\).

>>> showgood(lambda: arb(3).erf(), dps=25)
0.9999779095030014145586272
erfc(s)

Complementary error function \(\operatorname{erfc}(s)\).

>>> showgood(lambda: arb(3).erfc(), dps=25)
2.209049699858544137277613e-5
erfi(s)

Imaginary error function \(\operatorname{erfi}(s)\).

>>> showgood(lambda: arb(3).erfi(), dps=25)
1629.994622601565651061648
exp(s)

Exponential function \(\exp(s)\).

>>> showgood(lambda: arb(1).exp(), dps=25)
2.718281828459045235360287
expint(self, s)

Generalized exponential integral \(E_s(z)\). The argument z is given by self and the order s is passed as an extra parameter.

>>> showgood(lambda: arb(5).expint(2), dps=25)
0.0009964690427088381099832386
expm1(s)

Exponential function \(\exp(s) - 1\), computed accurately for small s.

>>> showgood(lambda: (arb(10) ** -8).expm1(), dps=25)
1.000000005000000016666667e-8
fac(s)

Factorial, equivalent to \(s! = \Gamma(s+1)\).

>>> showgood(lambda: arb(5).fac(), dps=25)
120.0000000000000000000000
>>> showgood(lambda: arb("0.1").fac(), dps=25)
0.9513507698668731836292487
static fac_ui(ulong n)

Factorial \(n!\), given an integer.

>>> print(arb.fac_ui(10))
3628800.00000000
>>> showgood(lambda: arb.fac_ui(10**9).log(), dps=25)
19723265848.22698260792313
static fib(n)

Computes the Fibonacci number \(F_n\) as an arb, where n is a given integer.

>>> print(arb.fib(10))
55.0000000000000
>>> showgood(lambda: arb.fib(10**100).log(), dps=25)
4.812118250596034474977589e+99
floor(s)

Floor function \(\lfloor s \rfloor\).

>>> print(arb.pi().floor())
3.00000000000000
>>> print((arb.pi() - arb.pi()).floor().str(more=True))
[-0.500000000000000 +/- 0.501]
fresnel_c(s, bool normalized=True)

Fresnel cosine integral \(C(s)\), optionally not normalized.

>>> showgood(lambda: arb(3).fresnel_c(), dps=25)
0.6057207892976856295561611
>>> showgood(lambda: arb(3).fresnel_c(normalized=False), dps=25)
0.7028635577302687301744099
fresnel_s(s, bool normalized=True)

Fresnel sine integral \(S(s)\), optionally not normalized.

>>> showgood(lambda: arb(3).fresnel_s(), dps=25)
0.4963129989673750360976123
>>> showgood(lambda: arb(3).fresnel_s(normalized=False), dps=25)
0.7735625268937690171497722
gamma(s)

Gamma function \(\Gamma(s)\).

>>> showgood(lambda: arb(10).gamma(), dps=25)
362880.0000000000000000000
>>> showgood(lambda: arb(-2.5).gamma(), dps=25)
-0.9453087204829418812256893
>>> showgood(lambda: (arb.pi() ** 10).gamma(), dps=25)
1.705646271897306403570389e+424898
>>> showgood(lambda: arb(0).gamma(), dps=25)  # pole
Traceback (most recent call last):
  ...
ValueError: no convergence (maxprec=960, try higher maxprec)
static gamma_fmpq(fmpq s)

Computes the gamma function \(\Gamma(s)\) of a given fmpq s, exploiting the fact that s is an exact rational number to improve performance.

>>> showgood(lambda: arb.gamma_fmpq(fmpq(1,4)), dps=25)
3.625609908221908311930685
gamma_lower(self, s, int regularized=0)

Lower incomplete gamma function \(\gamma(s,z)\). The argument z is given by self and the order s is passed as an extra parameter. Optionally the regularized versions \(P(s,z)\) and \(\gamma^{*}(s,z) = z^{-s} P(s,z)\) can be computed.

>>> showgood(lambda: arb(5).gamma_lower(2.5), dps=25)
1.229327136861979598135209
>>> showgood(lambda: arb(5).gamma_lower(2.5, regularized=1), dps=25)
0.9247647538534878212779231
>>> showgood(lambda: arb(5).gamma_lower(2.5, regularized=2), dps=25)
0.01654269482249807489997922
gamma_upper(self, s, int regularized=0)

Upper incomplete gamma function \(\Gamma(s,z)\). The argument z is given by self and the order s is passed as an extra parameter. Optionally the regularized version \(Q(s,z)\) can be computed.

>>> showgood(lambda: arb(5).gamma_upper(2.5), dps=25)
0.1000132513171574223384170
>>> showgood(lambda: arb(5).gamma_upper(2.5, regularized=1), dps=25)
0.07523524614651217872207687
gegenbauer_c(s, n, m)

Gegenbauer function \(C_n^{m}(s)\).

>>> showgood(lambda: (arb(1)/3).gegenbauer_c(5, 0.25), dps=25)
0.1321855709876543209876543
hermite_h(s, n)

Hermite function \(H_n(s)\).

>>> showgood(lambda: (arb(1)/3).hermite_h(5), dps=25)
34.20576131687242798353909
hypgeom(self, a, b, bool regularized=False)

Generalized hypergeometric function \({}_pF_q(a;b;z)\). The argument z is given by self and a and b are additional lists of complex numbers defining the parameters. Optionally the regularized hypergeometric function can be computed.

>>> showgood(lambda: arb(5).hypgeom([1,2,3],[5,4.5,6]), dps=25)
1.301849229178968153998454
>>> showgood(lambda: arb(5).hypgeom([1,2,3],[5,4.5,6],regularized=True), dps=25)
3.886189282817193519132054e-5
hypgeom_0f1(self, a, bool regularized=False)

The hypergeometric function \({}_0F_1(a,z)\) where the argument z is given by self Optionally the regularized version of this function can be computed.

>>> showgood(lambda: arb(-5).hypgeom_0f1(2.5), dps=25)
0.003114611044402738470826907
>>> showgood(lambda: arb(-5).hypgeom_0f1(2.5, regularized=True), dps=25)
0.002342974810739764377177885
hypgeom_1f1(self, a, b, bool regularized=False)

The hypergeometric function \({}_1F_1(a,b,z)\) where the argument z is given by self Optionally the regularized version of this function can be computed.

>>> showgood(lambda: arb(-5).hypgeom_1f1(1, 2.5), dps=25)
0.2652884733179767675077230
>>> showgood(lambda: arb(-5).hypgeom_1f1(1, 2.5, regularized=True), dps=25)
0.1995639910417191573048664
hypgeom_2f1(self, a, b, c, bool regularized=False, bool ab=False, bool ac=False, bc=False, abc=False)

The hypergeometric function \({}_2F_1(a,b,c,z)\) where the argument z is given by self Optionally the regularized version of this function can be computed.

>>> showgood(lambda: arb(-5).hypgeom_2f1(1,2,3), dps=25)
0.2566592424617555999350018
>>> showgood(lambda: arb(-5).hypgeom_2f1(1,2,3,regularized=True), dps=25)
0.1283296212308777999675009

The flags ab, ac, bc, abc can be used to specify whether the parameter differences \(a-b\), \(a-c\), \(b-c\) and \(a+b-c\) represent exact integers, even if the input intervals are inexact. If the parameters are exact, these flags are not needed.

>>> showgood(lambda: arb("9/10").hypgeom_2f1(arb(2).sqrt(), 0.5, arb(2).sqrt()+1.5, abc=True), dps=25)
1.447530478120770807945697
>>> showgood(lambda: arb("9/10").hypgeom_2f1(arb(2).sqrt(), 0.5, arb(2).sqrt()+1.5), dps=25)
Traceback (most recent call last):
  ...
ValueError: no convergence (maxprec=960, try higher maxprec)
hypgeom_u(self, a, b)

The hypergeometric function \(U(a,b,z)\) where the argument z is given by self

>>> showgood(lambda: arb(5).hypgeom_u(1, 2.5), dps=25)
0.2184157028890778783289036
intersection(s, t)

Returns a ball containing the intersection of s and t. If s and t are non-overlapping, raises ValueError.

>>> arb("10 +/- 8.001").intersection(arb("0 +/- 2.001"))
[2.00 +/- 1.01e-3]
>>> arb(2).intersection(3)
Traceback (most recent call last):
  ...
ValueError: empty intersection
is_exact(self) → bool
is_finite(self) → bool
is_nan(self) → bool
is_zero(self) → bool
jacobi_p(s, n, a, b)

Jacobi polynomial (or Jacobi function) \(P_n^{a,b}(s)\).

>>> showgood(lambda: (arb(1)/3).jacobi_p(5, 0.25, 0.5), dps=25)
0.4131944444444444444444444
laguerre_l(s, n, m=0)

Laguerre function \(L_n^{m}(s)\).

>>> showgood(lambda: (arb(1)/3).laguerre_l(5, 0.25), dps=25)
0.03871323490012002743484225
lambertw(s, int branch=0)

Lambert W function, \(W_k(s)\). Either the principal branch (\(k = 0\)) or the \(k = -1\) branch can be computed by specifying branch.

>>> showgood(lambda: arb(10).lambertw(), dps=25)
1.745528002740699383074301
>>> showgood(lambda: arb("-0.1").lambertw(-1), dps=25)
-3.577152063957297218409392
legendre_p(s, n, m=0, int type=2)

Legendre function of the first kind \(P_n^m(z)\).

>>> showgood(lambda: (arb(1)/3).legendre_p(5), dps=25)
0.3333333333333333333333333
>>> showgood(lambda: (arb(1)/3).legendre_p(5, 1.5), dps=25)
-2.372124991643971726805456
>>> showgood(lambda: (arb(3)).legendre_p(5, 1.5, type=3), dps=25)
17099.70021476473458984981

The optional parameter type can be 2 or 3, and selects between two different branch cut conventions (see Mathematica and mpmath).

static legendre_p_root(ulong n, ulong k, bool weight=False)

Returns the index-k zero of the Legendre polynomial \(P_n(x)\). The zeros are indexed in decreasing order.

If weight is True, returns a tuple (x, w) where x is the zero and w is the corresponding weight for Gauss-Legendre quadrature on \((-1,1)\).

>>> for k in range(5):
...     showgood(lambda: arb.legendre_p_root(5,k), dps=25)
...
0.9061798459386639927976269
0.5384693101056830910363144
0
-0.5384693101056830910363144
-0.9061798459386639927976269
>>> for k in range(3):
...     showgood(lambda: arb.legendre_p_root(3,k,weight=True), dps=15)
...
(0.774596669241483, 0.555555555555556)
(0, 0.888888888888889)
(-0.774596669241483, 0.555555555555556)
legendre_q(s, n, m=0, int type=2)

Legendre function of the second kind \(Q_n^m(z)\).

>>> showgood(lambda: (arb(1)/3).legendre_q(5), dps=25)
0.1655245300933242182362054
>>> showgood(lambda: (arb(1)/3).legendre_q(5, 1.5), dps=25)
-6.059967350218583975575616

The optional parameter type can be 2 or 3, and selects between two different branch cut conventions (see Mathematica and mpmath).

lgamma(s)

Logarithmic gamma function \(\log \Gamma(s)\).

>>> showgood(lambda: arb(100).lgamma(), dps=25)
359.1342053695753987760440

This function is undefined for negative \(s\). Use acb.lgamma() for the complex extension.

li(s, bool offset=False)

Logarithmic integral \(\operatorname{li}(s)\), optionally the offset logarithmic integral \(\operatorname{Li}(s) = \operatorname{li}(s) - \operatorname{li}(2)\).

>>> showgood(lambda: arb(10).li(), dps=25)
6.165599504787297937522982
>>> showgood(lambda: arb(10).li(offset=True), dps=25)
5.120435724669805152678393
log(s)

Natural logarithm \(\log(s)\).

>>> showgood(lambda: arb(2).log(), dps=25)
0.6931471805599453094172321
>>> showgood(lambda: arb(100).exp().log(), dps=25)
100.0000000000000000000000
>>> showgood(lambda: arb(-1).sqrt(), dps=25)
Traceback (most recent call last):
  ...
ValueError: no convergence (maxprec=960, try higher maxprec)

This function is undefined for negative input. Use acb.log() for the complex extension.

log1p(s)

Natural logarithm \(\log(1+s)\), computed accurately for small s.

>>> showgood(lambda: acb(1).log1p(), dps=25)
0.6931471805599453094172321
>>> showgood(lambda: arb("1e-100000000000000000").log1p(), dps=25)
1.000000000000000000000000e-100000000000000000

This function is undefined for \(s \le -1\). Use acb.log1p() for the complex extension.

lower(self)

Lower bound for self (towards \(-\infty\)). The output is an arb holding an exact floating-point number that has been rounded down to the current precision.

>>> print(arb("-5 +/- 2").lower().str(5, radius=False))
-7.0000
man_exp(self)

Decomposes self into an integer mantissa and an exponent, returning an fmpz pair. Requires that self is exact and finite.

>>> arb("1.1").mid().man_exp()
(4953959590107545, -52)
>>> arb("1.1").rad().man_exp()
(1, -52)
>>> arb(0).man_exp()
(0, 0)
>>> arb("1.1").man_exp()
Traceback (most recent call last):
  ...
ValueError: man_exp requires an exact, finite value
>>> arb("+inf").man_exp()
Traceback (most recent call last):
  ...
ValueError: man_exp requires an exact, finite value
max(s, t)

Maximum value of s and t.

>>> arb(2).max(arb("3 +/- 1.1"))
[+/- 4.11]
>>> arb(4).max(arb("3 +/- 1.1"))
[4e+0 +/- 0.101]
mid(self)

Returns the midpoint of self as an exact arb:

>>> arb("1 +/- 0.3").mid()
1.00000000000000
mid_rad_10exp(self, long n=0)

Returns an fmpz triple (mid, rad, exp) where the larger of mid and rad has n digits plus a few digits (n defaults to the current precision), such that self is contained in \([\operatorname{mid} \pm \operatorname{rad}] 10^{\operatorname{exp}}\).

>>> (arb(1) / 3).mid_rad_10exp(10)
(333333333333333, 2, -15)
>>> (arb(1) / 3).mid_rad_10exp(20)
(3333333333333333148296162, 555111516, -25)
>>> arb(0,1e-100).mid_rad_10exp(10)
(0, 100000000376832, -114)
>>> arb(-1,1e100).mid_rad_10exp()
(0, 10000000083585662976, 81)
min(s, t)

Minimum value of s and t.

>>> arb(2).min(3)
2.00000000000000
>>> arb(2).min(arb("3 +/- 1.1"))
[2e+0 +/- 0.101]
static nan()
static neg_inf()
nonnegative_part(self)
overlaps(self, other)
static partitions_p(n)

Number of partitions of the integer n, evaluated as an arb.

>>> showgood(lambda: arb.partitions_p(10), dps=25)
42.00000000000000000000000
>>> showgood(lambda: arb.partitions_p(100), dps=25)
190569292.0000000000000000
>>> showgood(lambda: arb.partitions_p(10**50), dps=25)
3.285979358867807890529967e+11140086280105007830283557
static pi()

Returns the constant \(\pi\) as an arb.

>>> showgood(arb.pi, dps=25)
3.141592653589793238462643
polylog(self, s)

Polylogarithm \(\operatorname{Li}_s(z)\) where the argument z is given by self and the order s is given as an extra parameter.

>>> showgood(lambda: arb(-1).polylog(2), dps=25)
-0.8224670334241132182362076
>>> showgood(lambda: arb(-3).polylog(1.75), dps=25)
-1.813689945878060161612620
>>> showgood(lambda: arb(-2.5).polylog(4.75), dps=25)
-2.322090601785704585092044

This function is undefined for some combinations of \(s, z\). Use acb.polylog() for the complex extension.

static pos_inf()
rad(self)

Returns the radius of self as an exact arb:

>>> print(arb("1 +/- 0.3").rad().str(5, radius=False))
0.30000
rel_accuracy_bits(self)
repr(self)
rgamma(s)

Reciprocal gamma function \(1/\Gamma(s)\), avoiding division by zero at the poles of the gamma function.

>>> showgood(lambda: arb(1.5).rgamma(), dps=25)
1.128379167095512573896159
>>> print(arb(0).rgamma())
0
>>> print(arb(-1).rgamma())
0
>>> print(arb(-3,1e-10).rgamma())
[+/- 6.01e-10]
rising(s, n)

Rising factorial \((s)_n\).

>>> showgood(lambda: arb.pi().rising(0), dps=25)
1.000000000000000000000000
>>> showgood(lambda: arb.pi().rising(10), dps=25)
299606572.3661012684972888
>>> showgood(lambda: arb.pi().rising(0.5), dps=25)
1.703592785410167015590330
rising2(s, ulong n)

Computes the rising factorial \((s)_n\) where n is an unsigned integer, along with the first derivative with respect to \((s)_n\). The current implementation does not use the gamma function, so n should be moderate.

>>> u, v = arb(3).rising2(5)
>>> print(u); print(v)
2520.00000000000
2754.00000000000
static rising_fmpq_ui(fmpq s, ulong n)

Computes the rising factorial \((s)_n\) where s is a rational number and n is an unsigned integer. The current implementation does not use the gamma function, so n should be moderate.

>>> showgood(lambda: arb.rising_fmpq_ui(fmpq(-1,3), 100), dps=25)
-4.960517984074284420131903e+154
root(s, ulong n)

Principal n-th root of s.

>>> showgood(lambda: arb(10).root(3), dps=25)
2.154434690031883721759294
rsqrt(s)

Reciprocal square root \(1/\sqrt{s}\).

>>> showgood(lambda: arb(3).rsqrt(), dps=25)
0.5773502691896257645091488
>>> showgood(lambda: arb(0).rsqrt(), dps=25)
Traceback (most recent call last):
  ...
ValueError: no convergence (maxprec=960, try higher maxprec)
>>> showgood(lambda: arb(-1).rsqrt(), dps=25)
Traceback (most recent call last):
  ...
ValueError: no convergence (maxprec=960, try higher maxprec)

This function is undefined for negative input. Use acb.rsqrt() for the complex extension.

sec(s)

Secant function \(\operatorname{sec}(s)\).

>>> showgood(lambda: arb(1).sec(), dps=25)
1.850815717680925617911753
sech(s)

Hyperbolic secant \(\operatorname{sech}(s)\).

>>> showgood(lambda: arb(1).sech(), dps=25)
0.6480542736638853995749774
sgn(self)

Sign function, returning an arb.

>>> arb(-3).sgn()
-1.00000000000000
>>> arb(0).sgn()
0
>>> arb("0 +/- 1").sgn()
[+/- 1.01]
shi(s)

Hyperbolic sine integral \(\operatorname{Shi}(s)\).

>>> showgood(lambda: arb(3).shi(), dps=25)
4.973440475859806797710418
si(s)

Sine integral \(\operatorname{Si}(s)\).

>>> showgood(lambda: arb(3).si(), dps=25)
1.848652527999468256397730
sin(s)

Sine function \(\sin(s)\).

>>> showgood(lambda: arb(1).sin(), dps=25)
0.8414709848078965066525023
sin_cos(s)

Computes \(\sin(s)\) and \(\cos(s)\) simultaneously.

>>> showgood(lambda: arb(1).sin_cos(), dps=25)
(0.8414709848078965066525023, 0.5403023058681397174009366)
sin_cos_pi(s)

Computes \(\sin(\pi s)\) and \(\cos(\pi s)\) simultaneously.

>>> showgood(lambda: arb(0.75).sin_cos_pi(), dps=25)
(0.7071067811865475244008444, -0.7071067811865475244008444)
static sin_cos_pi_fmpq(fmpq s)

Computes \(\sin(\pi s)\) and \(\cos(\pi s)\) simultaneously.

>>> showgood(lambda: arb.sin_cos_pi_fmpq(fmpq(3,4)), dps=25)
(0.7071067811865475244008444, -0.7071067811865475244008444)
sin_pi(s)

Sine function \(\sin(\pi s)\).

>>> showgood(lambda: arb(0.75).sin_pi(), dps=25)
0.7071067811865475244008444
>>> showgood(lambda: arb(1).sin_pi(), dps=25)
0
static sin_pi_fmpq(fmpq s)

Returns the algebraic sine value \(\sin(\pi s)\).

>>> showgood(lambda: arb.sin_pi_fmpq(fmpq(3,4)), dps=25)
0.7071067811865475244008444
sinc(s)

Sinc function, \(\operatorname{sinc}(x) = \sin(x)/x\).

>>> showgood(lambda: arb(3).sinc(), dps=25)
0.04704000268662240736691493
sinc_pi(s)

Normalized sinc function, \(\operatorname{sinc}(\pi x) = \sin(\pi x)/(\pi x)\).

>>> showgood(lambda: arb(1.5).sinc_pi(), dps=25)
-0.2122065907891937810251784
>>> showgood(lambda: arb(2).sinc_pi(), dps=25)
0
sinh(s)

Hyperbolic sine \(\sinh(s)\).

>>> showgood(lambda: arb(1).sinh(), dps=25)
1.175201193643801456882382
sinh_cosh(s)

Computes \(\sinh(s)\) and \(\cosh(s)\) simultaneously.

>>> showgood(lambda: arb(1).sinh_cosh(), dps=25)
(1.175201193643801456882382, 1.543080634815243778477906)
sqrt(s)

Square root \(\sqrt{s}\).

>>> showgood(lambda: arb(3).sqrt(), dps=25)
1.732050807568877293527446
>>> showgood(lambda: arb(0).sqrt(), dps=25)
0
>>> showgood(lambda: arb(-1).sqrt(), dps=25)
Traceback (most recent call last):
  ...
ValueError: no convergence (maxprec=960, try higher maxprec)

This function is undefined for negative input. Use acb.sqrt() for the complex extension.

str(self, long n=0, bool radius=True, bool more=False, long condense=0)

Produces a human-readable decimal representation of self, with up to n printed digits (which defaults to the current precision) for the midpoint. The output can be parsed by the arb constructor.

Since the internal representation is binary, conversion to decimal (and back from decimal) is generally inexact. Binary-decimal-binary roundtrips may result in significantly larger intervals, and should therefore be done sparingly.

>>> print(arb.pi().str())
[3.14159265358979 +/- 3.34e-15]
>>> print(arb.pi().str(5))
[3.1416 +/- 7.35e-6]
>>> print(arb.pi().str(5, radius=False))
3.1416

By default, the output is truncated so that all displayed digits are guaranteed to be correct, up to adding or subtracting 1 in the last displayed digit (as a special case, if the output ends with a string of 0s, the correct decimal expansion to infinite precision could have a string of 9s).

>>> print((arb(1) - arb("1e-10")).str(5))
[1.0000 +/- 4e-10]
>>> print((arb(1) - arb("1e-10")).str(10))
[0.9999999999 +/- 3e-15]

To force more digits, set more to True.

>>> print(arb("0.1").str(30))
[0.100000000000000 +/- 2.23e-17]
>>> print(arb("0.1").str(30, more=True))
[0.0999999999999999916733273153113 +/- 1.39e-17]

Note that setting more to True results in a smaller printed radius, since there is less error from the conversion back to decimal.

>>> x = arb.pi().sin()
>>> print(x.str())
[+/- 3.46e-16]
>>> print(x.str(more=True))
[1.22460635382238e-16 +/- 2.23e-16]

The error indicated in the output may be much larger than the actual error in the internal representation of self. For example, if self is accurate to 1000 digits and printing is done at 10-digit precision, the output might only appear as being accurate to 10 digits. It is even possible for self to be exact and have an inexact decimal representation.

The condense option can be passed to show only leading and trailing digits of the fractional, integer and exponent parts of the output.

>>> ctx.dps = 1000
>>> print(arb.pi().str(condense=10))
[3.1415926535{...979 digits...}9216420199 +/- 9.28e-1001]
>>> print(arb.fac_ui(300).str(condense=10))
3060575122{...595 digits...}0000000000.0000000000{...365 digits...}0000000000
>>> print(arb(10**100).exp().str(condense=5))
[1.53837{...989 digits...}96534e+43429{...90 digits...}17483 +/- 4.84e+43429{...90 digits...}16483]
>>> ctx.default()
tan(s)

Tangent function \(\tan(s)\).

>>> showgood(lambda: arb(1).tan(), dps=25)
1.557407724654902230506975
tan_pi(s)

Tangent function \(\tan(\pi s)\).

>>> showgood(lambda: arb(0.125).tan_pi(), dps=25)
0.4142135623730950488016887
>>> showgood(lambda: arb(1).tan_pi(), dps=25)
0
tanh(s)

Hyperbolic tangent \(\tanh(s)\).

>>> showgood(lambda: arb(1).tanh(), dps=25)
0.7615941559557648881194583
union(s, t)

Returns a ball containing the union of s and t.

>>> x = arb(3).union(5); x.lower(); x.upper()
[2.99999999813735 +/- 4.86e-15]
[5.00000000186265 +/- 4.86e-15]
unique_fmpz(self)

If self represents exactly one integer, returns this value as an fmpz; otherwise returns None.

>>> arb("5 +/- 0.1").unique_fmpz()
5
>>> arb("5 +/- 0.9").unique_fmpz()
5
>>> arb("5.1 +/- 0.9").unique_fmpz()
>>>
upper(self)

Upper bound for self (towards \(+\infty\)). The output is an arb holding an exact floating-point number that has been rounded up to the current precision.

>>> print(arb("-5 +/- 2").upper().str(5, radius=False))
-3.0000
zeta(s, a=None)

Riemann zeta function \(\zeta(s)\) or the Hurwitz zeta function \(\zeta(s,a)\) if a second parameter is passed.

>>> showgood(lambda: arb(4.25).zeta(), dps=25)
1.066954190711214532450370
>>> showgood(lambda: arb(4.25).zeta(2.75), dps=25)
0.01991885526414599096374229

This function is undefined for some combinations of \(s, a\). Use acb.zeta() for the complex extension.