Macaulay2 Engine
Loading...
Searching...
No Matches

◆ lowerP()

TowerPolynomial DPoly::lowerP ( int level,
const TowerPolynomial f )

Definition at line 1421 of file dpoly.cpp.

1422{
1423 int i, j;
1424 TowerPolynomial result;
1425 if (f == nullptr) return nullptr;
1426 int charac_as_int = static_cast<int>(charac);
1427 int newdeg = f->deg / charac_as_int; // should be exact...
1428 if (level == 0)
1429 {
1430 result = alloc_poly_0(newdeg);
1431 // In this situation, we just need to grab every p*i coeff...
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 {
1437 result = alloc_poly_n(newdeg);
1438 mpz_t order;
1439 mpz_init(order);
1440 unsigned long extdeg = 1;
1441 for (i = 0; i < level; i++) extdeg *= degree_of_extension(i);
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 // need p-th roots of the coefficients. So we take p^(n-1)
1446 // power (if coefficients are in field of size p^n)
1447 TowerPolynomial a = f->arr.polys[j];
1448 TowerPolynomial b = power_mod(level - 1, a, order, extensions[level - 1]);
1449 result->arr.polys[i] = b;
1450 }
1451 mpz_clear(order);
1452 }
1453 return result;
1454}
TowerPolynomial * extensions
Definition dpoly.hpp:114
static TowerPolynomial alloc_poly_n(int deg, TowerPolynomial *elems=nullptr)
Definition dpoly.cpp:265
int degree_of_extension(int level)
Definition dpoly.cpp:100
TowerPolynomial power_mod(int level, const TowerPolynomial f, mpz_srcptr n, const TowerPolynomial g)
Definition dpoly.cpp:1375
long charac
Definition dpoly.hpp:115
static TowerPolynomial alloc_poly_0(int deg, long *elems=nullptr)
Definition dpoly.cpp:279
VALGRIND_MAKE_MEM_DEFINED & result(result)

References alloc_poly_0(), alloc_poly_n(), charac, degree_of_extension(), extensions, power_mod(), and result().