LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
integration_rational_factorization.cpp
浏览该文件的文档.
1
#include "
internal/integration_rational_support.hpp
"
2
3
namespace
LMCAS
{
4
5
namespace
{
6
bool
rd_factor_quadratic
(
Polynomial<Rational>
& current,
int
mult,
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
31
bool
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
64
bool
detail::factor_denominator
(
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
}
LMCAS::Polynomial
一元多项式模板类
定义
polynomial.hpp:52
LMCAS::Polynomial::div_mod
std::pair< Polynomial, Polynomial > div_mod(const Polynomial &other) const
多项式带余除法
定义
polynomial.hpp:207
LMCAS::Polynomial::variable_name
std::string variable_name
变量名
定义
polynomial.hpp:56
LMCAS::Polynomial::is_zero
bool is_zero() const
判断是否为零多项式
定义
polynomial.hpp:92
LMCAS::Polynomial::degree
int degree() const
获取多项式的次数
定义
polynomial.hpp:100
LMCAS::Polynomial::make_monic
Polynomial make_monic() const
首一化(使首项系数为 1)
定义
polynomial.hpp:324
integration_rational_support.hpp
LMCAS::anonymous_namespace{integration_rational_factorization.cpp}::rd_factor_piece
bool rd_factor_piece(const Polynomial< Rational > &piece, int mult, std::vector< std::pair< Polynomial< Rational >, int > > &factors_out)
定义
integration_rational_factorization.cpp:31
LMCAS::anonymous_namespace{integration_rational_factorization.cpp}::rd_factor_quadratic
bool rd_factor_quadratic(Polynomial< Rational > ¤t, int mult, std::vector< std::pair< Polynomial< Rational >, int > > &factors_out)
定义
integration_rational_factorization.cpp:6
LMCAS::detail::factor_denominator
bool factor_denominator(const Polynomial< Rational > &denominator, std::vector< std::pair< Polynomial< Rational >, int > > &factors)
定义
integration_rational_factorization.cpp:64
LMCAS
定义
assumption.hpp:11
LMCAS::square_free_factorization
std::vector< std::pair< Polynomial< Rational >, int > > square_free_factorization(const Polynomial< Rational > &poly)
定义
rational_square_free.cpp:6
LMCAS::r
__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
定义
symbolic_complex.hpp:209
LMCAS::find_rational_roots
std::vector< Rational > find_rational_roots(const Polynomial< Rational > &poly)
定义
rational_polynomial.cpp:69
LMCAS::roots
ExprSetResult roots(const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)
定义
expr_solving.cpp:80
src
integration_rational_factorization.cpp
生成于
, 为 LMCAS使用
1.18.0