from sage.all import *
-def schur_cone(n):
+def schur_cone(n, lattice=None):
r"""
- Return the Schur cone in ``n`` dimensions.
+ Return the Schur cone in ``n`` dimensions that induces the
+ majorization ordering.
INPUT:
- - ``n`` -- the dimension the ambient space.
+ - ``n`` -- the dimension the ambient space.
+
+ - ``lattice`` -- (default: ``None``) an ambient lattice of rank ``n``
+ to be passed to the :func:`Cone` constructor.
OUTPUT:
- A rational closed convex Schur cone of dimension ``n``.
+ A rational closed convex Schur cone of dimension ``n``. Each
+ generating ray will have the integer ring as its base ring.
+
+ If a ``lattice`` was specified, then the resulting cone will live in
+ that lattice unless its rank is incompatible with the dimension
+ ``n`` (in which case a ``ValueError`` is raised).
REFERENCES:
sage: n = ZZ.random_element(10)
sage: K = schur_cone(n).dual()
sage: x = K.random_element()
- sage: all( x[i] >= x[i+1] for i in xrange(n-1) )
+ sage: all( x[i] >= x[i+1] for i in range(n-1) )
True
TESTS:
sage: set_random_seed()
sage: def majorized_by(x,y):
....: return (all(sum(x[0:i]) <= sum(y[0:i])
- ....: for i in xrange(x.degree()-1))
+ ....: for i in range(x.degree()-1))
....: and sum(x) == sum(y))
sage: n = ZZ.random_element(10)
sage: V = VectorSpace(QQ, n)
sage: majorized_by(x,y) == ( (y-x) in S )
True
+ If a ``lattice`` was given, it is actually used::
+
+ sage: L = ToricLattice(3, 'M')
+ sage: schur_cone(3, lattice=L)
+ 2-d cone in 3-d lattice M
+
+ Unless the rank of the lattice disagrees with ``n``::
+
+ sage: L = ToricLattice(1, 'M')
+ sage: schur_cone(3, lattice=L)
+ Traceback (most recent call last):
+ ...
+ ValueError: lattice rank=1 and dimension n=3 are incompatible
+
"""
+ if lattice is None:
+ lattice = ToricLattice(n)
+
+ if lattice.rank() != n:
+ raise ValueError('lattice rank=%d and dimension n=%d are incompatible'
+ %
+ (lattice.rank(), n))
def _f(i,j):
if i == j:
# The "max" below catches the trivial case where n == 0.
S = matrix(ZZ, max(0,n-1), n, _f)
- # Likewise, when n == 0, we need to specify the lattice.
- return Cone(S.rows(), ToricLattice(n))
+ return Cone(S.rows(), lattice)