LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::anonymous_namespace{integration_rational_coefficients.cpp} 命名空间参考

类型定义

using RationalFactors = std::vector<std::pair<Polynomial<Rational>, int>>

函数

bool rd_factor_complements (const Polynomial< Rational > &Q, const Polynomial< Rational > &fpoly, int mult, std::vector< Polynomial< Rational > > &q_over_fpow_l)
bool rd_fill_coefficient_matrix (const Polynomial< Rational > &Q, const RationalFactors &factors, const std::vector< size_t > &unknown_offset_per_term, std::vector< std::vector< Rational > > &M)
void rd_fill_factor_columns (const Polynomial< Rational > &fpoly, int mult, const std::vector< Polynomial< Rational > > &q_over_fpow_l, size_t col_off, std::vector< std::vector< Rational > > &M)
bool rd_unknown_offsets (const RationalFactors &factors, std::vector< size_t > &unknown_offset_per_term, size_t &num_unknowns)
void rd_unpack_numerators (const RationalFactors &factors, const std::vector< size_t > &unknown_offset_per_term, const std::vector< Rational > &sol, const std::string &var, std::vector< Polynomial< Rational > > &numerators_out)

类型定义说明

◆ RationalFactors

using LMCAS::anonymous_namespace{integration_rational_coefficients.cpp}::RationalFactors = std::vector<std::pair<Polynomial<Rational>, int>>

在文件 integration_rational_coefficients.cpp 第 7 行定义.

函数说明

◆ rd_factor_complements()

bool LMCAS::anonymous_namespace{integration_rational_coefficients.cpp}::rd_factor_complements ( const Polynomial< Rational > & Q,
const Polynomial< Rational > & fpoly,
int mult,
std::vector< Polynomial< Rational > > & q_over_fpow_l )

在文件 integration_rational_coefficients.cpp 第 25 行定义.

27 {
28 const auto& var = Q.variable_name;
29 Polynomial<Rational> remaining = Q;
30 for (int t = 0; t < mult; ++t) {
31 auto qr = remaining.div_mod(fpoly);
32 if (!qr.second.is_zero()) {
33 return false;
34 }
35 remaining = qr.first;
36 }
37 Polynomial<Rational> cur({Rational(1)}, var);
38 for (int l = mult; l >= 1; --l) {
39 Polynomial<Rational> factor_poly = remaining * cur;
40 q_over_fpow_l[l] = factor_poly;
41 cur = cur * fpoly;
42 }
43 return true;
44}
一元多项式模板类
std::pair< Polynomial, Polynomial > div_mod(const Polynomial &other) const
多项式带余除法
std::string variable_name
变量名
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & t

引用了 LMCAS::Polynomial< CoeffType >::div_mod(), rd_factor_complements(), LMCAS::t , 以及 LMCAS::Polynomial< CoeffType >::variable_name.

被这些函数引用 rd_factor_complements() , 以及 rd_fill_coefficient_matrix().

函数调用图:
这是这个函数的调用关系图:

◆ rd_fill_coefficient_matrix()

bool LMCAS::anonymous_namespace{integration_rational_coefficients.cpp}::rd_fill_coefficient_matrix ( const Polynomial< Rational > & Q,
const RationalFactors & factors,
const std::vector< size_t > & unknown_offset_per_term,
std::vector< std::vector< Rational > > & M )

在文件 integration_rational_coefficients.cpp 第 82 行定义.

84 {
85 for (size_t i = 0; i < factors.size(); ++i) {
86 const auto& [fpoly, mult] = factors[i];
87 std::vector<Polynomial<Rational>> complements(mult + 1, Polynomial<Rational>(Q.variable_name));
88 if (!rd_factor_complements(Q, fpoly, mult, complements)) { return false; }
89 rd_fill_factor_columns(fpoly, mult, complements, unknown_offset_per_term[i], M);
90 }
91 return true;
92}
void rd_fill_factor_columns(const Polynomial< Rational > &fpoly, int mult, const std::vector< Polynomial< Rational > > &q_over_fpow_l, size_t col_off, std::vector< std::vector< Rational > > &M)
bool rd_factor_complements(const Polynomial< Rational > &Q, const Polynomial< Rational > &fpoly, int mult, std::vector< Polynomial< Rational > > &q_over_fpow_l)

引用了 rd_factor_complements(), rd_fill_coefficient_matrix(), rd_fill_factor_columns() , 以及 LMCAS::Polynomial< CoeffType >::variable_name.

被这些函数引用 rd_fill_coefficient_matrix().

函数调用图:
这是这个函数的调用关系图:

◆ rd_fill_factor_columns()

void LMCAS::anonymous_namespace{integration_rational_coefficients.cpp}::rd_fill_factor_columns ( const Polynomial< Rational > & fpoly,
int mult,
const std::vector< Polynomial< Rational > > & q_over_fpow_l,
size_t col_off,
std::vector< std::vector< Rational > > & M )

在文件 integration_rational_coefficients.cpp 第 46 行定义.

48 {
49 const size_t rows = M.size();
50 if (fpoly.degree() == 1) {
51 for (int l = 1; l <= mult; ++l) {
52 const auto& qpl = q_over_fpow_l[l];
53 size_t this_col = col_off + static_cast<size_t>(l - 1);
54 for (size_t k = 0; k < rows; ++k) {
55 Rational c = (k < qpl.coeffs.size()) ? qpl.coeffs[k] : Rational(0);
56 M[k][this_col] = c;
57 }
58 }
59 } else if (fpoly.degree() == 2) {
60 for (int l = 1; l <= mult; ++l) {
61 const auto& qpl = q_over_fpow_l[l];
62 size_t base_col = col_off + static_cast<size_t>(2 * (l - 1));
63 size_t b_col = base_col;
64 size_t c_col = base_col + 1;
65 for (size_t k = 0; k < rows; ++k) {
66 Rational c = (k < qpl.coeffs.size()) ? qpl.coeffs[k] : Rational(0);
67 M[k][c_col] = c;
68 }
69 for (size_t k = 0; k < rows; ++k) {
70 if (k == 0) {
71 M[k][b_col] = Rational(0);
72 } else {
73 size_t src = k - 1;
74 Rational c = (src < qpl.coeffs.size()) ? qpl.coeffs[src] : Rational(0);
75 M[k][b_col] = c;
76 }
77 }
78 }
79 }
80}
int degree() const
获取多项式的次数
@ Rational
Rational numbers
const VectorField const VectorField & c

引用了 LMCAS::c, LMCAS::Polynomial< CoeffType >::degree() , 以及 rd_fill_factor_columns().

被这些函数引用 rd_fill_coefficient_matrix() , 以及 rd_fill_factor_columns().

函数调用图:
这是这个函数的调用关系图:

◆ rd_unknown_offsets()

bool LMCAS::anonymous_namespace{integration_rational_coefficients.cpp}::rd_unknown_offsets ( const RationalFactors & factors,
std::vector< size_t > & unknown_offset_per_term,
size_t & num_unknowns )

在文件 integration_rational_coefficients.cpp 第 9 行定义.

10 {
11 for (size_t i = 0; i < factors.size(); ++i) {
12 unknown_offset_per_term.push_back(num_unknowns);
13 const auto& [fpoly, mult] = factors[i];
14 if (fpoly.degree() == 1) {
15 num_unknowns += static_cast<size_t>(mult);
16 } else if (fpoly.degree() == 2) {
17 num_unknowns += static_cast<size_t>(2 * mult);
18 } else {
19 return false;
20 }
21 }
22 return num_unknowns != 0;
23}

引用了 rd_unknown_offsets().

被这些函数引用 rd_unknown_offsets().

函数调用图:
这是这个函数的调用关系图:

◆ rd_unpack_numerators()

void LMCAS::anonymous_namespace{integration_rational_coefficients.cpp}::rd_unpack_numerators ( const RationalFactors & factors,
const std::vector< size_t > & unknown_offset_per_term,
const std::vector< Rational > & sol,
const std::string & var,
std::vector< Polynomial< Rational > > & numerators_out )

二次因子。

在文件 integration_rational_coefficients.cpp 第 94 行定义.

96 {
97 for (size_t i = 0; i < factors.size(); ++i) {
98 const auto& [fpoly, mult] = factors[i];
99 size_t col_off = unknown_offset_per_term[i];
100 if (fpoly.degree() == 1) {
101 for (int l = 1; l <= mult; ++l) {
102 Rational A = sol[col_off + static_cast<size_t>(l - 1)];
103 numerators_out.push_back(Polynomial<Rational>({A}, var));
104 }
105 } else { /** @brief 二次因子。 */
106 for (int l = 1; l <= mult; ++l) {
107 size_t base_col = col_off + static_cast<size_t>(2 * (l - 1));
108 Rational B = sol[base_col];
109 Rational C = sol[base_col + 1];
110 numerators_out.push_back(
111 Polynomial<Rational>({C, B}, var));
112 }
113 }
114 }
115}

引用了 rd_unpack_numerators().

被这些函数引用 rd_unpack_numerators().

函数调用图:
这是这个函数的调用关系图: