The Fusion Ring of the Drinfeld Double of a Finite Group¶
- class sage.algebras.fusion_rings.fusion_double.FusionDouble(G, prefix='s')[source]¶
Bases:
CombinatorialFreeModule
The fusion ring corresponding to the Drinfeld double of a finite group.
This is the fusion ring of the modular tensor category of modules over the Drinfeld double of a finite group. Usage is similar to
FusionRing
; we refer the reader to that class for more information.INPUT:
G
– a finite groupprefix
– (default:'s'
) a prefix for the names of simple objectsinject_varables
– (optional) set toTrue
to create variables for the simple objects
REFERENCES:
[BaKi2001] Chapter 3
EXAMPLES:
sage: G = DihedralGroup(5) sage: H = FusionDouble(G, inject_variables=True) sage: H.basis() Finite family {0: s0, 1: s1, 2: s2, 3: s3, 4: s4, 5: s5, 6: s6, 7: s7, 8: s8, 9: s9, 10: s10, 11: s11, 12: s12, 13: s13, 14: s14, 15: s15} sage: for x in H.basis(): ....: print ("%s : %s"%(x,x^2)) ....: s0 : s0 s1 : s0 s2 : s0 + s1 + s3 s3 : s0 + s1 + s2 s4 : s0 + s2 + s3 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15 s5 : s0 + s2 + s3 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15 s6 : s0 + s1 + s11 s7 : s0 + s1 + s13 s8 : s0 + s1 + s15 s9 : s0 + s1 + s12 s10 : s0 + s1 + s14 s11 : s0 + s1 + s6 s12 : s0 + s1 + s9 s13 : s0 + s1 + s7 s14 : s0 + s1 + s10 s15 : s0 + s1 + s8 sage: s4*s5 s1 + s2 + s3 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15 sage: s4.ribbon() 1 sage: s5.ribbon() -1 sage: s8.ribbon() zeta5^3
>>> from sage.all import * >>> G = DihedralGroup(Integer(5)) >>> H = FusionDouble(G, inject_variables=True) >>> H.basis() Finite family {0: s0, 1: s1, 2: s2, 3: s3, 4: s4, 5: s5, 6: s6, 7: s7, 8: s8, 9: s9, 10: s10, 11: s11, 12: s12, 13: s13, 14: s14, 15: s15} >>> for x in H.basis(): ... print ("%s : %s"%(x,x**Integer(2))) ....: s0 : s0 s1 : s0 s2 : s0 + s1 + s3 s3 : s0 + s1 + s2 s4 : s0 + s2 + s3 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15 s5 : s0 + s2 + s3 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15 s6 : s0 + s1 + s11 s7 : s0 + s1 + s13 s8 : s0 + s1 + s15 s9 : s0 + s1 + s12 s10 : s0 + s1 + s14 s11 : s0 + s1 + s6 s12 : s0 + s1 + s9 s13 : s0 + s1 + s7 s14 : s0 + s1 + s10 s15 : s0 + s1 + s8 >>> s4*s5 s1 + s2 + s3 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15 >>> s4.ribbon() 1 >>> s5.ribbon() -1 >>> s8.ribbon() zeta5^3
G = DihedralGroup(5) H = FusionDouble(G, inject_variables=True) H.basis() for x in H.basis(): print ("%s : %s"%(x,x^2)) s4*s5 s4.ribbon() s5.ribbon() s8.ribbon()
If the fusion double is multiplicity-free, meaning that the fusion coefficients
are bounded by , then the F-matrix may be computed, by solving the pentagon and hexagon relations as described in [Bond2007] and [Ab2022], just as forFusionRing
. There is a caveat here, since even if the fusion rules are multiplicity-free, if there are too many F-matrix values to compute, even if many of them are zero, in the current implementation singular cannot create enough variables. At least, this code can compute the F-matrix for the Fusion Double of the symmetric group , duplicating the result of [CHW2015].sage: G1 = SymmetricGroup(3) sage: H1 = FusionDouble(G1, prefix='u', inject_variables=True) sage: F = H1.get_fmatrix()
>>> from sage.all import * >>> G1 = SymmetricGroup(Integer(3)) >>> H1 = FusionDouble(G1, prefix='u', inject_variables=True) >>> F = H1.get_fmatrix()
G1 = SymmetricGroup(3) H1 = FusionDouble(G1, prefix='u', inject_variables=True) F = H1.get_fmatrix()
The above commands create the F-matrix. You can compute all of the F-matrices with the command:
sage: H1.find_orthogonal_solution() # not tested (10-15 minutes)
>>> from sage.all import * >>> H1.find_orthogonal_solution() # not tested (10-15 minutes)
H1.find_orthogonal_solution() # not tested (10-15 minutes)
Individual F-matrices may be computed thus:
sage: F.fmatrix(u3, u3, u3, u4) # not tested
>>> from sage.all import * >>> F.fmatrix(u3, u3, u3, u4) # not tested
F.fmatrix(u3, u3, u3, u4) # not tested
See
FMatrix
for more information.Unfortunately beyond
the number of simple objects is seemingly impractical. Although theFusionDouble
class and its methods work well for groups of moderate size, theFMatrix
may not be computable. For the dihedral group of order 8, there are already 22 simple objects, and the F-matrix seems out of reach. The actual limitation is that singular will not create a polynomial ring in more than symbols, and there are more than this many F-matrix values to be computed for the dihedral group of order 8, so in the current implementation, this FusionRing is out of reach.It is an open problem to classify the finite groups whose fusion doubles are multiplicity-free. Abelian groups, dihedral groups, dicyclic groups, and all groups of order 16 are multiplicity-free. On the other hand, for groups of order 32, some are multiplicity-free and others are not. These can all be constructed using
SmallPermutationGroup
.EXAMPLES:
sage: G = SmallPermutationGroup(16,9) sage: F = FusionDouble(G, prefix='b', inject_variables=True) sage: b13^2 # long time (4s) b0 + b3 + b4
>>> from sage.all import * >>> G = SmallPermutationGroup(Integer(16),Integer(9)) >>> F = FusionDouble(G, prefix='b', inject_variables=True) >>> b13**Integer(2) # long time (4s) b0 + b3 + b4
G = SmallPermutationGroup(16,9) F = FusionDouble(G, prefix='b', inject_variables=True) b13^2 # long time (4s)
- D_minus(base_coercion=True)[source]¶
Return the positive square root of
self.global_q_dimension()
as an element ofself.field()
.For the Drinfeld double of a finite group
, this equals the cardinality of . This is also equal to , where runs through the simple objects, is the quantum dimension, and is the twist. This sum with is denoted in [BaKi2001] Chapter 3.EXAMPLES:
sage: FusionDouble(DihedralGroup(7)).total_q_order() 14
>>> from sage.all import * >>> FusionDouble(DihedralGroup(Integer(7))).total_q_order() 14
FusionDouble(DihedralGroup(7)).total_q_order()
- D_plus(base_coercion=True)[source]¶
Return the positive square root of
self.global_q_dimension()
as an element ofself.field()
.For the Drinfeld double of a finite group
, this equals the cardinality of . This is also equal to , where runs through the simple objects, is the quantum dimension, and is the twist. This sum with is denoted in [BaKi2001] Chapter 3.EXAMPLES:
sage: FusionDouble(DihedralGroup(7)).total_q_order() 14
>>> from sage.all import * >>> FusionDouble(DihedralGroup(Integer(7))).total_q_order() 14
FusionDouble(DihedralGroup(7)).total_q_order()
- class Element[source]¶
Bases:
IndexedFreeModuleElement
- char()[source]¶
Return the character
corresponding toself
.The data determining a simple object consists of a conjugacy class representative
and an irreducible character of the centralizer of .See also
EXAMPLES:
sage: G = DihedralGroup(5) sage: H = FusionDouble(G, prefix='f', inject_variables=True) sage: f10.g() (1,2,3,4,5) sage: f10.char() Character of Subgroup generated by [(1,2,3,4,5)] of (Dihedral group of order 10 as a permutation group)
>>> from sage.all import * >>> G = DihedralGroup(Integer(5)) >>> H = FusionDouble(G, prefix='f', inject_variables=True) >>> f10.g() (1,2,3,4,5) >>> f10.char() Character of Subgroup generated by [(1,2,3,4,5)] of (Dihedral group of order 10 as a permutation group)
G = DihedralGroup(5) H = FusionDouble(G, prefix='f', inject_variables=True) f10.g() f10.char()
- dual()[source]¶
Return the dual of
self
.This method is only available for simple objects.
EXAMPLES:
sage: G = CyclicPermutationGroup(4) sage: H = FusionDouble(G, prefix='j') sage: [x for x in H.basis() if x == x.dual()] [j0, j1, j8, j9]
>>> from sage.all import * >>> G = CyclicPermutationGroup(Integer(4)) >>> H = FusionDouble(G, prefix='j') >>> [x for x in H.basis() if x == x.dual()] [j0, j1, j8, j9]
G = CyclicPermutationGroup(4) H = FusionDouble(G, prefix='j') [x for x in H.basis() if x == x.dual()]
- g()[source]¶
The data determining a simple object consists of a conjugacy class representative
and an irreducible character of the centralizer of .This returns the conjugacy class representative of the underlying group corresponding to a simple object. See also
char()
.EXAMPLES:
sage: G = QuaternionGroup() sage: H = FusionDouble(G, prefix='e', inject_variables=True) sage: e10.g() (1,3)(2,4)(5,7)(6,8) sage: e10.char() Character of Subgroup generated by [(1,2,3,4)(5,6,7,8), (1,5,3,7)(2,8,4,6)] of (Quaternion group of order 8 as a permutation group)
>>> from sage.all import * >>> G = QuaternionGroup() >>> H = FusionDouble(G, prefix='e', inject_variables=True) >>> e10.g() (1,3)(2,4)(5,7)(6,8) >>> e10.char() Character of Subgroup generated by [(1,2,3,4)(5,6,7,8), (1,5,3,7)(2,8,4,6)] of (Quaternion group of order 8 as a permutation group)
G = QuaternionGroup() H = FusionDouble(G, prefix='e', inject_variables=True) e10.g() e10.char()
- is_simple_object()[source]¶
Determine whether
self
is a simple object (basis element) of the fusion ring.EXAMPLES:
sage: H = FusionDouble(CyclicPermutationGroup(2), prefix='g', inject_variables=True) sage: [x.is_simple_object() for x in [g0, g1, g0+g1]] [True, True, False]
>>> from sage.all import * >>> H = FusionDouble(CyclicPermutationGroup(Integer(2)), prefix='g', inject_variables=True) >>> [x.is_simple_object() for x in [g0, g1, g0+g1]] [True, True, False]
H = FusionDouble(CyclicPermutationGroup(2), prefix='g', inject_variables=True) [x.is_simple_object() for x in [g0, g1, g0+g1]]
- q_dimension(base_coercion=True)[source]¶
Return the q-dimension of
self
.This method is only available for simple objects.
EXAMPLES:
sage: G = AlternatingGroup(4) sage: H = FusionDouble(G) sage: [x.q_dimension() for x in H.basis()] [1, 1, 1, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4] sage: sum(x.q_dimension()^2 for x in H.basis()) == G.order()^2 True
>>> from sage.all import * >>> G = AlternatingGroup(Integer(4)) >>> H = FusionDouble(G) >>> [x.q_dimension() for x in H.basis()] [1, 1, 1, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4] >>> sum(x.q_dimension()**Integer(2) for x in H.basis()) == G.order()**Integer(2) True
G = AlternatingGroup(4) H = FusionDouble(G) [x.q_dimension() for x in H.basis()] sum(x.q_dimension()^2 for x in H.basis()) == G.order()^2
- ribbon(base_coercion=True)[source]¶
Return the twist or ribbon of the simple object.
EXAMPLES:
sage: H = FusionDouble(CyclicPermutationGroup(3)) sage: [i.ribbon() for i in H.basis()] [1, 1, 1, 1, zeta3, -zeta3 - 1, 1, -zeta3 - 1, zeta3]
>>> from sage.all import * >>> H = FusionDouble(CyclicPermutationGroup(Integer(3))) >>> [i.ribbon() for i in H.basis()] [1, 1, 1, 1, zeta3, -zeta3 - 1, 1, -zeta3 - 1, zeta3]
H = FusionDouble(CyclicPermutationGroup(3)) [i.ribbon() for i in H.basis()]
- twist(reduced=True)[source]¶
Return a rational number
such that is the twist ofself
.The quantity
is also available usingribbon()
.This method is only available for simple objects.
EXAMPLES:
sage: Q=FusionDouble(CyclicPermutationGroup(3)) sage: [x.twist() for x in Q.basis()] [0, 0, 0, 0, 2/3, 4/3, 0, 4/3, 2/3] sage: [x.ribbon() for x in Q.basis()] [1, 1, 1, 1, zeta3, -zeta3 - 1, 1, -zeta3 - 1, zeta3]
>>> from sage.all import * >>> Q=FusionDouble(CyclicPermutationGroup(Integer(3))) >>> [x.twist() for x in Q.basis()] [0, 0, 0, 0, 2/3, 4/3, 0, 4/3, 2/3] >>> [x.ribbon() for x in Q.basis()] [1, 1, 1, 1, zeta3, -zeta3 - 1, 1, -zeta3 - 1, zeta3]
Q=FusionDouble(CyclicPermutationGroup(3)) [x.twist() for x in Q.basis()] [x.ribbon() for x in Q.basis()]
- N_ijk(i, j, k)[source]¶
The symmetric invariant of three simple objects.
This is the dimension of
where
is the unit element (assumingprefix='s'
). Method of computation is through the Verlinde formula, deducing the values from the known values of the -matrix.EXAMPLES:
sage: A = FusionDouble(AlternatingGroup(4),prefix='a',inject_variables=True) sage: [A.N_ijk(a10,a11,x) for x in A.basis()] [0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
>>> from sage.all import * >>> A = FusionDouble(AlternatingGroup(Integer(4)),prefix='a',inject_variables=True) >>> [A.N_ijk(a10,a11,x) for x in A.basis()] [0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
A = FusionDouble(AlternatingGroup(4),prefix='a',inject_variables=True) [A.N_ijk(a10,a11,x) for x in A.basis()]
- Nk_ij(i, j, k, use_characters=False)[source]¶
Return the fusion coefficient
.INPUT:
i
,j
,k
– basis elementsuse_characters
– boolean (default:False
); see the algorithm description below
ALGORITHM:
If
use_characters=False
, then this is computed using the Verlinde formula:Otherwise we use a character theoretic method to compute the fusion coefficient
as follows. Each simple object, for example corresponds to a conjugacy class of the underlying group , and an irreducible character of the centralizer of a fixed representative of . In addition to the fixed representative of the class and , the formula will make use of variable elements and that are subject to the condition . See [GoMa2010] equation (7).where
is the character of conjugated to a character of , when is a conjugate of the fixed representative . More exactly, there exists such that , and then , and this definition does not depend on the choice of .Note
This should be functionally equivalent, and testing shows that it is, but it is slower.
EXAMPLES:
sage: A = FusionDouble(AlternatingGroup(4),prefix='aa',inject_variables=True) sage: [A.Nk_ij(aa8,aa10,x) for x in A.basis()] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1] sage: B = FusionDouble(CyclicPermutationGroup(2)) sage: all(B.Nk_ij(x,y,z,use_characters=True) == B.Nk_ij(x,y,z) ....: for x in B.basis() for y in B.basis() for z in B.basis()) True
>>> from sage.all import * >>> A = FusionDouble(AlternatingGroup(Integer(4)),prefix='aa',inject_variables=True) >>> [A.Nk_ij(aa8,aa10,x) for x in A.basis()] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1] >>> B = FusionDouble(CyclicPermutationGroup(Integer(2))) >>> all(B.Nk_ij(x,y,z,use_characters=True) == B.Nk_ij(x,y,z) ... for x in B.basis() for y in B.basis() for z in B.basis()) True
A = FusionDouble(AlternatingGroup(4),prefix='aa',inject_variables=True) [A.Nk_ij(aa8,aa10,x) for x in A.basis()] B = FusionDouble(CyclicPermutationGroup(2)) all(B.Nk_ij(x,y,z,use_characters=True) == B.Nk_ij(x,y,z) for x in B.basis() for y in B.basis() for z in B.basis())
- dual(i)[source]¶
Return the dual object
i^\ast
toi
.The dual is also available as an element method of
i
.EXAMPLES:
sage: K = FusionDouble(CyclicPermutationGroup(3),prefix='k') sage: [(x,K.dual(x)) for x in K.basis()] [(k0, k0), (k1, k2), (k2, k1), (k3, k6), (k4, k8), (k5, k7), (k6, k3), (k7, k5), (k8, k4)] sage: all(K.dual(x)==x.dual() for x in K.basis()) True
>>> from sage.all import * >>> K = FusionDouble(CyclicPermutationGroup(Integer(3)),prefix='k') >>> [(x,K.dual(x)) for x in K.basis()] [(k0, k0), (k1, k2), (k2, k1), (k3, k6), (k4, k8), (k5, k7), (k6, k3), (k7, k5), (k8, k4)] >>> all(K.dual(x)==x.dual() for x in K.basis()) True
K = FusionDouble(CyclicPermutationGroup(3),prefix='k') [(x,K.dual(x)) for x in K.basis()] all(K.dual(x)==x.dual() for x in K.basis())
- field()[source]¶
Return a cyclotomic field large enough to contain the values of R-matrices and twists that can arise for this fusion ring.
EXAMPLES:
sage: FusionDouble(SymmetricGroup(3)).field() Cyclotomic Field of order 24 and degree 8
>>> from sage.all import * >>> FusionDouble(SymmetricGroup(Integer(3))).field() Cyclotomic Field of order 24 and degree 8
FusionDouble(SymmetricGroup(3)).field()
- fvars_field()[source]¶
Return a field containing the
CyclotomicField
computed byfield()
as well as all the F-symbols of the associatedFMatrix
factory object.This method is only available if
self
is multiplicity-free.EXAMPLES:
sage: FusionDouble(SymmetricGroup(3)).fvars_field() Cyclotomic Field of order 24 and degree 8
>>> from sage.all import * >>> FusionDouble(SymmetricGroup(Integer(3))).fvars_field() Cyclotomic Field of order 24 and degree 8
FusionDouble(SymmetricGroup(3)).fvars_field()
- get_fmatrix(*args, **kwargs)[source]¶
Construct an
FMatrix
factory to solve the pentagon and hexagon relations and organize the resulting F-symbols.EXAMPLES:
sage: f = FusionDouble(SymmetricGroup(3)).get_fmatrix(); f F-Matrix factory for The Fusion Ring of the Drinfeld Double of Symmetric group of order 3! as a permutation group
>>> from sage.all import * >>> f = FusionDouble(SymmetricGroup(Integer(3))).get_fmatrix(); f F-Matrix factory for The Fusion Ring of the Drinfeld Double of Symmetric group of order 3! as a permutation group
f = FusionDouble(SymmetricGroup(3)).get_fmatrix(); f
- global_q_dimension(base_coercion=True)[source]¶
Return the global quantum dimension, which is the sum of the squares of the quantum dimensions of the simple objects.
For the Drinfeld double, it is the square of the order of the underlying quantum group.
EXAMPLES:
sage: G = SymmetricGroup(4) sage: H = FusionDouble(G) sage: H.global_q_dimension() 576 sage: sum(x.q_dimension()^2 for x in H.basis()) 576
>>> from sage.all import * >>> G = SymmetricGroup(Integer(4)) >>> H = FusionDouble(G) >>> H.global_q_dimension() 576 >>> sum(x.q_dimension()**Integer(2) for x in H.basis()) 576
G = SymmetricGroup(4) H = FusionDouble(G) H.global_q_dimension() sum(x.q_dimension()^2 for x in H.basis())
- group()[source]¶
Return the underlying group.
EXAMPLES:
sage: FusionDouble(DiCyclicGroup(4)).group() Dicyclic group of order 16 as a permutation group
>>> from sage.all import * >>> FusionDouble(DiCyclicGroup(Integer(4))).group() Dicyclic group of order 16 as a permutation group
FusionDouble(DiCyclicGroup(4)).group()
- inject_variables()[source]¶
Create variables for the simple objects in the global name space.
EXAMPLES:
sage: F = FusionDouble(DiCyclicGroup(3), prefix='d') sage: F.inject_variables() sage: d0 + d1 + d5 d0 + d1 + d5
>>> from sage.all import * >>> F = FusionDouble(DiCyclicGroup(Integer(3)), prefix='d') >>> F.inject_variables() >>> d0 + d1 + d5 d0 + d1 + d5
F = FusionDouble(DiCyclicGroup(3), prefix='d') F.inject_variables() d0 + d1 + d5
- is_multiplicity_free(verbose=False)[source]¶
Return
True
if all fusion coefficients are at most 1.EXAMPLES:
sage: FusionDouble(SymmetricGroup(3)).is_multiplicity_free() True sage: FusionDouble(SymmetricGroup(4)).is_multiplicity_free() False sage: FusionDouble(SymmetricGroup(3)).is_multiplicity_free(True) Checking multiplicity freeness True sage: FusionDouble(SymmetricGroup(4)).is_multiplicity_free(True) Checking multiplicity freeness N(s2,s13,s13) = 2 False
>>> from sage.all import * >>> FusionDouble(SymmetricGroup(Integer(3))).is_multiplicity_free() True >>> FusionDouble(SymmetricGroup(Integer(4))).is_multiplicity_free() False >>> FusionDouble(SymmetricGroup(Integer(3))).is_multiplicity_free(True) Checking multiplicity freeness True >>> FusionDouble(SymmetricGroup(Integer(4))).is_multiplicity_free(True) Checking multiplicity freeness N(s2,s13,s13) = 2 False
FusionDouble(SymmetricGroup(3)).is_multiplicity_free() FusionDouble(SymmetricGroup(4)).is_multiplicity_free() FusionDouble(SymmetricGroup(3)).is_multiplicity_free(True) FusionDouble(SymmetricGroup(4)).is_multiplicity_free(True)
- one_basis()[source]¶
The unit element of the ring, which is the first basis element.
EXAMPLES:
sage: FusionDouble(CyclicPermutationGroup(2), prefix='h').one() h1
>>> from sage.all import * >>> FusionDouble(CyclicPermutationGroup(Integer(2)), prefix='h').one() h1
FusionDouble(CyclicPermutationGroup(2), prefix='h').one()
- product_on_basis(a, b)[source]¶
Return the product of two basis elements corresponding to keys
and .INPUT:
a
,b
– keys for the dictionaryself._names
representing simple objects
EXAMPLES:
sage: Q=FusionDouble(SymmetricGroup(3),prefix='q',inject_variables=True) sage: q3*q4 q1 + q2 + q5 + q6 + q7 sage: Q._names {0: 'q0', 1: 'q1', 2: 'q2', 3: 'q3', 4: 'q4', 5: 'q5', 6: 'q6', 7: 'q7'} sage: Q.product_on_basis(3,4) q1 + q2 + q5 + q6 + q7
>>> from sage.all import * >>> Q=FusionDouble(SymmetricGroup(Integer(3)),prefix='q',inject_variables=True) >>> q3*q4 q1 + q2 + q5 + q6 + q7 >>> Q._names {0: 'q0', 1: 'q1', 2: 'q2', 3: 'q3', 4: 'q4', 5: 'q5', 6: 'q6', 7: 'q7'} >>> Q.product_on_basis(Integer(3),Integer(4)) q1 + q2 + q5 + q6 + q7
Q=FusionDouble(SymmetricGroup(3),prefix='q',inject_variables=True) q3*q4 Q._names Q.product_on_basis(3,4)
- r_matrix(i, j, k, base_coercion=True)[source]¶
Return the R-matrix entry corresponding to the subobject
k
in the tensor product ofi
withj
. This method is only correct if the fusion coefficientN_{ij}^k\leq 1
. See theFusionRing
method for more information, including the reason for this caveat, and the algorithm.EXAMPLES:
sage: C = FusionDouble(SymmetricGroup(3),prefix='c',inject_variables=True) sage: c4*c5 c3 + c4 sage: [C.r_matrix(c4,c5,k) for k in [c3,c4]] [-zeta24^6, 1] sage: c6^2 c0 + c1 + c6 sage: [C.r_matrix(c6,c6,k) for k in [c0,c1,c6]] [zeta3, -zeta3, -zeta3 - 1]
>>> from sage.all import * >>> C = FusionDouble(SymmetricGroup(Integer(3)),prefix='c',inject_variables=True) >>> c4*c5 c3 + c4 >>> [C.r_matrix(c4,c5,k) for k in [c3,c4]] [-zeta24^6, 1] >>> c6**Integer(2) c0 + c1 + c6 >>> [C.r_matrix(c6,c6,k) for k in [c0,c1,c6]] [zeta3, -zeta3, -zeta3 - 1]
C = FusionDouble(SymmetricGroup(3),prefix='c',inject_variables=True) c4*c5 [C.r_matrix(c4,c5,k) for k in [c3,c4]] c6^2 [C.r_matrix(c6,c6,k) for k in [c0,c1,c6]]
- root_of_unity(r, base_coercion=True)[source]¶
Return
as an element ofself.field()
if possible.INPUT:
r
– a rational number
EXAMPLES:
sage: H = FusionDouble(DihedralGroup(6)) sage: H.field() Cyclotomic Field of order 24 and degree 8 sage: for n in [1..7]: ....: try: ....: print (n,H.root_of_unity(2/n)) ....: except ValueError as err: ....: print (n,err) ....: 1 1 2 -1 3 zeta24^4 - 1 4 zeta24^6 5 not a root of unity in the field 6 zeta24^4 7 not a root of unity in the field
>>> from sage.all import * >>> H = FusionDouble(DihedralGroup(Integer(6))) >>> H.field() Cyclotomic Field of order 24 and degree 8 >>> for n in (ellipsis_range(Integer(1),Ellipsis,Integer(7))): ... try: ... print (n,H.root_of_unity(Integer(2)/n)) ... except ValueError as err: ... print (n,err) ....: 1 1 2 -1 3 zeta24^4 - 1 4 zeta24^6 5 not a root of unity in the field 6 zeta24^4 7 not a root of unity in the field
H = FusionDouble(DihedralGroup(6)) H.field() for n in [1..7]: try: print (n,H.root_of_unity(2/n)) except ValueError as err: print (n,err)
- s_ij(i, j, unitary=False, base_coercion=True)[source]¶
Return the element of the
-matrix of this fusion ring corresponding to the given elements.Without the unitary option set true, this is the unnormalized
-matrix entry, denoted , in [BaKi2001] Chapter 3. The normalized -matrix entries are denoted .INPUT:
i
,j
, – a pair of basis elementsunitary
– boolean (default:False
); set toTrue
to obtain the unitary -matrix
EXAMPLES:
sage: D = FusionDouble(SymmetricGroup(3), prefix='t', inject_variables=True) sage: [D.s_ij(t2, x) for x in D.basis()] [2, 2, 4, 0, 0, -2, -2, -2] sage: [D.s_ij(t2, x, unitary=True) for x in D.basis()] [1/3, 1/3, 2/3, 0, 0, -1/3, -1/3, -1/3]
>>> from sage.all import * >>> D = FusionDouble(SymmetricGroup(Integer(3)), prefix='t', inject_variables=True) >>> [D.s_ij(t2, x) for x in D.basis()] [2, 2, 4, 0, 0, -2, -2, -2] >>> [D.s_ij(t2, x, unitary=True) for x in D.basis()] [1/3, 1/3, 2/3, 0, 0, -1/3, -1/3, -1/3]
D = FusionDouble(SymmetricGroup(3), prefix='t', inject_variables=True) [D.s_ij(t2, x) for x in D.basis()] [D.s_ij(t2, x, unitary=True) for x in D.basis()]
- s_ijconj(i, j, unitary=False, base_coercion=True)[source]¶
Return the conjugate of the element of the
-matrix given byself.s_ij(elt_i, elt_j, base_coercion=base_coercion)
.See also
EXAMPLES:
sage: P=FusionDouble(CyclicPermutationGroup(3),prefix='p',inject_variables=True) sage: P.s_ij(p1,p3) zeta3 sage: P.s_ijconj(p1,p3) -zeta3 - 1
>>> from sage.all import * >>> P=FusionDouble(CyclicPermutationGroup(Integer(3)),prefix='p',inject_variables=True) >>> P.s_ij(p1,p3) zeta3 >>> P.s_ijconj(p1,p3) -zeta3 - 1
P=FusionDouble(CyclicPermutationGroup(3),prefix='p',inject_variables=True) P.s_ij(p1,p3) P.s_ijconj(p1,p3)
- s_matrix(unitary=False, base_coercion=True)[source]¶
Return the
-matrix of this fusion ring.OPTIONAL:
unitary
– boolean (default:False
); set toTrue
to obtain the unitary -matrix
Without the
unitary
parameter, this is the matrix denoted in [BaKi2001].EXAMPLES:
sage: FusionDouble(SymmetricGroup(3)).s_matrix() [ 1 1 2 3 3 2 2 2] [ 1 1 2 -3 -3 2 2 2] [ 2 2 4 0 0 -2 -2 -2] [ 3 -3 0 3 -3 0 0 0] [ 3 -3 0 -3 3 0 0 0] [ 2 2 -2 0 0 4 -2 -2] [ 2 2 -2 0 0 -2 -2 4] [ 2 2 -2 0 0 -2 4 -2] sage: FusionDouble(SymmetricGroup(3)).s_matrix(unitary=True) [ 1/6 1/6 1/3 1/2 1/2 1/3 1/3 1/3] [ 1/6 1/6 1/3 -1/2 -1/2 1/3 1/3 1/3] [ 1/3 1/3 2/3 0 0 -1/3 -1/3 -1/3] [ 1/2 -1/2 0 1/2 -1/2 0 0 0] [ 1/2 -1/2 0 -1/2 1/2 0 0 0] [ 1/3 1/3 -1/3 0 0 2/3 -1/3 -1/3] [ 1/3 1/3 -1/3 0 0 -1/3 -1/3 2/3] [ 1/3 1/3 -1/3 0 0 -1/3 2/3 -1/3]
>>> from sage.all import * >>> FusionDouble(SymmetricGroup(Integer(3))).s_matrix() [ 1 1 2 3 3 2 2 2] [ 1 1 2 -3 -3 2 2 2] [ 2 2 4 0 0 -2 -2 -2] [ 3 -3 0 3 -3 0 0 0] [ 3 -3 0 -3 3 0 0 0] [ 2 2 -2 0 0 4 -2 -2] [ 2 2 -2 0 0 -2 -2 4] [ 2 2 -2 0 0 -2 4 -2] >>> FusionDouble(SymmetricGroup(Integer(3))).s_matrix(unitary=True) [ 1/6 1/6 1/3 1/2 1/2 1/3 1/3 1/3] [ 1/6 1/6 1/3 -1/2 -1/2 1/3 1/3 1/3] [ 1/3 1/3 2/3 0 0 -1/3 -1/3 -1/3] [ 1/2 -1/2 0 1/2 -1/2 0 0 0] [ 1/2 -1/2 0 -1/2 1/2 0 0 0] [ 1/3 1/3 -1/3 0 0 2/3 -1/3 -1/3] [ 1/3 1/3 -1/3 0 0 -1/3 -1/3 2/3] [ 1/3 1/3 -1/3 0 0 -1/3 2/3 -1/3]
FusionDouble(SymmetricGroup(3)).s_matrix() FusionDouble(SymmetricGroup(3)).s_matrix(unitary=True)
- total_q_order(base_coercion=True)[source]¶
Return the positive square root of
self.global_q_dimension()
as an element ofself.field()
.For the Drinfeld double of a finite group
, this equals the cardinality of . This is also equal to , where runs through the simple objects, is the quantum dimension, and is the twist. This sum with is denoted in [BaKi2001] Chapter 3.EXAMPLES:
sage: FusionDouble(DihedralGroup(7)).total_q_order() 14
>>> from sage.all import * >>> FusionDouble(DihedralGroup(Integer(7))).total_q_order() 14
FusionDouble(DihedralGroup(7)).total_q_order()