1 /*
2     Copyright (C) 2018-2020 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 
14 
fmpq_mpoly_sub_fmpq(fmpq_mpoly_t A,const fmpq_mpoly_t B,const fmpq_t c,const fmpq_mpoly_ctx_t ctx)15 void fmpq_mpoly_sub_fmpq(fmpq_mpoly_t A, const fmpq_mpoly_t B,
16                                     const fmpq_t c, const fmpq_mpoly_ctx_t ctx)
17 {
18     fmpz_t t1, t2;
19     slong easy_length = B->zpoly->length + 1;
20 
21     if (fmpq_is_zero(c))
22     {
23         fmpq_mpoly_set(A, B, ctx);
24         return;
25     }
26     else if (fmpq_mpoly_is_zero(B, ctx))
27     {
28         fmpq_mpoly_set_fmpq(A, c, ctx);
29         fmpq_mpoly_neg(A, A, ctx);
30         return;
31     }
32 
33     fmpz_init(t1);
34     fmpz_init(t2);
35 
36     fmpq_gcd_cofactors(A->content, t1, t2, B->content, c);
37 
38     fmpz_mpoly_scalar_mul_fmpz(A->zpoly, B->zpoly, t1, ctx->zctx);
39     fmpz_mpoly_sub_fmpz(A->zpoly, A->zpoly, t2, ctx->zctx);
40 
41     fmpz_clear(t1);
42     fmpz_clear(t2);
43 
44     fmpq_mpoly_reduce_easy(A, easy_length, ctx);
45 }
46 
fmpq_mpoly_sub_fmpz(fmpq_mpoly_t A,const fmpq_mpoly_t B,const fmpz_t c,const fmpq_mpoly_ctx_t ctx)47 void fmpq_mpoly_sub_fmpz(fmpq_mpoly_t A, const fmpq_mpoly_t B,
48                                     const fmpz_t c, const fmpq_mpoly_ctx_t ctx)
49 {
50     fmpq_t t;
51     *fmpq_numref(t) = *c;
52     *fmpq_denref(t) = 1;
53     fmpq_mpoly_sub_fmpq(A, B, t, ctx);
54 }
55 
fmpq_mpoly_sub_ui(fmpq_mpoly_t A,const fmpq_mpoly_t B,ulong c,const fmpq_mpoly_ctx_t ctx)56 void fmpq_mpoly_sub_ui(fmpq_mpoly_t A, const fmpq_mpoly_t B,
57                                            ulong c, const fmpq_mpoly_ctx_t ctx)
58 {
59     fmpq_t t;
60     fmpz_init_set_ui(fmpq_numref(t), c);
61     *fmpq_denref(t) = 1;
62     fmpq_mpoly_sub_fmpq(A, B, t, ctx);
63     fmpz_clear(fmpq_numref(t));
64 }
65 
fmpq_mpoly_sub_si(fmpq_mpoly_t A,const fmpq_mpoly_t B,slong c,const fmpq_mpoly_ctx_t ctx)66 void fmpq_mpoly_sub_si(fmpq_mpoly_t A, const fmpq_mpoly_t B,
67                                            slong c, const fmpq_mpoly_ctx_t ctx)
68 {
69     fmpq_t t;
70     fmpz_init_set_si(fmpq_numref(t), c);
71     *fmpq_denref(t) = 1;
72     fmpq_mpoly_sub_fmpq(A, B, t, ctx);
73     fmpz_clear(fmpq_numref(t));
74 }
75