DGtal 1.4.2
Loading...
Searching...
No Matches
EhrhartPolynomial.h
1
17#pragma once
18
31#if defined(EhrhartPolynomial_RECURSES)
32#error Recursive header files inclusion detected in EhrhartPolynomial.h
33#else // defined(EhrhartPolynomial_RECURSES)
35#define EhrhartPolynomial_RECURSES
36
37#if !defined EhrhartPolynomial_h
39#define EhrhartPolynomial_h
40
42// Inclusions
43#include <iostream>
44#include <vector>
45#include "DGtal/base/Common.h"
46#include "DGtal/kernel/NumberTraits.h"
47#include "DGtal/kernel/CInteger.h"
48#include "DGtal/kernel/CSpace.h"
49#include "DGtal/math/LagrangeInterpolation.h"
50#include "DGtal/geometry/volumes/BoundedLatticePolytope.h"
52
53namespace DGtal
54{
65 template <typename TSpace, typename TInteger>
67 {
70
71 // ----------------------- public types -----------------------------------
72 public:
74 typedef TSpace Space;
75 typedef TInteger Integer;
79 typedef std::size_t Size;
80
81 // ----------------------- Standard services ------------------------------
82 public:
83
87 ~EhrhartPolynomial() = default;
88
93 : myE(), myD( NumberTraits< Integer >::ZERO )
94 {}
95
100 {
101 init( polytope );
102 }
103
108 EhrhartPolynomial( const EhrhartPolynomial & other ) = default;
109
115
121 EhrhartPolynomial & operator=( const EhrhartPolynomial & other ) = default;
122
129
131 inline Polynomial numerator() const
132 {
133 return myE;
134 }
135
137 inline Integer denominator() const
138 {
139 return myD;
140 }
141
145 void init( const LatticePolytope& polytope )
146 {
147 std::vector< Integer > X( Space::dimension + 1 );
148 std::vector< Integer > Y( Space::dimension + 1 );
151 for ( Integer i = 1; i <= Space::dimension; ++i )
152 {
153 LatticePolytope Q = i * polytope;
154 Integer nb = Q.count();
155 X[ i ] = i;
156 Y[ i ] = nb;
157 }
158 // Compute polynomial (degree d)
159 Lagrange L( X );
160 myE = L.polynomial( Y );
161 myD = L.denominator();
162 }
163
164 // @param t the dilation factor for this polytope P
165 // @return the number of lattice points of t * P
167 {
168 return myE( t ) / myD;
169 }
170
171 // @param t the dilation factor for this polytope P
172 // @return 0 if everything is correct.
174 {
175 return myE( t ) % myD;
176 }
177
178 // @param t the dilation factor for this polytope P
179 // @return the number of lattice points interior to t * P
180 // @note Use reciprocity formula (-1)^d E(-t)
182 return myE.degree() % 2 == 0
183 ? ( myE( -t ) / myD )
184 : - ( myE( -t ) / myD );
185 }
186
187 // @param t the dilation factor for this polytope P
188 // @return 0 if everything is correct.
190 return myE.degree() % 2 == 0
191 ? ( myE( -t ) % myD )
192 : - ( myE( -t ) % myD );
193 }
194
195 // ----------------------- Interface --------------------------------------
196 public:
197
202 void selfDisplay( std::ostream & that_stream ) const
203 {
204 that_stream << "[EhrhartPolynomial num=" << numerator()
205 << " den=" << denominator() << " ]" << std::endl;
206 }
207
212 bool OK() const
213 {
215 }
216
217 // ------------------------- Datas ----------------------------------------
218 protected:
219
224
225 };
226
235 template <typename TSpace, typename TInteger>
236 std::ostream&
237 operator<<( std::ostream & that_stream,
238 const EhrhartPolynomial< TSpace, TInteger > & that_object_to_display )
239 {
240 that_object_to_display.selfDisplay( that_stream );
241 return that_stream;
242 }
243
244
245} // namespace DGtal
246
247
249// Includes inline functions/methods if necessary.
250
251// //
253
254#endif // !defined EhrhartPolynomial_h
255
256#undef EhrhartPolynomial_RECURSES
257#endif // else defined(EhrhartPolynomial_RECURSES)
Aim: Represents an nD lattice polytope, i.e. a convex polyhedron bounded with vertices with integer c...
Aim: This class implements the class Ehrhart Polynomial which is related to lattice point enumeration...
Integer countInterior(Integer t) const
EhrhartPolynomial< TSpace, TInteger > Self
void init(const LatticePolytope &polytope)
Lagrange::Polynomial Polynomial
LagrangeInterpolation< Integer > Lagrange
void selfDisplay(std::ostream &that_stream) const
EhrhartPolynomial(const LatticePolytope &polytope)
EhrhartPolynomial(EhrhartPolynomial &&other)=default
Integer myD
The (integral) denominator of the Ehrhart polynomial.
Integer remainder(Integer t) const
Integer denominator() const
The (integral) denominator of the Ehrhart polynomial.
Polynomial myE
The Ehrhart polynomial (integral numerator part)
BOOST_CONCEPT_ASSERT((concepts::CInteger< TInteger >))
EhrhartPolynomial(const EhrhartPolynomial &other)=default
EhrhartPolynomial & operator=(EhrhartPolynomial &&other)=default
EhrhartPolynomial & operator=(const EhrhartPolynomial &other)=default
BoundedLatticePolytope< Space > LatticePolytope
Polynomial numerator() const
Integer count(Integer t) const
Integer remainderInterior(Integer t) const
BOOST_CONCEPT_ASSERT((concepts::CSpace< TSpace >))
Aim: This class implements Lagrange basis functions and Lagrange interpolation.
Aim: Represents a multivariate polynomial, i.e. an element of , where K is some ring or field.
static const Dimension dimension
static constants to store the dimension.
Definition SpaceND.h:132
DGtal is the top-level namespace which contains all DGtal functions and types.
std::ostream & operator<<(std::ostream &out, const ClosedIntegerHalfPlane< TSpace > &object)
Aim: The traits class for all models of Cinteger.
Aim: Concept checking for Integer Numbers. More precisely, this concept is a refinement of both CEucl...
Definition CInteger.h:88
Aim: Defines the concept describing a digital space, ie a cartesian product of integer lines.
Definition CSpace.h:106