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