LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
fglm.hpp
浏览该文件的文档.
1/**
2 * @file fglm.hpp
3 * @brief FGLM 算法:零维理想 Gröbner 基在不同单项式序之间的转换.
4 *
5 * @see J.-C. Faugère, P. Gianni, D. Lazard, and T. Mora,
6 * "Efficient Computation of Zero-dimensional Gröbner Bases by Change of Ordering,"
7 * Journal of Symbolic Computation 16(4), 1993.
8 */
9#pragma once
10
11#include "lmcas_export.hpp"
12#include "monomial_order.hpp"
13#include "rational.hpp"
14#include <vector>
15
16namespace LMCAS {
17
18/** @brief FGLM 算法中使用的多项式表示,以 (单项式, 系数) 对列表存储 */
19struct LMCAS_API FGLMPoly {
20 std::vector<std::pair<Monomial, Rational>> terms; ///< 项列表
21 size_t num_vars; ///< 变量个数
22
23 /** @brief 默认构造 */
24 FGLMPoly() : num_vars(0) {}
25
26 /**
27 * @brief 构造指定变量数的零多项式
28 * @param n 变量个数
29 */
30 explicit FGLMPoly(size_t n) : num_vars(n) {}
31
32 /** @brief 判断是否为零多项式 */
33 bool is_zero() const { return terms.empty(); }
34
35 /** @brief 获取首项单项式 */
36 Monomial lead_monomial() const {
37 if (terms.empty()) return Monomial();
38 return terms.front().first;
39 }
40
41 /** @brief 获取首项系数 */
42 Rational lead_coeff() const {
43 if (terms.empty()) return Rational(0);
44 return terms.front().second;
45 }
46
47 /**
48 * @brief 添加一项
49 * @param m 单项式
50 * @param c 系数(零系数不添加)
51 */
52 void add_term(const Monomial& m, const Rational& c) {
53 if (!c.is_zero()) {
54 terms.emplace_back(m, c);
55 }
56 }
57
58 /**
59 * @brief 按指定单项式序排序各项
60 * @param order 单项式序
61 */
62 void sort_terms(const MonomialOrder& order);
63
64 /** @brief 合并同类项并去除零项 */
65 void normalize();
66
67 /**
68 * @brief 对给定基进行多项式约化
69 * @param basis Gröbner 基
70 * @param order 单项式序
71 * @return 约化后的余式
72 */
73 FGLMPoly reduce(const std::vector<FGLMPoly>& basis,
74 const MonomialOrder& order) const;
75
76 /**
77 * @brief 从单项式构造多项式(系数为 1)
78 * @param m 单项式
79 * @param num_vars 变量个数
80 * @return 仅含一项的多项式
81 */
82 static FGLMPoly from_monomial(const Monomial& m, size_t num_vars);
83
84 /**
85 * @brief 构造零多项式
86 * @param num_vars 变量个数
87 * @return 零多项式
88 */
89 static FGLMPoly zero(size_t num_vars) {
90 return FGLMPoly(num_vars);
91 }
92};
93
94/**
95 * @brief 计算多项式关于基的标准形(余式)
96 * @param f 待约化多项式
97 * @param basis Gröbner 基
98 * @param order 单项式序
99 * @return 标准形
100 */
101LMCAS_API FGLMPoly normal_form(const FGLMPoly& f,
102 const std::vector<FGLMPoly>& basis,
104
105/**
106 * @brief 判断理想是否为零维(每个变量都有纯幂次首项)
107 * @param basis Gröbner 基
108 * @param num_vars 变量个数
109 * @return 零维返回 true
110 */
111LMCAS_API bool is_zero_dimensional(const std::vector<FGLMPoly>& basis, size_t num_vars);
112
113/**
114 * @brief 计算商空间维数(标准单项式个数)
115 * @param basis Gröbner 基
116 * @param num_vars 变量个数
117 * @param max_degree 搜索的最大次数上限
118 * @return 商空间维数;-1 表示当前搜索界内维数保持未知
119 */
120LMCAS_API int quotient_dimension(const std::vector<FGLMPoly>& basis,
121 size_t num_vars, int max_degree = 50);
122
123
124/**
125 * @brief FGLM 算法:将零维理想的 Gröbner 基从源序转换到目标序
126 * @param source_basis 源序下的 Gröbner 基
127 * @param source_order 源单项式序
128 * @param target_order 目标单项式序
129 * @param num_vars 变量个数
130 * @return 目标序下的 Gröbner 基
131 * @throw std::runtime_error 理想非零维或维数过大时抛出
132 * @see J.-C. Faugère, P. Gianni, D. Lazard, and T. Mora,
133 * "Efficient Computation of Zero-dimensional Gröbner Bases by Change of Ordering,"
134 * Journal of Symbolic Computation 16(4), 1993.
135 */
136LMCAS_API std::vector<FGLMPoly> fglm_convert(
137 const std::vector<FGLMPoly>& source_basis,
138 const MonomialOrder& source_order,
139 const MonomialOrder& target_order, size_t num_vars);
140
141/**
142 * @brief 将 GrevLex 序下的 Gröbner 基转换为 Lex 序
143 * @param grevlex_basis GrevLex 序下的 Gröbner 基
144 * @param num_vars 变量个数
145 * @return Lex 序下的 Gröbner 基
146 */
147LMCAS_API std::vector<FGLMPoly> grevlex_to_lex(
148 const std::vector<FGLMPoly>& grevlex_basis, size_t num_vars);
149
150}
单项式序比较器,支持 Lex、GrevLex、DegLex、DegRevLex
#define LMCAS_API
单项式序:Lex, GrevLex, DegLex, DegRevLex 及相关工具函数。
bool is_zero(const SymbolicExpr &expression)
ExpressionResult normalize(const Node &value, ComputationContext &context)
Poly reduce(Poly polynomial, const std::vector< Poly > &basis)
std::vector< int > Monomial
单项式类型,以整数向量表示各变量的指数
const std::vector< FGLMPoly > const MonomialOrder & order
@ Rational
Rational numbers
const VectorField const VectorField & c
std::vector< FGLMPoly > fglm_convert(const std::vector< FGLMPoly > &source_basis, const MonomialOrder &source_order, const MonomialOrder &target_order, size_t num_vars)
bool is_zero_dimensional(const std::vector< FGLMPoly > &basis, size_t num_vars)
int quotient_dimension(const std::vector< FGLMPoly > &basis, size_t num_vars, int max_degree)
std::vector< FGLMPoly > grevlex_to_lex(const std::vector< FGLMPoly > &grevlex_basis, size_t num_vars)
const std::vector< FGLMPoly > & basis
FGLMPoly normal_form(const FGLMPoly &f, const std::vector< FGLMPoly > &basis, const MonomialOrder &order)
精确有理数 Rational,基于 BigInt 分子/分母表示,自动约分。