LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
fglm_dimension.cpp
浏览该文件的文档.
1
#include "
internal/fglm_internal.hpp
"
2
3
namespace
LMCAS::fglm_detail
{
4
namespace
{
5
bool
is_pure_power
(
const
Monomial
& monomial,
size_t
variable
,
size_t
num_vars) {
6
for
(
size_t
index = 0; index < num_vars; ++index) {
7
int
exponent
= index < monomial.size() ? monomial[index] : 0;
8
if
(index ==
variable
) {
9
if
(
exponent
== 0)
return
false
;
10
}
else
if
(
exponent
!= 0) {
11
return
false
;
12
}
13
}
14
return
true
;
15
}
16
}
17
18
bool
is_standard
(
const
Monomial
& monomial,
const
std::vector<Monomial>& leading) {
19
for
(
const
auto
& divisor : leading) {
20
if
(
divides_monomial
(divisor, monomial))
return
false
;
21
}
22
return
true
;
23
}
24
25
bool
has_pure_generators
(
const
std::vector<Monomial>& leading,
size_t
num_vars) {
26
for
(
size_t
variable
= 0;
variable
< num_vars; ++
variable
) {
27
bool
found =
false
;
28
for
(
const
auto
& monomial : leading) {
29
if
(is_pure_power(monomial,
variable
, num_vars)) {
30
found =
true
;
31
break
;
32
}
33
}
34
if
(!found)
return
false
;
35
}
36
return
true
;
37
}
38
39
std::vector<Monomial>
leading_monomials
(
const
std::vector<FGLMPoly>&
basis
) {
40
std::vector<Monomial> leading;
41
for
(
const
auto
& polynomial :
basis
) {
42
if
(!polynomial.is_zero()) leading.push_back(polynomial.lead_monomial());
43
}
44
return
leading;
45
}
46
47
void
generate_degree
(
Monomial
& current,
size_t
variable
,
int
remaining,
48
std::vector<Monomial>& monomials) {
49
if
(
variable
== current.size() - 1) {
50
current[
variable
] = remaining;
51
monomials.push_back(current);
52
current[
variable
] = 0;
53
return
;
54
}
55
for
(
int
exponent
= 0;
exponent
<= remaining; ++
exponent
) {
56
current[
variable
] =
exponent
;
57
generate_degree
(current,
variable
+ 1, remaining -
exponent
, monomials);
58
}
59
current[
variable
] = 0;
60
}
61
}
62
63
namespace
LMCAS
{
64
bool
is_zero_dimensional
(
const
std::vector<FGLMPoly>&
basis
,
size_t
num_vars) {
65
if
(
basis
.empty())
return
false
;
66
for
(
size_t
variable
= 0;
variable
< num_vars; ++
variable
) {
67
bool
found =
false
;
68
for
(
const
auto
& polynomial :
basis
) {
69
if
(polynomial.is_zero())
continue
;
70
if
(fglm_detail::is_pure_power(polynomial.terms.front().first,
71
variable
, num_vars)) {
72
found =
true
;
73
break
;
74
}
75
}
76
if
(!found)
return
false
;
77
}
78
return
true
;
79
}
80
81
int
quotient_dimension
(
const
std::vector<FGLMPoly>&
basis
,
size_t
num_vars,
82
int
max_degree) {
83
if
(
basis
.empty())
return
-1;
84
auto
leading =
fglm_detail::leading_monomials
(
basis
);
85
int
count = 0;
86
const
int
limit = 1000;
87
for
(
int
degree = 0; degree <= max_degree && count <= limit; ++degree) {
88
std::vector<Monomial> monomials;
89
Monomial
current(num_vars, 0);
90
fglm_detail::generate_degree
(current, 0, degree, monomials);
91
bool
any_standard =
false
;
92
for
(
const
auto
& monomial : monomials) {
93
if
(!
fglm_detail::is_standard
(monomial, leading))
continue
;
94
any_standard =
true
;
95
if
(++count > limit)
return
count;
96
}
97
if
(!monomials.empty() && !any_standard && degree > 0)
break
;
98
}
99
return
count;
100
}
101
}
fglm_internal.hpp
LMCAS::fglm_detail::anonymous_namespace{fglm_dimension.cpp}::is_pure_power
bool is_pure_power(const Monomial &monomial, size_t variable, size_t num_vars)
定义
fglm_dimension.cpp:5
LMCAS::fglm_detail
定义
fglm_dimension.cpp:3
LMCAS::fglm_detail::generate_degree
void generate_degree(Monomial ¤t, size_t variable, int remaining, std::vector< Monomial > &monomials)
定义
fglm_dimension.cpp:47
LMCAS::fglm_detail::leading_monomials
std::vector< Monomial > leading_monomials(const std::vector< FGLMPoly > &basis)
定义
fglm_dimension.cpp:39
LMCAS::fglm_detail::is_standard
bool is_standard(const Monomial &monomial, const std::vector< Monomial > &leading)
定义
fglm_dimension.cpp:18
LMCAS::fglm_detail::has_pure_generators
bool has_pure_generators(const std::vector< Monomial > &leading, size_t num_vars)
定义
fglm_dimension.cpp:25
LMCAS
定义
assumption.hpp:11
LMCAS::variable
const std::string & variable
定义
expr.hpp:286
LMCAS::Monomial
std::vector< int > Monomial
单项式类型,以整数向量表示各变量的指数
定义
monomial_order.hpp:15
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::exponent
const ExprPtr & exponent
定义
expr.hpp:215
LMCAS::divides_monomial
bool divides_monomial(const Monomial &divisor, const Monomial &target)
判断 divisor 是否整除 target
定义
monomial_order.hpp:55
LMCAS::basis
const std::vector< FGLMPoly > & basis
定义
fglm.hpp:102
src
fglm_dimension.cpp
生成于
, 为 LMCAS使用
1.18.0