Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
r""" Multiple `\ZZ`-Graded Filtrations of a Single Vector Space
See :mod:`filtered_vector_space` for simply graded vector spaces. This module implements the analog but for a collection of filtrations of the same vector space.
The basic syntax to use it is a dictionary whose keys are some arbitrary indexing set and values are :func:`~sage.modules.filtered_vector_space.FilteredVectorSpace` ::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace({0:[(1,0)], 2:[(2,3)]}) sage: V = MultiFilteredVectorSpace({'first':F1, 'second':F2}) sage: V Filtrations first: QQ^2 >= QQ^2 >= 0 >= 0 second: QQ^2 >= QQ^1 >= QQ^1 >= 0
sage: V.index_set() # random output {'second', 'first'} sage: sorted(V.index_set()) ['first', 'second']
sage: V.get_filtration('first') QQ^2 >= 0 sage: V.get_degree('second', 1) Vector space of degree 2 and dimension 1 over Rational Field Basis matrix: [ 1 3/2] """
#***************************************************************************** # Copyright (C) 2013 Volker Braun <vbraun.name@gmail.com> # # Distributed under the terms of the GNU General Public License (GPL) # as published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # http://www.gnu.org/licenses/ #*****************************************************************************
""" Contstruct a multi-filtered vector space.
INPUT:
- ``arg`` -- either a non-empty dictionary of filtrations or an integer. The latter is interpreted as the vector space dimension, and the indexing set of the filtrations is empty.
- ``base_ring`` -- a field (optional, default ``'None'``). The base field of the vector space. Must be a field. If not specified, the base field is derived from the filtrations.
- ``check`` -- boolean (optional; default: ``True``). Whether to perform consistency checks.
EXAMPLES::
sage: MultiFilteredVectorSpace(3, QQ) Unfiltered QQ^3
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(2, 3) sage: V = MultiFilteredVectorSpace({1:F1, 2:F2}); V Filtrations 1: QQ^2 >= 0 >= 0 >= 0 2: QQ^2 >= QQ^2 >= QQ^2 >= 0 """ base_ring = QQ else:
""" Python constructor.
.. warning::
Use :func:`MultiFilteredVectorSpace` to construct multi-filtered vector spaces.
INPUT:
- ``base_ring`` -- a ring. the base ring.
- ``dim`` -- integer. The dimension of the ambient vector space.
- ``filtrations`` -- a dictionary whose values are filtrations.
- ``check`` -- boolean (optional). Whether to perform additional consistency checks.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(2, 3) sage: V = MultiFilteredVectorSpace({1:F1, 2:F2}); V Filtrations 1: QQ^2 >= 0 >= 0 >= 0 2: QQ^2 >= QQ^2 >= QQ^2 >= 0 """
def index_set(self): """ Return the allowed indices for the different filtrations.
OUTPUT:
Set.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(2, 3) sage: V = MultiFilteredVectorSpace({1:F1, 2:F2}) sage: V.index_set() {1, 2} """
""" Return the same multi-filtration over a different base ring.
INPUT:
- ``base_ring`` -- a ring. The new base ring.
OUTPUT:
This method returns a new multi-filtered vector space whose subspaces are defined by the same generators but over a different base ring.
EXAMPLES::
sage: V = FilteredVectorSpace(2, 0) sage: W = FilteredVectorSpace(2, 2) sage: F = MultiFilteredVectorSpace({'a':V, 'b':W}); F Filtrations a: QQ^2 >= 0 >= 0 >= 0 b: QQ^2 >= QQ^2 >= QQ^2 >= 0 sage: F.change_ring(RDF) Filtrations a: RDF^2 >= 0 >= 0 >= 0 b: RDF^2 >= RDF^2 >= RDF^2 >= 0
sage: MultiFilteredVectorSpace(3, base_ring=QQ).change_ring(RR) Unfiltered RR^3 """ base_ring=base_ring)
""" Return the ambient (unfiltered) vector space.
OUTPUT:
A vector space.
EXAMPLES::
sage: V = FilteredVectorSpace(2, 0) sage: W = FilteredVectorSpace(2, 2) sage: F = MultiFilteredVectorSpace({'a':V, 'b':W}) sage: F.ambient_vector_space() Vector space of dimension 2 over Rational Field """
def is_constant(self): """ Return whether the multi-filtration is constant.
OUTPUT:
Boolean. Whether the each filtration is constant, see :meth:`~sage.modules.filtered_vector_space.FilteredVectorSpace_class.is_constant`.
EXAMPLES::
sage: V = FilteredVectorSpace(2, 0) sage: W = FilteredVectorSpace(2, 2) sage: F = MultiFilteredVectorSpace({'a':V, 'b':W}); F Filtrations a: QQ^2 >= 0 >= 0 >= 0 b: QQ^2 >= QQ^2 >= QQ^2 >= 0 sage: F.is_constant() False """
""" Return whether the multi-filtration is exhaustive.
A filtration $\{F_d\}$ in an ambient vector space $V$ is exhaustive if $\cup F_d = V$. See also :meth:`is_separating`.
OUTPUT:
Boolean. Whether each filtration is constant, see :meth:`~sage.modules.filtered_vector_space.FilteredVectorSpace_class.is_exhaustive`.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(2, 3) sage: V = MultiFilteredVectorSpace({1:F1, 2:F2}) sage: V.is_exhaustive() True """
""" Return whether the multi-filtration is separating.
A filtration $\{F_d\}$ in an ambient vector space $V$ is exhaustive if $\cap F_d = 0$. See also :meth:`is_exhaustive`.
OUTPUT:
Boolean. Whether each filtration is separating, see :meth:`~sage.modules.filtered_vector_space.FilteredVectorSpace_class.is_separating`.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(2, 3) sage: V = MultiFilteredVectorSpace({1:F1, 2:F2}) sage: V.is_separating() True """
def support(self): """ Return the degrees in which there are non-trivial generators.
OUTPUT:
A tuple of integers (and plus infinity) in ascending order. The last entry is plus infinity if and only if the filtration is not separating (see :meth:`is_separating`).
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(2, 3) sage: V = MultiFilteredVectorSpace({1:F1, 2:F2}) sage: V.support() (1, 3) """
def min_degree(self): r""" Return the lowest degree of the filtration.
OUTPUT:
Integer or plus infinity. The largest degree `d` of the (descending) filtrations such that, for each individual filtration, the filtered vector space `F_d` still equal to `F_{-\infty}`.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(2, 3) sage: V = MultiFilteredVectorSpace({1:F1, 2:F2}) sage: V.min_degree() 1 """ return infinity
def max_degree(self): r""" Return the highest degree of the filtration.
OUTPUT:
Integer or minus infinity. The smallest degree of the filtrations such that the filtrations are constant to the right.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(2, 3) sage: V = MultiFilteredVectorSpace({1:F1, 2:F2}) sage: V.max_degree() 4 """ return minus_infinity
""" Return the filtration indexed by ``key``.
OUTPUT:
A filtered vector space.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(2, 3) sage: V = MultiFilteredVectorSpace({1:F1, 2:F2}) sage: V.get_filtration(2) QQ^2 >= 0 """
r""" Return one filtered vector space.
INPUT:
- ``key`` -- an element of the :meth:`index_set`. Specifies which filtration.
- ``d`` -- Integer. The desired degree of the filtration.
OUTPUT:
The vector space of degree ``deg`` in the filtration indexed by ``key`` as subspace of the ambient space.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(2, 3) sage: V = MultiFilteredVectorSpace({1:F1, 2:F2}) sage: V.get_degree(2, 0) Vector space of degree 2 and dimension 2 over Rational Field Basis matrix: [1 0] [0 1] """
r""" Return the associated graded vector space.
INPUT:
- ``key`` -- an element of the :meth:`index_set`. Specifies which filtration.
- ``d`` -- Integer. The desired degree of the filtration.
OUTPUT:
The quotient `G_d = F_d / F_{d+1}` of the filtration `F` corresponding to ``key``.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(1, 3) + FilteredVectorSpace(1,0) sage: V = MultiFilteredVectorSpace({1:F1, 2:F2}) sage: V.graded(2, 3) Vector space quotient V/W of dimension 1 over Rational Field where V: Vector space of degree 2 and dimension 1 over Rational Field Basis matrix: [1 0] W: Vector space of degree 2 and dimension 0 over Rational Field Basis matrix: [] """
r""" Return as string representation of ``self``.
OUTPUT:
A string.
EXAMPLES::
sage: rays = [(1,0), (1,1), (1,2), (-1,-1)] sage: F1 = FilteredVectorSpace(rays, {0:[1, 2], 2:[3]}) sage: F2 = FilteredVectorSpace(rays, {0:[1, 2], oo:[3]}) sage: F3 = FilteredVectorSpace(rays, {oo:[3]}) sage: F4 = FilteredVectorSpace(rays, {0:[3]}) sage: MultiFilteredVectorSpace({'a':F1, 'b':F2, 'c': F3, 'd': F4}) Filtrations a: QQ^2 >= QQ^1 >= QQ^1 >= 0 b: QQ^2 >= QQ^1 >= QQ^1 >= QQ^1 c: QQ^1 >= QQ^1 >= QQ^1 >= QQ^1 d: QQ^1 >= 0 >= 0 >= 0
sage: MultiFilteredVectorSpace(123, base_ring=RR) Unfiltered RR^123 """ base_ring=self.base_ring())
""" Return whether ``self`` is equal to ``other``.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(1, 3) + FilteredVectorSpace(1,0) sage: V = MultiFilteredVectorSpace({1:F1, 2:F2}) sage: V == MultiFilteredVectorSpace({2:F2, 1:F1}) True sage: V == MultiFilteredVectorSpace({'a':F1, 'b':F2}) False """ return False
""" Return whether ``self`` is not equal to ``other``.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(1, 3) + FilteredVectorSpace(1,0) sage: V = MultiFilteredVectorSpace({1:F1, 2:F2}) sage: V != MultiFilteredVectorSpace({2:F2, 1:F1}) False sage: V != MultiFilteredVectorSpace({'a':F1, 'b':F2}) True """
""" Return the direct sum.
INPUT:
- ``other`` -- a multi-filtered vector space with the same :meth:`index_set`.
OUTPUT:
The direct sum as a multi-filtered vector space. See :meth:`~sage.modules.filtered_vector_space.FilteredVectorSpace_class.direct_sum`.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(1, 3) + FilteredVectorSpace(1,0) sage: V = MultiFilteredVectorSpace({'a':F1, 'b':F2}) sage: G1 = FilteredVectorSpace(1, 1) sage: G2 = FilteredVectorSpace(1, 3) sage: W = MultiFilteredVectorSpace({'a':G1, 'b':G2}) sage: V.direct_sum(W) Filtrations a: QQ^3 >= QQ^3 >= 0 >= 0 >= 0 b: QQ^3 >= QQ^2 >= QQ^2 >= QQ^2 >= 0 sage: V + W # syntactic sugar Filtrations a: QQ^3 >= QQ^3 >= 0 >= 0 >= 0 b: QQ^3 >= QQ^2 >= QQ^2 >= QQ^2 >= 0 """ raise ValueError('the index sets of the two summands' ' must be the same')
r""" Return the graded tensor product.
INPUT:
- ``other`` -- a multi-filtered vector space with the same :meth:`index_set`.
OUTPUT:
The tensor product of ``self`` and ``other`` as a multi-filtered vector space. See :meth:`~sage.modules.filtered_vector_space.FilteredVectorSpace_class.tensor_product`.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(1, 3) + FilteredVectorSpace(1,0) sage: V = MultiFilteredVectorSpace({'a':F1, 'b':F2}) sage: G1 = FilteredVectorSpace(1, 1) sage: G2 = FilteredVectorSpace(1, 3) sage: W = MultiFilteredVectorSpace({'a':G1, 'b':G2}) sage: V.tensor_product(W) Filtrations a: QQ^2 >= 0 >= 0 >= 0 >= 0 >= 0 b: QQ^2 >= QQ^2 >= QQ^1 >= QQ^1 >= QQ^1 >= 0 sage: V * W # syntactic sugar Filtrations a: QQ^2 >= 0 >= 0 >= 0 >= 0 >= 0 b: QQ^2 >= QQ^2 >= QQ^1 >= QQ^1 >= QQ^1 >= 0 """ raise ValueError('the index sets of the two summands' ' must be the same')
""" Return the `n`-th graded exterior power.
INPUT:
- ``n`` -- integer. Exterior product of how many copies of ``self``.
OUTPUT:
The exterior power as a multi-filtered vector space. See :meth:`~sage.modules.filtered_vector_space.FilteredVectorSpace_class.exterior_power`.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(1, 3) + FilteredVectorSpace(1,0) sage: V = MultiFilteredVectorSpace({'a':F1, 'b':F2}) sage: V.exterior_power(2) Filtrations a: QQ^1 >= 0 >= 0 b: QQ^1 >= QQ^1 >= 0 """
""" Return the `n`-th graded symmetric power.
INPUT:
- ``n`` -- integer. Symmetric product of how many copies of ``self``.
OUTPUT:
The symmetric power as a multi-filtered vector space. See :meth:`~sage.modules.filtered_vector_space.FilteredVectorSpace_class.symmetric_power`.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(1, 3) + FilteredVectorSpace(1,0) sage: V = MultiFilteredVectorSpace({'a':F1, 'b':F2}) sage: V.symmetric_power(2) Filtrations a: QQ^3 >= QQ^3 >= QQ^3 >= 0 >= 0 >= 0 >= 0 >= 0 b: QQ^3 >= QQ^2 >= QQ^2 >= QQ^2 >= QQ^1 >= QQ^1 >= QQ^1 >= 0 """
""" Return the dual.
OUTPUT:
The dual as a multi-filtered vector space. See :meth:`~sage.modules.filtered_vector_space.FilteredVectorSpace_class.dual`.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(1, 3) + FilteredVectorSpace(1,0) sage: V = MultiFilteredVectorSpace({'a':F1, 'b':F2}) sage: V.dual() Filtrations a: QQ^2 >= QQ^2 >= QQ^2 >= 0 >= 0 b: QQ^2 >= QQ^1 >= QQ^1 >= QQ^1 >= 0 """
""" Return a filtered vector space with degrees shifted by a constant.
OUTPUT:
The shift of ``self``. See :meth:`~sage.modules.filtered_vector_space.FilteredVectorSpace_class.shift`.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(1, 3) + FilteredVectorSpace(1,0) sage: V = MultiFilteredVectorSpace({'a':F1, 'b':F2}) sage: V.support() (0, 1, 3) sage: V.shift(-5).support() (-5, -4, -2) """
""" Return a random deformation
INPUT:
- ``epsilon`` -- a number in the base ring.
OUTPUT:
A new multi-filtered vector space where the generating vectors of subspaces are moved by ``epsilon`` times a random vector.
EXAMPLES::
sage: F1 = FilteredVectorSpace(2, 1) sage: F2 = FilteredVectorSpace(1, 3) + FilteredVectorSpace(1,0) sage: V = MultiFilteredVectorSpace({'a':F1, 'b':F2}) sage: V.get_degree('b',1) Vector space of degree 2 and dimension 1 over Rational Field Basis matrix: [1 0] sage: V.random_deformation(1/100).get_degree('b',1) Vector space of degree 2 and dimension 1 over Rational Field Basis matrix: [ 1 8/1197] """ |