An acb_poly_t represents a polynomial over the complex numbers, implemented as an array of coefficients of type acb_struct.
Most functions are provided in two versions: an underscore method which operates directly on pre-allocated arrays of coefficients and generally has some restrictions (such as requiring the lengths to be nonzero and not supporting aliasing of the input and output arrays), and a non-underscore method which performs automatic memory management and handles degenerate cases.
Contains a pointer to an array of coefficients (coeffs), the used length (length), and the allocated size of the array (alloc).
An acb_poly_t is defined as an array of length one of type acb_poly_struct, permitting an acb_poly_t to be passed by reference.
Initializes the polynomial for use, setting it to the zero polynomial.
Clears the polynomial, deallocating all coefficients and the coefficient array.
Makes sures that the coefficient array of the polynomial contains at least len initialized coefficients.
Directly changes the length of the polynomial, without allocating or deallocating coefficients. The value shold not exceed the allocation length.
Strips any trailing coefficients which are identical to zero.
Swaps poly1 and poly2 efficiently.
Returns the length of poly, i.e. zero if poly is identically zero, and otherwise one more than the index of the highest term that is not identically zero.
Returns the degree of poly, defined as one less than its length. Note that if one or several leading coefficients are balls containing zero, this value can be larger than the true degree of the exact polynomial represented by poly, so the return value of this function is effectively an upper bound.
Sets poly to the zero polynomial.
Sets poly to the constant polynomial 1.
Sets dest to a copy of src.
Sets dest to a copy of src, rounded to prec bits.
Sets the coefficient with index n in poly to the value c. We require that n is nonnegative.
Sets v to the value of the coefficient with index n in poly. We require that n is nonnegative.
Given \(n \ge 0\), returns a pointer to coefficient n of poly, or NULL if n exceeds the length of poly.
Sets res to poly divided by \(x^n\), throwing away the lower coefficients. We require that n is nonnegative.
Sets res to poly multiplied by \(x^n\). We require that n is nonnegative.
Truncates poly to have length at most n, i.e. degree strictly smaller than n.
Prints the polynomial as an array of coefficients, printing each coefficient using arb_printd.
Creates a random polynomial with length at most len.
Returns nonzero iff A and B are identical as interval polynomials.
Returns nonzero iff poly2 is contained in poly1.
Returns nonzero iff poly1 overlaps with poly2. The underscore function requires that len1 ist at least as large as len2.
If x contains a unique integer polynomial, sets z to that value and returns nonzero. Otherwise (if x represents no integers or more than one integer), returns zero, possibly partially modifying z.
Returns nonzero iff all coefficients in poly have zero imaginary part.
Sets poly to the given real part re plus the imaginary part im, both rounded to prec bits.
Sets poly to src.
Sets res to an exact real polynomial whose coefficients are upper bounds for the absolute values of the coefficients in poly, rounded to prec bits.
Sets {C, max(lenA, lenB)} to the sum of {A, lenA} and {B, lenB}. Allows aliasing of the input and output operands.
Sets C to the sum of A and B.
Sets {C, max(lenA, lenB)} to the difference of {A, lenA} and {B, lenB}. Allows aliasing of the input and output operands.
Sets C to the difference of A and B.
Sets C to the negation of A.
Sets C to A multiplied by \(2^c\).
Sets {C, n} to the product of {A, lenA} and {B, lenB}, truncated to length n. The output is not allowed to be aliased with either of the inputs. We require \(\mathrm{lenA} \ge \mathrm{lenB} > 0\), \(n > 0\), \(\mathrm{lenA} + \mathrm{lenB} - 1 \ge n\).
The classical version uses a plain loop.
The transpose version evaluates the product using four real polynomial multiplications (via _arb_poly_mullow()).
The transpose_gauss version evaluates the product using three real polynomial multiplications. This is almost always faster than transpose, but has worse numerical stability when the coefficients vary in magnitude.
The default function _acb_poly_mullow() automatically switches been classical and transpose multiplication.
If the input pointers are identical (and the lengths are the same), they are assumed to represent the same polynomial, and its square is computed.
Sets C to the product of A and B, truncated to length n. If the same variable is passed for A and B, sets C to the square of A truncated to length n.
Sets {C, lenA + lenB - 1} to the product of {A, lenA} and {B, lenB}. The output is not allowed to be aliased with either of the inputs. We require \(\mathrm{lenA} \ge \mathrm{lenB} > 0\). This function is implemented as a simple wrapper for _acb_poly_mullow().
If the input pointers are identical (and the lengths are the same), they are assumed to represent the same polynomial, and its square is computed.
Sets C to the product of A and B. If the same variable is passed for A and B, sets C to the square of A.
Sets {Qinv, len} to the power series inverse of {Q, Qlen}. Uses Newton iteration.
Sets Qinv to the power series inverse of Q.
Sets {Q, n} to the power series quotient of {A, Alen} by {B, Blen}. Uses Newton iteration followed by multiplication.
Sets Q to the power series quotient A divided by B, truncated to length n.
Performs polynomial division with remainder, computing a quotient \(Q\) and a remainder \(R\) such that \(A = BQ + R\). The implementation reverses the inputs and performs power series division.
If the leading coefficient of \(B\) contains zero (or if \(B\) is identically zero), returns 0 indicating failure without modifying the outputs. Otherwise returns nonzero.
Divides \(A\) by the polynomial \(x - c\), computing the quotient \(Q\) as well as the remainder \(R = f(c)\).
Sets res to the composition \(h(x) = f(g(x))\) where \(f\) is given by poly1 and \(g\) is given by poly2, respectively using Horner’s rule, divide-and-conquer, and an automatic choice between the two algorithms. The underscore methods do not support aliasing of the output with either input polynomial.
Sets res to the power series composition \(h(x) = f(g(x))\) truncated to order \(O(x^n)\) where \(f\) is given by poly1 and \(g\) is given by poly2, respectively using Horner’s rule, the Brent-Kung baby step-giant step algorithm, and an automatic choice between the two algorithms. We require that the constant term in \(g(x)\) is exactly zero. The underscore methods do not support aliasing of the output with either input polynomial.
Sets \(h\) to the power series reversion of \(f\), i.e. the expansion of the compositional inverse function \(f^{-1}(x)\), truncated to order \(O(x^n)\), using respectively Lagrange inversion, Newton iteration, fast Lagrange inversion, and a default algorithm choice.
We require that the constant term in \(f\) is exactly zero and that the linear term is nonzero. The underscore methods assume that flen is at least 2, and do not support aliasing.
Sets \(y = f(x)\), evaluated respectively using Horner’s rule, rectangular splitting, and an automatic algorithm choice.
Sets \(y = f(x), z = f'(x)\), evaluated respectively using Horner’s rule, rectangular splitting, and an automatic algorithm choice.
When Horner’s rule is used, the only advantage of evaluating the function and its derivative simultaneously is that one does not have to generate the derivative polynomial explicitly. With the rectangular splitting algorithm, the powers can be reused, making simultaneous evaluation slightly faster.
Generates the polynomial \((x-x_0)(x-x_1)\cdots(x-x_{n-1})\).
Returns an initialized data structured capable of representing a remainder tree (product tree) of len roots.
Deallocates a tree structure as allocated using _acb_poly_tree_alloc.
Constructs a product tree from a given array of len roots. The tree structure must be pre-allocated to the specified length using _acb_poly_tree_alloc().
Evaluates the polynomial simultaneously at n given points, calling _acb_poly_evaluate() repeatedly.
Evaluates the polynomial simultaneously at n given points, using fast multipoint evaluation.
Recovers the unique polynomial of length at most n that interpolates the given x and y values. This implementation first interpolates in the Newton basis and then converts back to the monomial basis.
Recovers the unique polynomial of length at most n that interpolates the given x and y values. This implementation uses the barycentric form of Lagrange interpolation.
Recovers the unique polynomial of length at most n that interpolates the given x and y values, using fast Lagrange interpolation. The precomp function takes a precomputed product tree over the x values and a vector of interpolation weights as additional inputs.
Sets {res, len - 1} to the derivative of {poly, len}. Allows aliasing of the input and output.
Sets res to the derivative of poly.
Sets {res, len} to the integral of {poly, len - 1}. Allows aliasing of the input and output.
Sets res to the integral of poly.
Sets {res, len} to {f, flen} raised to the power exp, truncated to length len. Requires that len is no longer than the length of the power as computed without truncation (i.e. no zero-padding is performed). Does not support aliasing of the input and output, and requires that flen and len are positive. Uses binary expontiation.
Sets res to poly raised to the power exp, truncated to length len. Uses binary exponentiation.
Sets res to {f, flen} raised to the power exp. Does not support aliasing of the input and output, and requires that flen is positive.
Sets res to poly raised to the power exp.
Sets {h, len} to the power series \(f(x)^{g(x)} = \exp(g(x) \log f(x))\) truncated to length len. This function detects special cases such as g being an exact small integer or \(\pm 1/2\), and computes such powers more efficiently. This function does not support aliasing of the output with either of the input operands. It requires that all lengths are positive, and assumes that flen and glen do not exceed len.
Sets h to the power series \(f(x)^{g(x)} = \exp(g(x) \log f(x))\) truncated to length len. This function detects special cases such as g being an exact small integer or \(\pm 1/2\), and computes such powers more efficiently.
Sets {h, len} to the power series \(f(x)^g = \exp(g \log f(x))\) truncated to length len. This function detects special cases such as g being an exact small integer or \(\pm 1/2\), and computes such powers more efficiently. This function does not support aliasing of the output with either of the input operands. It requires that all lengths are positive, and assumes that flen does not exceed len.
Sets h to the power series \(f(x)^g = \exp(g \log f(x))\) truncated to length len.
Sets g to the power series square root of h, truncated to length n. Uses division-free Newton iteration for the reciprocal square root, followed by a multiplication.
The underscore method does not support aliasing of the input and output arrays. It requires that hlen and n are greater than zero.
Sets g to the reciprocal power series square root of h, truncated to length n. Uses division-free Newton iteration.
The underscore method does not support aliasing of the input and output arrays. It requires that hlen and n are greater than zero.
Sets res to the power series logarithm of f, truncated to length n. Uses the formula \(\log(f(x)) = \int f'(x) / f(x) dx\), adding the logarithm of the constant term in f as the constant of integration.
The underscore method supports aliasing of the input and output arrays. It requires that flen and n are greater than zero.
Sets res the power series inverse tangent of f, truncated to length n.
Uses the formula
adding the function of the constant term in f as the constant of integration.
The underscore method supports aliasing of the input and output arrays. It requires that flen and n are greater than zero.
Sets \(f\) to the power series exponential of \(h\), truncated to length \(n\).
The basecase version uses a simple recurrence for the coefficients, requiring \(O(nm)\) operations where \(m\) is the length of \(h\).
The main implementation uses Newton iteration, starting from a small number of terms given by the basecase algorithm. The complexity is \(O(M(n))\). Redundant operations in the Newton iteration are avoided by using the scheme described in [HZ2004].
The underscore methods support aliasing and allow the input to be shorter than the output, but require the lengths to be nonzero.
Sets s and c to the power series sine and cosine of h, computed simultaneously.
The basecase version uses a simple recurrence for the coefficients, requiring \(O(nm)\) operations where \(m\) is the length of \(h\).
The tangent version uses the tangent half-angle formulas to compute the sine and cosine via _acb_poly_tan_series(). This requires \(O(M(n))\) operations. When \(h = h_0 + h_1\) where the constant term \(h_0\) is nonzero, the evaluation is done as \(\sin(h_0 + h_1) = \cos(h_0) \sin(h_1) + \sin(h_0) \cos(h_1)\), \(\cos(h_0 + h_1) = \cos(h_0) \cos(h_1) - \sin(h_0) \sin(h_1)\), to improve accuracy and avoid dividing by zero at the poles of the tangent function.
The default version automatically selects between the basecase and tangent algorithms depending on the input.
The basecase and tangent versions take a flag times_pi specifying that the input is to be multiplied by \(\pi\).
The underscore methods support aliasing and require the lengths to be nonzero.
Respectively evaluates the power series sine or cosine. These functions simply wrap _acb_poly_sin_cos_series(). The underscore methods support aliasing and require the lengths to be nonzero.
Sets g to the power series tangent of h.
For small n takes the quotient of the sine and cosine as computed using the basecase algorithm. For large n, uses Newton iteration to invert the inverse tangent series. The complexity is \(O(M(n))\).
The underscore version does not support aliasing, and requires the lengths to be nonzero.
Compute the respective trigonometric functions of the input multiplied by \(\pi\).
Sets res to the series expansion of \(\Gamma(h(x))\), \(1/\Gamma(h(x))\), or \(\log \Gamma(h(x))\), \(\psi(h(x))\), truncated to length n.
These functions first generate the Taylor series at the constant term of h, and then call _acb_poly_compose_series(). The Taylor coefficients are generated using Stirling’s series.
The underscore methods support aliasing of the input and output arrays, and require that hlen and n are greater than zero.
Sets res to the rising factorial \((f) (f+1) (f+2) \cdots (f+r-1)\), truncated to length trunc. The underscore method assumes that flen, r and trunc are at least 1, and does not support aliasing. Uses binary splitting.
Computes
as a power series in \(t\) truncated to length len. This function evaluates the sum naively term by term. The threaded version splits the computation over the number of threads returned by flint_get_num_threads().
Computes
as a power series in \(t\) truncated to length len. This function stores a table of powers that have already been calculated, computing \((ij)^r\) as \(i^r j^r\) whenever \(k = ij\) is composite. As a further optimization, it groups all even \(k\) and evaluates the sum as a polynomial in \(2^{-(s+t)}\). This scheme requires about \(n / \log n\) powers, \(n / 2\) multiplications, and temporary storage of \(n / 6\) power series. Due to the extra power series multiplications, it is only faster than the naive algorithm when len is small.
Chooses N and M for Euler-Maclaurin summation of the Hurwitz zeta function, using a default algorithm.
Compute bounds for Euler-Maclaurin evaluation of the Hurwitz zeta function or its power series, using the formulas in [Joh2013].
Evaluates the tail in the Euler-Maclaurin sum for the Hurwitz zeta function, respectively using the naive recurrence and binary splitting.
Evaluates the truncated Euler-Maclaurin sum of order \(N, M\) for the length-d truncated Taylor series of the Hurwitz zeta function \(\zeta(s,a)\) at \(s\), using a working precision of prec bits. With \(a = 1\), this gives the usual Riemann zeta function.
If deflate is nonzero, \(\zeta(s,a) - 1/(s-1)\) is evaluated (which permits series expansion at \(s = 1\)).
Computes the series expansion of \(\zeta(s+x,a)\) (or \(\zeta(s+x,a) - 1/(s+x-1)\) if deflate is nonzero) to order d.
This function wraps _acb_poly_zeta_em_sum(), automatically choosing default values for \(N, M\) using _acb_poly_zeta_em_choose_param() to target an absolute truncation error of \(2^{-\operatorname{prec}}\).
Sets res to the Hurwitz zeta function \(\zeta(s,a)\) where \(s\) a power series and \(a\) is a constant, truncated to length n. To evaluate the usual Riemann zeta function, set \(a = 1\).
If deflate is nonzero, evaluates \(\zeta(s,a) + 1/(1-s)\), which is well-defined as a limit when the constant term of \(s\) is 1. In particular, expanding \(\zeta(s,a) + 1/(1-s)\) with \(s = 1+x\) gives the Stieltjes constants
If \(a = 1\), this implementation uses the reflection formula if the midpoint of the constant term of \(s\) is negative.
Sets w to the Taylor series with respect to x of the polylogarithm \(\operatorname{Li}_{s+x}(z)\), where s and z are given complex constants. The output is computed to length len which must be positive. Aliasing between w and s or z is not permitted.
The small version uses the standard power series expansion with respect to z, convergent when \(|z| < 1\). The zeta version evaluates the polylogarithm as a sum of two Hurwitz zeta functions. The default version automatically delegates to the small version when z is close to zero, and the zeta version otherwise. For further details, see Algorithms for polylogarithms.
Sets w to the polylogarithm \(\operatorname{Li}_{s}(z)\) where s is a given power series, truncating the output to length len. The underscore method requires all lengths to be positive and supports aliasing between all inputs and outputs.
Sets res to the error function of the power series z, truncated to length n.
Sets res to the upper incomplete gamma function \(\Gamma(s,z)\) where s is a constant and z is a power series, truncated to length n.
Sets res to the arithmetic-geometric mean of 1 and the power series z, truncated to length n.
Sets res to the complete elliptic integral of the first kind of the power series z, truncated to length n.
Sets res to the Weierstrass elliptic function of the power series z, with periods 1 and tau, truncated to length n.
Given any complex number \(m\), and a nonconstant polynomial \(f\) and its derivative \(f'\), sets r to a complex interval centered on \(m\) that is guaranteed to contain at least one root of \(f\). Such an interval is obtained by taking a ball of radius \(|f(m)/f'(m)| n\) where \(n\) is the degree of \(f\). Proof: assume that the distance to the nearest root exceeds \(r = |f(m)/f'(m)| n\). Then
which is a contradiction (see [Kob2010]).
Given a list of approximate roots of the input polynomial, this function sets a rigorous bounding interval for each root, and determines which roots are isolated from all the other roots. It then rearranges the list of roots so that the isolated roots are at the front of the list, and returns the count of isolated roots.
If the return value equals the degree of the polynomial, then all roots have been found. If the return value is smaller, all the remaining output intervals are guaranteed to contain roots, but it is possible that not all of the polynomial’s roots are contained among them.
Refines the given roots simultaneously using a single iteration of the Durand-Kerner method. The radius of each root is set to an approximation of the correction, giving a rough estimate of its error (not a rigorous bound).
Attempts to compute all the roots of the given nonzero polynomial poly using a working precision of prec bits. If n denotes the degree of poly, the function writes n approximate roots with rigorous error bounds to the preallocated array roots, and returns the number of roots that are isolated.
If the return value equals the degree of the polynomial, then all roots have been found. If the return value is smaller, all the output intervals are guaranteed to contain roots, but it is possible that not all of the polynomial’s roots are contained among them.
The roots are computed numerically by performing several steps with the Durand-Kerner method and terminating if the estimated accuracy of the roots approaches the working precision or if the number of steps exceeds maxiter, which can be set to zero in order to use a default value. Finally, the approximate roots are validated rigorously.
Initial values for the iteration can be provided as the array initial. If initial is set to NULL, default values \((0.4+0.9i)^k\) are used.
The polynomial is assumed to be squarefree. If there are repeated roots, the iteration is likely to find them (with low numerical accuracy), but the error bounds will not converge as the precision increases.