Gröbner basis project
Codebase for research into Gröbner basis computation
hilbert_functions.hpp
1 #ifndef __HILBERT_FUNCTIONS_
2 #define __HILBERT_FUNCTIONS_
3 
4 #include <set>
5 #include <list>
6 #include <cstring>
7 #include <iostream>
8 
9 using std::set; using std::list;
10 
11 #include "system_constants.hpp"
12 
13 #include "fields.hpp"
14 #include "monomial.hpp"
15 #include "polynomial_linked_list.hpp"
16 #include "dense_univariate_integer_poly.hpp"
17 #include "dense_univariate_rational_poly.hpp"
18 
37 void divide_by_common_term(COEF_TYPE &, UCOEF_TYPE &);
38 
44 bool is_zero_base_case(const list<Monomial> &);
45 
55  const list<Monomial> & T, const WT_TYPE * grading
56 );
57 
64 list<Monomial>::const_iterator is_one_base_case(const list<Monomial> &);
65 
76  const list<Monomial> & T, list<Monomial>::const_iterator ti,
77  const WT_TYPE * grading
78 );
79 
87 list<Monomial>::const_iterator is_splitting_case(const list<Monomial> & T);
88 
99  const list<Monomial> & T, list<Monomial>::const_iterator ti,
100  const WT_TYPE * grading
101 );
102 
113 Monomial choose_hilbert_pivot(const list<Monomial> & T);
114 
128  const list<Monomial> & T, const WT_TYPE * grading = nullptr
129 );
130 
141  NVAR_TYPE n,
143  const WT_TYPE * grading = nullptr
144 );
145 
155 unsigned ideal_dimension(
156  NVAR_TYPE nvars,
157  const Dense_Univariate_Integer_Polynomial *first_numerator,
158  const Dense_Univariate_Integer_Polynomial *second_numerator
159 );
160 
169  long long a, long long b
170 );
171 
183  NVAR_TYPE n,
184  unsigned int dim,
185  const list<Monomial> T,
188 );
189 
190 #endif
list< Monomial >::const_iterator is_one_base_case(const list< Monomial > &)
test for the 1-base case
Dense_Univariate_Rational_Polynomial * polynomial_binomial(long long a, long long b)
computes the number of combinations
Dense_Univariate_Rational_Polynomial * hilbert_polynomial(NVAR_TYPE n, unsigned int dim, const list< Monomial > T, Dense_Univariate_Integer_Polynomial *hn=nullptr, Dense_Univariate_Integer_Polynomial *hn2=nullptr)
computes the Hilbert polynomial for an ideal
list< Monomial >::const_iterator is_splitting_case(const list< Monomial > &T)
test for the “splitting case”
Dense_Univariate_Integer_Polynomial * solve_one_base_case(const list< Monomial > &T, list< Monomial >::const_iterator ti, const WT_TYPE *grading)
applies Bigatti’s algorithm for the 1-base case
Dense_Univariate_Integer_Polynomial * hilbert_second_numerator(NVAR_TYPE n, Dense_Univariate_Integer_Polynomial *hn, const WT_TYPE *grading=nullptr)
computes the second Hilbert numerator (after reduction by )
Dense_Univariate_Integer_Polynomial * hilbert_numerator_bigatti(const list< Monomial > &T, const WT_TYPE *grading=nullptr)
the Bigatti algorithm to compute the Hilbert numerator
quick-’n-dirty Dense_Univariate integer polynomial class
Dense_Univariate_Integer_Polynomial * solve_zero_base_case(const list< Monomial > &T, const WT_TYPE *grading)
computes Hilbert numerator when the 0-base case applies
Implementation of monomials.
Definition: monomial.hpp:69
Monomial choose_hilbert_pivot(const list< Monomial > &T)
chooses a pivot for the Bigatti algorithm
quick-’n-dirty Dense_Univariate rational polynomial class
Dense_Univariate_Integer_Polynomial * solve_splitting_case(const list< Monomial > &T, list< Monomial >::const_iterator ti, const WT_TYPE *grading)
applies Bigatti’s algorithm for the 1-base case
unsigned ideal_dimension(NVAR_TYPE nvars, const Dense_Univariate_Integer_Polynomial *first_numerator, const Dense_Univariate_Integer_Polynomial *second_numerator)
computes the dimension of the ideal by subtracting the Hilbert numerators
void divide_by_common_term(COEF_TYPE &, UCOEF_TYPE &)
divides out the common term of the two given numbers
bool is_zero_base_case(const list< Monomial > &)
test for the 0-base case