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