LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
fglm_dimension.cpp
浏览该文件的文档.
2
4namespace {
5bool 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
18bool 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
25bool 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
39std::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
47void 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
63namespace LMCAS {
64bool 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
81int quotient_dimension(const std::vector<FGLMPoly>& basis, size_t num_vars,
82 int max_degree) {
83 if (basis.empty()) return -1;
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}
bool is_pure_power(const Monomial &monomial, size_t variable, size_t num_vars)
void generate_degree(Monomial &current, size_t variable, int remaining, std::vector< Monomial > &monomials)
std::vector< Monomial > leading_monomials(const std::vector< FGLMPoly > &basis)
bool is_standard(const Monomial &monomial, const std::vector< Monomial > &leading)
bool has_pure_generators(const std::vector< Monomial > &leading, size_t num_vars)
const std::string & variable
std::vector< int > Monomial
单项式类型,以整数向量表示各变量的指数
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)
const ExprPtr & exponent
bool divides_monomial(const Monomial &divisor, const Monomial &target)
判断 divisor 是否整除 target
const std::vector< FGLMPoly > & basis