LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
multivariate_poly.hpp
浏览该文件的文档.
1
/**
2
* @file multivariate_poly.hpp
3
* @brief 多元多项式类 MultiPoly,稀疏表示,支持任意数量变量上的环运算。
4
*
5
* 以 (Monomial, Rational) 对的有序列表表示多元多项式,单项式按指定的
6
* MonomialOrder 排序。提供加减乘、求值、度数查询、一元转换等完整接口。
7
*/
8
#pragma once
9
10
#include "
lmcas_export.hpp
"
11
#include "
monomial_order.hpp
"
12
#include "
rational.hpp
"
13
#include "
polynomial.hpp
"
14
15
#include <map>
16
#include <string>
17
#include <utility>
18
#include <vector>
19
20
namespace
LMCAS
{
21
22
/**
23
* @brief 稀疏多元多项式。
24
*
25
* 以 (Monomial, Rational) 对的有序列表表示多元多项式。
26
* 单项式按指定的 MonomialOrder 排序。
27
* 支持加减乘、求值、度数查询和一元转换。
28
* 非零操作数必须具有按名称和排列完全相同的变量表,否则加减乘和整除
29
* 抛出 std::invalid_argument;不自动合并变量或重排变量坐标。
30
* 加减乘结果使用左侧单项式序;一侧为零时使用非零侧的变量表和序,
31
* 双方为零时保留左侧表示。不同单项式序不改变同一变量环中的数学值。
32
*/
33
class
LMCAS_API
MultiPoly {
34
public
:
35
/// 项类型:(单项式, 系数)
36
using
Term = std::pair<Monomial, Rational>;
37
38
/// @brief 构造零多项式
39
MultiPoly();
40
41
/**
42
* @brief 从项列表和变量名列表构造多元多项式
43
* @param[in] terms 项列表,每项为 (单项式, 系数) 对
44
* @param[in] vars 变量名列表,确定各分量对应的变量
45
* @param[in] order 单项式序类型,默认分次逆字典序
46
*/
47
MultiPoly(std::vector<Term> terms, std::vector<std::string> vars,
48
MonomialOrderType order = MonomialOrderType::GrevLex);
49
50
/**
51
* @brief 从常数构造多元多项式
52
* @param[in] constant 常数值
53
* @param[in] vars 变量名列表
54
*/
55
explicit
MultiPoly(
const
Rational& constant,
const
std::vector<std::string>& vars);
56
57
/// --- 算术运算 ---
58
59
/** @brief 多项式加法 */
60
MultiPoly operator+(
const
MultiPoly& other)
const
;
61
62
/** @brief 多项式减法 */
63
MultiPoly operator-(
const
MultiPoly& other)
const
;
64
65
/** @brief 多项式乘法 */
66
MultiPoly operator*(
const
MultiPoly& other)
const
;
67
68
/** @brief 一元取负 */
69
MultiPoly operator-()
const
;
70
71
/**
72
* @brief 同一变量表内按系数和单项式判等,不受单项式序影响
73
* @return 两个零多项式始终相等;非零对象的变量表不同时返回 false
74
*/
75
bool
operator==(
const
MultiPoly& other)
const
;
76
77
/** @brief 判不等 */
78
bool
operator!=(
const
MultiPoly& other)
const
;
79
80
/**
81
* @brief 标量乘法
82
* @param[in] scalar 有理数标量
83
* @return 各项系数乘以 scalar 后的多项式
84
*/
85
MultiPoly operator*(
const
Rational& scalar)
const
;
86
87
/**
88
* @brief 精确除法(假设整除)
89
* @param[in] divisor 除数多项式
90
* @return 商多项式
91
* 同一变量表允许不同单项式序;结果使用被除数的序。
92
* 零被除数的商使用除数的变量表和序。
93
* @throw std::runtime_error 除数为零或不整除时抛出
94
* @throw std::invalid_argument 两个非零操作数的变量表或排列不同时抛出
95
*/
96
MultiPoly exact_div(
const
MultiPoly& divisor)
const
;
97
98
/// --- 求值 ---
99
100
/**
101
* @brief 将指定变量代入有理数值,返回降维后的多项式
102
* @param[in] var 待代入的变量名
103
* @param[in] val 代入值
104
* @return 代入后的多项式(变量数减一或不变)
105
*/
106
MultiPoly eval(
const
std::string& var,
const
Rational& val)
const
;
107
108
/**
109
* @brief 将多个变量同时代入有理数值
110
* @param[in] substitution 变量名到值的映射
111
* @return 代入后的多项式
112
*/
113
MultiPoly eval(
const
std::map<std::string, Rational>& substitution)
const
;
114
115
/// --- 度数查询 ---
116
117
/**
118
* @brief 计算多项式的全次数
119
* @return 所有项中单项式全次数的最大值;零多项式返回 -1
120
*/
121
int
total_degree
()
const
;
122
123
/**
124
* @brief 计算关于指定变量的次数
125
* @param[in] var 变量名
126
* @return 该变量在所有项中指数的最大值;零多项式返回 -1
127
*/
128
int
degree(
const
std::string& var)
const
;
129
130
/**
131
* @brief 获取关于指定变量的首项系数
132
*
133
* 将多项式视为 var 的一元多项式,返回最高次项的系数(为辅助变量的多项式)。
134
* @param[in] var 主变量名
135
* @return 首项系数多项式
136
*/
137
MultiPoly leading_coeff(
const
std::string& var)
const
;
138
139
/// --- 转换 ---
140
141
/**
142
* @brief 转换为一元 Polynomial<Rational>
143
*
144
* 仅当多项式实际只含一个变量时有效。
145
* @return 对应的一元多项式
146
* @throw std::invalid_argument 含多个有效变量时抛出
147
*/
148
Polynomial<Rational> to_univariate()
const
;
149
150
/**
151
* @brief 从一元多项式构造多元多项式
152
* @param[in] poly 一元多项式
153
* @param[in] var 对应的变量名
154
* @return 等价的 MultiPoly 表示
155
*/
156
static
MultiPoly from_univariate(
const
Polynomial<Rational>& poly,
157
const
std::string& var);
158
159
/// --- 属性查询 ---
160
161
/** @brief 判断是否为零多项式 */
162
bool
is_zero
()
const
;
163
164
/** @brief 判断是否为常数多项式 */
165
bool
is_constant()
const
;
166
167
/** @brief 判断是否实质为一元多项式(仅一个变量出现非零指数) */
168
bool
is_univariate()
const
;
169
170
/** @brief 判断是否为齐次多项式(所有项全次数相同) */
171
bool
is_homogeneous()
const
;
172
173
/** @brief 获取非零项数 */
174
int
num_terms()
const
;
175
176
/** @brief 获取变量个数 */
177
int
num_vars()
const
;
178
179
/**
180
* @brief 获取变量名列表
181
* @return 变量名列表的常引用
182
*/
183
const
std::vector<std::string>& variables()
const
;
184
185
/**
186
* @brief 获取项列表
187
* @return 有序项列表的常引用
188
*/
189
const
std::vector<Term>& terms()
const
;
190
191
/// --- 工具方法 ---
192
193
/**
194
* @brief 提取数值内容(所有系数的 GCD)
195
* @return 所有系数绝对值的最大公约数(有理数形式)
196
*/
197
Rational
numeric_content()
const
;
198
199
/**
200
* @brief 使多项式本原化(除以数值内容)
201
* @return 本原多项式(数值内容为 1)
202
*/
203
MultiPoly make_primitive()
const
;
204
205
/**
206
* @brief 转换为可读字符串表示
207
* @return 多项式的字符串形式
208
*/
209
std::string to_string()
const
;
210
211
private
:
212
std::vector<Term> terms_;
///< 有序项列表(按 order_ 降序)
213
std::vector<std::string> vars_;
///< 变量名列表
214
MonomialOrderType
order_;
///< 单项式序类型
215
216
void
require_compatible_variables(
const
MultiPoly& other)
const
;
217
218
/**
219
* @internal
220
* @brief 规范化:合并同类项、去零项、按单项式序排序
221
*/
222
void
normalize
();
223
};
224
225
}
// namespace LMCAS
lmcas_export.hpp
LMCAS_API
#define LMCAS_API
定义
lmcas_export.hpp:13
monomial_order.hpp
单项式序:Lex, GrevLex, DegLex, DegRevLex 及相关工具函数。
LMCAS::anonymous_namespace{integrator.cpp}::is_zero
bool is_zero(const SymbolicExpr &expression)
定义
integrator.cpp:6
LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::normalize
ExpressionResult normalize(const Node &value, ComputationContext &context)
定义
complex_quadratic.cpp:41
LMCAS
定义
assumption.hpp:11
LMCAS::Domain::Rational
@ Rational
Rational numbers
定义
assumption.hpp:19
LMCAS::total_degree
int total_degree(const Monomial &m)
计算单项式的全次数
定义
monomial_order.hpp:30
LMCAS::MonomialOrderType
MonomialOrderType
单项式序的类型枚举
定义
monomial_order.hpp:18
polynomial.hpp
一元多项式模板类 Polynomial<T>,支持四则运算,GCD,求导,求值.
rational.hpp
精确有理数 Rational,基于 BigInt 分子/分母表示,自动约分。
include
multivariate_poly.hpp
生成于
, 为 LMCAS使用
1.18.0