1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
|
.. _fmpz-mpoly-q:
**fmpz_mpoly_q.h** -- multivariate rational functions over Q
===============================================================================
An :type:`fmpz_mpoly_q_t` represents an element of
`\mathbb{Q}(x_1,\ldots,x_n)` for fixed *n* as a pair of FLINT
multivariate polynomials (:type:`fmpz_mpoly_t`).
Instances are always kept in canonical form by ensuring that the GCD
of numerator and denominator is 1 and that the coefficient
of the leading term of the denominator is positive.
The user must create a multivariate polynomial context
(:type:`fmpz_mpoly_ctx_t`) specifying the number of variables *n* and
the monomial ordering.
Types and macros
-------------------------------------------------------------------------------
.. type:: fmpz_mpoly_q_struct
.. type:: fmpz_mpoly_q_t
An *fmpz_mpoly_q_struct* consists of a pair of *fmpz_mpoly_struct*:s.
An *fmpz_mpoly_q_t* is defined as an array of length one of type
*fmpz_mpoly_q_struct*, permitting an *fmpz_mpoly_q_t* to be passed by
reference.
.. macro:: fmpz_mpoly_q_numref(x)
Macro returning a pointer to the numerator of *x* which can be used as an *fmpz_mpoly_t*.
.. macro:: fmpz_mpoly_q_denref(x)
Macro returning a pointer to the denominator of *x* which can be used as an *fmpz_mpoly_t*.
Memory management
-------------------------------------------------------------------------------
.. function:: void fmpz_mpoly_q_init(fmpz_mpoly_q_t res, const fmpz_mpoly_ctx_t ctx)
Initializes *res* for use, and sets its value to zero.
.. function:: void fmpz_mpoly_q_clear(fmpz_mpoly_q_t res, const fmpz_mpoly_ctx_t ctx)
Clears *res*, freeing or recycling its allocated memory.
Assignment
-------------------------------------------------------------------------------
.. function:: void fmpz_mpoly_q_swap(fmpz_mpoly_q_t x, fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx)
Swaps the values of *x* and *y* efficiently.
.. function:: void fmpz_mpoly_q_set(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_set_fmpq(fmpz_mpoly_q_t res, const fmpq_t x, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_set_fmpz(fmpz_mpoly_q_t res, const fmpz_t x, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_set_si(fmpz_mpoly_q_t res, slong x, const fmpz_mpoly_ctx_t ctx)
Sets *res* to the value *x*.
Canonicalisation
-------------------------------------------------------------------------------
.. function:: void fmpz_mpoly_q_canonicalise(fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
Puts the numerator and denominator of *x* in canonical form by removing
common content and making the leading term of the denominator positive.
.. function:: int fmpz_mpoly_q_is_canonical(const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
Returns whether *x* is in canonical form.
In addition to verifying that the numerator and denominator
have no common content and that the leading term of the denominator
is positive, this function checks that the denominator is nonzero and that
the numerator and denominator have correctly sorted terms
(these properties should normally hold; verifying them
provides an extra consistency check for test code).
Properties
-------------------------------------------------------------------------------
.. function:: int fmpz_mpoly_q_is_zero(const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
Returns whether *x* is the constant 0.
.. function:: int fmpz_mpoly_q_is_one(const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
Returns whether *x* is the constant 1.
.. function:: void fmpz_mpoly_q_used_vars(int * used, const fmpz_mpoly_q_t f, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_used_vars_num(int * used, const fmpz_mpoly_q_t f, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_used_vars_den(int * used, const fmpz_mpoly_q_t f, const fmpz_mpoly_ctx_t ctx)
For each variable, sets the corresponding entry in *used* to the
boolean flag indicating whether that variable appears in the
rational function (respectively its numerator or denominator).
Special values
-------------------------------------------------------------------------------
.. function:: void fmpz_mpoly_q_zero(fmpz_mpoly_q_t res, const fmpz_mpoly_ctx_t ctx)
Sets *res* to the constant 0.
.. function:: void fmpz_mpoly_q_one(fmpz_mpoly_q_t res, const fmpz_mpoly_ctx_t ctx)
Sets *res* to the constant 1.
.. function:: void fmpz_mpoly_q_gen(fmpz_mpoly_q_t res, slong i, const fmpz_mpoly_ctx_t ctx)
Sets *res* to the generator `x_{i+1}`.
Requires `0 \le i < n` where *n* is the number of variables of *ctx*.
Input and output
-------------------------------------------------------------------------------
The variable strings in *x* start with the variable of most significance at index `0`. If *x* is ``NULL``, the variables are named ``x1``, ``x2``, etc.
.. function:: void fmpz_mpoly_q_print_pretty(const fmpz_mpoly_q_t f, const char ** x, const fmpz_mpoly_ctx_t ctx)
Prints *res* to standard output. If *x* is not *NULL*, the strings in
*x* are used as the symbols for the variables.
.. function:: char * fmpz_mpoly_q_get_str_pretty(const fmpz_mpoly_q_t f, const char ** x, const fmpz_mpoly_ctx_t ctx)
Return a string, which the user is responsible for cleaning up, representing *f*, given an array of variable strings *x*.
.. function:: int fmpz_mpoly_q_set_str_pretty(fmpz_mpoly_q_t res, const char * s, const char ** x, fmpz_mpoly_ctx_t ctx)
Set *res* to the fraction in the null-terminated string *str* given an array *x* of variable strings.
If parsing *str* fails, *res* is set to zero, and `-1` is returned. Otherwise, `0` is returned.
The operations ``+``, ``-``, ``*``, and ``/`` are permitted along with integers and the variables in *x*.
The character ``^`` must be immediately followed by the (integer) exponent.
If division by zero occurs, parsing fails.
Random generation
-------------------------------------------------------------------------------
.. function:: void fmpz_mpoly_q_randtest(fmpz_mpoly_q_t res, flint_rand_t state, slong length, ulong coeff_bits, slong exp_bound, const fmpz_mpoly_ctx_t ctx)
Sets *res* to a random rational function where both numerator and denominator
have up to *length* terms, coefficients up to size *coeff_bits*, and
exponents strictly smaller than *exp_bound*.
Comparisons
-------------------------------------------------------------------------------
.. function:: int fmpz_mpoly_q_equal(const fmpz_mpoly_q_t x, const fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx)
Returns whether *x* and *y* are equal.
Arithmetic
-------------------------------------------------------------------------------
.. function:: void fmpz_mpoly_q_neg(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
Sets *res* to the negation of *x*.
.. function:: void fmpz_mpoly_q_add(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_add_fmpq(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpq_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_add_fmpz(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_add_si(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, slong y, const fmpz_mpoly_ctx_t ctx)
Sets *res* to the sum of *x* and *y*.
.. function:: void fmpz_mpoly_q_sub(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_sub_fmpq(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpq_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_sub_fmpz(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_sub_si(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, slong y, const fmpz_mpoly_ctx_t ctx)
Sets *res* to the difference of *x* and *y*.
.. function:: void fmpz_mpoly_q_mul(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_mul_fmpq(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpq_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_mul_fmpz(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_mul_si(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, slong y, const fmpz_mpoly_ctx_t ctx)
Sets *res* to the product of *x* and *y*.
.. function:: void fmpz_mpoly_q_div(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_div_fmpq(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpq_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_div_fmpz(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_div_si(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, slong y, const fmpz_mpoly_ctx_t ctx)
Sets *res* to the quotient of *x* and *y*.
Division by zero calls *flint_abort*.
.. function:: void fmpz_mpoly_q_inv(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
Sets *res* to the inverse of *x*. Division by zero
calls *flint_abort*.
Content
-------------------------------------------------------------------------------
.. function:: void _fmpz_mpoly_q_content(fmpz_t num, fmpz_t den, const fmpz_mpoly_t xnum, const fmpz_mpoly_t xden, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_content(fmpq_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
Sets *res* to the content of the coefficients of *x*.
.. raw:: latex
\newpage
|