8 for (
size_t i = 0; i <
a.size(); ++i) {
18 return terms.begin()->first;
22 if (
terms.empty())
return Rational(0);
23 return terms.begin()->second;
27 if (
terms.empty())
return {Rational(0), std::vector<int>(
num_vars, 0)};
28 return {
terms.begin()->second,
terms.begin()->first};
32 if (
c == Rational(0))
return;
33 auto it =
terms.find(m);
34 if (it !=
terms.end()) {
36 Rational new_c = it->second +
c;
37 if (new_c == Rational(0)) {
49 for (
size_t i = 0; i <
a.size(); ++i) res[i] =
a[i] +
b[i];
55 for (
size_t i = 0; i <
a.size(); ++i) res[i] = std::max(
a[i],
b[i]);
60 for (
size_t i = 0; i <
a.size(); ++i) {
61 if (
a[i] >
b[i])
return false;
68 for (
size_t i = 0; i <
num.size(); ++i) res[i] =
num[i] - den[i];
74 for (
auto const& [m,
c] :
b.terms) {
82 for (
auto const& [m,
c] :
b.terms) {
84 Rational c_neg =
c * Rational(-1);
92 if (
t.coeff == Rational(0))
return res;
93 for (
auto const& [m,
c] : p.
terms) {
100 Poly res(
a.num_vars);
101 for (
auto const& [ma, ca] :
a.terms) {
102 for (
auto const& [mb, cb] :
b.terms) {
113 bool reduced =
false;
116 for (
const auto& g : G) {
132 r.add_term(
lt.mono,
lt.coeff);
160 for (
size_t i = 0; i < lm_f.size() && i < lm_g.size(); ++i) {
161 if (lm_f[i] > 0 && lm_g[i] > 0) {
169 const std::set<std::pair<size_t,size_t>>& processed_pairs) {
171 for (
size_t k = 0; k < G.size(); ++k) {
172 if (k == i || k == j) {
175 if (G[k].is_zero()) {
179 auto pair_ik = (i < k) ? std::make_pair(i, k) : std::make_pair(k, i);
180 auto pair_kj = (k < j) ? std::make_pair(k, j) : std::make_pair(j, k);
181 if (processed_pairs.count(pair_ik) && processed_pairs.count(pair_kj)) {
193 for (
int e : L) deg_L +=
e;
201 int sugar_f = f.
sugar + deg_L - deg_lm_f;
202 int sugar_g = g.
sugar + deg_L - deg_lm_g;
204 return std::max(sugar_f, sugar_g);
208 if (polynomial.
num_vars >= count)
return;
209 Poly extended(count);
210 for (
const auto& [monomial, coefficient] : polynomial.
terms) {
212 resized.resize(count, 0);
213 extended.
add_term(resized, coefficient);
215 polynomial = std::move(extended);
219 if (
a.num_vars <
b.num_vars) {
221 }
else if (
b.num_vars <
a.num_vars) {
Monomial div_mono(const Monomial &numerator, const Monomial &denominator)
Poly mul_poly(const Poly &a, const Poly &b)
bool chain_criterion(const std::vector< Poly > &basis, size_t i, size_t j, const std::set< std::pair< size_t, size_t > > &processed_pairs)
bool coprime_leading_monomials(const Poly &f, const Poly &g)
void extend_variables(Poly &polynomial, size_t count)
Poly s_poly(const Poly &f, const Poly &g)
Poly reduce(Poly polynomial, const std::vector< Poly > &basis)
int compute_spoly_sugar(const Poly &f, const Poly &g)
Monomial mul_mono(const Monomial &a, const Monomial &b)
void align_variables(Poly &a, Poly &b)
bool divides_mono(const Monomial &a, const Monomial &b)
Monomial lcm_mono(const Monomial &a, const Monomial &b)
Poly sub_poly(const Poly &a, const Poly &b)
Poly mul_poly_term(const Poly &polynomial, const Term &term)
Poly add_poly(const Poly &a, const Poly &b)
std::vector< int > Monomial
std::shared_ptr< SymbolicExpr > num(int value)
__attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std std::shared_ptr< SymbolicExpr > r
const VectorField const VectorField & c
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::shared_ptr< SymbolicExpr > & a
ExprResult lt(const ExprPtr &lhs, const ExprPtr &rhs)
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & t
bool operator()(const Monomial &a, const Monomial &b) const
Rational lead_coeff() const
void add_term(const Monomial &monomial, const Rational &coefficient)
Monomial lead_monomial() const