1422{
1423 int i, j;
1425 if (f == nullptr) return nullptr;
1426 int charac_as_int =
static_cast<int>(
charac);
1427 int newdeg = f->deg / charac_as_int;
1428 if (level == 0)
1429 {
1431
1432 for (i = 0, j = 0; i <= newdeg; i++, j += charac_as_int)
1433 result->arr.ints[i] = f->arr.ints[j];
1434 }
1435 else
1436 {
1438 mpz_t order;
1439 mpz_init(order);
1440 unsigned long extdeg = 1;
1442 mpz_ui_pow_ui(order, charac_as_int, extdeg - 1);
1443 for (i = 0, j = 0; i <= newdeg; i++, j += charac_as_int)
1444 {
1445
1446
1447 TowerPolynomial a = f->arr.polys[j];
1449 result->arr.polys[i] = b;
1450 }
1451 mpz_clear(order);
1452 }
1454}
TowerPolynomial * extensions
static TowerPolynomial alloc_poly_n(int deg, TowerPolynomial *elems=nullptr)
int degree_of_extension(int level)
TowerPolynomial power_mod(int level, const TowerPolynomial f, mpz_srcptr n, const TowerPolynomial g)
static TowerPolynomial alloc_poly_0(int deg, long *elems=nullptr)
VALGRIND_MAKE_MEM_DEFINED & result(result)