.. _fmpz-poly-q: **fmpz_poly_q.h** -- rational functions over the rational numbers =============================================================================== Description. Types, macros and constants ------------------------------------------------------------------------------- .. type:: fmpz_poly_q_struct .. type:: fmpz_poly_q_t Description. Memory management -------------------------------------------------------------------------------- We represent a rational function over `\mathbf{Q}` as the quotient of two coprime integer polynomials of type ``fmpz_poly_t``, enforcing that the leading coefficient of the denominator is positive. The zero function is represented as `0/1`. .. function:: void fmpz_poly_q_init(fmpz_poly_q_t rop) Initialises ``rop``. .. function:: void fmpz_poly_q_clear(fmpz_poly_q_t rop) Clears the object ``rop``. .. function:: fmpz_poly_struct * fmpz_poly_q_numref(const fmpz_poly_q_t op) Returns a reference to the numerator of ``op``. .. function:: fmpz_poly_struct * fmpz_poly_q_denref(const fmpz_poly_q_t op) Returns a reference to the denominator of ``op``. .. function:: void fmpz_poly_q_canonicalise(fmpz_poly_q_t rop) Brings ``rop`` into canonical form, only assuming that the denominator is non-zero. .. function:: int fmpz_poly_q_is_canonical(const fmpz_poly_q_t op) Checks whether the rational function ``op`` is in canonical form. Randomisation -------------------------------------------------------------------------------- .. function:: void fmpz_poly_q_randtest(fmpz_poly_q_t poly, flint_rand_t state, slong len1, flint_bitcnt_t bits1, slong len2, flint_bitcnt_t bits2) Sets ``poly`` to a random rational function. .. function:: void fmpz_poly_q_randtest_not_zero(fmpz_poly_q_t poly, flint_rand_t state, slong len1, flint_bitcnt_t bits1, slong len2, flint_bitcnt_t bits2) Sets ``poly`` to a random non-zero rational function. Assignment -------------------------------------------------------------------------------- .. function:: void fmpz_poly_q_set(fmpz_poly_q_t rop, const fmpz_poly_q_t op) Sets the element ``rop`` to the same value as the element ``op``. .. function:: void fmpz_poly_q_set_si(fmpz_poly_q_t rop, slong op) Sets the element ``rop`` to the value given by the ``slong`` ``op``. .. function:: void fmpz_poly_q_swap(fmpz_poly_q_t op1, fmpz_poly_q_t op2) Swaps the elements ``op1`` and ``op2``. This is done efficiently by swapping pointers. .. function:: void fmpz_poly_q_zero(fmpz_poly_q_t rop) Sets ``rop`` to zero. .. function:: void fmpz_poly_q_one(fmpz_poly_q_t rop) Sets ``rop`` to one. .. function:: void fmpz_poly_q_neg(fmpz_poly_q_t rop, const fmpz_poly_q_t op) Sets the element ``rop`` to the additive inverse of ``op``. .. function:: void fmpz_poly_q_inv(fmpz_poly_q_t rop, const fmpz_poly_q_t op) Sets the element ``rop`` to the multiplicative inverse of ``op``. Assumes that the element ``op`` is non-zero. Comparison -------------------------------------------------------------------------------- .. function:: int fmpz_poly_q_is_zero(const fmpz_poly_q_t op) Returns whether the element ``op`` is zero. .. function:: int fmpz_poly_q_is_one(const fmpz_poly_q_t op) Returns whether the element ``rop`` is equal to the constant polynomial `1`. .. function:: int fmpz_poly_q_equal(const fmpz_poly_q_t op1, const fmpz_poly_q_t op2) Returns whether the two elements ``op1`` and ``op2`` are equal. Addition and subtraction -------------------------------------------------------------------------------- .. function:: void fmpz_poly_q_add(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2) Sets ``rop`` to the sum of ``op1`` and ``op2``. .. function:: void fmpz_poly_q_sub(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2) Sets ``rop`` to the difference of ``op1`` and ``op2``. .. function:: void fmpz_poly_q_addmul(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2) Adds the product of ``op1`` and ``op2`` to ``rop``. .. function:: void fmpz_poly_q_submul(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2) Subtracts the product of ``op1`` and ``op2`` from ``rop``. Scalar multiplication and division -------------------------------------------------------------------------------- .. function:: void fmpz_poly_q_scalar_mul_si(fmpz_poly_q_t rop, const fmpz_poly_q_t op, slong x) Sets ``rop`` to the product of the rational function ``op`` and the ``slong`` integer `x`. .. function:: void fmpz_poly_q_scalar_mul_mpz(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const mpz_t x) Sets ``rop`` to the product of the rational function ``op`` and the ``mpz_t`` integer `x`. .. function:: void fmpz_poly_q_scalar_mul_mpq(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const mpq_t x) Sets ``rop`` to the product of the rational function ``op`` and the ``mpq_t`` rational `x`. .. function:: void fmpz_poly_q_scalar_div_si(fmpz_poly_q_t rop, const fmpz_poly_q_t op, slong x) Sets ``rop`` to the quotient of the rational function ``op`` and the ``slong`` integer `x`. .. function:: void fmpz_poly_q_scalar_div_mpz(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const mpz_t x) Sets ``rop`` to the quotient of the rational function ``op`` and the ``mpz_t`` integer `x`. .. function:: void fmpz_poly_q_scalar_div_mpq(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const mpq_t x) Sets ``rop`` to the quotient of the rational function ``op`` and the ``mpq_t`` rational `x`. Multiplication and division -------------------------------------------------------------------------------- .. function:: void fmpz_poly_q_mul(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2) Sets ``rop`` to the product of ``op1`` and ``op2``. .. function:: void fmpz_poly_q_div(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2) Sets ``rop`` to the quotient of ``op1`` and ``op2``. Powering -------------------------------------------------------------------------------- .. function:: void fmpz_poly_q_pow(fmpz_poly_q_t rop, const fmpz_poly_q_t op, ulong exp) Sets ``rop`` to the ``exp``-th power of ``op``. The corner case of ``exp == 0`` is handled by setting ``rop`` to the constant function `1`. Note that this includes the case `0^0 = 1`. Derivative -------------------------------------------------------------------------------- .. function:: void fmpz_poly_q_derivative(fmpz_poly_q_t rop, const fmpz_poly_q_t op) Sets ``rop`` to the derivative of ``op``. Evaluation -------------------------------------------------------------------------------- .. function:: int fmpz_poly_q_evaluate(mpq_t rop, const fmpz_poly_q_t f, const mpq_t a) Sets ``rop`` to `f` evaluated at the rational `a`. If the denominator evaluates to zero at `a`, returns non-zero and does not modify any of the variables. Otherwise, returns `0` and sets ``rop`` to the rational `f(a)`. Input and output -------------------------------------------------------------------------------- The following three methods enable users to construct elements of type\\ ``fmpz_poly_q_t`` from strings or to obtain string representations of such elements. The format used is based on the FLINT format for integer polynomials of type ``fmpz_poly_t``, which we recall first: A non-zero polynomial `a_0 + a_1 X + \dotsb + a_n X^n` of length `n + 1` is represented by the string ``"n+1 a_0 a_1 ... a_n"``, where there are two space characters following the length and single space characters separating the individual coefficients. There is no leading or trailing white-space. The zero polynomial is simply represented by ``"0"``. We adapt this notation for rational functions as follows. We denote the zero function by ``"0"``. Given a non-zero function with numerator and denominator string representations ``num`` and ``den``, respectively, we use the string ``num/den`` to represent the rational function, unless the denominator is equal to one, in which case we simply use ``num``. There is also a ``_pretty`` variant available, which bases the string parts for the numerator and denominator on the output of the function ``fmpz_poly_get_str_pretty`` and introduces parentheses where necessary. Note that currently these functions are not optimised for performance and are intended to be used only for debugging purposes or one-off input and output, rather than as a low-level parser. .. function:: int fmpz_poly_q_set_str(fmpz_poly_q_t rop, const char *s) Sets ``rop`` to the rational function given by the string ``s``. .. function:: char * fmpz_poly_q_get_str(const fmpz_poly_q_t op) Returns the string representation of the rational function ``op``. .. function:: char * fmpz_poly_q_get_str_pretty(const fmpz_poly_q_t op, const char *x) Returns the pretty string representation of the rational function ``op``. .. function:: int fmpz_poly_q_print(const fmpz_poly_q_t op) Prints the representation of the rational function ``op`` to ``stdout``. .. function:: int fmpz_poly_q_print_pretty(const fmpz_poly_q_t op, const char *x) Prints the pretty representation of the rational function ``op`` to ``stdout``.