19 std::vector<std::shared_ptr<SymbolicExpr>> symbolic_factors;
20 symbolic_factors.reserve(true_factors.size());
22 for (
const auto& poly_factor : true_factors) {
24 auto sym_factor = poly_to_symbolic(poly_factor);
25 if (!sym_factor)
continue;
30 symbolic_factors.push_back(back_sub);
35 if (symbolic_factors.size() <= 1) {
36 return {pyth_simplified};
43 size_t non_const_count = 0;
44 for (
const auto& f : final_factors) {
45 if (f && !f->is_number()) non_const_count++;
47 if (non_const_count <= 1 && final_factors.size() <= 1) {
48 return {pyth_simplified};
56 const std::shared_ptr<SymbolicExpr>& pyth_simplified,
59 std::vector<std::string> indeterminates;
60 indeterminates.reserve(sub_result.
mappings.size());
61 for (
const auto& m : sub_result.
mappings) {
62 indeterminates.push_back(m.indeterminate);
66 if (!built) {
return FactorsResult::failure(built.error()); }
67 const auto& poly_result = built.value();
68 if (!poly_result.success) {
69 return FactorsResult::success({pyth_simplified});
71 if (poly_result.poly.degree() <= 1) {
72 return FactorsResult::success({pyth_simplified});
77 return FactorsResult::failure(factored.error());
79 const auto& factorization = factored.value();
81 factorization.value.size() <= 1) {
82 return FactorsResult::success({pyth_simplified});
85 factorization.value, sub_result, pyth_simplified,
context);
89 const std::shared_ptr<SymbolicExpr>& expr,
90 const std::string& var,
96 "expression and variable must be nonempty",
"factor_transcendental");
98 auto step =
context.consume_steps(1,
"factor_transcendental");
100 return FactorsResult::failure(step.error());
104 if (!mult_factors.empty()) {
108 if (!exp_factors.empty()) {
113 return FactorsResult::success({pyth_simplified});
118 return FactorsResult::success({pyth_simplified});
121 return FactorsResult::success({pyth_simplified});
125 sub_result, var, pyth_simplified,
context);
127catch (
const std::bad_alloc&) {
128 return Result<std::vector<std::shared_ptr<SymbolicExpr>>>::failure(
130 "factor_transcendental");
131}
catch (
const std::exception& ex) {
137 const std::shared_ptr<SymbolicExpr>& expr,
138 const std::string& var) {
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::shared_ptr< SymbolicExpr > tf_simplify_pythagorean(const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable)
在因式分解前用 sin^2(f) + cos^2(f) = 1 化简表达式。
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
Result< TfPolyBuildResult > tf_build_polynomial_impl(const std::shared_ptr< SymbolicExpr > &expression, const std::vector< std::string > &indeterminates, const std::string &original_variable, ComputationContext &context)
bool tf_is_linear_irreducible(const TransSubstitutionResult &substitution, const std::string &variable)
判断换元后的表达式是否对所有不定元和原始变量均为线性.
std::shared_ptr< SymbolicExpr > tf_back_substitute(const std::shared_ptr< SymbolicExpr > &expression, const std::vector< TransSubstitution > &mappings, ComputationContext &context)
将因子表达式中的不定元变量替换回原始超越子表达式.
std::vector< std::shared_ptr< SymbolicExpr > > tf_detect_multiplicative_structure(const std::shared_ptr< SymbolicExpr > &expression)
检测表达式是否已为独立子表达式的乘积形式.
std::vector< std::shared_ptr< SymbolicExpr > > tf_simplify_factors_impl(const std::vector< std::shared_ptr< SymbolicExpr > > &factors, ComputationContext &context)
bool tf_contains_transcendental(const std::shared_ptr< const SymbolicNode > &node, const std::string &variable)
std::shared_ptr< SymbolicExpr > poly_expr
换元后的多项式表达式
UnivariateFactorResult factor_univariate_bridge_checked(const Polynomial< Rational > &polynomial, ComputationContext &context)
Result< std::vector< std::shared_ptr< SymbolicExpr > > > factor_transcendental(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context)
TransSubstitutionResult detect_trans_substitutions(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var)
为依赖 var 的 Sin、Cos、Exp、Ln、Tan 子表达式构造换元结果。
std::vector< std::shared_ptr< SymbolicExpr > > tf_detect_exponential_separation(const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable, ComputationContext &context)
检测加法表达式中的公共指数因子并执行分离.
std::vector< TransSubstitution > mappings
所有换元映射
static Result< std::vector< std::shared_ptr< SymbolicExpr > > > tf_factor_substitution(const TransSubstitutionResult &sub_result, const std::string &var, const std::shared_ptr< SymbolicExpr > &pyth_simplified, ComputationContext &context)
static std::vector< std::shared_ptr< SymbolicExpr > > tf_restore_factors(const std::vector< Polynomial< Rational > > &true_factors, const TransSubstitutionResult &sub_result, const std::shared_ptr< SymbolicExpr > &pyth_simplified, ComputationContext &context)