# Can sage compute the h* vector of a polytope?

We can define polytopes in sage with the command

sage: p = Polytope(A)

Here p is the convex hull of the integer matrix A.

I'm curious if we can compute the h* vector of p. Is this possible?

Roughly, the h* vector of a convex lattice polytope is constructed as follows.

The Ehrhart series can be expressed as a rational function whose numerator is a polynomial. The h* vector of a polytope is the vector of coefficients of this polynomial.

I'm aware that sage can compute the ehrhart polynomial of a polytope with sage: p.ehrhart_polynomial() but I cant find anything about the h* vector in the documentation.

I know the command in polymake is \$p -> H_STAR_VECTOR, but I'm not sure if this vector can be constructed in sage.

Perhaps a more general question would be: can I pass a polytope defined in sage to polymake and can sage read the results of the polymake operation?

edit retag close merge delete

If you could please give us a pointer to the definition of the h* vector of a polytope ?

( 2016-02-09 08:53:44 -0600 )edit
( 2016-02-09 11:06:34 -0600 )edit

@tmonteil I've included a brief description as well as a link to the wikipedia article where the h* vector is defined. Thanks for looking at this!

( 2016-02-09 12:28:24 -0600 )edit

http://trac.sagemath.org/ticket/14116 is probably relevant here...

( 2016-02-09 16:05:25 -0600 )edit

@kcrisman If I'm reading that link correctly, it sounds like sage once had this capability but no longer does?

( 2016-02-10 12:14:30 -0600 )edit

Sort by » oldest newest most voted

You can use the normaliz backend (requires Normaliz 3.5.4) and its python interface pynormaliz (requires PyNormaliz 1.16).

You can install them by typing:

sage -i normaliz
sage -i pynormaliz

Then, in a terminal with Sage 8.9 or more recent, you can get the h^*-vector by typing:

sage: C = polytopes.hypercube(3, backend="normaliz")
sage: C.ehrhart_series().numerator().coefficients()
[1, 23, 23, 1]

This hypercube is the ±1 cube, so its volume is 8*factorial(3)=48, which is 1+23+23+1.

Eventually, once this ticket is merged, it will be possible to call it directly on the polytope like so:

sage: C.h_star_vector()
[1, 23, 23, 1]
more

Sage doesn't have a direct 'print out the h* vector' command. It's not too difficult to manipulate the Ehrhart polynomial to get it, though I'm not sure my way could be cleanly implemented into Sage proper.

Let's say P is your polytope, of dimension n=P.dimension(), with Ehrhart polynomial p=P.ehrhart_polynomial() . Also, let t=p.parent().gen() . We need a polynomial ring to work over, and this let's us work over the same polynomial ring as p. Now, compute the first n+2 terms of the Ehrhart series (or more, if you want to be safe)

X=0
for i in range(0,n+10):
X+=p(i)*t^i
print(X)

Now, look at X*(1-t)^(n+1) . If X were the entire infinite Ehrhart series, we would get exactly the h* vector. But since we took sufficiently many terms of the Ehrhart series, we'll get lower order terms corresponding to the h* vector, and higher order error terms that can be discarded.

more

Can you add a specific example of this for a slightly nontrivial polytope?

( 2016-02-17 12:13:38 -0600 )edit