LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
transcendental_factor.cpp
浏览该文件的文档.
3#include "poly_utils.hpp"
6
7#include <exception>
8#include <new>
9#include <string>
10#include <vector>
11
12namespace LMCAS {
13
14static std::vector<std::shared_ptr<SymbolicExpr>> tf_restore_factors(
15 const std::vector<Polynomial<Rational>>& true_factors,
16 const TransSubstitutionResult& sub_result,
17 const std::shared_ptr<SymbolicExpr>& pyth_simplified, ComputationContext& context) {
18 /// --- Phase 6: 逆换元 ---
19 std::vector<std::shared_ptr<SymbolicExpr>> symbolic_factors;
20 symbolic_factors.reserve(true_factors.size());
21
22 for (const auto& poly_factor : true_factors) {
23 /// 将多项式因子转回符号表达式
24 auto sym_factor = poly_to_symbolic(poly_factor);
25 if (!sym_factor) continue;
26
27 /// 逆换元:将不定元替换回原始超越表达式
28 auto back_sub = tf_back_substitute(sym_factor, sub_result.mappings, context);
29 if (back_sub) {
30 symbolic_factors.push_back(back_sub);
31 }
32 }
33
34 /// 若逆换元后因子数 <= 1,分解无效
35 if (symbolic_factors.size() <= 1) {
36 return {pyth_simplified};
37 }
38
39 /// --- Phase 6.2: 化简与常数提取 ---
40 auto final_factors = tf_simplify_factors_impl(symbolic_factors, context);
41
42 /// 若化简后仅剩一个非常数因子,分解无效
43 size_t non_const_count = 0;
44 for (const auto& f : final_factors) {
45 if (f && !f->is_number()) non_const_count++;
46 }
47 if (non_const_count <= 1 && final_factors.size() <= 1) {
48 return {pyth_simplified};
49 }
50
51 return final_factors;
52}
53
55 const TransSubstitutionResult& sub_result, const std::string& var,
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);
63 }
64 auto built = tf_build_polynomial_impl(
65 sub_result.poly_expr, indeterminates, var, context);
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});
70 }
71 if (poly_result.poly.degree() <= 1) {
72 return FactorsResult::success({pyth_simplified});
73 }
74 auto factored =
76 if (!factored) {
77 return FactorsResult::failure(factored.error());
78 }
79 const auto& factorization = factored.value();
80 if (factorization.completeness != Completeness::Complete ||
81 factorization.value.size() <= 1) {
82 return FactorsResult::success({pyth_simplified});
83 }
84 return tf_restore_factors(
85 factorization.value, sub_result, pyth_simplified, context);
86}
87
89 const std::shared_ptr<SymbolicExpr>& expr,
90 const std::string& var,
92
94 if (!expr || !LMCAS::detail::node(expr) || var.empty()) {
95 return FactorsResult::failure(CasErrc::InvalidArgument,
96 "expression and variable must be nonempty", "factor_transcendental");
97 }
98 auto step = context.consume_steps(1, "factor_transcendental");
99 if (!step) {
100 return FactorsResult::failure(step.error());
101 }
102 auto pyth_simplified = tf_simplify_pythagorean(expr, var);
103 auto mult_factors = tf_detect_multiplicative_structure(pyth_simplified);
104 if (!mult_factors.empty()) {
105 return mult_factors;
106 }
107 auto exp_factors = tf_detect_exponential_separation(pyth_simplified, var, context);
108 if (!exp_factors.empty()) {
109 return exp_factors;
110 }
111
112 if (!tf_contains_transcendental(LMCAS::detail::node(pyth_simplified), var)) {
113 return FactorsResult::success({pyth_simplified});
114 }
115
116 TransSubstitutionResult sub_result = detect_trans_substitutions(pyth_simplified, var);
117 if (sub_result.mappings.empty()) {
118 return FactorsResult::success({pyth_simplified});
119 }
120 if (tf_is_linear_irreducible(sub_result, var)) {
121 return FactorsResult::success({pyth_simplified});
122 }
123
125 sub_result, var, pyth_simplified, context);
126}
127catch (const std::bad_alloc&) {
128 return Result<std::vector<std::shared_ptr<SymbolicExpr>>>::failure(
129 CasErrc::ResourceLimit, "allocation failed while factoring expression",
130 "factor_transcendental");
131} catch (const std::exception& ex) {
133 CasErrc::InternalInvariant, ex.what(), "factor_transcendental");
134}
135
137 const std::shared_ptr<SymbolicExpr>& expr,
138 const std::string& var) {
140 return factor_transcendental(expr, var, context);
141}
142
143}
一元多项式模板类
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)
多项式转换与精确符号多项式代数。
内部 AST 定义。
混合超越方程不可约因式分解器公共 API.