Necklaces

The algorithm used in this file comes from

  • Sawada, Joe. “A fast algorithm to generate necklaces with fixed content”, Source Theoretical Computer Science archive Volume 301 , Issue 1-3 (May 2003)
sage.combinat.necklace.Necklaces(content)

Return the set of necklaces with evaluation content.

A necklace is a list of integers that such that the list is the smallest lexicographic representative of all the cyclic shifts of the list.

See also

LyndonWords

INPUT:

  • content – a list or tuple of non-negative integers

EXAMPLES:

sage: Necklaces([2,1,1])
Necklaces with evaluation [2, 1, 1]
sage: Necklaces([2,1,1]).cardinality()
3
sage: Necklaces([2,1,1]).first()
[1, 1, 2, 3]
sage: Necklaces([2,1,1]).last()
[1, 2, 1, 3]
sage: Necklaces([2,1,1]).list()
[[1, 1, 2, 3], [1, 1, 3, 2], [1, 2, 1, 3]]
sage: Necklaces([0,2,1,1]).list()
[[2, 2, 3, 4], [2, 2, 4, 3], [2, 3, 2, 4]]
sage: Necklaces([2,0,1,1]).list()
[[1, 1, 3, 4], [1, 1, 4, 3], [1, 3, 1, 4]]
class sage.combinat.necklace.Necklaces_evaluation(content)

Bases: sage.structure.unique_representation.UniqueRepresentation, sage.structure.parent.Parent

Necklaces with a fixed evaluation (content).

INPUT:

  • content – a list or tuple of non-negative integers
cardinality()

Return the number of integer necklaces with the evaluation content.

The formula for the number of necklaces of content \(\alpha\) a composition of \(n\) is:

\[\sum_{d|gcd(\alpha)} \phi(d) \binom{n/d}{\alpha_1/d, \ldots, \alpha_\ell/d},\]

where \(\phi(d)\) is the Euler \(\phi\) function.

EXAMPLES:

sage: Necklaces([]).cardinality()
0
sage: Necklaces([2,2]).cardinality()
2
sage: Necklaces([2,3,2]).cardinality()
30
sage: Necklaces([0,3,2]).cardinality()
2

Check to make sure that the count matches up with the number of necklace words generated.

sage: comps = [[],[2,2],[3,2,7],[4,2],[0,4,2],[2,0,4]]+Compositions(4).list()
sage: ns = [Necklaces(comp) for comp in comps]
sage: all(n.cardinality() == len(n.list()) for n in ns)
True
content()

Return the content (or evaluation) of the necklaces.