LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
integration_rational_factorization.cpp
浏览该文件的文档.
2
3namespace LMCAS {
4
5namespace {
7 std::vector<std::pair<Polynomial<Rational>, int>>& factors_out) {
8 auto roots = find_rational_roots(current);
9 if (!roots.empty()) {
10 for (const auto& r : roots) {
11 Polynomial<Rational> linear({Rational(0) - r, Rational(1)}, current.variable_name);
12 auto qr = current.div_mod(linear);
13 if (!qr.second.is_zero()) {
14 return false;
15 }
16 factors_out.push_back({linear, mult});
17 current = qr.first;
18 if (current.degree() == 0) { break; }
19 }
20 }
21 if (current.degree() == 2) {
22 factors_out.push_back({current.make_monic(), mult});
23 current = Polynomial<Rational>({Rational(1)}, current.variable_name);
24 } else if (current.degree() == 1) {
25 factors_out.push_back({current.make_monic(), mult});
26 current = Polynomial<Rational>({Rational(1)}, current.variable_name);
27 }
28 return true;
29}
30
31bool rd_factor_piece(const Polynomial<Rational>& piece, int mult,
32 std::vector<std::pair<Polynomial<Rational>, int>>& factors_out) {
33 auto current = piece.make_monic();
34 if (current.degree() == 0) { return true; }
35 if (current.degree() == 1) {
36 factors_out.push_back({current, mult});
37 return true;
38 }
39 if (current.degree() == 2) { return rd_factor_quadratic(current, mult, factors_out); }
40 auto roots = find_rational_roots(current);
41 for (const auto& r : roots) {
42 Polynomial<Rational> linear({Rational(0) - r, Rational(1)}, current.variable_name);
43 auto qr = current.div_mod(linear);
44 if (qr.second.is_zero()) {
45 factors_out.push_back({linear, mult});
46 current = qr.first;
47 if (current.degree() <= 0) { break; }
48 }
49 }
50
51 if (current.degree() <= 0) { return true; }
52 if (current.degree() == 1) {
53 factors_out.push_back({current.make_monic(), mult});
54 return true;
55 }
56 if (current.degree() == 2) {
57 factors_out.push_back({current.make_monic(), mult});
58 return true;
59 }
60 return false;
61}
62}
63
65 const Polynomial<Rational>& Q,
66 std::vector<std::pair<Polynomial<Rational>, int>>& factors_out) {
67 factors_out.clear();
68 if (Q.degree() <= 0) { return false; }
69 auto sqfree = square_free_factorization(Q);
70 if (sqfree.empty()) { return false; }
71
72 /**
73 * @brief 逐次提取各无平方因子的有理根。
74 * 剩余因子次数至多为 2 时匹配成功,否则返回未匹配。
75 */
76 for (const auto& [piece, mult] : sqfree) {
77 if (!rd_factor_piece(piece, mult, factors_out)) { return false; }
78 }
79 return true;
80}
81
82}
一元多项式模板类
std::pair< Polynomial, Polynomial > div_mod(const Polynomial &other) const
多项式带余除法
std::string variable_name
变量名
bool is_zero() const
判断是否为零多项式
int degree() const
获取多项式的次数
Polynomial make_monic() const
首一化(使首项系数为 1)
bool rd_factor_piece(const Polynomial< Rational > &piece, int mult, std::vector< std::pair< Polynomial< Rational >, int > > &factors_out)
bool rd_factor_quadratic(Polynomial< Rational > &current, int mult, std::vector< std::pair< Polynomial< Rational >, int > > &factors_out)
bool factor_denominator(const Polynomial< Rational > &denominator, std::vector< std::pair< Polynomial< Rational >, int > > &factors)
std::vector< std::pair< Polynomial< Rational >, int > > square_free_factorization(const Polynomial< Rational > &poly)
__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
std::vector< Rational > find_rational_roots(const Polynomial< Rational > &poly)
ExprSetResult roots(const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)