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