16namespace layer1_foundations {
17namespace ring_theory {
20static int homogeneous_polynomial_domain_compare_monomial_with(
void *data,
21 int i,
void *data2,
void *extra_data);
22static int homogeneous_polynomial_domain_compare_monomial(
void *data,
23 int i,
int j,
void *extra_data);
24static void homogeneous_polynomial_domain_swap_monomial(
void *data,
25 int i,
int j,
void *extra_data);
27static void HPD_callback_print_function(
28 std::stringstream &ost,
void *data,
void *callback_data);
29static void HPD_callback_print_function2(
30 std::stringstream &ost,
void *data,
void *callback_data);
37 Monomial_ordering_type =
t_LEX;
43 monomial_symbols = NULL;
44 monomial_symbols_latex = NULL;
45 monomial_symbols_easy = NULL;
50 Affine_to_monomial = NULL;
89 delete [] symbols_latex;
91 if (monomial_symbols) {
92 for (i = 0; i < nb_monomials; i++) {
97 if (monomial_symbols_latex) {
98 for (i = 0; i < nb_monomials; i++) {
103 if (monomial_symbols_easy) {
104 for (i = 0; i < nb_monomials; i++) {
115 if (Affine_to_monomial) {
153 int nb_vars,
int degree,
int f_init_incidence_structure,
157 int f_v = (verbose_level >= 1);
161 cout <<
"homogeneous_polynomial_domain::init" << endl;
163 homogeneous_polynomial_domain::F = F;
167 homogeneous_polynomial_domain::Monomial_ordering_type = Monomial_ordering_type;
174 cout <<
"homogeneous_polynomial_domain::init before make_monomials" << endl;
178 cout <<
"homogeneous_polynomial_domain::init after make_monomials" << endl;
196 cout <<
"homogeneous_polynomial_domain::init before P->projective_space_init" << endl;
199 f_init_incidence_structure,
202 cout <<
"homogeneous_polynomial_domain::init after P->projective_space_init" << endl;
204 base_cols =
NEW_int(nb_monomials);
207 cout <<
"homogeneous_polynomial_domain::init done" << endl;
230 cout <<
"homogeneous_polynomial_domain::get_monomial j > nb_variables" << endl;
238 return monomial_symbols_easy[i];
257 const char *symbol_mask,
const char *symbol_mask_latex,
267 delete [] symbols_latex;
272 snprintf(label, 1000, symbol_mask, i + symbol_offset);
273 symbols[i].assign(label);
276 snprintf(label, 1000, symbol_mask_latex, i + symbol_offset);
277 symbols_latex[i].assign(label);
283 const char *symbol_mask,
const char *symbol_mask_latex,
289 for (j = 0; j < len; j++) {
291 snprintf(label, 1000, symbol_mask, i + symbol_offset);
292 symbols[i].assign(label);
294 for (j = 0; j < len; j++) {
296 snprintf(label, 1000, symbol_mask_latex, i + symbol_offset);
297 symbols_latex[i].assign(label);
306 int f_v = (verbose_level >= 1);
307 int i, j, a, h, idx, t;
313 cout <<
"homogeneous_polynomial_domain::make_monomials" << endl;
332 cout <<
"homogeneous_polynomial_domain::make_monomials before D->solve_all_betten" << endl;
336 cout <<
"homogeneous_polynomial_domain::make_monomials after D->solve_all_betten" << endl;
340 cout <<
"homogeneous_polynomial_domain::make_monomials "
341 "We found " << D->
_resultanz <<
" monomials" << endl;
348 cout <<
"There are " << nb_sol <<
" monomials." << endl;
354 cout <<
"too many to print" << endl;
358 if (nb_sol != nb_monomials) {
359 cout <<
"homogeneous_polynomial_domain::make_monomials "
360 "nb_sol != nb_monomials" << endl;
361 cout <<
"nb_sol=" << nb_sol << endl;
362 cout <<
"nb_monomials=" << nb_monomials << endl;
368 if (Monomial_ordering_type ==
t_PART) {
371 cout <<
"homogeneous_polynomial_domain::make_monomials rearranging by partition type:" << endl;
378 cout <<
"After rearranging by type:" << endl;
379 if (nb_monomials < 100) {
383 cout <<
"too many to print" << endl;
403 symbols[i].assign(label);
420 symbols_latex[i].assign(label);
425 monomial_symbols =
NEW_pchar(nb_monomials);
426 for (i = 0; i < nb_monomials; i++) {
438 strcat(label, symbols[j].c_str());
440 sprintf(label + strlen(label),
"^%d", a);
445 monomial_symbols[i] =
NEW_char(l + 1);
446 strcpy(monomial_symbols[i], label);
449 monomial_symbols_latex =
NEW_pchar(nb_monomials);
450 for (i = 0; i < nb_monomials; i++) {
455 strcat(label, symbols_latex[j].c_str());
458 sprintf(label + strlen(label),
"^{%d}", a);
461 sprintf(label + strlen(label),
"^%d", a);
467 monomial_symbols_latex[i] =
NEW_char(l + 1);
468 strcpy(monomial_symbols_latex[i], label);
472 for (i = 0; i < nb_monomials; i++) {
476 for (t = 0; t < a; t++) {
477 Variables[i *
degree + h] = j;
482 cout <<
"homogeneous_polynomial_domain::make_monomials "
483 "h != degree" << endl;
489 monomial_symbols_easy =
NEW_pchar(nb_monomials);
490 for (i = 0; i < nb_monomials; i++) {
493 for (j = 0; j <
degree; j++) {
494 a = Variables[i *
degree + j];
495 sprintf(label + strlen(label),
"%d", a);
498 monomial_symbols_easy[i] =
NEW_char(l + 1);
499 strcpy(monomial_symbols_easy[i], label);
504 cout <<
"homogeneous_polynomial_domain::make_monomials the "
505 "variable lists are:" << endl;
506 if (nb_monomials < 100) {
507 for (i = 0; i < nb_monomials; i++) {
508 cout << i <<
" : " << monomial_symbols[i] <<
" : ";
514 cout <<
"too many to print" << endl;
526 cout <<
"homogeneous_polynomial_domain::make_monomials "
527 "Affine, nb_affine=" << nb_affine << endl;
529 for (h = 0; h < nb_affine; h++) {
533 cout <<
"homogeneous_polynomial_domain::make_monomials "
537 Affine_to_monomial =
NEW_int(nb_affine);
538 for (i = 0; i < nb_affine; i++) {
539 if (i > 0 && (i & ((1 << 20) - 1)) == 0) {
540 cout <<
"homogeneous_polynomial_domain::make_monomials "
541 "i = " << i <<
" / " << nb_affine << endl;
544 for (j = 0; j <
degree; j++) {
545 a = Affine[i *
degree + j];
549 Affine_to_monomial[i] = idx;
553 cout <<
"homogeneous_polynomial_domain::make_monomials "
554 "nb_affine is too big, skipping Affine_to_monomial" << endl;
556 Affine_to_monomial = NULL;
560 cout <<
"homogeneous_polynomial_domain::make_monomials "
561 "Affine : idx:" << endl;
562 for (i = 0; i < nb_affine; i++) {
565 cout <<
" : " << Affine_to_monomial[i] << endl;
571 cout <<
"homogeneous_polynomial_domain::make_monomials done" << endl;
578 int f_v = (verbose_level >= 1);
582 cout <<
"homogeneous_polynomial_domain::rearrange_monomials_by_partition_type" << endl;
586 homogeneous_polynomial_domain_compare_monomial,
587 homogeneous_polynomial_domain_swap_monomial,
592 cout <<
"homogeneous_polynomial_domain::rearrange_monomials_by_partition_type done" << endl;
603 for (i = 0; i < nb_monomials; i++) {
604 for (j = 0; j < n; j++) {
605 if (v[j] != Monomials[i * n + j]) {
617 homogeneous_polynomial_domain_compare_monomial_with,
620 cout <<
"homogeneous_polynomial_domain::index_of_monomial "
621 "Did not find the monomial v=";
624 cout <<
"Monomials:" << endl;
627 for (i = 0; i < nb_monomials; i++) {
628 cout << setw(3) << i <<
" : ";
632 cout <<
"homogeneous_polynomial_domain::index_of_monomial "
633 "Did not find the monomial v=";
637 homogeneous_polynomial_domain_compare_monomial_with,
645 int *&Kernel,
int &dim_kernel,
int verbose_level)
647 int f_v = (verbose_level >= 1);
648 int i, j, h, a, b, c, idx, f_kernel;
652 cout <<
"homogeneous_polynomial_domain::affine_evaluation_kernel" << endl;
656 for (i = 0; i < nb_monomials; i++) {
674 cout <<
"homogeneous_polynomial_domain::affine_evaluation_kernel monomial ";
684 cout <<
"homogeneous_polynomial_domain::affine_evaluation_kernel dim_kernel = " << dim_kernel << endl;
686 Kernel =
NEW_int(dim_kernel * 2);
688 for (i = 0; i < nb_monomials; i++) {
706 cout <<
"homogeneous_polynomial_domain::affine_evaluation_kernel monomial ";
713 Kernel[h * 2 + 0] = i;
714 Kernel[h * 2 + 1] = idx;
720 cout <<
"homogeneous_polynomial_domain::affine_evaluation_kernel done" << endl;
726 int j, a, f_first =
TRUE;
748 int j, a, f_first =
TRUE;
777 ost << symbols_latex[j];
779 ost <<
"^{" << a <<
"}";
804 s.append(symbols_latex[j]);
810 sprintf(str,
"^{%d}", a);
813 sprintf(str,
"^%d", a);
830 int j, a, f_first =
TRUE;
860 ost << symbols_latex[j];
873 for (i = 0; i < nb_monomials; i++) {
905 for (i = 0; i < nb_monomials; i++) {
930 for (i = 0; i < nb_monomials; i++) {
955 for (i = 0; i < nb_monomials; i++) {
980 for (i = 0; i < nb_monomials; i++) {
1005 for (i = 0; i < nb_monomials; i++) {
1025 std::ostream &ost,
int *coeffs,
int nb_terms_per_line,
1026 const char *new_line_text)
1032 for (i = 0; i < nb_monomials; i++) {
1038 if ((cnt % nb_terms_per_line) == 0 && cnt) {
1039 ost << new_line_text;
1059 ostream &ost,
long int *coeffs,
int nb_terms_per_line,
1060 const char *new_line_text)
1066 for (i = 0; i < nb_monomials; i++) {
1072 if ((cnt % nb_terms_per_line) == 0 && cnt) {
1073 ost << new_line_text;
1093 long int *Pts,
int &nb_pts,
int verbose_level)
1095 int f_v = (verbose_level >= 1);
1099 cout <<
"homogeneous_polynomial_domain::algebraic_set "
1100 "P->N_points=" << P->
N_points << endl;
1103 for (rk = 0; rk < P->
N_points; rk++) {
1105 for (i = 0; i < nb_eqns; i++) {
1117 cout <<
"homogeneous_polynomial_domain::algebraic_set "
1124 int f_v = (verbose_level >= 1);
1128 cout <<
"homogeneous_polynomial_domain::polynomial_function "
1129 "P->N_points=" << P->
N_points << endl;
1131 for (rk = 0; rk < P->
N_points; rk++) {
1139 std::vector<long int> &Pts,
1142 int f_v = (verbose_level >= 1);
1148 cout <<
"homogeneous_polynomial_domain::enumerate_points" << endl;
1151 cout <<
"homogeneous_polynomial_domain::enumerate_points P->N_points=" << P->
N_points << endl;
1152 cout <<
"homogeneous_polynomial_domain::enumerate_points coeff=" << endl;
1163 for (rk = 0; rk < P->
N_points; rk++) {
1167 cout <<
"homogeneous_polynomial_domain::enumerate_points point " << rk <<
" / " << P->
N_points <<
" :";
1169 cout <<
" evaluates to " << a << endl;
1177 cout <<
"homogeneous_polynomial_domain::enumerate_points "
1183 long int *&Pts,
int &nb_pts,
int verbose_level)
1185 int f_v = (verbose_level >= 1);
1188 cout <<
"homogeneous_polynomial_domain::enumerate_points_lint" << endl;
1191 vector<long int> Points;
1194 cout <<
"homogeneous_polynomial_domain::enumerate_points_lint before "
1195 "enumerate_points" << endl;
1200 cout <<
"homogeneous_polynomial_domain::enumerate_points_lint after "
1201 "enumerate_points" << endl;
1204 cout <<
"homogeneous_polynomial_domain::enumerate_points_lint The object "
1205 "has " << Points.size() <<
" points" << endl;
1209 nb_pts = Points.size();
1211 for (i = 0; i < nb_pts; i++) {
1217 cout <<
"homogeneous_polynomial_domain::enumerate_points_lint done" << endl;
1223 std::vector<long int> &Pts,
1226 int f_v = (verbose_level >= 1);
1227 int f_vv = (verbose_level >= 2);
1232 cout <<
"homogeneous_polynomial_domain::enumerate_points_zariski_open_set" << endl;
1235 cout <<
"homogeneous_polynomial_domain::enumerate_points_zariski_open_set "
1236 "P->N_points=" << P->
N_points << endl;
1242 for (rk = 0; rk < P->
N_points; rk++) {
1251 cout <<
"homogeneous_polynomial_domain::enumerate_points_zariski_open_set "
1267 int *coeff,
int *pt_vec)
1272 for (i = 0; i < nb_monomials; i++) {
1273 if (coeff[i] == 0) {
1277 c = F->
mult(coeff[i], b);
1284 int *coeff_in,
int *coeff_out,
1285 int *Mtx_inv,
int verbose_level)
1287 int f_v = (verbose_level >= 1);
1290 cout <<
"homogeneous_polynomial_domain::substitute_linear" << endl;
1295 Mtx_inv, verbose_level);
1297 cout <<
"homogeneous_polynomial_domain::substitute_linear "
1303 int *coeff_in,
int *coeff_out,
1304 int f_semilinear,
int frob_power,
int *Mtx_inv,
1308 int f_v = (verbose_level >= 1);
1309 int a, b, c, i, j, idx;
1315 cout <<
"homogeneous_polynomial_domain::substitute_semilinear" << endl;
1328 for (i = 0; i < nb_monomials; i++) {
1335 cout <<
"homogeneous_polynomial_domain::substitute_semilinear monomial " << c <<
" * ";
1340 V = Variables + i *
degree;
1347 cout <<
"variables: ";
1348 int_vec_print(cout, V,
degree);
1351 cout <<
"Mtx:" << endl;
1352 int_matrix_print(Mtx_inv, n, n);
1356 for (a = 0; a < nb_affine; a++) {
1365 for (j = 0; j <
degree; j++) {
1371 if (Affine_to_monomial) {
1372 idx = Affine_to_monomial[a];
1376 for (j = 0; j <
degree; j++) {
1377 a = Affine[i *
degree + j];
1384 cout <<
"affine " << a <<
" / " << nb_affine <<
" : ";
1385 int_vec_print(cout, A, 3);
1386 cout <<
" factors ";
1387 int_vec_print(cout, factors, 3);
1388 cout <<
" b=" << b <<
" idx=" << idx << endl;
1390 coeff2[idx] = F->
add(coeff2[idx], b);
1392 for (j = 0; j < nb_monomials; j++) {
1393 coeff2[j] = F->
mult(coeff2[j], c);
1397 cout <<
"homogeneous_polynomial_domain::substitute_semilinear "
1398 "monomial " << c <<
" * ";
1400 cout <<
" yields:" << endl;
1401 int_vec_print(cout, coeff2, nb_monomials);
1405 for (j = 0; j < nb_monomials; j++) {
1406 coeff3[j] = F->
add(coeff2[j], coeff3[j]);
1410 cout <<
"homogeneous_polynomial_domain::substitute_semilinear "
1412 int_vec_print(cout, coeff_in, nb_monomials);
1414 cout <<
"homogeneous_polynomial_domain::substitute_semilinear "
1416 int_vec_print(cout, coeff3, nb_monomials);
1426 cout <<
"homogeneous_polynomial_domain::substitute_semilinear "
1432 int *coeff_in,
int *coeff_out,
1433 int *Pt1_coeff,
int *Pt2_coeff,
1437 int f_v = (verbose_level >= 1);
1438 int rk, b, c, i, j, idx;
1442 int my_nb_affine, wt;
1448 cout <<
"homogeneous_polynomial_domain::substitute_line" << endl;
1456 Mtx[i * 2 + 0] = Pt1_coeff[i];
1457 Mtx[i * 2 + 1] = Pt2_coeff[i];
1465 for (i = 0; i < nb_monomials; i++) {
1472 cout <<
"homogeneous_polynomial_domain::substitute_line monomial " << c <<
" * ";
1477 V = Variables + i *
degree;
1484 cout <<
"variables: ";
1485 int_vec_print(cout, V,
degree);
1488 cout <<
"Mtx:" << endl;
1489 int_matrix_print(Mtx, n, 2);
1493 for (rk = 0; rk < my_nb_affine; rk++) {
1500 for (j = 0; j <
degree; j++) {
1505 for (j = 0; j <
degree; j++) {
1507 factors[j] = Mtx[V[j] * 2 + A[j]];
1513 if (Affine_to_monomial) {
1514 idx = Affine_to_monomial[a];
1518 for (j = 0; j <
degree; j++) {
1519 a = Affine[i *
degree + j];
1529 cout <<
"affine " << a <<
" / " << nb_affine <<
" : ";
1530 int_vec_print(cout, A, 3);
1531 cout <<
" factors ";
1532 int_vec_print(cout, factors, 3);
1533 cout <<
" b=" << b <<
" idx=" << idx << endl;
1535 coeff2[idx] = F->
add(coeff2[idx], b);
1537 for (j = 0; j <=
degree; j++) {
1538 coeff2[j] = F->
mult(coeff2[j], c);
1542 cout <<
"homogeneous_polynomial_domain::substitute_line "
1543 "monomial " << c <<
" * ";
1545 cout <<
" yields:" << endl;
1546 int_vec_print(cout, coeff2, nb_monomials);
1550 for (j = 0; j <=
degree; j++) {
1551 coeff3[j] = F->
add(coeff2[j], coeff3[j]);
1555 cout <<
"homogeneous_polynomial_domain::substitute_line "
1557 int_vec_print(cout, coeff_in, nb_monomials);
1559 cout <<
"homogeneous_polynomial_domain::substitute_line "
1561 int_vec_print(cout, coeff3, nb_monomials);
1574 cout <<
"homogeneous_polynomial_domain::substitute_line "
1580 int *coeff_in,
int scalar,
int *coeff_out,
1583 int f_v = (verbose_level >= 1);
1587 cout <<
"homogeneous_polynomial_domain::multiply_by_scalar" << endl;
1591 for (i = 0; i < nb_monomials; i++) {
1597 cout <<
"coeff_in[" << i <<
"] = " << a << endl;
1599 c = F->
mult(a, scalar);
1604 cout <<
"homogeneous_polynomial_domain::multiply_by_scalar done" << endl;
1610 int *coeff1,
int *coeff2,
int *coeff3,
1613 int f_v = (verbose_level >= 1);
1614 int i, j, a, b, c, idx;
1617 cout <<
"homogeneous_polynomial_domain::multiply_mod" << endl;
1621 for (i = 0; i < nb_monomials; i++) {
1627 cout <<
"coeff1[" << i <<
"] = " << a << endl;
1629 for (j = 0; j < nb_monomials; j++) {
1635 cout <<
"coeff2[" << j <<
"] = " << b << endl;
1638 idx = (i + j) % nb_monomials;
1639 coeff3[idx] = F->
add(coeff3[idx], c);
1641 cout <<
"coeff3[" << idx <<
"] += " << c << endl;
1647 cout <<
"homogeneous_polynomial_domain::multiply_mod done" << endl;
1652 int *coeff1,
int *coeff2,
int *coeff3,
1655 int f_v = (verbose_level >= 1);
1656 int i, j, a, b, c, idx;
1659 cout <<
"homogeneous_polynomial_domain::multiply_mod_negatively_wrapped" << endl;
1663 for (i = 0; i < nb_monomials; i++) {
1669 cout <<
"coeff1[" << i <<
"] = " << a << endl;
1671 for (j = 0; j < nb_monomials; j++) {
1677 cout <<
"coeff2[" << j <<
"] = " << b << endl;
1681 if (idx < nb_monomials) {
1682 coeff3[idx] = F->
add(coeff3[idx], c);
1685 idx = idx % nb_monomials;
1686 coeff3[idx] = F->
add(coeff3[idx], F->
negate(c));
1689 cout <<
"coeff3[" << idx <<
"] += " << c << endl;
1695 cout <<
"homogeneous_polynomial_domain::multiply_mod_negatively_wrapped done" << endl;
1704 for (i = 0; i < nb_monomials; i++) {
1739 int &a1,
int &a2,
int &a3,
int &a4,
int &a6,
int verbose_level)
1741 int f_v = (verbose_level >= 1);
1746 cout <<
"homogeneous_polynomial_domain::test_weierstrass_form"
1750 cout <<
"homogeneous_polynomial_domain::test_weierstrass_form "
1751 "nb_variables != 3" << endl;
1755 cout <<
"homogeneous_polynomial_domain::test_weierstrass_form "
1756 "degree != 3" << endl;
1759 if (coeff2[1] || coeff2[3] || coeff2[6]) {
1763 if (coeff2[0] != 1) {
1767 if (coeff2[7] != m_one) {
1770 a1 = F->
negate(coeff2[4]);
1772 a3 = F->
negate(coeff2[8]);
1779 int nb_pts,
int &r,
int *Kernel,
int verbose_level)
1781 int f_v = (verbose_level >= 1);
1782 int f_vv = (verbose_level >= 2);
1787 cout <<
"homogeneous_polynomial_domain::vanishing_ideal" << endl;
1789 System =
NEW_int(
MAX(nb_pts, nb_monomials) * nb_monomials);
1790 for (i = 0; i < nb_pts; i++) {
1792 for (j = 0; j < nb_monomials; j++) {
1793 System[i * nb_monomials + j] =
1798 cout <<
"homogeneous_polynomial_domain::vanishing_ideal "
1799 "The system:" << endl;
1804 cout <<
"homogeneous_polynomial_domain::vanishing_ideal "
1805 "before RREF_and_kernel" << endl;
1808 nb_pts, System, 0 );
1810 cout <<
"homogeneous_polynomial_domain::vanishing_ideal "
1811 "The system has rank " << r << endl;
1814 cout <<
"homogeneous_polynomial_domain::vanishing_ideal "
1815 "The system in RREF:" << endl;
1817 cout <<
"homogeneous_polynomial_domain::vanishing_ideal "
1818 "The kernel:" << endl;
1820 nb_monomials - r, nb_monomials);
1823 (nb_monomials - r) * nb_monomials);
1826 cout <<
"homogeneous_polynomial_domain::vanishing_ideal done" << endl;
1834 if (Monomial_ordering_type ==
t_PART) {
1837 if (Monomial_ordering_type ==
t_LEX) {
1841 cout <<
"homogeneous_polynomial_domain::compare_monomials "
1842 "monomial ordering unrecognized" << endl;
1863 for (h =
degree; h >= 0; h--) {
1864 if (type2[h] > type1[h]) {
1869 if (type2[h] < type1[h]) {
1875 for (a =
degree; a >= 1; a--) {
1877 if ((M1[h] != a) && (M2[h] != a)) {
1880 if (M1[h] > M2[h]) {
1884 if (M1[h] < M2[h]) {
1904 for (i = 0; i < (nb_monomials + 24) / 25; i++) {
1906 l =
MINIMUM((i + 1) * 25, nb_monomials) - i * 25;
1908 ost <<
"$$" << endl;
1909 ost <<
"\\begin{array}{|r|r|r|}" << endl;
1910 ost <<
"\\hline" << endl;
1911 ost <<
"h & \\mbox{monomial} & \\mbox{vector} \\\\" << endl;
1912 ost <<
"\\hline" << endl;
1913 ost <<
"\\hline" << endl;
1915 for (h = 0; h < l; h++) {
1916 ost << i * 25 + h <<
" & ";
1920 ost <<
"\\\\" << endl;
1922 ost <<
"\\hline" << endl;
1923 ost <<
"\\end{array}" << endl;
1924 ost <<
"$$" << endl;
1926 ost <<
"\\clearpage" << endl;
1932 int f_v = (verbose_level >= 1);
1935 cout <<
"homogeneous_polynomial_domain::read_from_string_coefficient_pairs" << endl;
1951 for (i = 0; i < len / 2; i++) {
1952 a = coeff_pairs[2 * i];
1953 b = coeff_pairs[2 * i + 1];
1955 cout <<
"homogeneous_polynomial_domain::read_from_string_coefficient_pairs "
1956 "b >= get_nb_monomials()" << endl;
1960 cout <<
"homogeneous_polynomial_domain::read_from_string_coefficient_pairs "
1964 if (a < 0 || a >= F->
q) {
1966 cout <<
"homogeneous_polynomial_domain::read_from_string_coefficient_pairs "
1967 "In a field extension, what do you mean by " << a << endl;
1970 a = NT.
mod(a, F->
q);
1978 cout <<
"homogeneous_polynomial_domain::read_from_string_coefficient_pairs done" << endl;
1985 int f_v = (verbose_level >= 1);
1988 cout <<
"homogeneous_polynomial_domain::read_from_string_coefficient_vector" << endl;
2005 cout <<
"homogeneous_polynomial_domain::read_from_string_coefficient_vector "
2006 "len >= get_nb_monomials()" << endl;
2010 for (i = 0; i < len; i++) {
2012 if (a < 0 || a >= F->
q) {
2014 cout <<
"homogeneous_polynomial_domain::read_from_string_coefficient_vector "
2015 "In a field extension, what do you mean by " << a << endl;
2018 a = NT.
mod(a, F->
q);
2026 cout <<
"homogeneous_polynomial_domain::read_from_string_coefficient_vector done" << endl;
2031static int homogeneous_polynomial_domain_compare_monomial_with(
2032 void *data,
int i,
void *data2,
void *extra_data)
2037 int ret, nb_variables;
2039 Data = (
int *) data;
2045static int homogeneous_polynomial_domain_compare_monomial(
2046 void *data,
int i,
int j,
void *extra_data)
2048 homogeneous_polynomial_domain *HPD =
2049 (homogeneous_polynomial_domain *) extra_data;
2051 int ret, nb_variables;
2053 Data = (
int *) data;
2055 ret = HPD->compare_monomials(Data + i * nb_variables, Data + j * nb_variables);
2059static void homogeneous_polynomial_domain_swap_monomial(
2060 void *data,
int i,
int j,
void *extra_data)
2062 homogeneous_polynomial_domain *HPD =
2063 (homogeneous_polynomial_domain *) extra_data;
2065 int h, a, nb_variables;
2067 Data = (
int *) data;
2068 nb_variables = HPD->nb_variables;
2070 for (h = 0; h < nb_variables; h++) {
2071 a = Data[i * nb_variables + h];
2072 Data[i * nb_variables + h] = Data[j * nb_variables + h];
2073 Data[j * nb_variables + h] = a;
2080static void HPD_callback_print_function(
2081 stringstream &ost,
void *data,
void *callback_data)
2083 homogeneous_polynomial_domain *HPD =
2084 (homogeneous_polynomial_domain *) callback_data;
2087 int *i_data = (
int *) data;
2089 coeff =
NEW_int(HPD->get_nb_monomials());
2090 HPD->unrank_coeff_vector(coeff, i_data[0]);
2093 HPD->print_equation_str(ost, coeff);
2098static void HPD_callback_print_function2(
2099 stringstream &ost,
void *data,
void *callback_data)
2101 homogeneous_polynomial_domain *HPD =
2102 (homogeneous_polynomial_domain *) callback_data;
2105 int *i_data = (
int *) data;
2108 vector<long int> Points;
2111 coeff =
NEW_int(HPD->get_nb_monomials());
2112 HPD->unrank_coeff_vector(coeff, i_data[0]);
2113 HPD->enumerate_points(coeff, Points, 0 );
2114 ost << Points.size();
a collection of combinatorial functions
long int int_n_choose_k(int n, int k)
a collection of functions related to sorted vectors
void Heapsort_general(void *data, int len, int(*compare_func)(void *data, int i, int j, void *extra_data), void(*swap_func)(void *data, int i, int j, void *extra_data), void *extra_data)
int search_general(void *data, int len, void *search_object, int &idx, int(*compare_func)(void *data, int i, void *search_object, void *extra_data), void *extra_data, int verbose_level)
int int_vec_compare(int *p, int *q, int len)
void PG_element_normalize_from_front(int *v, int stride, int len)
int product_n(int *a, int n)
void print_element_str(std::stringstream &ost, int a)
void PG_element_unrank_modified_lint(int *v, int stride, int len, long int a)
linear_algebra::linear_algebra * Linear_algebra
void print_element(std::ostream &ost, int a)
void frobenius_power_vec_to_vec(int *v_in, int *v_out, int len, int frob_power)
void PG_element_rank_modified_lint(int *v, int stride, int len, long int &a)
various functions related to geometries
void AG_element_unrank(int q, int *v, int stride, int len, long int a)
projective space PG(n,q) of dimension n over Fq
long int rank_point(int *v)
void projective_space_init(int n, field_theory::finite_field *F, int f_init_incidence_structure, int verbose_level)
void unrank_point(int *v, long int rk)
int evaluate_monomial(int *monomial, int *variables, int nb_vars)
int RREF_and_kernel(int n, int k, int *A, int verbose_level)
basic number theoretic functions
long int mod(long int a, long int p)
int i_power_j(int i, int j)
homogeneous polynomials of a given degree in a given number of variables over a finite field GF(q)
void rearrange_monomials_by_partition_type(int verbose_level)
homogeneous_polynomial_domain()
void multiply_mod_negatively_wrapped(int *coeff1, int *coeff2, int *coeff3, int verbose_level)
void init(field_theory::finite_field *F, int nb_vars, int degree, int f_init_incidence_structure, monomial_ordering_type Monomial_ordering_type, int verbose_level)
void substitute_line(int *coeff_in, int *coeff_out, int *Pt1_coeff, int *Pt2_coeff, int verbose_level)
void print_equation_with_line_breaks_tex_lint(std::ostream &ost, long int *coeffs, int nb_terms_per_line, const char *new_line_text)
void polynomial_function(int *coeff, int *f, int verbose_level)
void print_equation_numerical(std::ostream &ost, int *coeffs)
void unrank_point(int *v, int rk)
int compare_monomials_PART(int *M1, int *M2)
int evaluate_at_a_point_by_rank(int *coeff, int pt)
int evaluate_at_a_point(int *coeff, int *pt_vec)
int get_monomial(int i, int j)
int test_weierstrass_form(int rk, int &a1, int &a2, int &a3, int &a4, int &a6, int verbose_level)
void print_monomial_ordering(std::ostream &ost)
void affine_evaluation_kernel(int *&Kernel, int &dim_kernel, int verbose_level)
void enumerate_points(int *coeff, std::vector< long int > &Pts, int verbose_level)
void print_equation_lint(std::ostream &ost, long int *coeffs)
void multiply_by_scalar(int *coeff_in, int scalar, int *coeff_out, int verbose_level)
int * read_from_string_coefficient_pairs(std::string &str, int verbose_level)
void print_equation(std::ostream &ost, int *coeffs)
void print_monomial(std::ostream &ost, int i)
void remake_symbols(int symbol_offset, const char *symbol_mask, const char *symbol_mask_latex, int verbose_level)
void enumerate_points_lint(int *coeff, long int *&Pts, int &nb_pts, int verbose_level)
void unrank_coeff_vector(int *v, long int rk)
char * get_monomial_symbol_easy(int i)
void print_monomial_latex_str(std::stringstream &ost, int i)
void print_equation_simple(std::ostream &ost, int *coeffs)
int * get_monomial_pointer(int i)
int * read_from_string_coefficient_vector(std::string &str, int verbose_level)
void enumerate_points_zariski_open_set(int *coeff, std::vector< long int > &Pts, int verbose_level)
void print_equation_with_line_breaks_tex(std::ostream &ost, int *coeffs, int nb_terms_per_line, const char *new_line_text)
void print_monomial_latex(std::ostream &ost, int *mon)
void print_equation_lint_tex(std::ostream &ost, long int *coeffs)
void substitute_semilinear(int *coeff_in, int *coeff_out, int f_semilinear, int frob_power, int *Mtx_inv, int verbose_level)
void multiply_mod(int *coeff1, int *coeff2, int *coeff3, int verbose_level)
void remake_symbols_interval(int symbol_offset, int from, int len, const char *symbol_mask, const char *symbol_mask_latex, int verbose_level)
void algebraic_set(int *Eqns, int nb_eqns, long int *Pts, int &nb_pts, int verbose_level)
int index_of_monomial(int *v)
void print_equation_tex(std::ostream &ost, int *coeffs)
geometry::projective_space * get_P()
void print_monomial_str(std::stringstream &ost, int i)
void substitute_linear(int *coeff_in, int *coeff_out, int *Mtx_inv, int verbose_level)
long int rank_coeff_vector(int *v)
int evaluate_monomial(int idx_of_monomial, int *coords)
field_theory::finite_field * get_F()
void vanishing_ideal(long int *Pts, int nb_pts, int &r, int *Kernel, int verbose_level)
void make_monomials(monomial_ordering_type Monomial_ordering_type, int verbose_level)
~homogeneous_polynomial_domain()
int compare_monomials(int *M1, int *M2)
void print_equation_str(std::stringstream &ost, int *coeffs)
diophantine systems of equations (i.e., linear systems over the integers)
void fill_coefficient_matrix_with(int a)
void set_x_max_constant(int a)
diophant_equation_type * type
void get_solutions_full_length(int *&Sol, int &nb_sol, int verbose_level)
int solve_all_betten(int verbose_level)
void set_x_min_constant(int a)
#define Int_vec_scan(A, B, C)
#define Int_vec_zero(A, B)
#define Int_vec_print_fully(A, B, C)
#define Int_matrix_print(A, B, C)
#define Int_vec_copy(A, B, C)
#define Int_vec_print(A, B, C)
the orbiter library for the classification of combinatorial objects