/*
Copyright (C) 2020 Daniel Schultz
This file is part of FLINT.
FLINT is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License (LGPL) as published
by the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version. See .
*/
#include
#include
#include "fmpz_poly_factor.h"
/* manual slow implementation of zassenhaus_subset_next_disjoint */
static int my_next_disjoint(slong * s, slong r)
{
slong i, j;
slong * olds;
olds = flint_malloc(r*sizeof(slong));
for (i = 0; i < r; i++)
olds[i] = s[i];
next:
if (!zassenhaus_subset_next(s, r))
{
flint_free(olds);
return 0;
}
for (i = 0; i < r; i++)
{
if (olds[i] >= 0 && s[i] >= 0)
goto next;
}
j = 0;
for (i = 0; i < r; i++)
{
if (olds[i] < 0)
s[j++] = s[i];
}
flint_free(olds);
return 1;
}
/* length of s is r */
static void my_subset_print(slong * s, slong r)
{
slong i;
FLINT_ASSERT(r >= 0);
for (i = 0; i < r; i++)
{
if (s[i] >= 0)
flint_printf(" %wd", s[i]);
else
flint_printf(" X", s[i]);
}
}
int
main(void)
{
fmpz_t f;
slong i, j, k, r;
slong * s, * s1, * s2;
int res1, res2;
flint_printf("zassenhaus_subset....");
fflush(stdout);
fmpz_init(f);
for (r = 0; r <= 13; r++)
{
s = (slong *) flint_malloc(r*sizeof(slong));
s1 = (slong *) flint_malloc(r*sizeof(slong));
s2 = (slong *) flint_malloc(r*sizeof(slong));
for (j = 0; j < r; j++)
s[j] = j;
for (i = 0; i <= r; i++)
{
ulong cnt = 0;
zassenhaus_subset_first(s, r, i);
do {
cnt++;
k = 0;
for (j = 0; j < r; j++)
{
if (s[j] != j && s[j] != -j - 1)
{
flint_printf("FAIL\ncheck subset element\n");
flint_abort();
}
k += (s[j] >= 0);
}
if (k != i)
{
flint_printf("FAIL\ncheck subset size\n");
flint_abort();
}
for (j = 0; j < r; j++)
{
s1[j] = s[j];
s2[j] = s[j];
}
res1 = zassenhaus_subset_next_disjoint(s1, r);
res2 = my_next_disjoint(s2, r);
if (res1 != res2)
{
flint_printf("FAIL\ncheck next disjoint success\n");
flint_printf("s:");
my_subset_print(s, r);
flint_printf("\n");
flint_printf("res1: %d res2: %d\n", res1, res2);
flint_abort();
}
k = 0;
for (j = 0; j < r; j++)
{
if (s[j] < 0)
{
if (s1[k] != s[j] && s1[k] != -s[j] - 1)
{
flint_printf("FAIL\ncheck next disjoint is disjoint\n");
flint_abort();
}
k++;
}
}
if (res1)
{
for (j = 0; j < r - i; j++)
{
if (s1[j] != s2[j])
{
flint_printf("FAIL\ncheck next disjoint subset\n");
flint_printf("s:");
my_subset_print(s, r);
flint_printf("\n");
flint_printf("s1: ");
my_subset_print(s1, r - i);
flint_printf("\n");
flint_printf("s2: ");
my_subset_print(s2, r - i);
flint_printf("\n");
flint_abort();
}
}
}
} while (zassenhaus_subset_next(s, r));
fmpz_bin_uiui(f, r, i);
if (!fmpz_equal_ui(f, cnt))
{
flint_printf("FAIL\ncheck subset size\n");
flint_abort();
}
}
flint_free(s2);
flint_free(s1);
flint_free(s);
}
fmpz_clear(f);
flint_printf("PASS\n");
return 0;
}