Ask Your Question
2

Can sage compute the h* vector of a polytope?

asked 9 years ago

done_with_fish gravatar image

updated 9 years ago

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?

Preview: (hide)

Comments

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

tmonteil gravatar imagetmonteil ( 9 years ago )
kcrisman gravatar imagekcrisman ( 9 years ago )

@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!

done_with_fish gravatar imagedone_with_fish ( 9 years ago )

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

kcrisman gravatar imagekcrisman ( 9 years ago )

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

done_with_fish gravatar imagedone_with_fish ( 9 years ago )

2 Answers

Sort by » oldest newest most voted
4

answered 6 years ago

jipilab gravatar image

updated 5 years ago

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]
Preview: (hide)
link
1

answered 9 years ago

kdilks gravatar image

updated 9 years ago

kcrisman gravatar image

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.

Preview: (hide)
link

Comments

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

kcrisman gravatar imagekcrisman ( 9 years ago )

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 9 years ago

Seen: 1,773 times

Last updated: Aug 27 '19