1 /*
2     Copyright (C) 2018 Daniel Schultz
3 
4     This file is part of FLINT.
5 
6     FLINT is free software: you can redistribute it and/or modify it under
7     the terms of the GNU Lesser General Public License (LGPL) as published
8     by the Free Software Foundation; either version 2.1 of the License, or
9     (at your option) any later version.  See <https://www.gnu.org/licenses/>.
10 */
11 
12 #include "fmpq_mpoly.h"
13 
_fmpq_mpoly_push_rescale(fmpq_mpoly_t A,fmpq_t C,const fmpq_mpoly_ctx_t ctx)14 void _fmpq_mpoly_push_rescale(fmpq_mpoly_t A,
15                                           fmpq_t C, const fmpq_mpoly_ctx_t ctx)
16 {
17     fmpz_mpoly_struct * Z = A->zpoly;
18 
19     if (!fmpz_is_one(fmpq_numref(A->content)))
20     {
21         _fmpz_vec_scalar_mul_fmpz(Z->coeffs, Z->coeffs, Z->length,
22                                                       fmpq_numref(A->content));
23         fmpz_one(fmpq_numref(A->content));
24     }
25 
26     fmpq_mul_fmpz(C, C, fmpq_denref(A->content));
27     if (!fmpz_is_one(fmpq_denref(C)))
28     {
29         _fmpz_vec_scalar_mul_fmpz(Z->coeffs, Z->coeffs, Z->length,
30                                                                fmpq_denref(C));
31         fmpz_mul(fmpq_denref(A->content), fmpq_denref(A->content),
32                                                                fmpq_denref(C));
33     }
34 }
35 
fmpq_mpoly_push_term_fmpq_ui(fmpq_mpoly_t A,const fmpq_t c,const ulong * exp,const fmpq_mpoly_ctx_t ctx)36 void fmpq_mpoly_push_term_fmpq_ui(fmpq_mpoly_t A,
37                  const fmpq_t c, const ulong * exp, const fmpq_mpoly_ctx_t ctx)
38 {
39     fmpq_t C;
40     fmpz_init_set(fmpq_numref(C), fmpq_numref(c));
41     fmpz_init_set(fmpq_denref(C), fmpq_denref(c));
42     _fmpq_mpoly_push_rescale(A, C, ctx);
43     _fmpz_mpoly_push_exp_ui(A->zpoly, exp, ctx->zctx);
44     fmpz_swap(A->zpoly->coeffs + A->zpoly->length - 1, fmpq_numref(C));
45     fmpq_clear(C);
46 }
47 
48 
fmpq_mpoly_push_term_fmpz_ui(fmpq_mpoly_t A,const fmpz_t c,const ulong * exp,const fmpq_mpoly_ctx_t ctx)49 void fmpq_mpoly_push_term_fmpz_ui(fmpq_mpoly_t A,
50                  const fmpz_t c, const ulong * exp, const fmpq_mpoly_ctx_t ctx)
51 {
52     fmpq_t C;
53     fmpz_init_set(fmpq_numref(C), c);
54     fmpz_init_set_ui(fmpq_denref(C), UWORD(1));
55     _fmpq_mpoly_push_rescale(A, C, ctx);
56     _fmpz_mpoly_push_exp_ui(A->zpoly, exp, ctx->zctx);
57     fmpz_swap(A->zpoly->coeffs + A->zpoly->length - 1, fmpq_numref(C));
58     fmpq_clear(C);
59 }
60 
fmpq_mpoly_push_term_ui_ui(fmpq_mpoly_t A,ulong c,const ulong * exp,const fmpq_mpoly_ctx_t ctx)61 void fmpq_mpoly_push_term_ui_ui(fmpq_mpoly_t A,
62                         ulong c, const ulong * exp, const fmpq_mpoly_ctx_t ctx)
63 {
64     fmpq_t C;
65     fmpz_init_set_ui(fmpq_numref(C), c);
66     fmpz_init_set_ui(fmpq_denref(C), UWORD(1));
67     _fmpq_mpoly_push_rescale(A, C, ctx);
68     _fmpz_mpoly_push_exp_ui(A->zpoly, exp, ctx->zctx);
69     fmpz_swap(A->zpoly->coeffs + A->zpoly->length - 1, fmpq_numref(C));
70     fmpq_clear(C);
71 }
72 
fmpq_mpoly_push_term_si_ui(fmpq_mpoly_t A,slong c,const ulong * exp,const fmpq_mpoly_ctx_t ctx)73 void fmpq_mpoly_push_term_si_ui(fmpq_mpoly_t A,
74                         slong c, const ulong * exp, const fmpq_mpoly_ctx_t ctx)
75 {
76     fmpq_t C;
77     fmpz_init_set_si(fmpq_numref(C), c);
78     fmpz_init_set_ui(fmpq_denref(C), UWORD(1));
79     _fmpq_mpoly_push_rescale(A, C, ctx);
80     _fmpz_mpoly_push_exp_ui(A->zpoly, exp, ctx->zctx);
81     fmpz_swap(A->zpoly->coeffs + A->zpoly->length - 1, fmpq_numref(C));
82     fmpq_clear(C);
83 }
84