1 /*
2 Copyright (C) 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 "fmpz_mod_mpoly_factor.h"
13
14
fmpz_mod_poly_stack_init(fmpz_mod_poly_stack_t S)15 void fmpz_mod_poly_stack_init(fmpz_mod_poly_stack_t S)
16 {
17 S->alloc = 0;
18 S->array = NULL;
19 S->top = 0;
20 }
21
fmpz_mod_poly_stack_clear(fmpz_mod_poly_stack_t S)22 void fmpz_mod_poly_stack_clear(fmpz_mod_poly_stack_t S)
23 {
24 slong i;
25
26 FLINT_ASSERT(S->top == 0);
27
28 for (i = 0; i < S->alloc; i++)
29 {
30 fmpz_mod_poly_clear(S->array[i], NULL);
31 flint_free(S->array[i]);
32 }
33
34 flint_free(S->array);
35 }
36
37 /* insure that k slots are available after top and return pointer to top */
fmpz_mod_poly_stack_fit_request(fmpz_mod_poly_stack_t S,slong k)38 fmpz_mod_poly_struct ** fmpz_mod_poly_stack_fit_request(
39 fmpz_mod_poly_stack_t S,
40 slong k)
41 {
42 slong newalloc, i;
43
44 FLINT_ASSERT(S->alloc >= S->top);
45
46 if (S->top + k > S->alloc)
47 {
48 newalloc = FLINT_MAX(1, S->top + k);
49
50 S->array = FLINT_ARRAY_REALLOC(S->array, newalloc, fmpz_mod_poly_struct *);
51
52 for (i = S->alloc; i < newalloc; i++)
53 {
54 S->array[i] = FLINT_ARRAY_ALLOC(1, fmpz_mod_poly_struct);
55 fmpz_mod_poly_init(S->array[i], NULL);
56 }
57 S->alloc = newalloc;
58 }
59
60 return S->array + S->top;
61 }
62
63
64
fmpz_mod_bpoly_stack_init(fmpz_mod_bpoly_stack_t S)65 void fmpz_mod_bpoly_stack_init(fmpz_mod_bpoly_stack_t S)
66 {
67 S->alloc = 0;
68 S->array = NULL;
69 S->top = 0;
70 }
71
fmpz_mod_bpoly_stack_clear(fmpz_mod_bpoly_stack_t S)72 void fmpz_mod_bpoly_stack_clear(fmpz_mod_bpoly_stack_t S)
73 {
74 slong i;
75
76 FLINT_ASSERT(S->top == 0);
77
78 for (i = 0; i < S->alloc; i++)
79 {
80 fmpz_mod_bpoly_clear(S->array[i], NULL);
81 flint_free(S->array[i]);
82 }
83
84 flint_free(S->array);
85 }
86
87 /* insure that k slots are available after top and return pointer to top */
fmpz_mod_bpoly_stack_fit_request(fmpz_mod_bpoly_stack_t S,slong k)88 fmpz_mod_bpoly_struct ** fmpz_mod_bpoly_stack_fit_request(
89 fmpz_mod_bpoly_stack_t S,
90 slong k)
91 {
92 slong newalloc, i;
93
94 FLINT_ASSERT(S->alloc >= S->top);
95
96 if (S->top + k > S->alloc)
97 {
98 newalloc = FLINT_MAX(1, S->top + k);
99
100 S->array = FLINT_ARRAY_REALLOC(S->array, newalloc, fmpz_mod_bpoly_struct *);
101
102 for (i = S->alloc; i < newalloc; i++)
103 {
104 S->array[i] = FLINT_ARRAY_ALLOC(1, fmpz_mod_bpoly_struct);
105 fmpz_mod_bpoly_init(S->array[i], NULL);
106 }
107 S->alloc = newalloc;
108 }
109
110 return S->array + S->top;
111 }
112
113
fmpz_mod_polyun_stack_init(fmpz_mod_polyun_stack_t S)114 void fmpz_mod_polyun_stack_init(fmpz_mod_polyun_stack_t S)
115 {
116 S->alloc = 0;
117 S->array = NULL;
118 S->top = 0;
119 }
120
fmpz_mod_polyun_stack_clear(fmpz_mod_polyun_stack_t S)121 void fmpz_mod_polyun_stack_clear(fmpz_mod_polyun_stack_t S)
122 {
123 slong i;
124
125 FLINT_ASSERT(S->top == 0);
126
127 for (i = 0; i < S->alloc; i++)
128 {
129 fmpz_mod_polyun_clear(S->array[i], NULL);
130 flint_free(S->array[i]);
131 }
132
133 flint_free(S->array);
134 }
135
136 /* insure that k slots are available after top and return pointer to top */
fmpz_mod_polyun_stack_fit_request(fmpz_mod_polyun_stack_t S,slong k)137 fmpz_mod_polyun_struct ** fmpz_mod_polyun_stack_fit_request(
138 fmpz_mod_polyun_stack_t S,
139 slong k)
140 {
141 slong newalloc, i;
142
143 FLINT_ASSERT(S->alloc >= S->top);
144
145 if (S->top + k > S->alloc)
146 {
147 newalloc = FLINT_MAX(1, S->top + k);
148
149 S->array = FLINT_ARRAY_REALLOC(S->array, newalloc, fmpz_mod_polyun_struct *);
150
151 for (i = S->alloc; i < newalloc; i++)
152 {
153 S->array[i] = FLINT_ARRAY_ALLOC(1, fmpz_mod_polyun_struct);
154 fmpz_mod_polyun_init(S->array[i], NULL);
155 }
156 S->alloc = newalloc;
157 }
158
159 return S->array + S->top;
160 }
161
162
163
164
165
fmpz_mod_mpolyn_stack_init(fmpz_mod_mpolyn_stack_t S,flint_bitcnt_t bits,const fmpz_mod_mpoly_ctx_t ctx)166 void fmpz_mod_mpolyn_stack_init(fmpz_mod_mpolyn_stack_t S,
167 flint_bitcnt_t bits, const fmpz_mod_mpoly_ctx_t ctx)
168 {
169 S->alloc = 0;
170 S->array = NULL;
171 S->top = 0;
172 S->bits = bits;
173 }
174
fmpz_mod_mpolyn_stack_clear(fmpz_mod_mpolyn_stack_t S,const fmpz_mod_mpoly_ctx_t ctx)175 void fmpz_mod_mpolyn_stack_clear(
176 fmpz_mod_mpolyn_stack_t S,
177 const fmpz_mod_mpoly_ctx_t ctx)
178 {
179 slong i;
180
181 FLINT_ASSERT(S->top == 0);
182
183 for (i = 0; i < S->alloc; i++)
184 {
185 fmpz_mod_mpolyn_clear(S->array[i], ctx);
186 flint_free(S->array[i]);
187 }
188
189 flint_free(S->array);
190 }
191
192 /* insure that k slots are available after top and return pointer to top */
fmpz_mod_mpolyn_stack_fit_request(fmpz_mod_mpolyn_stack_t S,slong k,const fmpz_mod_mpoly_ctx_t ctx)193 fmpz_mod_mpolyn_struct ** fmpz_mod_mpolyn_stack_fit_request(
194 fmpz_mod_mpolyn_stack_t S, slong k, const fmpz_mod_mpoly_ctx_t ctx)
195 {
196 slong newalloc, i;
197
198 FLINT_ASSERT(S->alloc >= S->top);
199
200 if (S->top + k > S->alloc)
201 {
202 newalloc = FLINT_MAX(1, S->top + k);
203
204 S->array = FLINT_ARRAY_REALLOC(S->array, newalloc, fmpz_mod_mpolyn_struct *);
205
206 for (i = S->alloc; i < newalloc; i++)
207 {
208 S->array[i] = FLINT_ARRAY_ALLOC(1, fmpz_mod_mpolyn_struct);
209 fmpz_mod_mpolyn_init(S->array[i], S->bits, ctx);
210 }
211 S->alloc = newalloc;
212 }
213
214 return S->array + S->top;
215 }
216