19 long utemp, vtemp, gtemp;
46 if (a < 0) a += charac;
49void ZZp_APXY(
long charac,
long &a,
long b,
long c)
51 a = (a + b * c) % charac;
56 if (a >= charac) a -= charac;
61 if (a < 0) a += charac;
72 if (v < 0) v += charac;
89 for (
int i = 0; i <
nlevels; i++)
103 if (level < 0 || level >=
nlevels)
return -1;
105 if (f ==
nullptr)
return -1;
111 if (f ==
nullptr)
return true;
112 for (
int i = oldlevel; i > newlevel; i--)
119 TowerPolynomial g = f->arr.polys[0];
120 f->arr.polys[0] =
nullptr;
129 if (f ==
nullptr)
return 0;
133 for (
int i = 0; i <= f->deg; i++)
134 if (f->arr.ints[i] != 0) nterms++;
138 for (
int i = 0; i <= f->deg; i++)
139 if (f->arr.polys[i] !=
nullptr) nterms++;
146 const TowerPolynomial f,
150 M2_ArrayString names)
const
160 bool needs_parens = p_parens && (nterms >= 2);
164 if (p_plus) o <<
'+';
169 bool one =
is_one(level, f);
173 if (p_plus) o <<
"+";
178 M2_string this_varname = names->array[level];
182 bool firstterm =
true;
183 for (
int i = f->deg; i >= 0; i--)
184 if (f->arr.ints[i] != 0)
186 if (!firstterm || p_plus) o <<
"+";
188 if (i == 0 || f->arr.ints[i] != 1) o << f->arr.ints[i];
189 if (i > 0) o << this_varname;
192 if (needs_parens) o <<
")";
196 bool firstterm =
true;
197 for (
int i = f->deg; i >= 0; i--)
198 if (f->arr.polys[i] !=
nullptr)
200 bool this_p_parens = p_parens || (i > 0);
202 if (i == 0 || !
is_one(level - 1, f->arr.polys[i]))
207 p_plus || !firstterm,
210 else if (p_plus || !firstterm)
212 if (i > 0) o << this_varname;
217 if (needs_parens) o <<
")";
223 for (
int i = 0; i <
nlevels; i++)
236 if (f->len <= newdeg)
239 long *fp = f->arr.ints;
240 for (
int i = 0; i <= f->deg; i++) newelems[i] = fp[i];
241 for (
int i = f->deg + 1; i < newdeg + 1; i++) newelems[i] = 0;
243 f->arr.ints = newelems;
252 if (f->len <= newdeg)
254 TowerPolynomial *newelems =
newarray(TowerPolynomial, newdeg + 1);
255 TowerPolynomial *fp = f->arr.polys;
256 for (
int i = 0; i <= f->deg; i++) newelems[i] = fp[i];
257 for (
int i = f->deg + 1; i < newdeg + 1; i++) newelems[i] =
nullptr;
259 f->arr.polys = newelems;
272 if (elems ==
nullptr)
273 for (
int i = 0; i <= deg; i++)
result->arr.polys[i] =
nullptr;
275 for (
int i = 0; i <= deg; i++)
result->arr.polys[i] = elems[i];
285 if (elems ==
nullptr)
286 for (
int i = 0; i <= deg; i++)
result->arr.ints[i] = 0;
288 for (
int i = 0; i <= deg; i++)
result->arr.ints[i] = elems[i];
295 if (f ==
nullptr)
return;
304 TowerPolynomial *elems =
newarray(TowerPolynomial, 100);
305 TowerPolynomial this_elem =
nullptr;
308 fprintf(stderr,
"expected '[', got %s\n", str);
315 while (isspace(*str)) str++;
320 else if (*str ==
'[')
323 while (isspace(*str)) str++;
324 if (*str ==
',') str++;
328 fprintf(stderr,
"expected , or [, but got %s\n", str);
331 elems[len++] = this_elem;
348 fprintf(stderr,
"expected '[', got %s\n", str);
355 while (isspace(*str)) str++;
360 else if (isdigit(*str))
363 this_elem = strtol(str, &
end, 10);
365 while (isspace(*str)) str++;
366 if (*str ==
',') str++;
370 fprintf(stderr,
"expected , or [, but got %s\n", str);
373 elems[len++] = this_elem;
395 long *
p = f->arr.ints;
397 for (
int i = 0; i <= f->deg; i++)
400 if (
p[i] != 0) o <<
p[i];
406 TowerPolynomial *
p = f->arr.polys;
408 for (
int i = 0; i <= f->deg; i++)
419 std::ostringstream o;
422 size_t n = o.str().length();
423 char *
result =
new char[n + 1];
424 memcpy(
result, o.str().c_str(), n);
434 long *
p = f->arr.ints;
437 for (
int i = 0; i <= f->deg; i++)
439 if (i > 0) fprintf(fil,
",");
440 if (
p[i] != 0) fprintf(fil,
"%ld",
p[i]);
446 TowerPolynomial *
p = f->arr.polys;
449 for (
int i = 0; i <= f->deg; i++)
451 if (i > 0) fprintf(fil,
",");
463 if (g ==
nullptr)
return true;
466 if (g ==
nullptr || f->deg != g->deg)
return false;
469 long *fp = f->arr.ints;
470 long *gp = g->arr.ints;
471 for (
int i = 0; i <= f->deg; i++)
472 if (fp[i] != gp[i])
return false;
476 TowerPolynomial *fp = f->arr.polys;
477 TowerPolynomial *gp = g->arr.polys;
478 for (
int i = 0; i <= f->deg; i++)
479 if (!
is_equal(level - 1, fp[i], gp[i]))
return false;
485 if (f ==
nullptr)
return nullptr;
490 for (
int i = 0; i <= f->deg; i++)
result->arr.ints[i] = f->arr.ints[i];
495 for (
int i = 0; i <= f->deg; i++)
496 result->arr.polys[i] =
copy(level - 1, f->arr.polys[i]);
503 if (c == 0)
return nullptr;
506 for (
int i = 1; i <= level; i++)
508 TowerPolynomial a =
result;
518 if (v > level)
return nullptr;
519 int which = (v == 0 ? 1 : 0);
522 result->arr.ints[which] = 1;
523 for (
int i = 1; i <= level; i++)
525 which = (i == v ? 1 : 0);
526 TowerPolynomial a =
result;
528 result->arr.polys[which] = a;
535 if (deg < 0) deg = 3;
543 if (deg < 0) deg = 3;
545 for (
int i = 0; i <= deg; i++) f->arr.polys[i] =
random(level - 1);
551 if (deg < 0) deg = 0;
552 if (level == 0)
return random_0(deg);
567 if (g ==
nullptr)
return 0;
570 if (g ==
nullptr)
return -1;
571 if (f->deg > g->deg)
return -1;
572 if (f->deg < g->deg)
return 1;
576 for (
int i = f->deg; i >= 0; i--)
578 long cmp = f->arr.ints[i] - g->arr.ints[i];
579 if (cmp > 0)
return -1;
580 if (cmp < 0)
return 1;
585 for (
int i = f->deg; i >= 0; i--)
587 int cmp =
compare(level - 1, f->arr.polys[i], g->arr.polys[i]);
588 if (cmp > 0)
return -1;
589 if (cmp < 0)
return 1;
597 if (f ==
nullptr)
return false;
598 if (f->deg != 0)
return false;
600 return 1 == f->arr.ints[0];
602 return is_one(level - 1, f->arr.polys[0]);
606 if (f ==
nullptr)
return;
610 long *
p = f->arr.ints;
611 for (
int i = 0; i <= deg; i++)
617 TowerPolynomial *
p = f->arr.polys;
618 for (
int i = 0; i <= deg; i++)
626 for (
int j = fdeg; j >= 0; --j)
627 if (f->arr.ints[j] != 0)
639 for (
int j = fdeg; j >= 0; --j)
640 if (f->arr.polys[j] !=
nullptr)
673 if (g ==
nullptr)
return;
683 for (i = 0; i <= gdeg; i++)
687 else if (gdeg == fdeg)
694 if (g ==
nullptr)
return;
704 for (i = 0; i <= gdeg; i++)
705 add_in_place(level - 1, f->arr.polys[i], g->arr.polys[i]);
708 else if (gdeg == fdeg)
711 for (
int j = fdeg; j >= 0; --j)
712 if (f->arr.polys[j] !=
nullptr)
733 if (g ==
nullptr)
return;
744 for (i = 0; i <= gdeg; i++)
748 else if (gdeg == fdeg)
751 for (
int j = fdeg; j >= 0; --j)
752 if (f->arr.ints[j] != 0)
765 if (g ==
nullptr)
return;
776 for (i = 0; i <= gdeg; i++)
780 else if (gdeg == fdeg)
783 for (
int j = fdeg; j >= 0; --j)
784 if (f->arr.polys[j] !=
nullptr)
802TowerPolynomial
DPoly::mult_0(
const TowerPolynomial f,
const TowerPolynomial g,
bool reduce_by_extension)
804 if (f ==
nullptr || g ==
nullptr)
return nullptr;
807 for (
int i = 0; i <= f->deg; i++)
809 long a = f->arr.ints[i];
810 for (
int j = 0; j <= g->deg; j++)
814 if (reduce_by_extension &&
extensions[0] !=
nullptr)
819 const TowerPolynomial f,
820 const TowerPolynomial g,
821 bool reduce_by_extension)
823 if (f ==
nullptr || g ==
nullptr)
return nullptr;
826 for (
int i = 0; i <= f->deg; i++)
828 TowerPolynomial a = f->arr.polys[i];
830 for (
int j = 0; j <= g->deg; j++)
832 TowerPolynomial b = g->arr.polys[j];
833 TowerPolynomial c =
mult(level - 1, a, b,
true);
842 if (reduce_by_extension &&
extensions[level] !=
nullptr)
847 const TowerPolynomial f,
848 const TowerPolynomial g,
849 bool reduce_by_extension)
851 if (level == 0)
return mult_0(f, g, reduce_by_extension);
852 return mult_n(level, f, g, reduce_by_extension);
861 TowerPolynomial u, v;
874 if (f ==
nullptr)
return;
875 long *
p = f->arr.ints;
880 for (
int i = 0; i <= deg; i++)
888 if (f ==
nullptr)
return;
889 TowerPolynomial *
p = f->arr.polys;
895 else if (!
is_one(level - 1, b))
896 for (
int i = 0; i <= deg; i++)
898 if (*
p !=
nullptr) *
p =
mult(level - 1, *
p, b,
true);
904 if (f ==
nullptr)
return;
905 long *
p = f->arr.ints;
910 result_multiplier = b;
914 if (f ==
nullptr)
return;
915 TowerPolynomial *
p = f->arr.polys;
916 TowerPolynomial a =
p[f->deg];
917 TowerPolynomial b =
invert(level - 1, a);
919 result_multiplier = b;
924 if (f ==
nullptr)
return;
932 TowerPolynomial not_used;
944 if (u3 ==
nullptr)
return true;
950 if (c == 0)
return false;
956 TowerPolynomial c =
nullptr;
958 if (c ==
nullptr)
return false;
969 if (f ==
nullptr)
return nullptr;
974 int shift = f->deg - g->deg;
979 long *
p = f->arr.ints;
980 long *q = g->arr.ints;
981 for (
int d = f->deg; shift >= 0; d--, shift--)
986 quot->arr.ints[shift] = a;
988 for (
int j = 0; j <= g->deg; j++)
996 TowerPolynomial *
p = f->arr.polys;
997 TowerPolynomial *q = g->arr.polys;
998 for (
int d = f->deg; shift >= 0; d--, shift--)
1000 TowerPolynomial a =
p[d];
1003 quot->arr.polys[shift] =
copy(level - 1, a);
1004 for (
int j = 0; j <= g->deg; j++)
1006 TowerPolynomial b =
mult(level - 1, a, q[j],
true);
1017 const TowerPolynomial g,
1018 TowerPolynomial &result_quot)
1022 if (f ==
nullptr || f->deg < g->deg)
1024 result_quot =
nullptr;
1027 int shift = f->deg - g->deg;
1033 long *
p = f->arr.ints;
1034 long *q = g->arr.ints;
1035 long leadcoeff = q[g->deg];
1041 for (
int d = f->deg; shift >= 0; d--, shift--)
1047 result_quot->arr.ints[shift] = a;
1049 for (
int j = 0; j <= g->deg; j++)
1059 TowerPolynomial *
p = f->arr.polys;
1060 TowerPolynomial *q = g->arr.polys;
1061 TowerPolynomial leadcoeff = q[g->deg];
1062 TowerPolynomial invlead;
1063 if (
is_one(level - 1, leadcoeff))
1064 invlead = leadcoeff;
1067 invlead =
invert(level - 1, leadcoeff);
1068 if (invlead ==
nullptr)
return false;
1070 for (
int d = f->deg; shift >= 0; d--, shift--)
1072 TowerPolynomial a =
p[d];
1075 TowerPolynomial b =
mult(level - 1, invlead, a,
true);
1076 result_quot->arr.polys[shift] =
copy(level - 1, b);
1077 for (
int j = 0; j <= g->deg; j++)
1079 b =
mult(level - 1, a, q[j],
true);
1091 if (g ==
nullptr)
return;
1092 TowerPolynomial quot =
nullptr;
1101 if (g ==
nullptr)
return;
1108 if (g ==
nullptr)
return nullptr;
1120static void swap_poly(TowerPolynomial &f, TowerPolynomial &g)
1122 TowerPolynomial a = f;
1126TowerPolynomial
DPoly::gcd(
int level,
const TowerPolynomial f,
const TowerPolynomial g)
1128 TowerPolynomial F =
copy(level, f);
1129 TowerPolynomial
G =
copy(level, g);
1141 if (
G ==
nullptr)
return nullptr;
1144 printf(
"monic G = %s\n",
to_string(level,
G));
1145 printf(
"F = %s\n",
to_string(level, F));
1149 if (F ==
nullptr)
return G;
1152 printf(
"F mod G = %s\n",
to_string(level, F));
1160 const TowerPolynomial f,
1161 const TowerPolynomial g,
1162 TowerPolynomial &result_u,
1163 TowerPolynomial &result_v)
1167 TowerPolynomial v1, v2, v3;
1168 TowerPolynomial u1, u2, u3;
1169 TowerPolynomial q =
nullptr;
1173 v3 =
copy(level, g);
1177 u3 =
copy(level, f);
1179 if (v3 ==
nullptr || (u3 !=
nullptr && v3->deg > u3->deg))
1194 printf(
"u1 = %s\n",
to_string(level, u1));
1195 printf(
"u2 = %s\n",
to_string(level, u2));
1196 printf(
"u3 = %s\n",
to_string(level, u3));
1198 printf(
"v1 = %s\n",
to_string(level, v1));
1199 printf(
"v2 = %s\n",
to_string(level, v2));
1200 printf(
"v3 = %s\n",
to_string(level, v3));
1204 while (v3 !=
nullptr)
1228 printf(
"q = %s\n",
to_string(level, q));
1229 printf(
"u3 = %s\n",
to_string(level, u3));
1234 TowerPolynomial a =
mult(level, q, v1,
false);
1235 TowerPolynomial b =
mult(level, q, v2,
false);
1242 printf(
"u1 = %s\n",
to_string(level, u1));
1243 printf(
"u2 = %s\n",
to_string(level, u2));
1244 printf(
"u3 = %s\n",
to_string(level, u3));
1257 printf(
"u1 = %s\n",
to_string(level, u1));
1258 printf(
"u2 = %s\n",
to_string(level, u2));
1259 printf(
"u3 = %s\n",
to_string(level, u3));
1276 if (f ==
nullptr)
return -1;
1277 if (whichvar == 0)
return f->deg;
1280 for (
int i = 0; i <= f->deg; i++)
1282 TowerPolynomial g = f->arr.polys[i];
1285 int d =
degree(level - 1, whichvar - 1, g);
1286 if (d > deg) deg = d;
1295 for (
int i = 0; i <= f->deg; i++)
1297 long c = f->arr.ints[i];
1310 for (
int i = 0; i <= f->deg; i++)
1312 TowerPolynomial c = f->arr.polys[i];
1321 if (f ==
nullptr)
return nullptr;
1328 if (f ==
nullptr || f->deg == 0)
return nullptr;
1330 for (
int i = 1; i <= f->deg; i++)
1332 long c = f->arr.ints[i];
1336 result->arr.ints[i - 1] = c;
1349 for (
int i = 1; i <= f->deg; i++)
1351 TowerPolynomial c = f->arr.polys[i];
1358 for (
int i = 0; i <= f->deg; i++)
1360 TowerPolynomial c = f->arr.polys[i];
1361 if (c !=
nullptr)
result->arr.polys[i] =
diff(level - 1, whichvar - 1, c);
1368TowerPolynomial
DPoly::diff(
int level,
int whichvar,
const TowerPolynomial f)
1370 if (f ==
nullptr)
return nullptr;
1371 if (level == 0)
return diff_0(f);
1372 return diff_n(level, whichvar, f);
1375TowerPolynomial
DPoly::power_mod(
int level,
const TowerPolynomial f, mpz_srcptr m,
const TowerPolynomial g)
1381 TowerPolynomial prod =
from_long(level, 1);
1382 TowerPolynomial
base =
copy(level, f);
1383 TowerPolynomial tmp;
1394 tmp =
mult(level, prod,
base,
false);
1399 mpz_tdiv_q_2exp(n, n, 1);
1400 if (mpz_sgn(n) == 0)
1425 if (f ==
nullptr)
return nullptr;
1426 int charac_as_int =
static_cast<int>(
charac);
1427 int newdeg = f->deg / charac_as_int;
1432 for (i = 0, j = 0; i <= newdeg; i++, j += charac_as_int)
1433 result->arr.ints[i] = f->arr.ints[j];
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)
1447 TowerPolynomial a = f->arr.polys[j];
1449 result->arr.polys[i] = b;
1458 if (f ==
nullptr or level < 0 or f->deg >= 2)
return -1;
1461 if (f->deg == 0)
return -1;
1463 if (f->arr.ints[0] == 0 and f->arr.ints[1] == 1)
1470 if (f->arr.polys[0] ==
nullptr and
is_one(level - 1, f->arr.polys[1]))
1472 if (f->deg == 1)
return -1;
1478 const TowerPolynomial f,
1479 std::vector<int> &result_maxdegs)
const
1482 result_maxdegs[level] = std::max(result_maxdegs[level], f->deg);
1483 if (level == 0)
return;
1484 for (
int i = 0; i <= f->deg; i++)
1485 if (f->arr.polys[i] !=
nullptr)
1490 :
level(nvars - 1),
D(charac, nvars, exts),
P(charac)
1496 return new DRing(
p, nvars0, ext0);
1503 mpz_mod_ui(a, r,
P);
1504 long c = mpz_get_si(a);
1515 mpz_mod_ui(a, mpq_numref(r),
P);
1516 long ctop = mpz_get_si(a);
1517 mpz_mod_ui(a, mpq_denref(r),
P);
1518 long cbottom = mpz_get_si(a);
1520 if (ctop < 0) ctop +=
P;
1521 if (cbottom < 0) cbottom +=
P;
1537 for (
int i = 0; i <=
level - firstvar; i++)
1539 int d =
D.degree_of_extension(i);
1540 if (d < 0)
return -1;
1547 const TowerPolynomial f,
1551 M2_ArrayString names)
const
1553 D.elem_text_out(o,
level, f, p_one, p_plus, p_parens, names);
1567 for (
size_t i = 0; i <
D->nvars; i++) exp[i] = 0;
1578 long *cfs = f->arr.ints;
1579 for (
int i = f->deg; i >= 0; --i)
1583 if (!
viewTerm(cfs[i], exp))
return false;
1589 TowerPolynomial *cfs = f->arr.polys;
1590 for (
int i = f->deg; i >= 0; --i)
1591 if (cfs[i] !=
nullptr)
1594 if (!
traverse1(level - 1, cfs[i], exp))
return false;
exponents::Exponents exponents_t
Legacy RingZZ — a Ring-derived integer ring backed by GMP mpz_t.
void subtract_in_place(int level, TowerPolynomial &f, const TowerPolynomial g)
TowerPolynomial * extensions
static void increase_size_n(int newdeg, TowerPolynomial &f)
void make_monic(int level, TowerPolynomial &f)
void mult_by_coeff_0(TowerPolynomial &f, long b)
static TowerPolynomial read_poly(char *&str, int level)
static TowerPolynomial alloc_poly_n(int deg, TowerPolynomial *elems=nullptr)
TowerPolynomial mult_n(int level, const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension)
TowerPolynomial random(int level, int deg)
TowerPolynomial pseudo_division(int level, TowerPolynomial &f, const TowerPolynomial g)
static TowerPolynomial copy(int level, const TowerPolynomial f)
DPoly(long p, int nvars0, const TowerPolynomial *extensions=nullptr)
TowerPolynomial diff_0(const TowerPolynomial f)
void reset_degree_n(int level, TowerPolynomial &f)
TowerPolynomial var(int level, int v)
TowerPolynomial invert(int level, const TowerPolynomial a)
int degree_of_extension(int level)
void elem_text_out(buffer &o, int level, const TowerPolynomial f, bool p_one, bool p_plus, bool p_parens, M2_ArrayString names) const
TowerPolynomial gcd_coefficients(int level, const TowerPolynomial f, const TowerPolynomial g, TowerPolynomial &result_u, TowerPolynomial &result_v)
void mult_by_coeff_n(int level, TowerPolynomial &f, TowerPolynomial b)
void remainder(int level, TowerPolynomial &f, const TowerPolynomial g)
TowerPolynomial random_0(int deg)
TowerPolynomial power_mod(int level, const TowerPolynomial f, mpz_srcptr n, const TowerPolynomial g)
void add_in_place(int level, TowerPolynomial &f, const TowerPolynomial g)
static std::ostream & append_to_stream(std::ostream &o, int level, const TowerPolynomial f)
void add_in_place_n(int level, TowerPolynomial &f, const TowerPolynomial g)
static bool is_equal(int level, const TowerPolynomial f, const TowerPolynomial g)
void make_monic_n(int level, TowerPolynomial &f, TowerPolynomial &result_multiplier)
TowerPolynomial diff_n(int level, int whichvar, const TowerPolynomial f)
void degrees_of_vars(int level, const TowerPolynomial f, std::vector< int > &result_max_degs) const
TowerPolynomial mult_by_int_0(long c, const TowerPolynomial f)
void pseudo_remainder(int level, TowerPolynomial &f, const TowerPolynomial g)
static void increase_size_0(int newdeg, TowerPolynomial &f)
TowerPolynomial random_n(int level, int deg)
TowerPolynomial mult_0(const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension)
TowerPolynomial mult(int level, const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension)
TowerPolynomial diff(int level, int var, const TowerPolynomial f)
void subtract_in_place_0(TowerPolynomial &f, const TowerPolynomial g)
TowerPolynomial gcd(int level, const TowerPolynomial f, const TowerPolynomial g)
void add_in_place_0(TowerPolynomial &f, const TowerPolynomial g)
static TowerPolynomial read_poly_n(char *&str, int level)
int compare(int level, const TowerPolynomial f, const TowerPolynomial g)
bool make_monic3(int level, TowerPolynomial &u1, TowerPolynomial &u2, TowerPolynomial &u3)
TowerPolynomial lowerP(int level, const TowerPolynomial f)
void initialize(long p, int nvars0, const TowerPolynomial *ext0)
static void dealloc_poly(TowerPolynomial &f)
void make_monic_0(TowerPolynomial &f, long &result_multiplier)
void add_term(int level, TowerPolynomial &result, long coeff, exponents_t exp) const
static TowerPolynomial alloc_poly_0(int deg, long *elems=nullptr)
void negate_in_place(int level, TowerPolynomial &f)
TowerPolynomial mult_by_int(int level, long c, const TowerPolynomial f)
void reset_degree_0(TowerPolynomial &f)
static TowerPolynomial read_poly_0(char *&str)
TowerPolynomial resultant(int level, TowerPolynomial f, TowerPolynomial g)
int index_of_var(int level, const TowerPolynomial f) const
static bool is_one(int level, const TowerPolynomial f)
void subtract_in_place_n(int level, TowerPolynomial &f, const TowerPolynomial g)
void extensions_text_out(buffer &o, M2_ArrayString names) const
TowerPolynomial mult_by_int_n(int level, long c, const TowerPolynomial f)
static void display_poly(FILE *fil, int level, const TowerPolynomial f)
bool down_level(int newlevel, int oldlevel, TowerPolynomial &f)
bool division_in_place(int level, TowerPolynomial &f, const TowerPolynomial g, TowerPolynomial &result_quot)
int degree(int level, int var, const TowerPolynomial f) const
static char * to_string(int level, const TowerPolynomial f)
TowerPolynomial division_in_place_monic(int level, TowerPolynomial &f, const TowerPolynomial g)
static TowerPolynomial from_long(int level, long c)
bool traverse1(int level, const TowerPolynomial g, exponents_t exp)
void traverse(const TowerPolynomial f)
virtual bool viewTerm(long coeff, const_exponents exp)=0
void add_term(elem &result, long coeff, exponents_t exp) const
void set_from_int(TowerPolynomial &result, mpz_srcptr r)
int extension_degree(int firstvar)
void elem_text_out(buffer &o, const TowerPolynomial f, bool p_one, bool p_plus, bool p_parens, M2_ArrayString names) const
bool set_from_mpq(TowerPolynomial &result, mpq_srcptr r)
static DRing * create(long p, int nvars0, const TowerPolynomial *ext0)
DRing(long charac, int nvars, const TowerPolynomial *exts)
static unsigned int mod_ui(mpz_srcptr n, unsigned int p)
void ZZp_MULT(long charac, long &a, long b)
void ZZp_ADD_TO(long charac, long &a, long b)
void ZZp_APXY(long charac, long &a, long b, long c)
void dpoly(int level, const TowerPolynomial f)
void ZZp_RANDOM(long charac, long &result)
void ZZp_INVERT(long charac, long &result, long b)
static void swap_poly(TowerPolynomial &f, TowerPolynomial &g)
long gcd_extended(long a, long b, long &u, long &v)
void ZZp_SUBTRACT_TO(long charac, long &a, long b)
void ZZp_NEGATE(long charac, long &a)
void ZZp_FROM_INT(long charac, long &a, long b)
static int n_nonzero_terms(int level, const TowerPolynomial f)
Native univariate polynomial arithmetic over QQ extensions and finite fields.
static CanonicalForm base
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define newarray_atomic(T, len)
int32_t rawRandomInt(int32_t max)
Engine-boundary C API for the engine's PRNG and rational / real / complex random draws.
TermIterator< Nterm > end(Nterm *)
Heap-allocated node of a tower polynomial: a dense degree-indexed coefficient array that recurses thr...