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_mpoly_factor.h"
13
14
tuple_print(fmpz * alpha,slong n)15 void tuple_print(fmpz * alpha, slong n)
16 {
17 slong j;
18 for (j = 0; j < n; j++)
19 {
20 fmpz_print(alpha + j);
21 flint_printf(j + 1 < n ? ", " : "\n");
22 }
23 }
24
25 /* ensure that the first m values change upon the next call to tuple_next*/
tuple_saturate(fmpz * alpha,slong n,slong m)26 void tuple_saturate(fmpz * alpha, slong n, slong m)
27 {
28 slong i;
29
30 for (i = m + 1; i < n; i++)
31 {
32 fmpz_add(alpha + m, alpha + m, alpha + i);
33 fmpz_zero(alpha + i);
34 }
35
36 if (m < n && fmpz_is_zero(alpha + m))
37 {
38 for (i = 0; i < m; i++)
39 if (!fmpz_is_zero(alpha + i))
40 return;
41 fmpz_one(alpha + m);
42 }
43 }
44
45
tuple_next(fmpz * alpha,slong n)46 void tuple_next(fmpz * alpha, slong n)
47 {
48 slong i, t1, t2, t3;
49 fmpz_t sum;
50
51 fmpz_init(sum);
52 for (i = 0; i < n; i++)
53 fmpz_add(sum, sum, alpha + i);
54
55 i = n - 1;
56 while(i >= 0 && fmpz_is_zero(alpha + i))
57 i--;
58 t1 = i;
59 while(i >= 0 && fmpz_cmp(alpha + i, sum) != 0)
60 i--;
61 t2 = i;
62 while(i >= 0 && fmpz_cmp(alpha + i, sum) == 0)
63 i--;
64 t3 = i;
65
66 if (t1 > 0 && t1 != t2)
67 {
68 fmpz_swap(alpha + t1, alpha + n - 1);
69 fmpz_sub_ui(alpha + n - 1, alpha + n - 1, 1);
70 fmpz_add_ui(alpha + t1 - 1, alpha + t1 - 1, 1);
71 }
72 else if (t1 > 0 && t1 == t2 && t3 >= 0)
73 {
74 fmpz_add_ui(alpha + t3, alpha + t3, 1);
75 fmpz_zero(alpha + t3 + 1);
76 fmpz_sub_ui(alpha + n - 1, sum, 1);
77 }
78 else
79 {
80 fmpz_add_ui(alpha + n - 1, alpha + 0, 1);
81 if (n > 1)
82 fmpz_zero(alpha + 0);
83 }
84
85 fmpz_clear(sum);
86 }
87
88