Plane Partitions#
AUTHORS:
Jang Soo Kim (2016): Initial implementation
Jessica Striker (2016): Added additional methods
Kevin Dilks (2021): Added symmetry classes
- class sage.combinat.plane_partition.PlanePartition(parent, pp, check=True)[source]#
Bases:
ClonableArray
A plane partition.
A plane partition is a stack of cubes in the positive orthant.
INPUT:
PP
– a list of lists which represents a tableaubox_size
– (optional) a list[A, B, C]
of 3 positive integers, whereA
,B
,C
are the lengths of the box in the \(x\)-axis, \(y\)-axis, \(z\)-axis, respectively; if this is not given, it is determined by the smallest box boundingPP
OUTPUT:
The plane partition whose tableau representation is
PP
.EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP Plane partition [[4, 3, 3, 1], [2, 1, 1], [1, 1]]
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP Plane partition [[4, 3, 3, 1], [2, 1, 1], [1, 1]]
- bounding_box()[source]#
Return the smallest box \((a, b, c)\) that
self
is contained in.EXAMPLES:
sage: PP = PlanePartition([[5,2,1,1], [2,2], [2]]) sage: PP.bounding_box() (3, 4, 5)
>>> from sage.all import * >>> PP = PlanePartition([[Integer(5),Integer(2),Integer(1),Integer(1)], [Integer(2),Integer(2)], [Integer(2)]]) >>> PP.bounding_box() (3, 4, 5)
- cells()[source]#
Return the list of cells inside
self
.Each cell is a tuple.
EXAMPLES:
sage: PP = PlanePartition([[3,1],[2]]) sage: PP.cells() [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (1, 0, 0), (1, 0, 1)]
>>> from sage.all import * >>> PP = PlanePartition([[Integer(3),Integer(1)],[Integer(2)]]) >>> PP.cells() [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (1, 0, 0), (1, 0, 1)]
- check()[source]#
Check to see that
self
is a valid plane partition.EXAMPLES:
sage: a = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: a.check() sage: b = PlanePartition([[1,2],[1]]) Traceback (most recent call last): ... ValueError: not weakly decreasing along rows sage: c = PlanePartition([[1,1],[2]]) Traceback (most recent call last): ... ValueError: not weakly decreasing along columns sage: d = PlanePartition([[2,-1],[-2]]) Traceback (most recent call last): ... ValueError: entries not all nonnegative sage: e = PlanePartition([[3/2,1],[.5]]) Traceback (most recent call last): ... ValueError: entries not all integers
>>> from sage.all import * >>> a = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> a.check() >>> b = PlanePartition([[Integer(1),Integer(2)],[Integer(1)]]) Traceback (most recent call last): ... ValueError: not weakly decreasing along rows >>> c = PlanePartition([[Integer(1),Integer(1)],[Integer(2)]]) Traceback (most recent call last): ... ValueError: not weakly decreasing along columns >>> d = PlanePartition([[Integer(2),-Integer(1)],[-Integer(2)]]) Traceback (most recent call last): ... ValueError: entries not all nonnegative >>> e = PlanePartition([[Integer(3)/Integer(2),Integer(1)],[RealNumber('.5')]]) Traceback (most recent call last): ... ValueError: entries not all integers
- complement(tableau_only=False)[source]#
Return the complement of
self
.If the parent of
self
consists only of partitions inside a given box, then the complement is taken in this box. Otherwise, the complement is taken in the smallest box containing the plane partition. The empty plane partition with no box specified is its own complement.If
tableau_only
is set toTrue
, then only the tableau consisting of the projection of boxes size onto the \(xy\)-plane is returned instead of aPlanePartition
. This output will not have empty trailing rows or trailing zeros removed.EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.complement() Plane partition [[4, 4, 3, 3], [4, 3, 3, 2], [3, 1, 1]] sage: PP.complement(True) [[4, 4, 3, 3], [4, 3, 3, 2], [3, 1, 1, 0]]
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.complement() Plane partition [[4, 4, 3, 3], [4, 3, 3, 2], [3, 1, 1]] >>> PP.complement(True) [[4, 4, 3, 3], [4, 3, 3, 2], [3, 1, 1, 0]]
- contains(PP)[source]#
Return
True
ifPP
is a plane partition that fits insideself
.Specifically,
self
containsPP
if, for all \(i\), \(j\), the height ofPP
at \(ij\) is less than or equal to the height ofself
at \(ij\).EXAMPLES:
sage: P1 = PlanePartition([[5,4,3], [3,2,2], [1]]) sage: P2 = PlanePartition([[3,2], [1,1], [0,0], [0,0]]) sage: P3 = PlanePartition([[5,5,5], [2,1,0]]) sage: P1.contains(P2) True sage: P2.contains(P1) False sage: P1.contains(P3) False sage: P3.contains(P2) True
>>> from sage.all import * >>> P1 = PlanePartition([[Integer(5),Integer(4),Integer(3)], [Integer(3),Integer(2),Integer(2)], [Integer(1)]]) >>> P2 = PlanePartition([[Integer(3),Integer(2)], [Integer(1),Integer(1)], [Integer(0),Integer(0)], [Integer(0),Integer(0)]]) >>> P3 = PlanePartition([[Integer(5),Integer(5),Integer(5)], [Integer(2),Integer(1),Integer(0)]]) >>> P1.contains(P2) True >>> P2.contains(P1) False >>> P1.contains(P3) False >>> P3.contains(P2) True
- cyclically_rotate(preserve_parent=False)[source]#
Return the cyclic rotation of
self
.By default, if the parent of
self
consists of plane partitions inside an \(a \times b \times c\) box, the result will have a parent consisting of partitions inside a \(c \times a \times b\) box, unless the optional parameterpreserve_parent
is set toTrue
. Enabling this setting may give an element that is not an element of its parent.EXAMPLES:
sage: PlanePartition([[3,2,1],[2,2],[2]]).cyclically_rotate() Plane partition [[3, 3, 1], [2, 2], [1]] sage: PP = PlanePartition([[4,1],[1],[1]]) sage: PP.cyclically_rotate() Plane partition [[3, 1, 1, 1], [1]] sage: PP == PP.cyclically_rotate().cyclically_rotate().cyclically_rotate() True sage: # needs sage.graphs sage.modules sage: PP = PlanePartitions([4,3,2]).random_element() sage: PP.cyclically_rotate().parent() Plane partitions inside a 2 x 4 x 3 box sage: PP = PlanePartitions([3,4,2])([[2,2,2,2],[2,2,2,2],[2,2,2,2]]) sage: PP_rotated = PP.cyclically_rotate(preserve_parent=True) sage: PP_rotated in PP_rotated.parent() False
>>> from sage.all import * >>> PlanePartition([[Integer(3),Integer(2),Integer(1)],[Integer(2),Integer(2)],[Integer(2)]]).cyclically_rotate() Plane partition [[3, 3, 1], [2, 2], [1]] >>> PP = PlanePartition([[Integer(4),Integer(1)],[Integer(1)],[Integer(1)]]) >>> PP.cyclically_rotate() Plane partition [[3, 1, 1, 1], [1]] >>> PP == PP.cyclically_rotate().cyclically_rotate().cyclically_rotate() True >>> # needs sage.graphs sage.modules >>> PP = PlanePartitions([Integer(4),Integer(3),Integer(2)]).random_element() >>> PP.cyclically_rotate().parent() Plane partitions inside a 2 x 4 x 3 box >>> PP = PlanePartitions([Integer(3),Integer(4),Integer(2)])([[Integer(2),Integer(2),Integer(2),Integer(2)],[Integer(2),Integer(2),Integer(2),Integer(2)],[Integer(2),Integer(2),Integer(2),Integer(2)]]) >>> PP_rotated = PP.cyclically_rotate(preserve_parent=True) >>> PP_rotated in PP_rotated.parent() False
- is_CSPP()[source]#
Return whether
self
is a cyclically symmetric plane partition.A plane partition is cyclically symmetric if its \(x\), \(y\), and \(z\) tableaux are all equal.
EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.is_CSPP() False sage: PP = PlanePartition([[3,2,2],[3,1,0],[1,1,0]]) sage: PP.is_CSPP() True
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.is_CSPP() False >>> PP = PlanePartition([[Integer(3),Integer(2),Integer(2)],[Integer(3),Integer(1),Integer(0)],[Integer(1),Integer(1),Integer(0)]]) >>> PP.is_CSPP() True
- is_CSSCPP()[source]#
Return whether
self
is a cyclically symmetric and self-complementary plane partition.EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.is_CSSCPP() False sage: PP = PlanePartition([[4,4,4,1],[3,3,2,1],[3,2,1,1],[3,0,0,0]]) sage: PP.is_CSSCPP() True
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.is_CSSCPP() False >>> PP = PlanePartition([[Integer(4),Integer(4),Integer(4),Integer(1)],[Integer(3),Integer(3),Integer(2),Integer(1)],[Integer(3),Integer(2),Integer(1),Integer(1)],[Integer(3),Integer(0),Integer(0),Integer(0)]]) >>> PP.is_CSSCPP() True
- is_CSTCPP()[source]#
Return whether
self
is a cyclically symmetric and transpose-complementary plane partition.EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.is_CSTCPP() False sage: PP = PlanePartition([[4,4,3,2],[4,3,2,1],[3,2,1,0],[2,1,0,0]]) sage: PP.is_CSTCPP() True
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.is_CSTCPP() False >>> PP = PlanePartition([[Integer(4),Integer(4),Integer(3),Integer(2)],[Integer(4),Integer(3),Integer(2),Integer(1)],[Integer(3),Integer(2),Integer(1),Integer(0)],[Integer(2),Integer(1),Integer(0),Integer(0)]]) >>> PP.is_CSTCPP() True
- is_SCPP()[source]#
Return whether
self
is a self-complementary plane partition.Note that the complement of a plane partition (and thus the property of being self-complementary) is dependent on the choice of a box that it is contained in. If no parent/bounding box is specified, the box is taken to be the smallest box that contains the plane partition.
EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.is_SCPP() False sage: PP = PlanePartition([[4,4,4,4],[4,4,2,0],[4,2,0,0],[0,0,0,0]]) sage: PP.is_SCPP() False sage: PP = PlanePartitions([4,4,4])([[4,4,4,4],[4,4,2,0],[4,2,0,0],[0,0,0,0]]) sage: PP.is_SCPP() True
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.is_SCPP() False >>> PP = PlanePartition([[Integer(4),Integer(4),Integer(4),Integer(4)],[Integer(4),Integer(4),Integer(2),Integer(0)],[Integer(4),Integer(2),Integer(0),Integer(0)],[Integer(0),Integer(0),Integer(0),Integer(0)]]) >>> PP.is_SCPP() False >>> PP = PlanePartitions([Integer(4),Integer(4),Integer(4)])([[Integer(4),Integer(4),Integer(4),Integer(4)],[Integer(4),Integer(4),Integer(2),Integer(0)],[Integer(4),Integer(2),Integer(0),Integer(0)],[Integer(0),Integer(0),Integer(0),Integer(0)]]) >>> PP.is_SCPP() True
- is_SPP()[source]#
Return whether
self
is a symmetric plane partition.A plane partition is symmetric if the corresponding tableau is symmetric about the diagonal.
EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.is_SPP() False sage: PP = PlanePartition([[3,3,2],[3,3,2],[2,2,2]]) sage: PP.is_SPP() True sage: PP = PlanePartition([[3,2,1],[2,0,0]]) sage: PP.is_SPP() False sage: PP = PlanePartition([[3,2,0],[2,0,0]]) sage: PP.is_SPP() True sage: PP = PlanePartition([[3,2],[2,0],[1,0]]) sage: PP.is_SPP() False sage: PP = PlanePartition([[3,2],[2,0],[0,0]]) sage: PP.is_SPP() True
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.is_SPP() False >>> PP = PlanePartition([[Integer(3),Integer(3),Integer(2)],[Integer(3),Integer(3),Integer(2)],[Integer(2),Integer(2),Integer(2)]]) >>> PP.is_SPP() True >>> PP = PlanePartition([[Integer(3),Integer(2),Integer(1)],[Integer(2),Integer(0),Integer(0)]]) >>> PP.is_SPP() False >>> PP = PlanePartition([[Integer(3),Integer(2),Integer(0)],[Integer(2),Integer(0),Integer(0)]]) >>> PP.is_SPP() True >>> PP = PlanePartition([[Integer(3),Integer(2)],[Integer(2),Integer(0)],[Integer(1),Integer(0)]]) >>> PP.is_SPP() False >>> PP = PlanePartition([[Integer(3),Integer(2)],[Integer(2),Integer(0)],[Integer(0),Integer(0)]]) >>> PP.is_SPP() True
- is_SSCPP()[source]#
Return whether
self
is a symmetric, self-complementary plane partition.EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.is_SSCPP() False sage: PP = PlanePartition([[4,3,3,2],[3,2,2,1],[3,2,2,1],[2,1,1,0]]) sage: PP.is_SSCPP() True sage: PP = PlanePartition([[2,1],[1,0]]) sage: PP.is_SSCPP() True sage: PP = PlanePartition([[4,3,2],[3,2,1],[2,1,0]]) sage: PP.is_SSCPP() True sage: PP = PlanePartition([[4,2,2,2],[2,2,2,2],[2,2,2,2],[2,2,2,0]]) sage: PP.is_SSCPP() True
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.is_SSCPP() False >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(2)],[Integer(3),Integer(2),Integer(2),Integer(1)],[Integer(3),Integer(2),Integer(2),Integer(1)],[Integer(2),Integer(1),Integer(1),Integer(0)]]) >>> PP.is_SSCPP() True >>> PP = PlanePartition([[Integer(2),Integer(1)],[Integer(1),Integer(0)]]) >>> PP.is_SSCPP() True >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(2)],[Integer(3),Integer(2),Integer(1)],[Integer(2),Integer(1),Integer(0)]]) >>> PP.is_SSCPP() True >>> PP = PlanePartition([[Integer(4),Integer(2),Integer(2),Integer(2)],[Integer(2),Integer(2),Integer(2),Integer(2)],[Integer(2),Integer(2),Integer(2),Integer(2)],[Integer(2),Integer(2),Integer(2),Integer(0)]]) >>> PP.is_SSCPP() True
- is_TCPP()[source]#
Return whether
self
is a transpose-complementary plane partition.EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.is_TCPP() False sage: PP = PlanePartition([[4,4,3,2],[4,4,2,1],[4,2,0,0],[2,0,0,0]]) sage: PP.is_TCPP() True
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.is_TCPP() False >>> PP = PlanePartition([[Integer(4),Integer(4),Integer(3),Integer(2)],[Integer(4),Integer(4),Integer(2),Integer(1)],[Integer(4),Integer(2),Integer(0),Integer(0)],[Integer(2),Integer(0),Integer(0),Integer(0)]]) >>> PP.is_TCPP() True
- is_TSPP()[source]#
Return whether
self
is a totally symmetric plane partition.A plane partition is totally symmetric if it is both symmetric and cyclically symmetric.
EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.is_TSPP() False sage: PP = PlanePartition([[3,3,3],[3,3,2],[3,2,1]]) sage: PP.is_TSPP() True
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.is_TSPP() False >>> PP = PlanePartition([[Integer(3),Integer(3),Integer(3)],[Integer(3),Integer(3),Integer(2)],[Integer(3),Integer(2),Integer(1)]]) >>> PP.is_TSPP() True
- is_TSSCPP()[source]#
Return whether
self
is a totally symmetric self-complementary plane partition.EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.is_TSSCPP() False sage: PP = PlanePartition([[4,4,3,2],[4,3,2,1],[3,2,1,0],[2,1,0,0]]) sage: PP.is_TSSCPP() True
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.is_TSSCPP() False >>> PP = PlanePartition([[Integer(4),Integer(4),Integer(3),Integer(2)],[Integer(4),Integer(3),Integer(2),Integer(1)],[Integer(3),Integer(2),Integer(1),Integer(0)],[Integer(2),Integer(1),Integer(0),Integer(0)]]) >>> PP.is_TSSCPP() True
- maximal_boxes()[source]#
Return the coordinates of the maximal boxes of
self
.The maximal boxes of a plane partitions are the boxes that can be removed from a plane partition and still yield a valid plane partition.
EXAMPLES:
sage: sorted(PlanePartition([[3,2,1],[2,2],[2]]).maximal_boxes()) [[0, 0, 2], [0, 2, 0], [1, 1, 1], [2, 0, 1]] sage: sorted(PlanePartition([[2,1],[1],[1]]).maximal_boxes()) [[0, 0, 1], [0, 1, 0], [2, 0, 0]]
>>> from sage.all import * >>> sorted(PlanePartition([[Integer(3),Integer(2),Integer(1)],[Integer(2),Integer(2)],[Integer(2)]]).maximal_boxes()) [[0, 0, 2], [0, 2, 0], [1, 1, 1], [2, 0, 1]] >>> sorted(PlanePartition([[Integer(2),Integer(1)],[Integer(1)],[Integer(1)]]).maximal_boxes()) [[0, 0, 1], [0, 1, 0], [2, 0, 0]]
- number_of_boxes()[source]#
Return the number of boxes in the plane partition.
EXAMPLES:
sage: PP = PlanePartition([[3,1],[2]]) sage: PP.number_of_boxes() 6
>>> from sage.all import * >>> PP = PlanePartition([[Integer(3),Integer(1)],[Integer(2)]]) >>> PP.number_of_boxes() 6
- plot(show_box=False, colors=None)[source]#
Return a plot of
self
.INPUT:
show_box
– boolean (default:False
); ifTrue
, also shows the visible tiles on the \(xy\)-, \(yz\)-, \(zx\)-planescolors
– (default:["white", "lightgray", "darkgray"]
) list[A, B, C]
of 3 strings representing colors
EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.plot() # needs sage.plot Graphics object consisting of 27 graphics primitives
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.plot() # needs sage.plot Graphics object consisting of 27 graphics primitives
- plot3d(colors=None)[source]#
Return a 3D-plot of
self
.INPUT:
colors
– (default:["white", "lightgray", "darkgray"]
) list[A, B, C]
of 3 strings representing colors
EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.plot3d() # needs sage.plot Graphics3d Object
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.plot3d() # needs sage.plot Graphics3d Object
- pp(show_box=False)[source]#
Return a pretty print of the plane partition.
INPUT:
show_box
– boolean (default:False
); ifTrue
, also shows the visible tiles on the \(xy\)-, \(yz\)-, \(zx\)-planes
OUTPUT:
A pretty print of the plane partition.
EXAMPLES:
sage: PlanePartition([[4,3,3,1],[2,1,1],[1,1]]).pp() __ /\_\ __/\/_/ __/\_\/\_\ /\_\/_/\/\_\ \/\_\_\/\/_/ \/_/\_\/_/ \/_/\_\ \/_/ sage: PlanePartition([[4,3,3,1],[2,1,1],[1,1]]).pp(True) ______ /_/_/\_\ /_/_/\/_/\ /_/\_\/\_\/\ /\_\/_/\/\_\/\ \/\_\_\/\/_/\/ \/_/\_\/_/\/ \_\/_/\_\/ \_\_\/_/
>>> from sage.all import * >>> PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]).pp() __ /\_\ __/\/_/ __/\_\/\_\ /\_\/_/\/\_\ \/\_\_\/\/_/ \/_/\_\/_/ \/_/\_\ \/_/ >>> PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]).pp(True) ______ /_/_/\_\ /_/_/\/_/\ /_/\_\/\_\/\ /\_\/_/\/\_\/\ \/\_\_\/\/_/\/ \/_/\_\/_/\/ \_\/_/\_\/ \_\_\/_/
- to_order_ideal()[source]#
Return the order ideal corresponding to
self
.Todo
As many families of symmetric plane partitions are in bijection with order ideals in an associated poset, this function could feasibly have options to send symmetric plane partitions to the associated order ideal in that poset, instead.
EXAMPLES:
sage: PlanePartition([[3,2,1],[2,2],[2]]).to_order_ideal() # needs sage.graphs sage.modules [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 2, 0), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1), (2, 0, 0), (2, 0, 1)] sage: PlanePartition([[2,1],[1],[1]]).to_order_ideal() # needs sage.graphs sage.modules [(0, 0, 0), (0, 0, 1), (0, 1, 0), (1, 0, 0), (2, 0, 0)]
>>> from sage.all import * >>> PlanePartition([[Integer(3),Integer(2),Integer(1)],[Integer(2),Integer(2)],[Integer(2)]]).to_order_ideal() # needs sage.graphs sage.modules [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 2, 0), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1), (2, 0, 0), (2, 0, 1)] >>> PlanePartition([[Integer(2),Integer(1)],[Integer(1)],[Integer(1)]]).to_order_ideal() # needs sage.graphs sage.modules [(0, 0, 0), (0, 0, 1), (0, 1, 0), (1, 0, 0), (2, 0, 0)]
- to_tableau()[source]#
Return the tableau class of
self
.EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.to_tableau() [[4, 3, 3, 1], [2, 1, 1], [1, 1]]
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.to_tableau() [[4, 3, 3, 1], [2, 1, 1], [1, 1]]
- transpose(tableau_only=False)[source]#
Return the transpose of
self
.If
tableau_only
is set toTrue
, then only the tableau consisting of the projection of boxes size onto the \(xy\)-plane is returned instead of aPlanePartition
. This will not necessarily have trailing rows or trailing zeros removed.EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.transpose() Plane partition [[4, 2, 1], [3, 1, 1], [3, 1], [1]] sage: PP.transpose(True) [[4, 2, 1], [3, 1, 1], [3, 1, 0], [1, 0, 0]] sage: PPP = PlanePartitions([1, 2, 3]) sage: PP = PPP([[1, 1]]) sage: PT = PP.transpose(); PT Plane partition [[1], [1]] sage: PT.parent() Plane partitions inside a 2 x 1 x 3 box
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.transpose() Plane partition [[4, 2, 1], [3, 1, 1], [3, 1], [1]] >>> PP.transpose(True) [[4, 2, 1], [3, 1, 1], [3, 1, 0], [1, 0, 0]] >>> PPP = PlanePartitions([Integer(1), Integer(2), Integer(3)]) >>> PP = PPP([[Integer(1), Integer(1)]]) >>> PT = PP.transpose(); PT Plane partition [[1], [1]] >>> PT.parent() Plane partitions inside a 2 x 1 x 3 box
- x_tableau(tableau=True)[source]#
Return the projection of
self
in the \(x\) direction.If
tableau
is set toFalse
, then only the list of lists consisting of the projection of boxes size onto the \(yz\)-plane is returned instead of aTableau
object. This output will not have empty trailing rows or trailing zeros removed.EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.x_tableau() [[3, 2, 1, 1], [3, 1, 1, 0], [2, 1, 1, 0], [1, 0, 0, 0]]
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.x_tableau() [[3, 2, 1, 1], [3, 1, 1, 0], [2, 1, 1, 0], [1, 0, 0, 0]]
- y_tableau(tableau=True)[source]#
Return the projection of
self
in the \(y\) direction.If
tableau
is set toFalse
, then only the list of lists consisting of the projection of boxes size onto the \(xz\)-plane is returned instead of aTableau
object. This output will not have empty trailing rows or trailing zeros removed.EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.y_tableau() [[4, 3, 2], [3, 1, 0], [3, 0, 0], [1, 0, 0]]
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.y_tableau() [[4, 3, 2], [3, 1, 0], [3, 0, 0], [1, 0, 0]]
- z_tableau(tableau=True)[source]#
Return the projection of
self
in the \(z\) direction.If
tableau
is set toFalse
, then only the list of lists consisting of the projection of boxes size onto the \(xy\)-plane is returned instead of aTableau
object. This output will not have empty trailing rows or trailing zeros removed.EXAMPLES:
sage: PP = PlanePartition([[4,3,3,1],[2,1,1],[1,1]]) sage: PP.z_tableau() [[4, 3, 3, 1], [2, 1, 1, 0], [1, 1, 0, 0]]
>>> from sage.all import * >>> PP = PlanePartition([[Integer(4),Integer(3),Integer(3),Integer(1)],[Integer(2),Integer(1),Integer(1)],[Integer(1),Integer(1)]]) >>> PP.z_tableau() [[4, 3, 3, 1], [2, 1, 1, 0], [1, 1, 0, 0]]
- class sage.combinat.plane_partition.PlanePartitions(box_size=None, symmetry=None, category=None)[source]#
Bases:
UniqueRepresentation
,Parent
Plane partitions.
PlanePartitions()
returns the class of all plane partitions.PlanePartitions(n)
return the class of all plane partitions with precisely \(n\) boxes.PlanePartitions([a, b, c])
returns the class of plane partitions that fit inside an \(a \times b \times c\) box.PlanePartitions([a, b, c])
has the optional keywordsymmetry
, which restricts the plane partitions inside a box of the specified size satisfying certain symmetry conditions.symmetry='SPP'
gives the class of symmetric plane partitions. which is all plane partitions fixed under reflection across the diagonal. Requires that \(a = b\).symmetry='CSPP'
gives the class of cyclic plane partitions, which is all plane partitions fixed under cyclic rotation of coordinates. Requires that \(a = b = c\).symmetry='TSPP'
gives the class of totally symmetric plane partitions, which is all plane partitions fixed under any interchanging of coordinates. Requires that \(a = b = c\).symmetry='SCPP'
gives the class of self-complementary plane partitions. which is all plane partitions that are equal to their own complement in the specified box. Requires at least one of \(a,b,c\) be even.symmetry='TCPP'
gives the class of transpose complement plane partitions, which is all plane partitions whose complement in the box of the specified size is equal to their transpose. Requires \(a = b\) and at least one of \(a, b, c\) be even.symmetry='SSCPP'
gives the class of symmetric self-complementary plane partitions, which is all plane partitions that are both symmetric and self-complementary. Requires \(a = b\) and at least one of \(a, b, c\) be even.symmetry='CSTCPP'
gives the class of cyclically symmetric transpose complement plane partitions, which is all plane partitions that are both symmetric and equal to the transpose of their complement. Requires \(a = b = c\).symmetry='CSSCPP'
gives the class of cyclically symmetric self-complementary plane partitions, which is all plane partitions that are both cyclically symmetric and self-complementary. Requires \(a = b = c\) and all \(a, b, c\) be even.symmetry='TSSCPP'
gives the class of totally symmetric self-complementary plane partitions, which is all plane partitions that are totally symmetric and also self-complementary. Requires \(a = b = c\) and all \(a, b, c\) be even.
EXAMPLES:
If no arguments are passed, then the class of all plane partitions is returned:
sage: PlanePartitions() Plane partitions sage: [[2,1],[1]] in PlanePartitions() True
>>> from sage.all import * >>> PlanePartitions() Plane partitions >>> [[Integer(2),Integer(1)],[Integer(1)]] in PlanePartitions() True
If an integer \(n\) is passed, then the class of plane partitions of \(n\) is returned:
sage: PlanePartitions(3) Plane partitions of size 3 sage: PlanePartitions(3).list() [Plane partition [[3]], Plane partition [[2, 1]], Plane partition [[1, 1, 1]], Plane partition [[2], [1]], Plane partition [[1, 1], [1]], Plane partition [[1], [1], [1]]]
>>> from sage.all import * >>> PlanePartitions(Integer(3)) Plane partitions of size 3 >>> PlanePartitions(Integer(3)).list() [Plane partition [[3]], Plane partition [[2, 1]], Plane partition [[1, 1, 1]], Plane partition [[2], [1]], Plane partition [[1, 1], [1]], Plane partition [[1], [1], [1]]]
If a three-element tuple or list \([a,b,c]\) is passed, then the class of all plane partitions that fit inside and \(a \times b \times c\) box is returned:
sage: PlanePartitions([2,2,2]) Plane partitions inside a 2 x 2 x 2 box sage: [[2,1],[1]] in PlanePartitions([2,2,2]) True
>>> from sage.all import * >>> PlanePartitions([Integer(2),Integer(2),Integer(2)]) Plane partitions inside a 2 x 2 x 2 box >>> [[Integer(2),Integer(1)],[Integer(1)]] in PlanePartitions([Integer(2),Integer(2),Integer(2)]) True
If an additional keyword
symmetry
is pass along with a three-element tuple or list \([a, b,c ]\), then the class of all plane partitions that fit inside an \(a \times b \times c\) box with the specified symmetry is returned:sage: PlanePartitions([2,2,2], symmetry='CSPP') Cyclically symmetric plane partitions inside a 2 x 2 x 2 box sage: [[2,1],[1]] in PlanePartitions([2,2,2], symmetry='CSPP') True
>>> from sage.all import * >>> PlanePartitions([Integer(2),Integer(2),Integer(2)], symmetry='CSPP') Cyclically symmetric plane partitions inside a 2 x 2 x 2 box >>> [[Integer(2),Integer(1)],[Integer(1)]] in PlanePartitions([Integer(2),Integer(2),Integer(2)], symmetry='CSPP') True
See also
- Element[source]#
alias of
PlanePartition
- box()[source]#
Return the size of the box of the plane partition of
self
is contained in.EXAMPLES:
sage: P = PlanePartitions([4,3,5]) sage: P.box() (4, 3, 5) sage: PP = PlanePartitions() sage: PP.box() is None True
>>> from sage.all import * >>> P = PlanePartitions([Integer(4),Integer(3),Integer(5)]) >>> P.box() (4, 3, 5) >>> PP = PlanePartitions() >>> PP.box() is None True
- symmetry()[source]#
Return the symmetry class of
self
.EXAMPLES:
sage: PP = PlanePartitions([3,3,2], symmetry='SPP') sage: PP.symmetry() 'SPP' sage: PP = PlanePartitions() sage: PP.symmetry() is None True
>>> from sage.all import * >>> PP = PlanePartitions([Integer(3),Integer(3),Integer(2)], symmetry='SPP') >>> PP.symmetry() 'SPP' >>> PP = PlanePartitions() >>> PP.symmetry() is None True
- class sage.combinat.plane_partition.PlanePartitions_CSPP(box_size)[source]#
Bases:
PlanePartitions
Plane partitions that fit inside a box of a specified size that are cyclically symmetric.
- cardinality()[source]#
Return the cardinality of
self
.The number of cyclically symmetric plane partitions inside an \(a \times a \times a\) box is equal to
\[\left(\prod_{i=1}^{a} \frac{3i - 1}{3i - 2}\right) \left(\prod_{1 \leq i < j \leq a} \frac{i+j+a-1}{2i+j-1}\right).\]EXAMPLES:
sage: P = PlanePartitions([4,4,4], symmetry='CSPP') sage: P.cardinality() 132
>>> from sage.all import * >>> P = PlanePartitions([Integer(4),Integer(4),Integer(4)], symmetry='CSPP') >>> P.cardinality() 132
- from_antichain(acl)[source]#
Return the cyclically symmetric plane partition corresponding to an antichain in the poset given in
to_poset()
.EXAMPLES:
sage: PP = PlanePartitions([3,3,3], symmetry='CSPP') sage: A = [(0, 2, 2), (1, 1, 1)] sage: PP.from_antichain(A) Plane partition [[3, 3, 3], [3, 2, 1], [3, 1, 1]]
>>> from sage.all import * >>> PP = PlanePartitions([Integer(3),Integer(3),Integer(3)], symmetry='CSPP') >>> A = [(Integer(0), Integer(2), Integer(2)), (Integer(1), Integer(1), Integer(1))] >>> PP.from_antichain(A) Plane partition [[3, 3, 3], [3, 2, 1], [3, 1, 1]]
- from_order_ideal(I)[source]#
Return the cylically symmetric plane partition corresponding to an order ideal in the poset given in
to_poset()
.EXAMPLES:
sage: PP = PlanePartitions([3,3,3], symmetry='CSPP') sage: I = [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 1), (0, 1, 2), ....: (1, 0, 2), (0, 2, 2), (1, 1, 1), (1, 1, 2), (1, 2, 2)] sage: PP.from_order_ideal(I) # needs sage.graphs Plane partition [[3, 3, 3], [3, 3, 3], [3, 3, 2]]
>>> from sage.all import * >>> PP = PlanePartitions([Integer(3),Integer(3),Integer(3)], symmetry='CSPP') >>> I = [(Integer(0), Integer(0), Integer(0)), (Integer(0), Integer(0), Integer(1)), (Integer(0), Integer(0), Integer(2)), (Integer(0), Integer(1), Integer(1)), (Integer(0), Integer(1), Integer(2)), ... (Integer(1), Integer(0), Integer(2)), (Integer(0), Integer(2), Integer(2)), (Integer(1), Integer(1), Integer(1)), (Integer(1), Integer(1), Integer(2)), (Integer(1), Integer(2), Integer(2))] >>> PP.from_order_ideal(I) # needs sage.graphs Plane partition [[3, 3, 3], [3, 3, 3], [3, 3, 2]]
- random_element()[source]#
Return a uniformly random element of
self
.ALGORITHM:
This uses the
random_order_ideal()
method and the natural bijection between cyclically symmetric plane partitions and order ideals in an associated poset.EXAMPLES:
sage: PP = PlanePartitions([3,3,3], symmetry='CSPP') sage: PP.random_element() # random # needs sage.graphs Plane partition [[3, 2, 2], [3, 1], [1, 1]]
>>> from sage.all import * >>> PP = PlanePartitions([Integer(3),Integer(3),Integer(3)], symmetry='CSPP') >>> PP.random_element() # random # needs sage.graphs Plane partition [[3, 2, 2], [3, 1], [1, 1]]
- to_poset()[source]#
Return a partially ordered set whose order ideals are in bijection with cyclically symmetric plane partitions.
EXAMPLES:
sage: PP = PlanePartitions([3,3,3], symmetry='CSPP') sage: PP.to_poset() # needs sage.graphs Finite poset containing 11 elements sage: PP.to_poset().order_ideals_lattice().cardinality() == PP.cardinality() # needs sage.graphs True
>>> from sage.all import * >>> PP = PlanePartitions([Integer(3),Integer(3),Integer(3)], symmetry='CSPP') >>> PP.to_poset() # needs sage.graphs Finite poset containing 11 elements >>> PP.to_poset().order_ideals_lattice().cardinality() == PP.cardinality() # needs sage.graphs True
- class sage.combinat.plane_partition.PlanePartitions_CSSCPP(box_size)[source]#
Bases:
PlanePartitions
Plane partitions that fit inside a box of a specified size that are cyclically symmetric self-complementary.
- cardinality()[source]#
Return the cardinality of
self
.The number of cyclically symmetric self-complementary plane partitions inside a \(2a \times 2a \times 2a\) box is equal to
\[\left( \prod_{i=0}^{a-1} \frac{(3i+1)!}{(a+i)!} \right)^2.\]EXAMPLES:
sage: P = PlanePartitions([6,6,6], symmetry='CSSCPP') sage: P.cardinality() 49
>>> from sage.all import * >>> P = PlanePartitions([Integer(6),Integer(6),Integer(6)], symmetry='CSSCPP') >>> P.cardinality() 49
- class sage.combinat.plane_partition.PlanePartitions_CSTCPP(box_size)[source]#
Bases:
PlanePartitions
Plane partitions that fit inside a box of a specified size that are cyclically symmetric and transpose-complement.
- cardinality()[source]#
Return the cardinality of
self
.The number of cyclically symmetric transpose complement plane partitions inside a \(2a \times 2a \times 2a\) box is equal to
\[\prod_{i=0}^{a-1} \frac{(3i+1)(6i)!(2i)!}{(4i+1)!(4i)!}.\]EXAMPLES:
sage: P = PlanePartitions([6,6,6], symmetry='CSTCPP') sage: P.cardinality() 11
>>> from sage.all import * >>> P = PlanePartitions([Integer(6),Integer(6),Integer(6)], symmetry='CSTCPP') >>> P.cardinality() 11
- class sage.combinat.plane_partition.PlanePartitions_SCPP(box_size)[source]#
Bases:
PlanePartitions
Plane partitions that fit inside a box of a specified size that are self-complementary.
- cardinality()[source]#
Return the cardinality of
self
.The number of self complementary plane partitions inside a \(2a \times 2b \times 2c\) box is equal to
\[\left(\prod_{i=1}^{r}\prod_{j=1}^{b} \frac{i + j + c - 1}{i + j - 1}\right)^2.\]The number of self complementary plane partitions inside an \((2a+1) \times 2b \times 2c\) box is equal to
\[\left(\prod_{i=1}^{a} \prod_{j=1}^{b} \frac{i+j+c-1}{i+j-1} \right) \left(\prod_{i=1}^{a+1} \prod_{j=1}^{b} \frac{i+j+c-1}{i+j-1} \right).\]The number of self complementary plane partitions inside an \((2a+1) \times (2b+1) \times 2c\) box is equal to
\[\left(\prod_{i=1}^{a+1} \prod_{j=1}^{b} \frac{i+j+c-1}{i+j-1} \right) \left(\prod_{i=1}^{a} \prod_{j=1}^{b+1} \frac{i+j+c-1}{i+j-1} \right).\]EXAMPLES:
sage: P = PlanePartitions([4,4,4], symmetry='SCPP') sage: P.cardinality() 400 sage: P = PlanePartitions([5,4,4], symmetry='SCPP') sage: P.cardinality() 1000 sage: P = PlanePartitions([4,5,4], symmetry='SCPP') sage: P.cardinality() 1000 sage: P = PlanePartitions([4,4,5], symmetry='SCPP') sage: P.cardinality() 1000 sage: P = PlanePartitions([5,5,4], symmetry='SCPP') sage: P.cardinality() 2500 sage: P = PlanePartitions([5,4,5], symmetry='SCPP') sage: P.cardinality() 2500 sage: P = PlanePartitions([4,5,5], symmetry='SCPP') sage: P.cardinality() 2500
>>> from sage.all import * >>> P = PlanePartitions([Integer(4),Integer(4),Integer(4)], symmetry='SCPP') >>> P.cardinality() 400 >>> P = PlanePartitions([Integer(5),Integer(4),Integer(4)], symmetry='SCPP') >>> P.cardinality() 1000 >>> P = PlanePartitions([Integer(4),Integer(5),Integer(4)], symmetry='SCPP') >>> P.cardinality() 1000 >>> P = PlanePartitions([Integer(4),Integer(4),Integer(5)], symmetry='SCPP') >>> P.cardinality() 1000 >>> P = PlanePartitions([Integer(5),Integer(5),Integer(4)], symmetry='SCPP') >>> P.cardinality() 2500 >>> P = PlanePartitions([Integer(5),Integer(4),Integer(5)], symmetry='SCPP') >>> P.cardinality() 2500 >>> P = PlanePartitions([Integer(4),Integer(5),Integer(5)], symmetry='SCPP') >>> P.cardinality() 2500
- class sage.combinat.plane_partition.PlanePartitions_SPP(box_size)[source]#
Bases:
PlanePartitions
Plane partitions that fit inside a box of a specified size that are symmetric.
- cardinality()[source]#
Return the cardinality of
self
.The number of symmetric plane partitions inside an \(a \times a \times b\) box is equal to
\[\left(\prod_{i=1}^{a} \frac{2i + b - 1}{2i - 1}\right) \left(\prod_{1 \leq i < j \leq a} \frac{i+j+b-1}{i+j-1}\right).\]EXAMPLES:
sage: P = PlanePartitions([3,3,2], symmetry='SPP') sage: P.cardinality() 35
>>> from sage.all import * >>> P = PlanePartitions([Integer(3),Integer(3),Integer(2)], symmetry='SPP') >>> P.cardinality() 35
- from_antichain(A)[source]#
Return the symmetric plane partition corresponding to an antichain in the poset given in
to_poset()
.EXAMPLES:
sage: PP = PlanePartitions([3,3,2], symmetry='SPP') sage: A = [(2, 2, 0), (1, 0, 1), (1, 1, 0)] sage: PP.from_antichain(A) Plane partition [[2, 2, 1], [2, 1, 1], [1, 1, 1]]
>>> from sage.all import * >>> PP = PlanePartitions([Integer(3),Integer(3),Integer(2)], symmetry='SPP') >>> A = [(Integer(2), Integer(2), Integer(0)), (Integer(1), Integer(0), Integer(1)), (Integer(1), Integer(1), Integer(0))] >>> PP.from_antichain(A) Plane partition [[2, 2, 1], [2, 1, 1], [1, 1, 1]]
- from_order_ideal(I)[source]#
Return the symmetric plane partition corresponding to an order ideal in the poset given in
to_poset()
.EXAMPLES:
sage: PP = PlanePartitions([3,3,2], symmetry='SPP') sage: I = [(0, 0, 0), (1, 0, 0), (1, 1, 0), (2, 0, 0)] sage: PP.from_order_ideal(I) # needs sage.graphs Plane partition [[1, 1, 1], [1, 1], [1]]
>>> from sage.all import * >>> PP = PlanePartitions([Integer(3),Integer(3),Integer(2)], symmetry='SPP') >>> I = [(Integer(0), Integer(0), Integer(0)), (Integer(1), Integer(0), Integer(0)), (Integer(1), Integer(1), Integer(0)), (Integer(2), Integer(0), Integer(0))] >>> PP.from_order_ideal(I) # needs sage.graphs Plane partition [[1, 1, 1], [1, 1], [1]]
- random_element()[source]#
Return a uniformly random element of
self
.ALGORITHM:
This uses the
random_order_ideal()
method and the natural bijection between symmetric plane partitions and order ideals in an associated poset.EXAMPLES:
sage: PP = PlanePartitions([3,3,2], symmetry='SPP') sage: PP.random_element() # random # needs sage.graphs Plane partition [[2, 2, 2], [2, 2], [2]]
>>> from sage.all import * >>> PP = PlanePartitions([Integer(3),Integer(3),Integer(2)], symmetry='SPP') >>> PP.random_element() # random # needs sage.graphs Plane partition [[2, 2, 2], [2, 2], [2]]
- to_poset()[source]#
Return a poset whose order ideals are in bijection with symmetric plane partitions.
EXAMPLES:
sage: PP = PlanePartitions([3,3,2], symmetry='SPP') sage: PP.to_poset() # needs sage.graphs Finite poset containing 12 elements sage: PP.to_poset().order_ideals_lattice().cardinality() == PP.cardinality() # needs sage.graphs sage.modules sage.rings.finite_rings True
>>> from sage.all import * >>> PP = PlanePartitions([Integer(3),Integer(3),Integer(2)], symmetry='SPP') >>> PP.to_poset() # needs sage.graphs Finite poset containing 12 elements >>> PP.to_poset().order_ideals_lattice().cardinality() == PP.cardinality() # needs sage.graphs sage.modules sage.rings.finite_rings True
- class sage.combinat.plane_partition.PlanePartitions_SSCPP(box_size)[source]#
Bases:
PlanePartitions
Plane partitions that fit inside a box of a specified size that are symmetric self-complementary.
- cardinality()[source]#
Return the cardinality of
self
.The number of symmetric self-complementary plane partitions inside a \(2a \times 2a \times 2b\) box is equal to
\[\prod_{i=1}^a \prod_{j=1}^a \frac{i + j + b - 1}{i + j - 1}.\]The number of symmetric self-complementary plane partitions inside a \((2a+1) \times (2a+1) \times 2b\) box is equal to
\[\prod_{i=1}^a \prod_{j=1}^{a+1} \frac{i + j + b - 1}{i + j - 1}.\]EXAMPLES:
sage: P = PlanePartitions([4,4,2], symmetry='SSCPP') sage: P.cardinality() 6 sage: Q = PlanePartitions([3,3,2], symmetry='SSCPP') sage: Q.cardinality() 3
>>> from sage.all import * >>> P = PlanePartitions([Integer(4),Integer(4),Integer(2)], symmetry='SSCPP') >>> P.cardinality() 6 >>> Q = PlanePartitions([Integer(3),Integer(3),Integer(2)], symmetry='SSCPP') >>> Q.cardinality() 3
- class sage.combinat.plane_partition.PlanePartitions_TCPP(box_size)[source]#
Bases:
PlanePartitions
Plane partitions that fit inside a box of a specified size that are transpose-complement.
- cardinality()[source]#
Return the cardinality of
self
.The number of transpose complement plane partitions inside an \(a \times a \times 2b\) box is equal to
\[\binom{b+1-1}{a-1} \prod_{1\leq i,j \leq a-2} \frac{i + j + 2b - 1}{i + j - 1}.\]EXAMPLES:
sage: P = PlanePartitions([3,3,2], symmetry='TCPP') sage: P.cardinality() 5
>>> from sage.all import * >>> P = PlanePartitions([Integer(3),Integer(3),Integer(2)], symmetry='TCPP') >>> P.cardinality() 5
- class sage.combinat.plane_partition.PlanePartitions_TSPP(box_size)[source]#
Bases:
PlanePartitions
Plane partitions that fit inside a box of a specified size that are totally symmetric.
- cardinality()[source]#
Return the cardinality of
self
.The number of totally symmetric plane partitions inside an \(a \times a \times a\) box is equal to
\[\prod_{1 \leq i \leq j \leq a} \frac{i+j+a-1}{i+2j-2}.\]EXAMPLES:
sage: P = PlanePartitions([4,4,4], symmetry='TSPP') sage: P.cardinality() 66
>>> from sage.all import * >>> P = PlanePartitions([Integer(4),Integer(4),Integer(4)], symmetry='TSPP') >>> P.cardinality() 66
- from_antichain(acl)[source]#
Return the totally symmetric plane partition corresponding to an antichain in the poset given in
to_poset()
.EXAMPLES:
sage: PP = PlanePartitions([3,3,3], symmetry='TSPP') sage: A = [(0, 0, 2), (0, 1, 1)] sage: PP.from_antichain(A) Plane partition [[3, 2, 1], [2, 1], [1]]
>>> from sage.all import * >>> PP = PlanePartitions([Integer(3),Integer(3),Integer(3)], symmetry='TSPP') >>> A = [(Integer(0), Integer(0), Integer(2)), (Integer(0), Integer(1), Integer(1))] >>> PP.from_antichain(A) Plane partition [[3, 2, 1], [2, 1], [1]]
- from_order_ideal(I)[source]#
Return the totally symmetric plane partition corresponding to an order ideal in the poset given in
to_poset()
.EXAMPLES:
sage: PP = PlanePartitions([3,3,3], symmetry='TSPP') sage: I = [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 1)] sage: PP.from_order_ideal(I) # needs sage.graphs Plane partition [[3, 2, 1], [2, 1], [1]]
>>> from sage.all import * >>> PP = PlanePartitions([Integer(3),Integer(3),Integer(3)], symmetry='TSPP') >>> I = [(Integer(0), Integer(0), Integer(0)), (Integer(0), Integer(0), Integer(1)), (Integer(0), Integer(0), Integer(2)), (Integer(0), Integer(1), Integer(1))] >>> PP.from_order_ideal(I) # needs sage.graphs Plane partition [[3, 2, 1], [2, 1], [1]]
- to_poset()[source]#
Return a poset whose order ideals are in bijection with totally symmetric plane partitions.
EXAMPLES:
sage: PP = PlanePartitions([3,3,3], symmetry='TSPP') sage: PP.to_poset() # needs sage.graphs Finite poset containing 10 elements sage: (PP.to_poset().order_ideals_lattice().cardinality() # needs sage.graphs sage.modules sage.rings.finite_rings ....: == PP.cardinality()) True
>>> from sage.all import * >>> PP = PlanePartitions([Integer(3),Integer(3),Integer(3)], symmetry='TSPP') >>> PP.to_poset() # needs sage.graphs Finite poset containing 10 elements >>> (PP.to_poset().order_ideals_lattice().cardinality() # needs sage.graphs sage.modules sage.rings.finite_rings ... == PP.cardinality()) True
- class sage.combinat.plane_partition.PlanePartitions_TSSCPP(box_size)[source]#
Bases:
PlanePartitions
Plane partitions that fit inside a box of a specified size that are totally symmetric self-complementary.
- cardinality()[source]#
Return the cardinality of
self
.The number of totally symmetric self-complementary plane partitions inside a \(2a \times 2a \times 2a\) box is equal to
\[\prod_{i=0}^{a-1} \frac{(3i+1)!}{(a+i)!}.\]EXAMPLES:
sage: P = PlanePartitions([6,6,6], symmetry='TSSCPP') sage: P.cardinality() 7
>>> from sage.all import * >>> P = PlanePartitions([Integer(6),Integer(6),Integer(6)], symmetry='TSSCPP') >>> P.cardinality() 7
- from_antichain(acl)[source]#
Return the totally symmetric self-complementary plane partition corresponding to an antichain in the poset given in
to_poset()
.EXAMPLES:
sage: PP = PlanePartitions([6,6,6], symmetry='TSSCPP') sage: A = [(0, 0, 1), (1, 1, 0)] sage: PP.from_antichain(A) Plane partition [[6, 6, 6, 5, 5, 3], [6, 5, 5, 4, 3, 1], [6, 5, 4, 3, 2, 1], [5, 4, 3, 2, 1], [5, 3, 2, 1, 1], [3, 1, 1]]
>>> from sage.all import * >>> PP = PlanePartitions([Integer(6),Integer(6),Integer(6)], symmetry='TSSCPP') >>> A = [(Integer(0), Integer(0), Integer(1)), (Integer(1), Integer(1), Integer(0))] >>> PP.from_antichain(A) Plane partition [[6, 6, 6, 5, 5, 3], [6, 5, 5, 4, 3, 1], [6, 5, 4, 3, 2, 1], [5, 4, 3, 2, 1], [5, 3, 2, 1, 1], [3, 1, 1]]
- from_order_ideal(I)[source]#
Return the totally symmetric self-complementary plane partition corresponding to an order ideal in the poset given in
to_poset()
.EXAMPLES:
sage: PP = PlanePartitions([6,6,6], symmetry='TSSCPP') # needs sage.graphs sage: I = [(0, 0, 0), (0, 1, 0), (1, 1, 0)] sage: PP.from_order_ideal(I) # needs sage.graphs Plane partition [[6, 6, 6, 5, 5, 3], [6, 5, 5, 3, 3, 1], [6, 5, 5, 3, 3, 1], [5, 3, 3, 1, 1], [5, 3, 3, 1, 1], [3, 1, 1]]
>>> from sage.all import * >>> PP = PlanePartitions([Integer(6),Integer(6),Integer(6)], symmetry='TSSCPP') # needs sage.graphs >>> I = [(Integer(0), Integer(0), Integer(0)), (Integer(0), Integer(1), Integer(0)), (Integer(1), Integer(1), Integer(0))] >>> PP.from_order_ideal(I) # needs sage.graphs Plane partition [[6, 6, 6, 5, 5, 3], [6, 5, 5, 3, 3, 1], [6, 5, 5, 3, 3, 1], [5, 3, 3, 1, 1], [5, 3, 3, 1, 1], [3, 1, 1]]
- to_poset()[source]#
Return a poset whose order ideals are in bijection with totally symmetric self-complementary plane partitions.
EXAMPLES:
sage: PP = PlanePartitions([6,6,6], symmetry='TSSCPP') sage: PP.to_poset() # needs sage.graphs sage.modules Finite poset containing 4 elements sage: PP.to_poset().order_ideals_lattice().cardinality() == PP.cardinality() # needs sage.graphs sage.modules True
>>> from sage.all import * >>> PP = PlanePartitions([Integer(6),Integer(6),Integer(6)], symmetry='TSSCPP') >>> PP.to_poset() # needs sage.graphs sage.modules Finite poset containing 4 elements >>> PP.to_poset().order_ideals_lattice().cardinality() == PP.cardinality() # needs sage.graphs sage.modules True
- class sage.combinat.plane_partition.PlanePartitions_all[source]#
Bases:
PlanePartitions
,DisjointUnionEnumeratedSets
All plane partitions.
- class sage.combinat.plane_partition.PlanePartitions_box(box_size)[source]#
Bases:
PlanePartitions
All plane partitions that fit inside a box of a specified size.
By convention, a plane partition in an \(a \times b \times c\) box will have at most \(a\) rows, of lengths at most \(b\), with entries at most \(c\).
- cardinality()[source]#
Return the cardinality of
self
.The number of plane partitions inside an \(a \times b \times c\) box is equal to
\[\prod_{i=1}^{a} \prod_{j=1}^{b} \prod_{k=1}^{c} \frac{i+j+k-1}{i+j+k-2}.\]EXAMPLES:
sage: P = PlanePartitions([4,3,5]) sage: P.cardinality() 116424
>>> from sage.all import * >>> P = PlanePartitions([Integer(4),Integer(3),Integer(5)]) >>> P.cardinality() 116424
- from_antichain(A)[source]#
Return the plane partition corresponding to an antichain in the poset given in
to_poset()
.EXAMPLES:
sage: A = [(1,0,1), (0,1,1), (1,1,0)] sage: PlanePartitions([2,2,2]).from_antichain(A) Plane partition [[2, 2], [2, 1]]
>>> from sage.all import * >>> A = [(Integer(1),Integer(0),Integer(1)), (Integer(0),Integer(1),Integer(1)), (Integer(1),Integer(1),Integer(0))] >>> PlanePartitions([Integer(2),Integer(2),Integer(2)]).from_antichain(A) Plane partition [[2, 2], [2, 1]]
- from_order_ideal(I)[source]#
Return the plane partition corresponding to an order ideal in the poset given in
to_poset()
.EXAMPLES:
sage: I = [(1, 0, 0), (1, 0, 1), (1, 1, 0), (0, 1, 0), ....: (0, 0, 0), (0, 0, 1), (0, 1, 1)] sage: PlanePartitions([2,2,2]).from_order_ideal(I) # needs sage.graphs sage.modules Plane partition [[2, 2], [2, 1]]
>>> from sage.all import * >>> I = [(Integer(1), Integer(0), Integer(0)), (Integer(1), Integer(0), Integer(1)), (Integer(1), Integer(1), Integer(0)), (Integer(0), Integer(1), Integer(0)), ... (Integer(0), Integer(0), Integer(0)), (Integer(0), Integer(0), Integer(1)), (Integer(0), Integer(1), Integer(1))] >>> PlanePartitions([Integer(2),Integer(2),Integer(2)]).from_order_ideal(I) # needs sage.graphs sage.modules Plane partition [[2, 2], [2, 1]]
- random_element()[source]#
Return a uniformly random plane partition inside a box.
ALGORITHM:
This uses the
random_order_ideal()
method and the natural bijection with plane partitions.EXAMPLES:
sage: P = PlanePartitions([4,3,5]) sage: P.random_element() # random # needs sage.graphs sage.modules Plane partition [[4, 3, 3], [4], [2]]
>>> from sage.all import * >>> P = PlanePartitions([Integer(4),Integer(3),Integer(5)]) >>> P.random_element() # random # needs sage.graphs sage.modules Plane partition [[4, 3, 3], [4], [2]]
- to_poset()[source]#
Return the product of three chains poset, whose order ideals are naturally in bijection with plane partitions inside a box.
EXAMPLES:
sage: PlanePartitions([2,2,2]).to_poset() # needs sage.graphs sage.modules Finite lattice containing 8 elements
>>> from sage.all import * >>> PlanePartitions([Integer(2),Integer(2),Integer(2)]).to_poset() # needs sage.graphs sage.modules Finite lattice containing 8 elements
- class sage.combinat.plane_partition.PlanePartitions_n(n)[source]#
Bases:
PlanePartitions
Plane partitions with a fixed number of boxes.
- cardinality()[source]#
Return the number of plane partitions with
n
boxes.Calculated using the recurrence relation
\[PL(n) = \sum_{k=1}^n PL(n-k) \sigma_2(k),\]where \(\sigma_k(n)\) is the sum of the \(k\)-th powers of divisors of \(n\).
EXAMPLES:
sage: P = PlanePartitions(17) sage: P.cardinality() 18334
>>> from sage.all import * >>> P = PlanePartitions(Integer(17)) >>> P.cardinality() 18334