88std::vector<FGLMPoly>
fglm_convert(
const std::vector<FGLMPoly>& source_basis,
92 int dimension = checked_dimension(source_basis, num_vars);
93 std::vector<FGLMPoly> target_basis;
94 std::vector<Monomial> basis_monomials;
95 auto standard = standard_basis(source_basis, num_vars, dimension);
96 std::map<Monomial, size_t> monomial_index;
97 for (
size_t index = 0; index < standard.size(); ++index) {
98 monomial_index[standard[index]] = index;
102 std::vector<Monomial> target_leading;
103 const int max_iterations = dimension * 10 + 50;
106 while (iterations < max_iterations && enumerator.
next(monomial)) {
109 auto polynomial = FGLMPoly::from_monomial(monomial, num_vars);
110 auto normal =
normal_form(polynomial, source_basis, source_order);
111 auto vector = coordinates(normal, monomial_index);
112 std::vector<Rational> combination;
114 basis_monomials.push_back(monomial);
116 auto dependent = dependent_polynomial(monomial, combination,
117 basis_monomials, target_order,
119 if (!dependent.is_zero()) {
120 target_leading.push_back(dependent.lead_monomial());
121 target_basis.push_back(std::move(dependent));
124 if (
static_cast<int>(basis_monomials.size()) == dimension &&
129 throw std::runtime_error(
130 "FGLM: enumeration ended before the target basis was complete");