LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
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
16
namespace
LMCAS
{
17
18
/** @brief FGLM 算法中使用的多项式表示,以 (单项式, 系数) 对列表存储 */
19
struct
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
*/
101
LMCAS_API
FGLMPoly
normal_form
(
const
FGLMPoly& f,
102
const
std::vector<FGLMPoly>&
basis
,
103
const
MonomialOrder
&
order
);
104
105
/**
106
* @brief 判断理想是否为零维(每个变量都有纯幂次首项)
107
* @param basis Gröbner 基
108
* @param num_vars 变量个数
109
* @return 零维返回 true
110
*/
111
LMCAS_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
*/
120
LMCAS_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
*/
136
LMCAS_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
*/
147
LMCAS_API
std::vector<FGLMPoly>
grevlex_to_lex
(
148
const
std::vector<FGLMPoly>& grevlex_basis,
size_t
num_vars);
149
150
}
LMCAS::MonomialOrder
单项式序比较器,支持 Lex、GrevLex、DegLex、DegRevLex
定义
monomial_order.hpp:67
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::groebner_detail::reduce
Poly reduce(Poly polynomial, const std::vector< Poly > &basis)
定义
solver_groebner_poly.cpp:109
LMCAS
定义
assumption.hpp:11
LMCAS::Monomial
std::vector< int > Monomial
单项式类型,以整数向量表示各变量的指数
定义
monomial_order.hpp:15
LMCAS::order
const std::vector< FGLMPoly > const MonomialOrder & order
定义
fglm.hpp:103
LMCAS::Domain::Rational
@ Rational
Rational numbers
定义
assumption.hpp:19
LMCAS::c
const VectorField const VectorField & c
定义
vector_calculus_vectors.hpp:60
LMCAS::fglm_convert
std::vector< FGLMPoly > fglm_convert(const std::vector< FGLMPoly > &source_basis, const MonomialOrder &source_order, const MonomialOrder &target_order, size_t num_vars)
定义
fglm.cpp:88
LMCAS::is_zero_dimensional
bool is_zero_dimensional(const std::vector< FGLMPoly > &basis, size_t num_vars)
定义
fglm_dimension.cpp:64
LMCAS::quotient_dimension
int quotient_dimension(const std::vector< FGLMPoly > &basis, size_t num_vars, int max_degree)
定义
fglm_dimension.cpp:81
LMCAS::grevlex_to_lex
std::vector< FGLMPoly > grevlex_to_lex(const std::vector< FGLMPoly > &grevlex_basis, size_t num_vars)
定义
fglm.cpp:133
LMCAS::basis
const std::vector< FGLMPoly > & basis
定义
fglm.hpp:102
LMCAS::normal_form
FGLMPoly normal_form(const FGLMPoly &f, const std::vector< FGLMPoly > &basis, const MonomialOrder &order)
定义
fglm_polynomial.cpp:127
rational.hpp
精确有理数 Rational,基于 BigInt 分子/分母表示,自动约分。
include
fglm.hpp
生成于
, 为 LMCAS使用
1.18.0