From 33e4490969d998fb1aa51a99a518cda2f1a776f5 Mon Sep 17 00:00:00 2001 From: Jonathan Kliem Date: Fri, 13 Mar 2020 16:17:47 +0100 Subject: [PATCH] set up permutahedron with precomputed data --- src/sage/geometry/polyhedron/library.py | 28 +++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/sage/geometry/polyhedron/library.py b/src/sage/geometry/polyhedron/library.py index d6b0d20bac7..896c35fcd29 100644 --- a/src/sage/geometry/polyhedron/library.py +++ b/src/sage/geometry/polyhedron/library.py @@ -2212,11 +2212,35 @@ def permutahedron(self, n, project=False, backend=None): sage: p4 = polytopes.permutahedron(4,backend='normaliz') # optional - pynormaliz sage: TestSuite(p4).run() # optional - pynormaliz + + Check that precomputed data is correct:: + + sage: P = polytopes.permutahedron(5, backend='field') + sage: assert P == Polyhedron(P.vertices()) + sage: assert P == Polyhedron(ieqs=P.inequalities(), eqns=P.equations()) """ - verts = list(itertools.permutations(range(1, n + 1))) + verts = tuple(itertools.permutations(range(1, n + 1))) if project: verts = project_points(*verts) - return Polyhedron(vertices=verts, backend=backend) + return Polyhedron(vertices=verts, backend=backend) + else: + parent = Polyhedra(ZZ, n, backend=backend) + def tri(m): + return (m*(m+1))//2 + + # Each proper `S \subset [n]` corresponds exactly to + # a facet that minimizes the coordinates in `S`. + # The minimal sum for `m` coordinates is `(m*(m+1))/2`. + ieqs = tuple((-tri(sum(x)),) + x + for x in itertools.product([0,1], repeat=n) + if 0 < sum(x) < n) + + # Adding the defining equality. + eqns = ((-tri(n),) + tuple(1 for _ in range(n)),) + + return parent([verts, [], []], [ieqs, eqns], + Vrep_minimal=True, Hrep_minimal=True) + def generalized_permutahedron(self, coxeter_type, point=None, exact=True, regular=False, backend=None): r"""