Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-11-07 10:15:17

0001 /*
0002     Copyright (C) 2009, 2010, 2011 Sebastian Pancratz
0003     Copyright (C) 2023 Albin Ahlbäck
0004 
0005     This file is part of FLINT.
0006 
0007     FLINT is free software: you can redistribute it and/or modify it under
0008     the terms of the GNU Lesser General Public License (LGPL) as published
0009     by the Free Software Foundation; either version 3 of the License, or
0010     (at your option) any later version.  See <https://www.gnu.org/licenses/>.
0011 */
0012 
0013 #ifndef FMPZ_POLY_Q_H
0014 #define FMPZ_POLY_Q_H
0015 
0016 #ifdef FMPZ_POLY_Q_INLINES_C
0017 #define FMPZ_POLY_Q_INLINE
0018 #else
0019 #define FMPZ_POLY_Q_INLINE static inline
0020 #endif
0021 
0022 #include "fmpz_poly.h"
0023 
0024 #ifdef __cplusplus
0025 extern "C" {
0026 #endif
0027 
0028 /* Accessing numerator and denominator ***************************************/
0029 
0030 #define fmpz_poly_q_numref(op)  ((op)->num)
0031 
0032 #define fmpz_poly_q_denref(op)  ((op)->den)
0033 
0034 void fmpz_poly_q_canonicalise(fmpz_poly_q_t rop);
0035 
0036 int fmpz_poly_q_is_canonical(const fmpz_poly_q_t op);
0037 
0038 /* Memory management *********************************************************/
0039 
0040 void fmpz_poly_q_init(fmpz_poly_q_t rop);
0041 
0042 void fmpz_poly_q_clear(fmpz_poly_q_t rop);
0043 
0044 /* Randomisation *************************************************************/
0045 
0046 void fmpz_poly_q_randtest(fmpz_poly_q_t poly, flint_rand_t state,
0047                           slong len1, flint_bitcnt_t bits1,
0048                           slong len2, flint_bitcnt_t bits2);
0049 
0050 void fmpz_poly_q_randtest_not_zero(fmpz_poly_q_t poly, flint_rand_t state,
0051                                    slong len1, flint_bitcnt_t bits1,
0052                                    slong len2, flint_bitcnt_t bits2);
0053 
0054 /* Assignment ****************************************************************/
0055 
0056 void fmpz_poly_q_set(fmpz_poly_q_t rop, const fmpz_poly_q_t op);
0057 
0058 void fmpz_poly_q_set_si(fmpz_poly_q_t rop, slong op);
0059 
0060 void fmpz_poly_q_swap(fmpz_poly_q_t op1, fmpz_poly_q_t op2);
0061 
0062 FMPZ_POLY_Q_INLINE
0063 void fmpz_poly_q_zero(fmpz_poly_q_t rop)
0064 {
0065     fmpz_poly_zero(rop->num);
0066     fmpz_poly_set_si(rop->den, 1);
0067 }
0068 
0069 FMPZ_POLY_Q_INLINE
0070 void fmpz_poly_q_one(fmpz_poly_q_t rop)
0071 {
0072     fmpz_poly_set_si(rop->num, 1);
0073     fmpz_poly_set_si(rop->den, 1);
0074 }
0075 
0076 FMPZ_POLY_Q_INLINE
0077 void fmpz_poly_q_neg(fmpz_poly_q_t rop, const fmpz_poly_q_t op)
0078 {
0079     fmpz_poly_neg(rop->num, op->num);
0080     fmpz_poly_set(rop->den, op->den);
0081 }
0082 
0083 void fmpz_poly_q_inv(fmpz_poly_q_t rop, const fmpz_poly_q_t op);
0084 
0085 /* Comparison ****************************************************************/
0086 
0087 FMPZ_POLY_Q_INLINE
0088 int fmpz_poly_q_is_zero(const fmpz_poly_q_t op)
0089 {
0090     return fmpz_poly_is_zero(op->num);
0091 }
0092 
0093 FMPZ_POLY_Q_INLINE
0094 int fmpz_poly_q_is_one(const fmpz_poly_q_t op)
0095 {
0096     return fmpz_poly_is_one(op->num) && fmpz_poly_is_one(op->den);
0097 }
0098 
0099 FMPZ_POLY_Q_INLINE
0100 int fmpz_poly_q_equal(const fmpz_poly_q_t op1, const fmpz_poly_q_t op2)
0101 {
0102     return fmpz_poly_equal(op1->num, op2->num) && fmpz_poly_equal(op1->den, op2->den);
0103 }
0104 
0105 /* Addition and subtraction **************************************************/
0106 
0107 void fmpz_poly_q_add_in_place(fmpz_poly_q_t rop, const fmpz_poly_q_t op);
0108 void fmpz_poly_q_sub_in_place(fmpz_poly_q_t rop, const fmpz_poly_q_t op);
0109 
0110 void fmpz_poly_q_add(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2);
0111 void fmpz_poly_q_sub(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2);
0112 
0113 void fmpz_poly_q_addmul(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2);
0114 void fmpz_poly_q_submul(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2);
0115 
0116 /* Scalar multiplication and division ****************************************/
0117 
0118 void fmpz_poly_q_scalar_mul_si(fmpz_poly_q_t rop, const fmpz_poly_q_t op, slong x);
0119 void fmpz_poly_q_scalar_mul_fmpz(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const fmpz_t x);
0120 void fmpz_poly_q_scalar_mul_fmpq(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const fmpq_t x);
0121 
0122 void fmpz_poly_q_scalar_div_si(fmpz_poly_q_t rop, const fmpz_poly_q_t op, slong x);
0123 void fmpz_poly_q_scalar_div_fmpz(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const fmpz_t x);
0124 void fmpz_poly_q_scalar_div_fmpq(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const fmpq_t x);
0125 
0126 /* Multiplication and division ***********************************************/
0127 
0128 void fmpz_poly_q_mul(fmpz_poly_q_t rop,
0129                      const fmpz_poly_q_t op1, const fmpz_poly_q_t op2);
0130 
0131 void fmpz_poly_q_div(fmpz_poly_q_t rop,
0132                      const fmpz_poly_q_t op1, const fmpz_poly_q_t op2);
0133 
0134 /* Powering ******************************************************************/
0135 
0136 void fmpz_poly_q_pow(fmpz_poly_q_t rop, const fmpz_poly_q_t op, ulong exp);
0137 
0138 /* Derivative ****************************************************************/
0139 
0140 void fmpz_poly_q_derivative(fmpz_poly_q_t rop, const fmpz_poly_q_t op);
0141 
0142 /* Evaluation ****************************************************************/
0143 
0144 int fmpz_poly_q_evaluate_fmpq(fmpq_t rop, const fmpz_poly_q_t f, const fmpq_t a);
0145 
0146 /* Input and output **********************************************************/
0147 
0148 int fmpz_poly_q_set_str(fmpz_poly_q_t rop, const char *s);
0149 
0150 char * fmpz_poly_q_get_str(const fmpz_poly_q_t op);
0151 char * fmpz_poly_q_get_str_pretty(const fmpz_poly_q_t op, const char *x);
0152 
0153 int fmpz_poly_q_print(const fmpz_poly_q_t op);
0154 int fmpz_poly_q_print_pretty(const fmpz_poly_q_t op, const char *x);
0155 
0156 /* Declare old functions dead *************************************************/
0157 
0158 #define fmpz_poly_q_scalar_mul_mpz _Pragma("GCC error \"'fmpz_poly_q_scalar_mul_mpz' is deprecated. Use 'fmpz_poly_q_scalar_mul_fmpz' instead.\"")
0159 #define fmpz_poly_q_scalar_mul_mpq _Pragma("GCC error \"'fmpz_poly_q_scalar_mul_mpq' is deprecated. Use 'fmpz_poly_q_scalar_mul_fmpq' instead.\"")
0160 #define fmpz_poly_q_scalar_div_mpz _Pragma("GCC error \"'fmpz_poly_q_scalar_div_mpz' is deprecated. Use 'fmpz_poly_q_scalar_div_fmpz' instead.\"")
0161 #define fmpz_poly_q_scalar_div_mpq _Pragma("GCC error \"'fmpz_poly_q_scalar_div_mpq' is deprecated. Use 'fmpz_poly_q_scalar_div_fmpq' instead.\"")
0162 #define fmpz_poly_q_evaluate _Pragma("GCC error \"'fmpz_poly_q_evaluate' is deprecated. Use 'fmpz_poly_q_evaluate_fmpq' instead.\"")
0163 
0164 #ifdef __cplusplus
0165 }
0166 #endif
0167 
0168 #endif