Fast computation of combinatorial functions (Cython + mpz)¶
Currently implemented:
Stirling numbers of the second kind
iterators for set partitions
iterator for Lyndon words
iterator for perfect matchings
conjugate of partitions
AUTHORS:
Fredrik Johansson (2010-10): Stirling numbers of second kind
Martin Rubey and Travis Scrimshaw (2018): iterators for set partitions, Lyndon words, and perfect matchings
- sage.combinat.combinat_cython.conjugate(p)[source]¶
Return the conjugate partition associated to the partition
p
as a list.EXAMPLES:
sage: from sage.combinat.combinat_cython import conjugate sage: conjugate([2,2]) [2, 2] sage: conjugate([6,3,1]) [3, 2, 2, 1, 1, 1]
>>> from sage.all import * >>> from sage.combinat.combinat_cython import conjugate >>> conjugate([Integer(2),Integer(2)]) [2, 2] >>> conjugate([Integer(6),Integer(3),Integer(1)]) [3, 2, 2, 1, 1, 1]
- sage.combinat.combinat_cython.lyndon_word_iterator(n, k)[source]¶
Generate the Lyndon words of fixed length
k
withn
letters.The resulting Lyndon words will be words represented as lists whose alphabet is
range(n)
(\(= \{0, 1, \ldots, n-1\}\)).ALGORITHM:
The iterative FKM Algorithm 7.2 from [Rus2003].
EXAMPLES:
sage: from sage.combinat.combinat_cython import lyndon_word_iterator sage: list(lyndon_word_iterator(4, 2)) [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]] sage: list(lyndon_word_iterator(2, 4)) [[0, 0, 0, 1], [0, 0, 1, 1], [0, 1, 1, 1]]
>>> from sage.all import * >>> from sage.combinat.combinat_cython import lyndon_word_iterator >>> list(lyndon_word_iterator(Integer(4), Integer(2))) [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]] >>> list(lyndon_word_iterator(Integer(2), Integer(4))) [[0, 0, 0, 1], [0, 0, 1, 1], [0, 1, 1, 1]]
- sage.combinat.combinat_cython.perfect_matchings_iterator(n)[source]¶
Iterate over all perfect matchings with
n
parts.This iterates over all perfect matchings of \(\{0, 1, \ldots, 2n-1\}\) using a Gray code for fixed-point-free involutions due to Walsh [Wal2001].
EXAMPLES:
sage: from sage.combinat.combinat_cython import perfect_matchings_iterator sage: list(perfect_matchings_iterator(1)) [[(0, 1)]] sage: list(perfect_matchings_iterator(2)) [[(0, 1), (2, 3)], [(0, 2), (1, 3)], [(0, 3), (1, 2)]] sage: list(perfect_matchings_iterator(0)) [[]]
>>> from sage.all import * >>> from sage.combinat.combinat_cython import perfect_matchings_iterator >>> list(perfect_matchings_iterator(Integer(1))) [[(0, 1)]] >>> list(perfect_matchings_iterator(Integer(2))) [[(0, 1), (2, 3)], [(0, 2), (1, 3)], [(0, 3), (1, 2)]] >>> list(perfect_matchings_iterator(Integer(0))) [[]]
REFERENCES:
- sage.combinat.combinat_cython.set_partition_composition(sp1, sp2)[source]¶
Return a tuple consisting of the composition of the set partitions
sp1
andsp2
and the number of components removed from the middle rows of the graph.EXAMPLES:
sage: from sage.combinat.combinat_cython import set_partition_composition sage: sp1 = ((1,-2),(2,-1)) sage: sp2 = ((1,-2),(2,-1)) sage: p, c = set_partition_composition(sp1, sp2) sage: (SetPartition(p), c) == (SetPartition([[1,-1],[2,-2]]), 0) # needs sage.combinat True
>>> from sage.all import * >>> from sage.combinat.combinat_cython import set_partition_composition >>> sp1 = ((Integer(1),-Integer(2)),(Integer(2),-Integer(1))) >>> sp2 = ((Integer(1),-Integer(2)),(Integer(2),-Integer(1))) >>> p, c = set_partition_composition(sp1, sp2) >>> (SetPartition(p), c) == (SetPartition([[Integer(1),-Integer(1)],[Integer(2),-Integer(2)]]), Integer(0)) # needs sage.combinat True