LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
multivariate_factor.hpp
浏览该文件的文档.
1/**
2 * @file multivariate_factor.hpp
3 * @brief 多元多项式因式分解器公共 API。
4 *
5 * 采用 Wang-EEZ(Enhanced Extended Zassenhaus)算法,将多元多项式分解为
6 * 不可约因子的乘积。核心流程:预处理(容度/本原/无平方)→ 求值同态降维 →
7 * 一元分解 → 多元 Hensel 提升 → 试除验证。
8 *
9 * @see Wang, P.S. "An Improved Multivariate Polynomial Factoring Algorithm."
10 * Mathematics of Computation, 32(144), 1978.
11 * @see Geddes, Czapor, Labahn. "Algorithms for Computer Algebra." Chapter 15.
12 */
13#pragma once
14
15#include "lmcas_export.hpp"
16#include "multivariate_poly.hpp"
18#include "result.hpp"
19
20#include <optional>
21#include <string>
22#include <tuple>
23#include <vector>
24
25namespace LMCAS {
26
27/**
28 * @brief 多元因式分解结果
29 *
30 * 满足不变量:constant * ∏(factors[i] ^ multiplicities[i]) == 原多项式。
31 * Complete 结果的终端因子已证明不可约;Inconclusive 结果保留精确乘积。
32 */
34 Rational constant; ///< 数值常数因子
35 std::vector<MultiPoly> factors; ///< 精确因子列表(各因子本原)
36 std::vector<int> multiplicities; ///< 各因子的重数
37};
38
40
41/**
42 * @brief 受检精确多元因式分解.
43 *
44 * 每个成功值都精确重构 @p poly.`Complete` 还证明所有终端因子在已实现
45 * 的精确路径下不可约;有界或尚不支持的精确部分结果标记为
46 * `Inconclusive`.资源、取消、分配与内部不变量失败均通过 CasError 返回.
47 */
49 const MultiPoly& poly,
51
53 const MultiPoly& poly);
54
55/// 内部算法组件(供测试使用)
56
57/**
58 * @brief 计算多元容度
59 *
60 * 将多项式视为主变量的一元多项式,计算所有系数多项式(辅助变量的多项式)的 GCD。
61 *
62 * @param[in] poly 输入多元多项式
63 * @param[in] main_var 主变量名
64 * @return 容度多项式(辅助变量的多项式)
65 */
66LMCAS_API MultiPoly multivariate_content(const MultiPoly& poly,
67 const std::string& main_var);
68
69/**
70 * @brief 计算多元本原部分
71 *
72 * 将多项式除以其关于主变量的容度,得到本原部分。
73 * 满足:multivariate_content(poly, var) * multivariate_primitive_part(poly, var) == poly(至多差符号)。
74 *
75 * @param[in] poly 输入多元多项式
76 * @param[in] main_var 主变量名
77 * @return 本原部分多项式
78 */
79LMCAS_API MultiPoly multivariate_primitive_part(const MultiPoly& poly,
80 const std::string& main_var);
81
82/**
83 * @brief 计算多元多项式 GCD
84 *
85 * 采用递归求值-插值算法,避开降次的坏求值点,并对恢复的
86 * 候选多项式执行精确整除验证。
87 *
88 * @param[in] a 第一个多项式
89 * @param[in] b 第二个多项式
90 * @return gcd(a, b)
91 */
92LMCAS_API MultiPoly multivariate_gcd(const MultiPoly& a, const MultiPoly& b);
93
94/**
95 * @brief 无平方因子分解结果
96 *
97 * components[i] 的重数为 i+1。
98 * 满足:f = components[0] * components[1]² * components[2]³ * ...(至多差常数)。
99 */
101 std::vector<MultiPoly> components; ///< 各无平方分量,components[i] 重数为 i+1
102};
103
104/**
105 * @brief 多元无平方因子分解
106 *
107 * 通过计算 gcd(f, ∂f/∂x_main) 检测重因子,将多项式分解为
108 * f = f₁ · f₂² · f₃³ · ... 的形式,其中每个 fᵢ 无平方。
109 *
110 * @param[in] poly 输入多元多项式
111 * @param[in] main_var 主变量名
112 * @return 无平方因子分解结果
113 */
115 const std::string& main_var);
116
117/**
118 * @brief 多元 Hensel 提升(单变量步)
119 *
120 * 将一元因子逐变量提升,从 f(x₁, a₂, ..., aₙ) 的因子恢复到包含 lift_var 的因子。
121 * 每次引入一个辅助变量,计算修正项直到达到次数上界。
122 *
123 * @param[in] poly 原始多元多项式
124 * @param[in] univariate_factors 一元分解得到的因子列表
125 * @param[in] lift_var 当前提升的变量名
126 * @param[in] eval_point 该变量的求值点
127 * @param[in] degree_bound 提升次数上界
128 * @return 提升后的多元因子列表
129 */
130LMCAS_API std::vector<MultiPoly> multivariate_hensel_lift(
131 const MultiPoly& poly,
132 const std::vector<Polynomial<Rational>>& univariate_factors,
133 const std::string& lift_var,
134 const Rational& eval_point,
135 int degree_bound);
136
137/**
138 * @brief 多元丢番图方程求解器
139 *
140 * 求解 s₁·f₁ + s₂·f₂ + ... + sᵣ·fᵣ ≡ target (mod ideal),
141 * 其中 ideal 由 (var - eval_point)^degree_bound 生成。
142 * 用于 Hensel 提升过程中计算修正项。
143 *
144 * @param[in] factors 互素因子列表
145 * @param[in] target 目标多项式
146 * @param[in] var 变量名
147 * @param[in] eval_point 求值点
148 * @param[in] degree_bound 次数上界
149 * @return 解多项式列表 [s₁, s₂, ..., sᵣ]
150 */
151LMCAS_API std::vector<MultiPoly> multivariate_diophantine(
152 const std::vector<MultiPoly>& factors,
153 const MultiPoly& target,
154 const std::string& var,
155 const Rational& eval_point,
156 int degree_bound);
157
158/// 快速路径检测(detail 命名空间)
159
160namespace detail {
161
162/**
163 * @brief 检测是否为线性多项式
164 *
165 * 判断多项式关于主变量的次数是否 ≤ 1,线性多项式直接视为不可约。
166 *
167 * @param[in] poly 输入多项式
168 * @param[in] main_var 主变量名
169 * @return 若关于 main_var 的次数 ≤ 1 则返回 true
170 */
171LMCAS_API bool is_linear(const MultiPoly& poly, const std::string& main_var);
172
173/**
174 * @brief 检测差平方模式 a² - b²
175 *
176 * 若多项式可表示为两个多项式平方之差,返回 (a, b),
177 * 使得 poly = a² - b² = (a+b)(a-b)。
178 *
179 * @param[in] poly 输入多项式
180 * @return 若匹配则返回 (a, b),否则返回 nullopt
181 */
182LMCAS_API std::optional<std::pair<MultiPoly, MultiPoly>>
183detect_difference_of_squares(const MultiPoly& poly);
184
185/**
186 * @brief 检测二项式幂模式 xⁿ - yⁿ
187 *
188 * 若多项式为两个变量的纯幂之差(如 x³ - y³),返回变量名和幂次,
189 * 以便应用分圆多项式分解公式。
190 *
191 * @param[in] poly 输入多项式
192 * @return 若匹配则返回 (变量1, 变量2, 幂次),否则返回 nullopt
193 */
194LMCAS_API std::optional<std::tuple<std::string, std::string, int>>
195detect_binomial_power(const MultiPoly& poly);
196
197/**
198 * @brief 提取公因子单项式
199 *
200 * 计算所有项的 GCD 单项式并提取,返回公因子单项式和剩余多项式。
201 *
202 * @param[in] poly 输入多项式
203 * @return pair(公因子单项式, 提取后的多项式)
204 */
205LMCAS_API std::pair<Monomial, MultiPoly>
206extract_common_monomial(const MultiPoly& poly);
207
208/**
209 * @brief 齐次二元多项式分解
210 *
211 * 对齐次二元多项式,利用 f(x,1) 的一元分解结果推导二元因子。
212 * 仅当多项式恰好含两个变量且为齐次时适用。
213 *
214 * @param[in] poly 输入多项式(须为齐次二元)
215 * @param[in,out] context 调用方的计算预算和取消状态
216 * @return 不适用时成功返回 nullopt;分解错误原样传播
217 */
220 const MultiPoly& poly,
222
223} // namespace detail
224
225} // namespace LMCAS
一元多项式模板类
#define LMCAS_API
多元多项式类 MultiPoly,稀疏表示,支持任意数量变量上的环运算。
多元 Hensel 提升(单变量步)
std::pair< Monomial, MultiPoly > extract_common_monomial(const MultiPoly &poly)
提取公因子单项式
bool is_linear(const MultiPoly &poly, const std::string &main_var)
检测是否为线性多项式(主变量次数 <= 1)
Result< std::optional< MultiFactorResult > > factor_homogeneous_bivariate(const MultiPoly &poly, ComputationContext &context)
齐次二元多项式分解
const std::string & main_var
std::optional< std::tuple< std::string, std::string, int > > detect_binomial_power(const MultiPoly &poly)
检测二项式幂模式 xⁿ - yⁿ
std::size_t std::size_t ComputationContext & context
std::optional< std::pair< MultiPoly, MultiPoly > > detect_difference_of_squares(const MultiPoly &poly)
检测差平方模式 a^2 - b^2
Result< MathResult< MultiFactorResult > > MultiFactorCheckedResult
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
std::vector< MultiPoly > factors
精确因子列表(各因子本原)
std::vector< MultiPoly > components
各无平方分量,components[i] 重数为 i+1
MultiFactorCheckedResult factor_multivariate_checked(const MultiPoly &poly, ComputationContext &context)
const MultiPoly & b
SquareFreeDecomp square_free_decompose(const MultiPoly &poly, const std::string &main_var)
多元无平方因子分解(Yun 算法的多元推广)
std::vector< MultiPoly > multivariate_hensel_lift(const MultiPoly &poly, const std::vector< Polynomial< Rational > > &univariate_factors, const std::string &lift_var, const Rational &eval_point, int degree_bound)
多元 Hensel 提升(单变量步)
MultiPoly multivariate_primitive_part(const MultiPoly &poly, const std::string &main_var)
__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 const std::shared_ptr< SymbolicExpr > & a
const ExprPtr & target
std::vector< MultiPoly > multivariate_diophantine(const std::vector< MultiPoly > &factors, const MultiPoly &target, const std::string &var, const Rational &eval_point, int degree_bound)
多元丢番图方程求解器
MultiPoly multivariate_gcd(const MultiPoly &a, const MultiPoly &b)
Rational constant
数值常数因子
const std::string & main_var
MultiPoly multivariate_content(const MultiPoly &poly, const std::string &main_var)
std::vector< int > multiplicities
各因子的重数
无平方因子分解结果