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
""" Partition Species """ from __future__ import absolute_import #***************************************************************************** # Copyright (C) 2008 Mike Hansen <mhansen@gmail.com>, # # Distributed under the terms of the GNU General Public License (GPL) # # This code is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # The full text of the GPL is available at: # # http://www.gnu.org/licenses/ #*****************************************************************************
from .species import GenericCombinatorialSpecies from .generating_series import _integers_from, factorial_stream from .subset_species import SubsetSpeciesStructure from .set_species import SetSpecies from .structure import GenericSpeciesStructure from sage.combinat.species.misc import accept_size from functools import reduce
class PartitionSpeciesStructure(GenericSpeciesStructure): def __init__(self, parent, labels, list): """ EXAMPLES::
sage: from sage.combinat.species.partition_species import PartitionSpeciesStructure sage: P = species.PartitionSpecies() sage: s = PartitionSpeciesStructure(P, ['a','b','c'], [[1,2],[3]]); s {{'a', 'b'}, {'c'}} sage: s == loads(dumps(s)) True """
def __repr__(self): """ EXAMPLES::
sage: S = species.PartitionSpecies() sage: a = S.structures(["a","b","c"]).random_element(); a {{'a', 'b', 'c'}} """
def canonical_label(self): """ EXAMPLES::
sage: P = species.PartitionSpecies() sage: S = P.structures(["a", "b", "c"]) sage: [s.canonical_label() for s in S] [{{'a', 'b', 'c'}}, {{'a', 'b'}, {'c'}}, {{'a', 'b'}, {'c'}}, {{'a', 'b'}, {'c'}}, {{'a'}, {'b'}, {'c'}}] """
def transport(self, perm): """ Returns the transport of this set partition along the permutation perm. For set partitions, this is the direct product of the automorphism groups for each of the blocks.
EXAMPLES::
sage: p = PermutationGroupElement((2,3)) sage: from sage.combinat.species.partition_species import PartitionSpeciesStructure sage: a = PartitionSpeciesStructure(None, [2,3,4], [[1,2],[3]]); a {{2, 3}, {4}} sage: a.transport(p) {{2, 4}, {3}} """
def automorphism_group(self): """ Returns the group of permutations whose action on this set partition leave it fixed.
EXAMPLES::
sage: p = PermutationGroupElement((2,3)) sage: from sage.combinat.species.partition_species import PartitionSpeciesStructure sage: a = PartitionSpeciesStructure(None, [2,3,4], [[1,2],[3]]); a {{2, 3}, {4}} sage: a.automorphism_group() Permutation Group with generators [(1,2)] """ [SymmetricGroup(block._list) for block in self._list])
def change_labels(self, labels): """ Return a relabelled structure.
INPUT:
- ``labels``, a list of labels.
OUTPUT:
A structure with the i-th label of self replaced with the i-th label of the list.
EXAMPLES::
sage: p = PermutationGroupElement((2,3)) sage: from sage.combinat.species.partition_species import PartitionSpeciesStructure sage: a = PartitionSpeciesStructure(None, [2,3,4], [[1,2],[3]]); a {{2, 3}, {4}} sage: a.change_labels([1,2,3]) {{1, 2}, {3}} """
class PartitionSpecies(GenericCombinatorialSpecies): @staticmethod @accept_size def __classcall__(cls, *args, **kwds): """ EXAMPLES::
sage: P = species.PartitionSpecies(); P Partition species """ return super(PartitionSpecies, cls).__classcall__(cls, *args, **kwds)
def __init__(self, min=None, max=None, weight=None): """ Returns the species of partitions.
EXAMPLES::
sage: P = species.PartitionSpecies() sage: P.generating_series().coefficients(5) [1, 1, 1, 5/6, 5/8] sage: P.isotype_generating_series().coefficients(5) [1, 1, 2, 3, 5]
sage: P = species.PartitionSpecies() sage: P._check() True sage: P == loads(dumps(P)) True """
_default_structure_class = PartitionSpeciesStructure
def _structures(self, structure_class, labels): """ EXAMPLES::
sage: P = species.PartitionSpecies() sage: P.structures([1,2,3]).list() [{{1, 2, 3}}, {{1, 3}, {2}}, {{1, 2}, {3}}, {{2, 3}, {1}}, {{1}, {2}, {3}}] """
yield structure_class(self, labels, []) return
#Reconstruct the set partitions from #restricted growth arrays
def _isotypes(self, structure_class, labels): """ EXAMPLES::
sage: P = species.PartitionSpecies() sage: P.isotypes([1,2,3,4]).list() [{{1, 2, 3, 4}}, {{1, 2, 3}, {4}}, {{1, 2}, {3, 4}}, {{1, 2}, {3}, {4}}, {{1}, {2}, {3}, {4}}] """
def _canonical_rep_from_partition(self, structure_class, labels, p): """ Returns the canonical representative corresponding to the partition p.
EXAMPLES::
sage: P = species.PartitionSpecies() sage: P._canonical_rep_from_partition(P._default_structure_class,[1,2,3],[2,1]) {{1, 2}, {3}} """
def _gs_iterator(self, base_ring): r""" EXAMPLES::
sage: P = species.PartitionSpecies() sage: g = P.generating_series() sage: g.coefficients(5) [1, 1, 1, 5/6, 5/8] """
def _itgs_iterator(self, base_ring): r""" The isomorphism type generating series is given by `\frac{1}{1-x}`.
EXAMPLES::
sage: P = species.PartitionSpecies() sage: g = P.isotype_generating_series() sage: g.coefficients(10) [1, 1, 2, 3, 5, 7, 11, 15, 22, 30] """
def _cis(self, series_ring, base_ring): r""" The cycle index series for the species of partitions is given by
.. MATH::
exp \sum_{n \ge 1} \frac{1}{n} \left( exp \left( \sum_{k \ge 1} \frac{x_{kn}}{k} \right) -1 \right).
EXAMPLES::
sage: P = species.PartitionSpecies() sage: g = P.cycle_index_series() sage: g.coefficients(5) [p[], p[1], p[1, 1] + p[2], 5/6*p[1, 1, 1] + 3/2*p[2, 1] + 2/3*p[3], 5/8*p[1, 1, 1, 1] + 7/4*p[2, 1, 1] + 7/8*p[2, 2] + p[3, 1] + 3/4*p[4]] """ res *= self._weight
#Backward compatibility PartitionSpecies_class = PartitionSpecies |