10 auto [reduced_denominator, remainder] = Q.
div_mod(P);
11 if (remainder.is_zero()) {
14 Q = std::move(reduced_denominator);
21 auto result = SymbolicExpr::number(0);
23 for (
size_t k = 0; k < quot.
coeffs.size(); ++k) {
24 if (quot.
coeffs[k] == Rational(0)) {
continue; }
25 const BigInt integrated_power = BigInt(k) + BigInt(1);
26 Rational coeff = quot.
coeffs[k] / Rational(integrated_power);
27 std::shared_ptr<SymbolicExpr> term;
28 auto v = SymbolicExpr::variable(var);
29 auto pw = SymbolicExpr::power(
v, SymbolicExpr::number(integrated_power));
30 if (coeff == Rational(1)) {
33 term = SymbolicExpr::multiply(SymbolicExpr::number(coeff), pw);
35 result = SymbolicExpr::add(result, term);
42 const std::string& var,
47 context.limits().max_ast_nodes,
"transform");
49 for (
const auto& [factor, mult] : factors) {
50 for (
int power = 1; power <= mult; ++power, ++idx) {
68 const std::string& var,
74 quot = std::move(divided.first);
75 rem = std::move(divided.second);
79 if (rem.
is_zero()) {
return result; }
81 std::vector<std::pair<Polynomial<Rational>,
int>> factors;
83 result.
remainder = *SymbolicExpr::divide(poly_to_symbolic(rem), poly_to_symbolic(Q));
87 std::vector<Polynomial<Rational>> numerators;
92 if (!coefficients.value()) {
93 result.
remainder = *SymbolicExpr::divide(poly_to_symbolic(rem), poly_to_symbolic(Q));
100Result<std::optional<detail::IntegralParts>> Integrator::try_rational_decomposition(
101 const SymbolicExpr& expr,
const std::string& var,
102 ComputationContext& computation,
int depth)
try {
103 detail::RewriteBudget transform_budget(computation, computation.limits().max_recursion_depth,
104 computation.limits().max_ast_nodes,
"transform");
107 Polynomial<Rational> P, Q;
110 return Result<std::optional<detail::IntegralParts>>::failure(extracted.error());
112 if (!extracted.value()) {
return std::optional<detail::IntegralParts>{}; }
114 if (Q.is_zero() || Q.degree() < 1) {
return std::optional<detail::IntegralParts>{}; }
116 if (Q.degree() == 1 && P.degree() <= 0 &&
117 !P.coeffs.empty() && Q.coeffs.size() > 1 &&
119 auto coefficient = SymbolicExpr::number(P.coeffs[0] / Q.coeffs[1]);
120 auto logarithm = SymbolicExpr::ln(poly_to_symbolic(Q));
122 detail::node(SymbolicExpr::multiply(coefficient, logarithm)), transform_budget));
123 return std::optional<detail::IntegralParts>{{std::move(primitive), zero_}};
129 return std::optional<detail::IntegralParts>{std::move(integrated.value())};
132}
catch (
const std::bad_alloc&) {
135}
catch (
const std::length_error& error) {
138}
catch (
const std::exception& error) {
std::pair< Polynomial, Polynomial > div_mod(const Polynomial &other) const
多项式带余除法
std::string variable_name
变量名
bool is_zero() const
判断是否为零多项式
std::vector< CoeffType > coeffs
系数数组,coeffs[i] 为 x^i 的系数
int degree() const
获取多项式的次数
static Result failure(CasErrc code, std::string message, std::string operation={})
Result< detail::IntegralParts > rd_integrate_proper_fraction(const std::string &var, const Polynomial< Rational > &P, const Polynomial< Rational > &Q, const SymbolicExpr &zero, ComputationContext &computation)
std::shared_ptr< SymbolicExpr > rd_integrate_polynomial(const Polynomial< Rational > ", const std::string &var)
void rd_reduce_reciprocal(Polynomial< Rational > &P, Polynomial< Rational > &Q)
detail::IntegralParts rd_add_fraction_primitives(const std::string &var, const std::vector< std::pair< Polynomial< Rational >, int > > &factors, const std::vector< Polynomial< Rational > > &numerators, detail::IntegralParts result, ComputationContext &context)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
IntegralParts integrate_rational_term(const Polynomial< Rational > &numerator, const Polynomial< Rational > &factor, int power, const std::string &var)
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
bool factor_denominator(const Polynomial< Rational > &denominator, std::vector< std::pair< Polynomial< Rational >, int > > &factors)
Result< bool > extract_rational(const SymbolicExpr &expr, const std::string &var, Polynomial< Rational > &numerator, Polynomial< Rational > &denominator)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
Result< bool > solve_coefficients(const Polynomial< Rational > &numerator, const Polynomial< Rational > &denominator, const std::vector< std::pair< Polynomial< Rational >, int > > &factors, std::vector< Polynomial< Rational > > &numerators, ComputationContext &context)
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string & v
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
@ Rational
Rational numbers
std::size_t std::size_t depth