LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
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
20namespace LMCAS {
21
22/**
23 * @brief 稀疏多元多项式。
24 *
25 * 以 (Monomial, Rational) 对的有序列表表示多元多项式。
26 * 单项式按指定的 MonomialOrder 排序。
27 * 支持加减乘、求值、度数查询和一元转换。
28 * 非零操作数必须具有按名称和排列完全相同的变量表,否则加减乘和整除
29 * 抛出 std::invalid_argument;不自动合并变量或重排变量坐标。
30 * 加减乘结果使用左侧单项式序;一侧为零时使用非零侧的变量表和序,
31 * 双方为零时保留左侧表示。不同单项式序不改变同一变量环中的数学值。
32 */
33class LMCAS_API MultiPoly {
34public:
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
211private:
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
#define LMCAS_API
单项式序:Lex, GrevLex, DegLex, DegRevLex 及相关工具函数。
bool is_zero(const SymbolicExpr &expression)
ExpressionResult normalize(const Node &value, ComputationContext &context)
@ Rational
Rational numbers
int total_degree(const Monomial &m)
计算单项式的全次数
MonomialOrderType
单项式序的类型枚举
一元多项式模板类 Polynomial<T>,支持四则运算,GCD,求导,求值.
精确有理数 Rational,基于 BigInt 分子/分母表示,自动约分。