1377{
1378
1379 mpz_t n;
1380 mpz_init_set(n, m);
1381 TowerPolynomial prod =
from_long(level, 1);
1382 TowerPolynomial
base =
copy(level, f);
1383 TowerPolynomial tmp;
1384
1385 for (;;)
1386 {
1387
1388
1389
1390
1391
1393 {
1394 tmp =
mult(level, prod,
base,
false);
1396
1397 prod = tmp;
1398 }
1399 mpz_tdiv_q_2exp(n, n, 1);
1400 if (mpz_sgn(n) == 0)
1401 {
1402 mpz_clear(n);
1403
1404
1405
1406
1407
1408
1409 return prod;
1410 }
1411 else
1412 {
1415
1417 }
1418 }
1419}
static TowerPolynomial copy(int level, const TowerPolynomial f)
void remainder(int level, TowerPolynomial &f, const TowerPolynomial g)
TowerPolynomial mult(int level, const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension)
static TowerPolynomial from_long(int level, long c)
static unsigned int mod_ui(mpz_srcptr n, unsigned int p)
static CanonicalForm base