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

◆ power_mod()

TowerPolynomial DPoly::power_mod ( int level,
const TowerPolynomial f,
mpz_srcptr n,
const TowerPolynomial g )

Definition at line 1375 of file dpoly.cpp.

1377{
1378 // We assume that m > 0. THIS IS NOT CHECKED!!
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 // fprintf(stdout, "prod = ");
1388 // dpoly(level,prod);
1389 // fprintf(stdout, "\nbase = ");
1390 // dpoly(level,base);
1391 // fprintf(stdout, "\n");
1392 if (RingZZ::mod_ui(n, 2) == 1)
1393 {
1394 tmp = mult(level, prod, base, false);
1395 remainder(level, tmp, g);
1396 // TODO: free prod
1397 prod = tmp;
1398 }
1399 mpz_tdiv_q_2exp(n, n, 1);
1400 if (mpz_sgn(n) == 0)
1401 {
1402 mpz_clear(n);
1403 // fprintf(stdout, "final prod = ");
1404 // dpoly(level,prod);
1405 // fprintf(stdout, "\nbase = ");
1406 // dpoly(level,base);
1407 // fprintf(stdout, "\n");
1408 // TODO: free base
1409 return prod;
1410 }
1411 else
1412 {
1413 tmp = mult(level, base, base, false);
1414 remainder(level, tmp, g);
1415 // TODO: free base
1416 base = tmp;
1417 }
1418 }
1419}
static TowerPolynomial copy(int level, const TowerPolynomial f)
Definition dpoly.cpp:483
void remainder(int level, TowerPolynomial &f, const TowerPolynomial g)
Definition dpoly.cpp:1089
TowerPolynomial mult(int level, const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension)
Definition dpoly.cpp:846
static TowerPolynomial from_long(int level, long c)
Definition dpoly.cpp:501
static unsigned int mod_ui(mpz_srcptr n, unsigned int p)
Definition ZZ.cpp:55
static CanonicalForm base
Definition factory.cpp:289

References base, copy(), from_long(), RingZZ::mod_ui(), mult(), and remainder().

Referenced by lowerP().