11#include <unordered_set>
18 auto exp_num = std::dynamic_pointer_cast<const NumberNode>(power.
exponent());
19 if (!exp_num)
return -1;
22 if (std::holds_alternative<BigInt>(exp_num->value())) {
23 exponent = std::get<BigInt>(exp_num->value());
25 const auto&
r = std::get<Rational>(exp_num->value());
29 if (
exponent.is_negative() ||
exponent > BigInt(std::numeric_limits<int>::max())) {
32 const int e_val =
static_cast<int>(
exponent.try_to_int64().
value());
36 (e_val != 0 && base_deg > std::numeric_limits<int>::max() / e_val))
return -1;
37 return base_deg * e_val;
40int tf_degree_in(
const std::shared_ptr<const SymbolicNode>& node,
const std::string& var) {
45 if (
auto v = std::dynamic_pointer_cast<const VariableNode>(node)) {
46 return (!
v->is_constant() &&
v->name() == var) ? 1 : 0;
49 if (
auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
51 for (
const auto&
op :
add->operands()) {
54 max_deg = std::max(max_deg, d);
59 if (
auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
61 for (
const auto&
op :
mul->operands()) {
64 if (d > std::numeric_limits<int>::max() - total_deg)
return -1;
70 if (
auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
73 if (std::dynamic_pointer_cast<const FunctionNode>(node)) {
89 const std::shared_ptr<SymbolicExpr>& poly_expr,
90 const std::vector<std::string>& all_variables) {
94 for (
const auto& var : all_variables) {
97 if (deg < 0)
return false;
104 const std::shared_ptr<SymbolicExpr>& expression,
105 const std::vector<std::string>& indeterminates,
const std::string& original_var) {
106 std::vector<std::string> variables;
107 for (
const auto&
variable : indeterminates) {
113 variables.push_back(original_var);
119 const std::shared_ptr<SymbolicExpr>& expanded,
120 const std::vector<std::string>& variables,
int& max_degree) {
121 for (
const auto&
variable : variables) {
123 if (degree > max_degree) {
128 for (
const auto&
variable : variables) {
135 const std::vector<std::string>& all_variables) {
137 auto converted = symbolic_to_poly<Rational>(expanded,
main_var);
139 result.
poly = std::move(converted.value());
146 for (
const auto& var : all_variables) {
148 auto trial = symbolic_to_poly<Rational>(expanded, var);
154 result.
poly = std::move(trial.value());
156 for (
const auto& other : all_variables) {
167 const std::shared_ptr<SymbolicExpr>& poly_expr,
168 const std::vector<std::string>& indeterminates,
169 const std::string& original_var) {
175 const std::shared_ptr<SymbolicExpr>& poly_expr,
176 const std::vector<std::string>& indeterminates,
179 context.limits().max_ast_nodes,
180 "tf_build_polynomial");
186 "expression and variable must be nonempty",
"tf_build_polynomial");
193 expanded = poly_expr;
196 if (all_variables.empty()) {
213 if (result.
main_variable.empty() || max_degree < 0)
return result;
218 "allocation failed while constructing polynomial",
"tf_build_polynomial");
221 ex.what(),
"tf_build_polynomial");
const std::shared_ptr< const SymbolicNode > & exponent() const noexcept
const std::shared_ptr< const SymbolicNode > & base() const noexcept
static Result failure(CasErrc code, std::string message, std::string operation={})
SymbolicNodePtr expand_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
const std::string & variable
__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
__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
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)
ExprResult mul(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
const VectorField const VectorField & c
static bool tf_validate_polynomial(const std::shared_ptr< SymbolicExpr > &poly_expr, const std::vector< std::string > &all_variables)
判断换元式是否为候选变量的多项式。 各候选变量的次数须可确定为非负整数,且超越函数不得依赖不定元或原始变量。
bool expression_depends_on_variable(const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
Result< T > extract_coeff_value(const std::shared_ptr< SymbolicExpr > &coefficient)
精确提取系数;不支持的值返回错误,保持数值完整。
static int tf_power_degree(const PowerNode &power, const std::string &var)
static std::vector< std::string > tf_polynomial_variables(const std::shared_ptr< SymbolicExpr > &expression, const std::vector< std::string > &indeterminates, const std::string &original_var)
const ExprPtr RelationOp op
int tf_degree_in(const std::shared_ptr< const SymbolicNode > &node, const std::string &variable)
const std::string const ExprPtr & value
static Result< TfPolyBuildResult > tf_convert_main_variable(TfPolyBuildResult result, const std::shared_ptr< SymbolicExpr > &expanded, const std::vector< std::string > &all_variables)
static void tf_select_main_variable(TfPolyBuildResult &result, const std::shared_ptr< SymbolicExpr > &expanded, const std::vector< std::string > &variables, int &max_degree)
const std::string & main_var
Result< TfPolyBuildResult > tf_build_polynomial(const std::shared_ptr< SymbolicExpr > &poly_expr, const std::vector< std::string > &indeterminates, const std::string &original_var)
分解含 sin、cos、exp、ln 等超越函数的表达式。
std::vector< std::string > param_variables
参数变量列表(非主变量的不定元)
Polynomial< Rational > poly
主变量多项式(单变量或主变量策略)
std::string main_variable
选定的主变量名