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 group
- prefix– (default:- 's') a prefix for the names of simple objects
- inject_varables– (optional) set to- Trueto 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 - If the fusion double is multiplicity-free, meaning that the fusion coefficients \(N_k^{ij}\) are bounded by \(1\), then the F-matrix may be computed, by solving the pentagon and hexagon relations as described in [Bond2007] and [Ab2022], just as for - FusionRing. 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 \(S_3\), 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() - 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) - 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 - See - FMatrixfor more information.- Unfortunately beyond \(S_3\) the number of simple objects is seemingly impractical. Although the - FusionDoubleclass and its methods work well for groups of moderate size, the- FMatrixmay 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 \(2^{15}-1 = 32767\) 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 - D_minus(base_coercion=True)[source]¶
- Return the positive square root of - self.global_q_dimension()as an element of- self.field().- For the Drinfeld double of a finite group \(G\), this equals the cardinality of \(G\). This is also equal to \(\sum d_i^2 \theta_i^{\pm 1}\), where \(i\) runs through the simple objects, \(d_i\) is the quantum dimension, and \(\theta_i\) is the twist. This sum with \(\theta_i\) is denoted \(p_-\) 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 
 - D_plus(base_coercion=True)[source]¶
- Return the positive square root of - self.global_q_dimension()as an element of- self.field().- For the Drinfeld double of a finite group \(G\), this equals the cardinality of \(G\). This is also equal to \(\sum d_i^2 \theta_i^{\pm 1}\), where \(i\) runs through the simple objects, \(d_i\) is the quantum dimension, and \(\theta_i\) is the twist. This sum with \(\theta_i\) is denoted \(p_-\) 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 
 - class Element[source]¶
- Bases: - IndexedFreeModuleElement- char()[source]¶
- Return the character \(\chi\) corresponding to - self.- The data determining a simple object consists of a conjugacy class representative \(g\) and an irreducible character \(\chi\) of the centralizer of \(g\). - 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) 
 - 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()[source]¶
- The data determining a simple object consists of a conjugacy class representative \(g\) and an irreducible character \(\chi\) of the centralizer of \(g\). - 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) 
 - is_simple_object()[source]¶
- Determine whether - selfis 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] 
 - 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 
 - 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] 
 - twist(reduced=True)[source]¶
- Return a rational number \(h\) such that \(\theta = e^{i \pi h}\) is the twist of - self.- The quantity \(e^{i \pi h}\) is also available using - ribbon().- 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] 
 
 - N_ijk(i, j, k)[source]¶
- The symmetric invariant of three simple objects. - This is the dimension of \[Hom(i \otimes j \otimes k, s_0),\]- where \(s_0\) is the unit element (assuming - prefix='s'). Method of computation is through the Verlinde formula, deducing the values from the known values of the \(S\)-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] 
 - Nk_ij(i, j, k, use_characters=False)[source]¶
- Return the fusion coefficient \(N^k_{ij}\). - INPUT: - i,- j,- k– basis elements
- use_characters– boolean (default:- False); see the algorithm description below
 - ALGORITHM: - If - use_characters=False, then this is computed using the Verlinde formula:\[N^k_{ij} = \sum_l \frac{s(i, \ell)\, s(j, \ell)\, \overline{s(k, \ell)}}{s(I, \ell)}.\]- Otherwise we use a character theoretic method to compute the fusion coefficient \(N_{ij}^k\) as follows. Each simple object, for example \(i\) corresponds to a conjugacy class \(\mathcal{C}_i\) of the underlying group \(G\), and an irreducible character \(\chi_i\) of the centralizer \(C(g_i)\) of a fixed representative \(g_i\) of \(\mathcal{C}_i\). In addition to the fixed representative \(g_k\) of the class \(\mathcal{C}_i\) and \(\mathcal{C}_j\), the formula will make use of variable elements \(h_i\) and \(h_j\) that are subject to the condition \(h_i h_j = g_k\). See [GoMa2010] equation (7). \[\begin{split}\frac{|\mathcal{C}_k|}{|G|} \sum_{\substack{h_i\in\mathcal{C}_i \\ h_j\in\mathcal{C}_j \\ h_ih_j=g_k}} \lvert C(h_i)\cap C(h_j) \rvert \, \langle \chi_i^{(h_i)} \chi_j^{(h_j)}, \chi_k \rangle_{C(h_i)\cap C(h_j)},\end{split}\]- where \(\chi_i^{(h_i)}\) is the character \(\chi_i\) of \(C(g_i)\) conjugated to a character of \(C(h_i)\), when \(h_i\) is a conjugate of the fixed representative \(g_i\). More exactly, there exists \(r_i\) such that \(r_i g_i r_i^{-1} = h_i\), and then \(\chi_i^{(h_i)}(x) = \chi_i(r_i^{-1}xr_i)\), and this definition does not depend on the choice of \(r_i\). - 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 
 - dual(i)[source]¶
- Return the dual object - i^\astto- i.- 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 
 - 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 
 - fvars_field()[source]¶
- Return a field containing the - CyclotomicFieldcomputed by- field()as well as all the F-symbols of the associated- FMatrixfactory object.- This method is only available if - selfis 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 
 - get_fmatrix(*args, **kwargs)[source]¶
- Construct an - FMatrixfactory 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 
 - 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 
 - 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 
 - 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 
 - is_multiplicity_free(verbose=False)[source]¶
- Return - Trueif 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 
 - 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 
 - product_on_basis(a, b)[source]¶
- Return the product of two basis elements corresponding to keys \(a\) and \(b\). - INPUT: - a,- b– keys for the dictionary- self._namesrepresenting 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 
 - r_matrix(i, j, k, base_coercion=True)[source]¶
- Return the R-matrix entry corresponding to the subobject - kin the tensor product of- iwith- j. This method is only correct if the fusion coefficient- N_{ij}^k\leq 1. See the- FusionRingmethod 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] 
 - root_of_unity(r, base_coercion=True)[source]¶
- Return \(e^{i\pi r}\) as an element of - self.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 
 - s_ij(i, j, unitary=False, base_coercion=True)[source]¶
- Return the element of the \(S\)-matrix of this fusion ring corresponding to the given elements. - Without the unitary option set true, this is the unnormalized \(S\)-matrix entry, denoted \(\tilde{s}_{ij}\), in [BaKi2001] Chapter 3. The normalized \(S\)-matrix entries are denoted \(s_{ij}\). - INPUT: - i,- j, – a pair of basis elements
- unitary– boolean (default:- False); set to- Trueto obtain the unitary \(S\)-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] 
 - s_ijconj(i, j, unitary=False, base_coercion=True)[source]¶
- Return the conjugate of the element of the \(S\)-matrix given by - self.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 
 - s_matrix(unitary=False, base_coercion=True)[source]¶
- Return the \(S\)-matrix of this fusion ring. - OPTIONAL: - unitary– boolean (default:- False); set to- Trueto obtain the unitary \(S\)-matrix
 - Without the - unitaryparameter, this is the matrix denoted \(\widetilde{s}\) 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] 
 - total_q_order(base_coercion=True)[source]¶
- Return the positive square root of - self.global_q_dimension()as an element of- self.field().- For the Drinfeld double of a finite group \(G\), this equals the cardinality of \(G\). This is also equal to \(\sum d_i^2 \theta_i^{\pm 1}\), where \(i\) runs through the simple objects, \(d_i\) is the quantum dimension, and \(\theta_i\) is the twist. This sum with \(\theta_i\) is denoted \(p_-\) 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