# 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.