/*
Copyright (C) 2011 Fredrik Johansson
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
#include
#include "flint.h"
#include "arith.h"
#include "fmpz.h"
#include "fmpz_poly.h"
/*
Generated with Mathematica:
Table[Mod[MinimalPolynomial[Cos[2 Pi/n]][1337], 31337], {n,1,500}]
*/
static const short testdata[] = {
1,
1336, 1338, 2675, 1337, 8113, 2673, 6283, 2719, 29508, 2765, 6949,
5437, 2788, 26742, 25554, 26194, 29376, 29506, 30945, 15614, 8957,
16643, 9263, 21050, 30556, 10533, 1570, 11562, 3988, 16546, 26642, 4041,
3581, 109, 9839, 27175, 11691, 1460, 28287, 18369, 16503, 3184, 13336,
23083, 12495, 3246, 14160, 8081, 5301, 8652, 28989, 24149, 17733, 1568,
4800, 28863, 29280, 13741, 30919, 29819, 28584, 8913, 550, 6207, 13930,
23373, 12644, 15265, 27975, 30386, 1603, 15894, 22276, 3138, 11610,
2208, 515, 30817, 23050, 4333, 25031, 13615, 5116, 18609, 25490, 14555,
22663, 8425, 21751, 19293, 3, 10688, 26829, 14467, 1426, 12413, 5305,
25377, 27164, 3711,
9613, 22340, 7457, 3704, 1795, 22877, 31060, 17472, 11317, 22274,
11036, 7796, 27242, 22174, 3663, 10507, 16599, 18192, 15208, 7257, 7022,
10810, 27891, 18495, 7032, 11383, 20768, 27351, 31089, 27723, 10486,
2075, 25298, 20531, 28548, 25342, 6510, 20657, 15608, 5534, 22145,
30150, 25222, 12128, 389, 21860, 9631, 4536, 4704, 3677, 27282, 26668,
20784, 15684, 12847, 1307, 10586, 24355, 27553, 10952, 8886, 25029,
29278, 29964, 17943, 1006, 5895, 11466, 16679, 17500, 5414, 3420, 17644,
5165, 6255, 2807, 30577, 26277, 14032, 2425, 13945, 27988, 17437, 28204,
11853, 12265, 8097, 24919, 10703, 18081, 19121, 23364, 14035, 2382,
1722, 21617, 11863, 27682, 8538, 26401,
1487, 14570, 14213, 18315, 30244, 14611, 25421, 13954, 29802,
29118, 5788, 7547, 9710, 21645, 17858, 20672, 2295, 21286, 7217, 30405,
5090, 22674, 5747, 5809, 13789, 16385, 23732, 12258, 10944, 14669, 2043,
1453, 13510, 12422, 24073, 3025, 28094, 2770, 9198, 27411, 24736, 28958,
23508, 27897, 17838, 10690, 5375, 29469, 22458, 9466, 28541, 16308,
20491, 10320, 9836, 673, 26630, 20819, 25687, 19263, 16620, 28683,
30268, 1113, 26632, 18450, 17555, 20121, 18083, 12796, 26659, 9788,
10448, 2828, 29753, 26653, 13636, 6270, 10398, 16224, 1481, 1153, 26387,
17835, 19289, 2683, 1937, 16760, 14372, 12632, 15716, 12423, 24202,
14543, 10763, 27059, 437, 18647, 17133, 27774,
2039, 3931, 7737, 20470, 11068, 26238, 28463, 22610, 28349, 23819,
22780, 4101, 13218, 12878, 25048, 25163, 11032, 10129, 2571, 9319,
11708, 6704, 19105, 11593, 24863, 26090, 15235, 18038, 22056, 19624,
12066, 9798, 16508, 22376, 15776, 10595, 28391, 18898, 11645, 16655,
19391, 11364, 28198, 4348, 6653, 11962, 22652, 18750, 22125, 21504,
23718, 25662, 6768, 24234, 29605, 8280, 5246, 23064, 1360, 21538, 4374,
8186, 7540, 24091, 3017, 23007, 12000, 11289, 8698, 22118, 5505, 18535,
29647, 15878, 4416, 8598, 13062, 8878, 9674, 5066, 17770, 24888, 20643,
1345, 22570, 1363, 3710, 18429, 11731, 14885, 12983, 18600, 26334,
27101, 17858, 22221, 2471, 911, 12033, 2824,
6354, 984, 28507, 3521, 17963, 6558, 11166, 24004, 24367, 8572,
19198, 6937, 15220, 13122, 3540, 589, 17503, 14073, 14954, 26020, 12974,
20684, 19844, 17852, 1097, 10831, 23848, 7013, 15683, 15954, 22290,
30257, 15807, 22775, 13607, 9428, 30055, 11607, 30426, 2579, 340, 29747,
25213, 28551, 5705, 15704, 10625, 16932, 3215, 16716, 6698, 21470,
29839, 511, 23506, 4338, 30506, 18038, 20430, 20586, 18225, 7721, 15812,
3140, 22149, 4949, 8125, 9897, 6323, 20612, 2012, 23744, 9414, 16497,
5557, 5225, 8518, 30549, 21805, 5692, 25222, 16326, 22995, 27432, 16385,
23506, 9911, 23131, 3880, 30647, 13222, 10416, 5619, 2078, 9411, 12398,
22772, 7328, 17932, 19965,
-1
};
int main()
{
fmpz_poly_t p;
slong n;
FLINT_TEST_INIT(state);
flint_printf("cyclotomic_cos_polynomial....");
fflush(stdout);
fmpz_poly_init(p);
for (n = 0; testdata[n] != -1; n++)
{
mp_limb_t y;
arith_cos_minpoly(p, n);
y = fmpz_poly_evaluate_mod(p, 1337, 31337);
if (y != testdata[n])
{
flint_printf("FAIL: n = %wd\n", n);
flint_printf("y = %wu\n", y);
flint_printf("\n");
abort();
}
}
fmpz_poly_clear(p);
FLINT_TEST_CLEANUP(state);
flint_printf("PASS\n");
return 0;
}