Cyclic sieving phenomenon

Implementation of the Cyclic Sieving Phenomenon as described by Reiner, Stanton, and White in [RSW2004].

We define the CyclicSievingPolynomial() of a finite set \(S\) together with cyclic action cyc_act (of order \(n\)) to be the unique polynomial P(q) of order < \(n\) such that the triple (\(S\), cyc_act, P(q)) exhibits the cyclic sieving phenomenon.

AUTHORS:

  • Christian Stump

REFERENCES:

[RSW2004]Reiner, Stanton, White - The cyclic sieving phenomenon, Journal of Combinatorial Theory A 108 (2004)
sage.combinat.cyclic_sieving_phenomenon.CyclicSievingCheck(L, cyc_act, f, order=None)

Return whether the triple (L, cyc_act, f) exhibits the cyclic sieving phenomenon.

If cyc_act is None, L is expected to contain the orbit lengths.

INPUT:

  • L – if cyc_act is None: list of orbit sizes, otherwise list of objects
  • cyc_act – (default:None) bijective function from L to L
  • order – (default:None) if set to an integer, this
    cyclic order of cyc_act is used (must be an integer multiple of the order of cyc_act) otherwise, the order of cyc_action is used

EXAMPLES:

sage: from sage.combinat.cyclic_sieving_phenomenon import *
sage: from sage.combinat.q_analogues import q_binomial
sage: S42 = Subsets([1,2,3,4], 2)
sage: def cyc_act(S): return Set(i.mod(4) + 1 for i in S)
sage: cyc_act([1,3])
{2, 4}
sage: cyc_act([1,4])
{1, 2}
sage: p = q_binomial(4,2); p
q^4 + q^3 + 2*q^2 + q + 1
sage: CyclicSievingPolynomial( S42, cyc_act )
q^3 + 2*q^2 + q + 2
sage: CyclicSievingCheck( S42, cyc_act, p )
True
sage.combinat.cyclic_sieving_phenomenon.CyclicSievingPolynomial(L, cyc_act=None, order=None, get_order=False)

Return the unique polynomial p of degree smaller than order such that the triple (L, cyc_act, p) exhibits the Cyclic Sieving Phenomenon.

If cyc_act is None, L is expected to contain the orbit lengths.

INPUT:

  • L – if cyc_act is None: list of orbit sizes, otherwise list of objects
  • cyc_act – (default:None) bijective function from L to L
  • order – (default:None) if set to an integer, this
    cyclic order of cyc_act is used (must be an integer multiple of the order of cyc_act) otherwise, the order of cyc_action is used
  • get_order – (default:False) if True, a tuple [p,n] is returned where p is as above, and n is the order

EXAMPLES:

sage: from sage.combinat.cyclic_sieving_phenomenon import CyclicSievingPolynomial
sage: S42 = Subsets([1,2,3,4], 2)
sage: def cyc_act(S): return Set(i.mod(4) + 1 for i in S)
sage: cyc_act([1,3])
{2, 4}
sage: cyc_act([1,4])
{1, 2}
sage: CyclicSievingPolynomial(S42, cyc_act)
q^3 + 2*q^2 + q + 2
sage: CyclicSievingPolynomial(S42, cyc_act, get_order=True)
[q^3 + 2*q^2 + q + 2, 4]
sage: CyclicSievingPolynomial(S42, cyc_act, order=8)
q^6 + 2*q^4 + q^2 + 2
sage: CyclicSievingPolynomial([4,2])
q^3 + 2*q^2 + q + 2
sage.combinat.cyclic_sieving_phenomenon.orbit_decomposition(L, cyc_act)

Return the orbit decomposition of L by the action of cyc_act.

INPUT:

  • L – list
  • cyc_act – bijective function from L to L

OUTPUT:

  • a list of lists, the orbits under the cyc_act acting on L

EXAMPLES:

sage: from sage.combinat.cyclic_sieving_phenomenon import *
sage: S42 = Subsets([1,2,3,4], 2); S42
Subsets of {1, 2, 3, 4} of size 2
sage: def cyc_act(S): return Set(i.mod(4) + 1 for i in S)
sage: cyc_act([1,3])
{2, 4}
sage: cyc_act([1,4])
{1, 2}
sage: orbits = orbit_decomposition(S42, cyc_act)
sage: sorted([sorted(orb, key=sorted) for orb in orbits], key=len)
[[{1, 3}, {2, 4}], [{1, 2}, {1, 4}, {2, 3}, {3, 4}]]