arb/acb_modular/test/t-hilbert_class_poly.c

170 lines
7.4 KiB
C
Raw Permalink Normal View History

/*
Copyright (C) 2015 Fredrik Johansson
This file is part of Arb.
Arb 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 <http://www.gnu.org/licenses/>.
*/
2016-03-03 15:42:23 +01:00
#include "flint/fmpz_poly.h"
#include "acb_modular.h"
/* reference values h_(-d)(2015) mod 31337 computed using sage */
static const short hilbert_poly_values[1000] = {
0, 0, 0, 2015, 287, 0, 0, 5390, 25352, 0, 0, 3446, 10689, 0, 0, 7571,
27889, 0, 0, 9315, 17503, 0, 0, 20694, 1734, 0, 0, 5911, 29250, 0, 0,
6194, 3783, 0, 0, 6982, 30449, 0, 0, 10645, 11069, 0, 0, 494, 29262,
0, 0, 10595, 22835, 0, 0, 18309, 24632, 0, 0, 6433, 5042, 0, 0, 9174,
24082, 0, 0, 3463, 30027, 0, 0, 11406, 22491, 0, 0, 16831, 8457, 0, 0,
21721, 19275, 0, 0, 23777, 28295, 0, 0, 13585, 26717, 0, 0, 632,
20965, 0, 0, 9886, 852, 0, 0, 18674, 12461, 0, 0, 17204, 23887, 0, 0,
132, 11124, 0, 0, 29609, 2760, 0, 0, 29227, 28978, 0, 0, 29543, 20831,
0, 0, 12260, 15153, 0, 0, 18215, 29267, 0, 0, 13864, 4648, 0, 0, 9591,
3948, 0, 0, 29683, 20283, 0, 0, 30212, 23760, 0, 0, 10290, 17465, 0,
0, 31207, 21341, 0, 0, 19076, 29310, 0, 0, 740, 11697, 0, 0, 20446,
7258, 0, 0, 16515, 29406, 0, 0, 19948, 20065, 0, 0, 8576, 19014, 0, 0,
1647, 1354, 0, 0, 19468, 6933, 0, 0, 2065, 17883, 0, 0, 19430, 5539,
0, 0, 5738, 25233, 0, 0, 21651, 6815, 0, 0, 23927, 28399, 0, 0, 3108,
23302, 0, 0, 17409, 7911, 0, 0, 26800, 31051, 0, 0, 14360, 11091, 0,
0, 10984, 11954, 0, 0, 26389, 3557, 0, 0, 3298, 18516, 0, 0, 22211,
2972, 0, 0, 22613, 5274, 0, 0, 27799, 13362, 0, 0, 8002, 23366, 0, 0,
31122, 20593, 0, 0, 356, 19130, 0, 0, 10024, 2373, 0, 0, 19390, 28768,
0, 0, 25504, 4440, 0, 0, 14798, 8726, 0, 0, 6180, 7623, 0, 0, 12941,
31038, 0, 0, 14370, 29147, 0, 0, 166, 10994, 0, 0, 8397, 354, 0, 0,
26973, 17435, 0, 0, 21128, 5064, 0, 0, 20453, 30343, 0, 0, 25679,
6503, 0, 0, 28364, 4924, 0, 0, 6341, 11339, 0, 0, 10624, 17028, 0, 0,
28001, 192, 0, 0, 27052, 28470, 0, 0, 10034, 12162, 0, 0, 25236, 6842,
0, 0, 19334, 7593, 0, 0, 29159, 26694, 0, 0, 14719, 26199, 0, 0, 9382,
25741, 0, 0, 31174, 8440, 0, 0, 4218, 17722, 0, 0, 11574, 8090, 0, 0,
9938, 4982, 0, 0, 22701, 6931, 0, 0, 29372, 29088, 0, 0, 28, 24186, 0,
0, 23852, 7521, 0, 0, 18508, 9883, 0, 0, 2392, 30611, 0, 0, 26103,
11926, 0, 0, 27676, 24118, 0, 0, 7495, 15441, 0, 0, 12681, 20030, 0,
0, 8106, 3260, 0, 0, 25626, 24143, 0, 0, 17471, 9620, 0, 0, 24315,
24991, 0, 0, 25966, 12488, 0, 0, 9839, 25896, 0, 0, 14932, 27863, 0,
0, 20652, 11663, 0, 0, 1779, 5540, 0, 0, 2066, 24758, 0, 0, 23522,
20408, 0, 0, 26357, 2423, 0, 0, 14671, 18184, 0, 0, 16904, 264, 0, 0,
27879, 30997, 0, 0, 1506, 23000, 0, 0, 1236, 13243, 0, 0, 24917, 2346,
0, 0, 2397, 14849, 0, 0, 21298, 15702, 0, 0, 9627, 8103, 0, 0, 26185,
6738, 0, 0, 2476, 21350, 0, 0, 7578, 9859, 0, 0, 19157, 5329, 0, 0,
401, 3223, 0, 0, 30337, 21258, 0, 0, 25707, 14593, 0, 0, 8611, 15496,
0, 0, 12225, 1505, 0, 0, 23534, 16704, 0, 0, 13230, 19926, 0, 0,
12220, 19104, 0, 0, 6130, 12697, 0, 0, 19881, 6864, 0, 0, 25044, 7436,
0, 0, 29137, 14435, 0, 0, 20628, 26292, 0, 0, 30933, 8606, 0, 0,
28752, 23603, 0, 0, 11633, 21739, 0, 0, 22592, 18621, 0, 0, 20125,
1595, 0, 0, 25306, 15723, 0, 0, 1643, 16444, 0, 0, 11825, 27858, 0, 0,
13835, 4948, 0, 0, 29003, 12298, 0, 0, 16479, 12920, 0, 0, 25238,
15558, 0, 0, 4102, 16578, 0, 0, 10456, 546, 0, 0, 3738, 28968, 0, 0,
20266, 8035, 0, 0, 9779, 25941, 0, 0, 5911, 20127, 0, 0, 18291, 28982,
0, 0, 18831, 29846, 0, 0, 21272, 11493, 0, 0, 24427, 28574, 0, 0,
22664, 14849, 0, 0, 30445, 20996, 0, 0, 13612, 18604, 0, 0, 19880,
19227, 0, 0, 6230, 17398, 0, 0, 29192, 29933, 0, 0, 25046, 14031, 0,
0, 24100, 463, 0, 0, 19254, 17038, 0, 0, 19912, 10339, 0, 0, 12475,
24909, 0, 0, 3292, 18482, 0, 0, 1542, 24603, 0, 0, 24850, 2332, 0, 0,
22262, 14510, 0, 0, 16526, 18396, 0, 0, 30544, 14396, 0, 0, 2788,
18461, 0, 0, 17619, 14749, 0, 0, 29832, 24740, 0, 0, 19298, 20355, 0,
0, 538, 18003, 0, 0, 4225, 4401, 0, 0, 28095, 1371, 0, 0, 2724, 353,
0, 0, 8917, 943, 0, 0, 4998, 2384, 0, 0, 14677, 9528, 0, 0, 7351,
13960, 0, 0, 4467, 8153, 0, 0, 16711, 8606, 0, 0, 24590, 1061, 0, 0,
7678, 5647, 0, 0, 27940, 3563, 0, 0, 11137, 29574, 0, 0, 15623, 29261,
0, 0, 15422, 3266, 0, 0, 26284, 9039, 0, 0, 9616, 21817, 0, 0, 2661,
8479, 0, 0, 19882, 5965, 0, 0, 13459, 2231, 0, 0, 10839, 22085, 0, 0,
23581, 14883, 0, 0, 7516, 20147, 0, 0, 7072, 16192, 0, 0, 26870,
29168, 0, 0, 5724, 19808, 0, 0, 25458, 21905, 0, 0, 28942, 29586, 0,
0, 13256, 6359, 0, 0, 15267, 8726, 0, 0, 29008, 24734, 0, 0, 2786,
716, 0, 0, 29798, 3021, 0, 0, 1388, 28017, 0, 0, 26001, 11541, 0, 0,
19326, 2630, 0, 0, 5326, 1153, 0, 0, 12367, 12089, 0, 0, 15701, 7816,
0, 0, 28096, 13980, 0, 0, 15683, 16412, 0, 0, 29609, 21907, 0, 0,
2266, 30126, 0, 0, 26922, 29563, 0, 0, 27024, 11031, 0, 0, 28714,
4013, 0, 0, 20446, 30395, 0, 0, 1980, 26546, 0, 0, 26413, 13346, 0, 0,
4083, 837, 0, 0, 7134, 251, 0, 0, 29540, 6521, 0, 0, 18515, 2436, 0,
0, 21198, 24291, 0, 0, 26451, 28377, 0, 0, 18689, 15300, 0, 0, 8527,
27153, 0, 0, 18586, 30431, 0, 0, 28981, 13795, 0, 0, 11286, 26207, 0,
0, 11870, 2833, 0, 0, 6996, 19018, 0, 0, 22638, 18958, 0, 0, 10333,
12804, 0, 0, 13618, 8212, 0, 0, 30926, 11947, 0, 0, 6681
};
static const int hilbert_poly_values_2[] = {
-2000, 13490,
-1999, 10172,
-4000, 2042,
-3999, 16478,
-8000, 14919,
-7999, 15365,
-16000, 8190,
-15999, 30928,
-32000, 10486,
-31999, 2808,
-64000, 26310,
-63999, 23551,
/* slow
-128000, 30815,
-127999, 2144,
-256000, 5257,
-255999, 18151,
-512000, 31288,
-511999, 30227,
-1024000, 14241,
-1023999, 16711,
*/
0, 0,
};
int main()
{
flint_printf("hilbert_class_poly....");
fflush(stdout);
{
slong i;
mp_limb_t c;
fmpz_poly_t hd;
nmod_poly_t hdp;
fmpz_poly_init(hd);
nmod_poly_init(hdp, 31337);
for (i = 0; i < 1000; i++)
{
acb_modular_hilbert_class_poly(hd, -i);
fmpz_poly_get_nmod_poly(hdp, hd);
c = nmod_poly_evaluate_nmod(hdp, 2015);
if (c != hilbert_poly_values[i])
{
flint_printf("FAIL!\n");
flint_printf("D = %wd\n", -i);
flint_printf("c = %wu\n", c);
flint_printf("expected = %d\n", (int) hilbert_poly_values[i]);
flint_abort();
}
}
for (i = 0; hilbert_poly_values_2[2 * i] != 0; i++)
{
acb_modular_hilbert_class_poly(hd, hilbert_poly_values_2[2 * i]);
fmpz_poly_get_nmod_poly(hdp, hd);
c = nmod_poly_evaluate_nmod(hdp, 2015);
if (c != hilbert_poly_values_2[2 * i + 1])
{
flint_printf("FAIL!\n");
flint_printf("D = %wd\n", -i);
flint_printf("c = %wu\n", c);
flint_printf("expected = %d\n", (int) hilbert_poly_values_2[2*i+1]);
flint_abort();
}
}
fmpz_poly_clear(hd);
nmod_poly_clear(hdp);
}
flint_cleanup();
flint_printf("PASS\n");
return EXIT_SUCCESS;
}