passagemath-singular 10.6.31rc3__cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of passagemath-singular might be problematic. Click here for more details.

Files changed (490) hide show
  1. PySingular.cpython-314-aarch64-linux-gnu.so +0 -0
  2. passagemath_singular-10.6.31rc3.dist-info/METADATA +183 -0
  3. passagemath_singular-10.6.31rc3.dist-info/RECORD +490 -0
  4. passagemath_singular-10.6.31rc3.dist-info/WHEEL +6 -0
  5. passagemath_singular-10.6.31rc3.dist-info/top_level.txt +3 -0
  6. passagemath_singular.libs/libSingular-4-6a2a8666.4.1.so +0 -0
  7. passagemath_singular.libs/libcddgmp-ac579979.so.0.1.3 +0 -0
  8. passagemath_singular.libs/libfactory-4-66e33516.4.1.so +0 -0
  9. passagemath_singular.libs/libflint-81de1160.so.21.0.0 +0 -0
  10. passagemath_singular.libs/libgf2x-fbd36f80.so.3.0.0 +0 -0
  11. passagemath_singular.libs/libgfortran-e1b7dfc8.so.5.0.0 +0 -0
  12. passagemath_singular.libs/libgmp-93ebf16a.so.10.5.0 +0 -0
  13. passagemath_singular.libs/libgsl-e3525837.so.28.0.0 +0 -0
  14. passagemath_singular.libs/libmpfr-e0f11cf3.so.6.2.1 +0 -0
  15. passagemath_singular.libs/libntl-0043a3a2.so.44.0.1 +0 -0
  16. passagemath_singular.libs/libomalloc-0-06512335.9.6.so +0 -0
  17. passagemath_singular.libs/libopenblasp-r0-4c5b64b1.3.29.so +0 -0
  18. passagemath_singular.libs/libpolys-4-cb7246b5.4.1.so +0 -0
  19. passagemath_singular.libs/libreadline-28330744.so.8.2 +0 -0
  20. passagemath_singular.libs/libsingular_resources-4-8c425241.4.1.so +0 -0
  21. passagemath_singular.libs/libtinfo-f81c2d16.so.6.3 +0 -0
  22. sage/algebras/all__sagemath_singular.py +3 -0
  23. sage/algebras/fusion_rings/all.py +19 -0
  24. sage/algebras/fusion_rings/f_matrix.py +2448 -0
  25. sage/algebras/fusion_rings/fast_parallel_fmats_methods.cpython-314-aarch64-linux-gnu.so +0 -0
  26. sage/algebras/fusion_rings/fast_parallel_fmats_methods.pxd +5 -0
  27. sage/algebras/fusion_rings/fast_parallel_fmats_methods.pyx +538 -0
  28. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.cpython-314-aarch64-linux-gnu.so +0 -0
  29. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pxd +3 -0
  30. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pyx +331 -0
  31. sage/algebras/fusion_rings/fusion_double.py +899 -0
  32. sage/algebras/fusion_rings/fusion_ring.py +1580 -0
  33. sage/algebras/fusion_rings/poly_tup_engine.cpython-314-aarch64-linux-gnu.so +0 -0
  34. sage/algebras/fusion_rings/poly_tup_engine.pxd +24 -0
  35. sage/algebras/fusion_rings/poly_tup_engine.pyx +579 -0
  36. sage/algebras/fusion_rings/shm_managers.cpython-314-aarch64-linux-gnu.so +0 -0
  37. sage/algebras/fusion_rings/shm_managers.pxd +24 -0
  38. sage/algebras/fusion_rings/shm_managers.pyx +780 -0
  39. sage/algebras/letterplace/all.py +1 -0
  40. sage/algebras/letterplace/free_algebra_element_letterplace.cpython-314-aarch64-linux-gnu.so +0 -0
  41. sage/algebras/letterplace/free_algebra_element_letterplace.pxd +18 -0
  42. sage/algebras/letterplace/free_algebra_element_letterplace.pyx +755 -0
  43. sage/algebras/letterplace/free_algebra_letterplace.cpython-314-aarch64-linux-gnu.so +0 -0
  44. sage/algebras/letterplace/free_algebra_letterplace.pxd +35 -0
  45. sage/algebras/letterplace/free_algebra_letterplace.pyx +914 -0
  46. sage/algebras/letterplace/letterplace_ideal.cpython-314-aarch64-linux-gnu.so +0 -0
  47. sage/algebras/letterplace/letterplace_ideal.pyx +408 -0
  48. sage/algebras/quatalg/all.py +2 -0
  49. sage/algebras/quatalg/quaternion_algebra.py +4778 -0
  50. sage/algebras/quatalg/quaternion_algebra_cython.cpython-314-aarch64-linux-gnu.so +0 -0
  51. sage/algebras/quatalg/quaternion_algebra_cython.pyx +261 -0
  52. sage/algebras/quatalg/quaternion_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  53. sage/algebras/quatalg/quaternion_algebra_element.pxd +29 -0
  54. sage/algebras/quatalg/quaternion_algebra_element.pyx +2176 -0
  55. sage/all__sagemath_singular.py +11 -0
  56. sage/ext_data/all__sagemath_singular.py +1 -0
  57. sage/ext_data/singular/function_field/core.lib +98 -0
  58. sage/interfaces/all__sagemath_singular.py +1 -0
  59. sage/interfaces/singular.py +2835 -0
  60. sage/libs/all__sagemath_singular.py +1 -0
  61. sage/libs/singular/__init__.py +1 -0
  62. sage/libs/singular/decl.pxd +1168 -0
  63. sage/libs/singular/function.cpython-314-aarch64-linux-gnu.so +0 -0
  64. sage/libs/singular/function.pxd +87 -0
  65. sage/libs/singular/function.pyx +1901 -0
  66. sage/libs/singular/function_factory.py +61 -0
  67. sage/libs/singular/groebner_strategy.cpython-314-aarch64-linux-gnu.so +0 -0
  68. sage/libs/singular/groebner_strategy.pxd +22 -0
  69. sage/libs/singular/groebner_strategy.pyx +582 -0
  70. sage/libs/singular/option.cpython-314-aarch64-linux-gnu.so +0 -0
  71. sage/libs/singular/option.pyx +671 -0
  72. sage/libs/singular/polynomial.cpython-314-aarch64-linux-gnu.so +0 -0
  73. sage/libs/singular/polynomial.pxd +39 -0
  74. sage/libs/singular/polynomial.pyx +661 -0
  75. sage/libs/singular/ring.cpython-314-aarch64-linux-gnu.so +0 -0
  76. sage/libs/singular/ring.pxd +58 -0
  77. sage/libs/singular/ring.pyx +893 -0
  78. sage/libs/singular/singular.cpython-314-aarch64-linux-gnu.so +0 -0
  79. sage/libs/singular/singular.pxd +72 -0
  80. sage/libs/singular/singular.pyx +1944 -0
  81. sage/libs/singular/standard_options.py +145 -0
  82. sage/matrix/all__sagemath_singular.py +1 -0
  83. sage/matrix/matrix_mpolynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  84. sage/matrix/matrix_mpolynomial_dense.pxd +7 -0
  85. sage/matrix/matrix_mpolynomial_dense.pyx +615 -0
  86. sage/rings/all__sagemath_singular.py +1 -0
  87. sage/rings/function_field/all__sagemath_singular.py +1 -0
  88. sage/rings/function_field/derivations_polymod.py +911 -0
  89. sage/rings/function_field/element_polymod.cpython-314-aarch64-linux-gnu.so +0 -0
  90. sage/rings/function_field/element_polymod.pyx +406 -0
  91. sage/rings/function_field/function_field_polymod.py +2611 -0
  92. sage/rings/function_field/ideal_polymod.py +1775 -0
  93. sage/rings/function_field/order_polymod.py +1475 -0
  94. sage/rings/function_field/place_polymod.py +681 -0
  95. sage/rings/polynomial/all__sagemath_singular.py +1 -0
  96. sage/rings/polynomial/multi_polynomial_ideal_libsingular.cpython-314-aarch64-linux-gnu.so +0 -0
  97. sage/rings/polynomial/multi_polynomial_ideal_libsingular.pxd +5 -0
  98. sage/rings/polynomial/multi_polynomial_ideal_libsingular.pyx +339 -0
  99. sage/rings/polynomial/multi_polynomial_libsingular.cpython-314-aarch64-linux-gnu.so +0 -0
  100. sage/rings/polynomial/multi_polynomial_libsingular.pxd +30 -0
  101. sage/rings/polynomial/multi_polynomial_libsingular.pyx +6277 -0
  102. sage/rings/polynomial/plural.cpython-314-aarch64-linux-gnu.so +0 -0
  103. sage/rings/polynomial/plural.pxd +48 -0
  104. sage/rings/polynomial/plural.pyx +3171 -0
  105. sage/symbolic/all__sagemath_singular.py +1 -0
  106. sage/symbolic/comparison_impl.pxi +428 -0
  107. sage/symbolic/constants_c_impl.pxi +178 -0
  108. sage/symbolic/expression.cpython-314-aarch64-linux-gnu.so +0 -0
  109. sage/symbolic/expression.pxd +7 -0
  110. sage/symbolic/expression.pyx +14200 -0
  111. sage/symbolic/getitem_impl.pxi +202 -0
  112. sage/symbolic/pynac.pxi +572 -0
  113. sage/symbolic/pynac_constant_impl.pxi +133 -0
  114. sage/symbolic/pynac_function_impl.pxi +206 -0
  115. sage/symbolic/pynac_impl.pxi +2576 -0
  116. sage/symbolic/pynac_wrap.h +124 -0
  117. sage/symbolic/series_impl.pxi +272 -0
  118. sage/symbolic/substitution_map_impl.pxi +94 -0
  119. sage_wheels/bin/ESingular +0 -0
  120. sage_wheels/bin/Singular +0 -0
  121. sage_wheels/bin/TSingular +0 -0
  122. sage_wheels/lib/singular/MOD/cohomo.la +41 -0
  123. sage_wheels/lib/singular/MOD/cohomo.so +0 -0
  124. sage_wheels/lib/singular/MOD/customstd.la +41 -0
  125. sage_wheels/lib/singular/MOD/customstd.so +0 -0
  126. sage_wheels/lib/singular/MOD/freealgebra.la +41 -0
  127. sage_wheels/lib/singular/MOD/freealgebra.so +0 -0
  128. sage_wheels/lib/singular/MOD/gfanlib.la +41 -0
  129. sage_wheels/lib/singular/MOD/gfanlib.so +0 -0
  130. sage_wheels/lib/singular/MOD/gitfan.la +41 -0
  131. sage_wheels/lib/singular/MOD/gitfan.so +0 -0
  132. sage_wheels/lib/singular/MOD/interval.la +41 -0
  133. sage_wheels/lib/singular/MOD/interval.so +0 -0
  134. sage_wheels/lib/singular/MOD/loctriv.la +41 -0
  135. sage_wheels/lib/singular/MOD/loctriv.so +0 -0
  136. sage_wheels/lib/singular/MOD/machinelearning.la +41 -0
  137. sage_wheels/lib/singular/MOD/machinelearning.so +0 -0
  138. sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.la +41 -0
  139. sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.so +0 -0
  140. sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.la +41 -0
  141. sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.so +0 -0
  142. sage_wheels/lib/singular/MOD/p_Procs_FieldQ.la +41 -0
  143. sage_wheels/lib/singular/MOD/p_Procs_FieldQ.so +0 -0
  144. sage_wheels/lib/singular/MOD/p_Procs_FieldZp.la +41 -0
  145. sage_wheels/lib/singular/MOD/p_Procs_FieldZp.so +0 -0
  146. sage_wheels/lib/singular/MOD/partialgb.la +41 -0
  147. sage_wheels/lib/singular/MOD/partialgb.so +0 -0
  148. sage_wheels/lib/singular/MOD/pyobject.la +41 -0
  149. sage_wheels/lib/singular/MOD/pyobject.so +0 -0
  150. sage_wheels/lib/singular/MOD/singmathic.la +41 -0
  151. sage_wheels/lib/singular/MOD/singmathic.so +0 -0
  152. sage_wheels/lib/singular/MOD/sispasm.la +41 -0
  153. sage_wheels/lib/singular/MOD/sispasm.so +0 -0
  154. sage_wheels/lib/singular/MOD/subsets.la +41 -0
  155. sage_wheels/lib/singular/MOD/subsets.so +0 -0
  156. sage_wheels/lib/singular/MOD/systhreads.la +41 -0
  157. sage_wheels/lib/singular/MOD/systhreads.so +0 -0
  158. sage_wheels/lib/singular/MOD/syzextra.la +41 -0
  159. sage_wheels/lib/singular/MOD/syzextra.so +0 -0
  160. sage_wheels/libexec/singular/MOD/change_cost +0 -0
  161. sage_wheels/libexec/singular/MOD/singularsurf +11 -0
  162. sage_wheels/libexec/singular/MOD/singularsurf_jupyter +9 -0
  163. sage_wheels/libexec/singular/MOD/singularsurf_win +10 -0
  164. sage_wheels/libexec/singular/MOD/solve_IP +0 -0
  165. sage_wheels/libexec/singular/MOD/surfex +16 -0
  166. sage_wheels/libexec/singular/MOD/toric_ideal +0 -0
  167. sage_wheels/share/factory/gftables/10201 +342 -0
  168. sage_wheels/share/factory/gftables/1024 +37 -0
  169. sage_wheels/share/factory/gftables/10609 +356 -0
  170. sage_wheels/share/factory/gftables/11449 +384 -0
  171. sage_wheels/share/factory/gftables/11881 +398 -0
  172. sage_wheels/share/factory/gftables/121 +6 -0
  173. sage_wheels/share/factory/gftables/12167 +408 -0
  174. sage_wheels/share/factory/gftables/125 +7 -0
  175. sage_wheels/share/factory/gftables/12769 +428 -0
  176. sage_wheels/share/factory/gftables/128 +7 -0
  177. sage_wheels/share/factory/gftables/1331 +47 -0
  178. sage_wheels/share/factory/gftables/1369 +48 -0
  179. sage_wheels/share/factory/gftables/14641 +490 -0
  180. sage_wheels/share/factory/gftables/15625 +523 -0
  181. sage_wheels/share/factory/gftables/16 +3 -0
  182. sage_wheels/share/factory/gftables/16129 +540 -0
  183. sage_wheels/share/factory/gftables/16384 +549 -0
  184. sage_wheels/share/factory/gftables/16807 +563 -0
  185. sage_wheels/share/factory/gftables/1681 +58 -0
  186. sage_wheels/share/factory/gftables/169 +8 -0
  187. sage_wheels/share/factory/gftables/17161 +574 -0
  188. sage_wheels/share/factory/gftables/1849 +64 -0
  189. sage_wheels/share/factory/gftables/18769 +628 -0
  190. sage_wheels/share/factory/gftables/19321 +646 -0
  191. sage_wheels/share/factory/gftables/19683 +659 -0
  192. sage_wheels/share/factory/gftables/2048 +71 -0
  193. sage_wheels/share/factory/gftables/2187 +75 -0
  194. sage_wheels/share/factory/gftables/2197 +76 -0
  195. sage_wheels/share/factory/gftables/2209 +76 -0
  196. sage_wheels/share/factory/gftables/22201 +742 -0
  197. sage_wheels/share/factory/gftables/22801 +762 -0
  198. sage_wheels/share/factory/gftables/2401 +82 -0
  199. sage_wheels/share/factory/gftables/243 +11 -0
  200. sage_wheels/share/factory/gftables/24389 +815 -0
  201. sage_wheels/share/factory/gftables/24649 +824 -0
  202. sage_wheels/share/factory/gftables/25 +3 -0
  203. sage_wheels/share/factory/gftables/256 +11 -0
  204. sage_wheels/share/factory/gftables/26569 +888 -0
  205. sage_wheels/share/factory/gftables/27 +3 -0
  206. sage_wheels/share/factory/gftables/27889 +932 -0
  207. sage_wheels/share/factory/gftables/2809 +96 -0
  208. sage_wheels/share/factory/gftables/28561 +954 -0
  209. sage_wheels/share/factory/gftables/289 +12 -0
  210. sage_wheels/share/factory/gftables/29791 +995 -0
  211. sage_wheels/share/factory/gftables/29929 +1000 -0
  212. sage_wheels/share/factory/gftables/3125 +107 -0
  213. sage_wheels/share/factory/gftables/32 +4 -0
  214. sage_wheels/share/factory/gftables/32041 +1070 -0
  215. sage_wheels/share/factory/gftables/32761 +1094 -0
  216. sage_wheels/share/factory/gftables/32768 +1095 -0
  217. sage_wheels/share/factory/gftables/343 +14 -0
  218. sage_wheels/share/factory/gftables/3481 +118 -0
  219. sage_wheels/share/factory/gftables/361 +14 -0
  220. sage_wheels/share/factory/gftables/36481 +1218 -0
  221. sage_wheels/share/factory/gftables/3721 +126 -0
  222. sage_wheels/share/factory/gftables/37249 +1244 -0
  223. sage_wheels/share/factory/gftables/38809 +1296 -0
  224. sage_wheels/share/factory/gftables/39601 +1322 -0
  225. sage_wheels/share/factory/gftables/4 +3 -0
  226. sage_wheels/share/factory/gftables/4096 +139 -0
  227. sage_wheels/share/factory/gftables/44521 +1486 -0
  228. sage_wheels/share/factory/gftables/4489 +152 -0
  229. sage_wheels/share/factory/gftables/49 +4 -0
  230. sage_wheels/share/factory/gftables/4913 +166 -0
  231. sage_wheels/share/factory/gftables/49729 +1660 -0
  232. sage_wheels/share/factory/gftables/5041 +170 -0
  233. sage_wheels/share/factory/gftables/50653 +1691 -0
  234. sage_wheels/share/factory/gftables/512 +20 -0
  235. sage_wheels/share/factory/gftables/51529 +1720 -0
  236. sage_wheels/share/factory/gftables/52441 +1750 -0
  237. sage_wheels/share/factory/gftables/529 +20 -0
  238. sage_wheels/share/factory/gftables/5329 +180 -0
  239. sage_wheels/share/factory/gftables/54289 +1812 -0
  240. sage_wheels/share/factory/gftables/57121 +1906 -0
  241. sage_wheels/share/factory/gftables/58081 +1938 -0
  242. sage_wheels/share/factory/gftables/59049 +1971 -0
  243. sage_wheels/share/factory/gftables/6241 +210 -0
  244. sage_wheels/share/factory/gftables/625 +23 -0
  245. sage_wheels/share/factory/gftables/63001 +2102 -0
  246. sage_wheels/share/factory/gftables/64 +5 -0
  247. sage_wheels/share/factory/gftables/6561 +221 -0
  248. sage_wheels/share/factory/gftables/6859 +231 -0
  249. sage_wheels/share/factory/gftables/6889 +232 -0
  250. sage_wheels/share/factory/gftables/729 +27 -0
  251. sage_wheels/share/factory/gftables/7921 +266 -0
  252. sage_wheels/share/factory/gftables/8 +3 -0
  253. sage_wheels/share/factory/gftables/81 +5 -0
  254. sage_wheels/share/factory/gftables/8192 +276 -0
  255. sage_wheels/share/factory/gftables/841 +30 -0
  256. sage_wheels/share/factory/gftables/9 +3 -0
  257. sage_wheels/share/factory/gftables/9409 +316 -0
  258. sage_wheels/share/factory/gftables/961 +34 -0
  259. sage_wheels/share/info/singular.info +191898 -0
  260. sage_wheels/share/singular/LIB/GND.lib +1359 -0
  261. sage_wheels/share/singular/LIB/JMBTest.lib +976 -0
  262. sage_wheels/share/singular/LIB/JMSConst.lib +1363 -0
  263. sage_wheels/share/singular/LIB/KVequiv.lib +699 -0
  264. sage_wheels/share/singular/LIB/SingularityDBM.lib +491 -0
  265. sage_wheels/share/singular/LIB/VecField.lib +1542 -0
  266. sage_wheels/share/singular/LIB/absfact.lib +959 -0
  267. sage_wheels/share/singular/LIB/ainvar.lib +730 -0
  268. sage_wheels/share/singular/LIB/aksaka.lib +419 -0
  269. sage_wheels/share/singular/LIB/alexpoly.lib +2542 -0
  270. sage_wheels/share/singular/LIB/algebra.lib +1193 -0
  271. sage_wheels/share/singular/LIB/all.lib +136 -0
  272. sage_wheels/share/singular/LIB/arcpoint.lib +514 -0
  273. sage_wheels/share/singular/LIB/arnold.lib +4553 -0
  274. sage_wheels/share/singular/LIB/arnoldclassify.lib +2058 -0
  275. sage_wheels/share/singular/LIB/arr.lib +3486 -0
  276. sage_wheels/share/singular/LIB/assprimeszerodim.lib +755 -0
  277. sage_wheels/share/singular/LIB/autgradalg.lib +3361 -0
  278. sage_wheels/share/singular/LIB/bfun.lib +1964 -0
  279. sage_wheels/share/singular/LIB/bimodules.lib +774 -0
  280. sage_wheels/share/singular/LIB/brillnoether.lib +226 -0
  281. sage_wheels/share/singular/LIB/brnoeth.lib +5017 -0
  282. sage_wheels/share/singular/LIB/central.lib +2169 -0
  283. sage_wheels/share/singular/LIB/chern.lib +4162 -0
  284. sage_wheels/share/singular/LIB/cimonom.lib +571 -0
  285. sage_wheels/share/singular/LIB/cisimplicial.lib +1835 -0
  286. sage_wheels/share/singular/LIB/classify.lib +3239 -0
  287. sage_wheels/share/singular/LIB/classify2.lib +1462 -0
  288. sage_wheels/share/singular/LIB/classifyMapGerms.lib +1515 -0
  289. sage_wheels/share/singular/LIB/classify_aeq.lib +3253 -0
  290. sage_wheels/share/singular/LIB/classifyceq.lib +2092 -0
  291. sage_wheels/share/singular/LIB/classifyci.lib +1133 -0
  292. sage_wheels/share/singular/LIB/combinat.lib +91 -0
  293. sage_wheels/share/singular/LIB/compregb.lib +276 -0
  294. sage_wheels/share/singular/LIB/control.lib +1636 -0
  295. sage_wheels/share/singular/LIB/crypto.lib +3795 -0
  296. sage_wheels/share/singular/LIB/curveInv.lib +667 -0
  297. sage_wheels/share/singular/LIB/curvepar.lib +1817 -0
  298. sage_wheels/share/singular/LIB/customstd.lib +100 -0
  299. sage_wheels/share/singular/LIB/deRham.lib +5979 -0
  300. sage_wheels/share/singular/LIB/decodegb.lib +2134 -0
  301. sage_wheels/share/singular/LIB/decomp.lib +1655 -0
  302. sage_wheels/share/singular/LIB/deflation.lib +872 -0
  303. sage_wheels/share/singular/LIB/deform.lib +925 -0
  304. sage_wheels/share/singular/LIB/difform.lib +3055 -0
  305. sage_wheels/share/singular/LIB/divisors.lib +750 -0
  306. sage_wheels/share/singular/LIB/dmod.lib +5817 -0
  307. sage_wheels/share/singular/LIB/dmodapp.lib +3269 -0
  308. sage_wheels/share/singular/LIB/dmodideal.lib +1211 -0
  309. sage_wheels/share/singular/LIB/dmodloc.lib +2645 -0
  310. sage_wheels/share/singular/LIB/dmodvar.lib +818 -0
  311. sage_wheels/share/singular/LIB/dummy.lib +17 -0
  312. sage_wheels/share/singular/LIB/elim.lib +1009 -0
  313. sage_wheels/share/singular/LIB/ellipticcovers.lib +548 -0
  314. sage_wheels/share/singular/LIB/enumpoints.lib +146 -0
  315. sage_wheels/share/singular/LIB/equising.lib +2127 -0
  316. sage_wheels/share/singular/LIB/ffmodstd.lib +2384 -0
  317. sage_wheels/share/singular/LIB/ffsolve.lib +1289 -0
  318. sage_wheels/share/singular/LIB/findifs.lib +778 -0
  319. sage_wheels/share/singular/LIB/finitediff.lib +1768 -0
  320. sage_wheels/share/singular/LIB/finvar.lib +7989 -0
  321. sage_wheels/share/singular/LIB/fpadim.lib +2429 -0
  322. sage_wheels/share/singular/LIB/fpalgebras.lib +1666 -0
  323. sage_wheels/share/singular/LIB/fpaprops.lib +1462 -0
  324. sage_wheels/share/singular/LIB/freegb.lib +3853 -0
  325. sage_wheels/share/singular/LIB/general.lib +1350 -0
  326. sage_wheels/share/singular/LIB/gfan.lib +1768 -0
  327. sage_wheels/share/singular/LIB/gitfan.lib +3130 -0
  328. sage_wheels/share/singular/LIB/gkdim.lib +99 -0
  329. sage_wheels/share/singular/LIB/gmspoly.lib +589 -0
  330. sage_wheels/share/singular/LIB/gmssing.lib +1739 -0
  331. sage_wheels/share/singular/LIB/goettsche.lib +909 -0
  332. sage_wheels/share/singular/LIB/graal.lib +1366 -0
  333. sage_wheels/share/singular/LIB/gradedModules.lib +2541 -0
  334. sage_wheels/share/singular/LIB/graphics.lib +360 -0
  335. sage_wheels/share/singular/LIB/grobcov.lib +7706 -0
  336. sage_wheels/share/singular/LIB/groups.lib +1123 -0
  337. sage_wheels/share/singular/LIB/grwalk.lib +507 -0
  338. sage_wheels/share/singular/LIB/hdepth.lib +194 -0
  339. sage_wheels/share/singular/LIB/help.cnf +57 -0
  340. sage_wheels/share/singular/LIB/hess.lib +1946 -0
  341. sage_wheels/share/singular/LIB/hnoether.lib +4292 -0
  342. sage_wheels/share/singular/LIB/hodge.lib +400 -0
  343. sage_wheels/share/singular/LIB/homolog.lib +1965 -0
  344. sage_wheels/share/singular/LIB/hyperel.lib +975 -0
  345. sage_wheels/share/singular/LIB/inout.lib +679 -0
  346. sage_wheels/share/singular/LIB/integralbasis.lib +6224 -0
  347. sage_wheels/share/singular/LIB/interval.lib +1418 -0
  348. sage_wheels/share/singular/LIB/intprog.lib +778 -0
  349. sage_wheels/share/singular/LIB/invar.lib +443 -0
  350. sage_wheels/share/singular/LIB/involut.lib +980 -0
  351. sage_wheels/share/singular/LIB/jacobson.lib +1215 -0
  352. sage_wheels/share/singular/LIB/kskernel.lib +534 -0
  353. sage_wheels/share/singular/LIB/latex.lib +3146 -0
  354. sage_wheels/share/singular/LIB/lejeune.lib +651 -0
  355. sage_wheels/share/singular/LIB/linalg.lib +2040 -0
  356. sage_wheels/share/singular/LIB/locnormal.lib +212 -0
  357. sage_wheels/share/singular/LIB/lrcalc.lib +526 -0
  358. sage_wheels/share/singular/LIB/makedbm.lib +294 -0
  359. sage_wheels/share/singular/LIB/mathml.lib +813 -0
  360. sage_wheels/share/singular/LIB/matrix.lib +1372 -0
  361. sage_wheels/share/singular/LIB/maxlike.lib +1132 -0
  362. sage_wheels/share/singular/LIB/methods.lib +212 -0
  363. sage_wheels/share/singular/LIB/moddiq.lib +322 -0
  364. sage_wheels/share/singular/LIB/modfinduni.lib +181 -0
  365. sage_wheels/share/singular/LIB/modnormal.lib +218 -0
  366. sage_wheels/share/singular/LIB/modprimdec.lib +1278 -0
  367. sage_wheels/share/singular/LIB/modquotient.lib +269 -0
  368. sage_wheels/share/singular/LIB/modstd.lib +1024 -0
  369. sage_wheels/share/singular/LIB/modular.lib +545 -0
  370. sage_wheels/share/singular/LIB/modules.lib +2561 -0
  371. sage_wheels/share/singular/LIB/modwalk.lib +609 -0
  372. sage_wheels/share/singular/LIB/mondromy.lib +1016 -0
  373. sage_wheels/share/singular/LIB/monomialideal.lib +3851 -0
  374. sage_wheels/share/singular/LIB/mprimdec.lib +2353 -0
  375. sage_wheels/share/singular/LIB/mregular.lib +1863 -0
  376. sage_wheels/share/singular/LIB/multigrading.lib +5629 -0
  377. sage_wheels/share/singular/LIB/ncHilb.lib +777 -0
  378. sage_wheels/share/singular/LIB/ncModslimgb.lib +791 -0
  379. sage_wheels/share/singular/LIB/ncalg.lib +16311 -0
  380. sage_wheels/share/singular/LIB/ncall.lib +31 -0
  381. sage_wheels/share/singular/LIB/ncdecomp.lib +468 -0
  382. sage_wheels/share/singular/LIB/ncfactor.lib +13371 -0
  383. sage_wheels/share/singular/LIB/ncfrac.lib +1023 -0
  384. sage_wheels/share/singular/LIB/nchilbert.lib +448 -0
  385. sage_wheels/share/singular/LIB/nchomolog.lib +759 -0
  386. sage_wheels/share/singular/LIB/ncloc.lib +361 -0
  387. sage_wheels/share/singular/LIB/ncpreim.lib +795 -0
  388. sage_wheels/share/singular/LIB/ncrat.lib +2849 -0
  389. sage_wheels/share/singular/LIB/nctools.lib +1887 -0
  390. sage_wheels/share/singular/LIB/nets.lib +1456 -0
  391. sage_wheels/share/singular/LIB/nfmodstd.lib +1000 -0
  392. sage_wheels/share/singular/LIB/nfmodsyz.lib +732 -0
  393. sage_wheels/share/singular/LIB/noether.lib +1106 -0
  394. sage_wheels/share/singular/LIB/normal.lib +8700 -0
  395. sage_wheels/share/singular/LIB/normaliz.lib +2226 -0
  396. sage_wheels/share/singular/LIB/ntsolve.lib +362 -0
  397. sage_wheels/share/singular/LIB/numerAlg.lib +560 -0
  398. sage_wheels/share/singular/LIB/numerDecom.lib +2261 -0
  399. sage_wheels/share/singular/LIB/olga.lib +1933 -0
  400. sage_wheels/share/singular/LIB/orbitparam.lib +351 -0
  401. sage_wheels/share/singular/LIB/parallel.lib +319 -0
  402. sage_wheels/share/singular/LIB/paraplanecurves.lib +3110 -0
  403. sage_wheels/share/singular/LIB/perron.lib +202 -0
  404. sage_wheels/share/singular/LIB/pfd.lib +2223 -0
  405. sage_wheels/share/singular/LIB/phindex.lib +642 -0
  406. sage_wheels/share/singular/LIB/pointid.lib +673 -0
  407. sage_wheels/share/singular/LIB/polybori.lib +1430 -0
  408. sage_wheels/share/singular/LIB/polyclass.lib +525 -0
  409. sage_wheels/share/singular/LIB/polylib.lib +1174 -0
  410. sage_wheels/share/singular/LIB/polymake.lib +1902 -0
  411. sage_wheels/share/singular/LIB/presolve.lib +1533 -0
  412. sage_wheels/share/singular/LIB/primdec.lib +9576 -0
  413. sage_wheels/share/singular/LIB/primdecint.lib +1782 -0
  414. sage_wheels/share/singular/LIB/primitiv.lib +401 -0
  415. sage_wheels/share/singular/LIB/puiseuxexpansions.lib +1631 -0
  416. sage_wheels/share/singular/LIB/purityfiltration.lib +960 -0
  417. sage_wheels/share/singular/LIB/qhmoduli.lib +1561 -0
  418. sage_wheels/share/singular/LIB/qmatrix.lib +293 -0
  419. sage_wheels/share/singular/LIB/random.lib +455 -0
  420. sage_wheels/share/singular/LIB/ratgb.lib +489 -0
  421. sage_wheels/share/singular/LIB/realclassify.lib +5759 -0
  422. sage_wheels/share/singular/LIB/realizationMatroids.lib +772 -0
  423. sage_wheels/share/singular/LIB/realrad.lib +1197 -0
  424. sage_wheels/share/singular/LIB/recover.lib +2628 -0
  425. sage_wheels/share/singular/LIB/redcgs.lib +3984 -0
  426. sage_wheels/share/singular/LIB/reesclos.lib +465 -0
  427. sage_wheels/share/singular/LIB/resbinomial.lib +2802 -0
  428. sage_wheels/share/singular/LIB/resgraph.lib +789 -0
  429. sage_wheels/share/singular/LIB/resjung.lib +820 -0
  430. sage_wheels/share/singular/LIB/resolve.lib +5110 -0
  431. sage_wheels/share/singular/LIB/resources.lib +170 -0
  432. sage_wheels/share/singular/LIB/reszeta.lib +5473 -0
  433. sage_wheels/share/singular/LIB/ring.lib +1328 -0
  434. sage_wheels/share/singular/LIB/ringgb.lib +343 -0
  435. sage_wheels/share/singular/LIB/rinvar.lib +1153 -0
  436. sage_wheels/share/singular/LIB/rootisolation.lib +1481 -0
  437. sage_wheels/share/singular/LIB/rootsmr.lib +709 -0
  438. sage_wheels/share/singular/LIB/rootsur.lib +886 -0
  439. sage_wheels/share/singular/LIB/rstandard.lib +607 -0
  440. sage_wheels/share/singular/LIB/rwalk.lib +336 -0
  441. sage_wheels/share/singular/LIB/sagbi.lib +1353 -0
  442. sage_wheels/share/singular/LIB/sagbiNormaliz.lib +1622 -0
  443. sage_wheels/share/singular/LIB/sagbiNormaliz0.lib +1498 -0
  444. sage_wheels/share/singular/LIB/sagbigrob.lib +449 -0
  445. sage_wheels/share/singular/LIB/schreyer.lib +321 -0
  446. sage_wheels/share/singular/LIB/schubert.lib +2551 -0
  447. sage_wheels/share/singular/LIB/sets.lib +524 -0
  448. sage_wheels/share/singular/LIB/sheafcoh.lib +1663 -0
  449. sage_wheels/share/singular/LIB/signcond.lib +437 -0
  450. sage_wheels/share/singular/LIB/sing.lib +1094 -0
  451. sage_wheels/share/singular/LIB/sing4ti2.lib +419 -0
  452. sage_wheels/share/singular/LIB/solve.lib +2243 -0
  453. sage_wheels/share/singular/LIB/spcurve.lib +1077 -0
  454. sage_wheels/share/singular/LIB/spectrum.lib +62 -0
  455. sage_wheels/share/singular/LIB/sresext.lib +757 -0
  456. sage_wheels/share/singular/LIB/ssi.lib +143 -0
  457. sage_wheels/share/singular/LIB/standard.lib +2769 -0
  458. sage_wheels/share/singular/LIB/stanleyreisner.lib +473 -0
  459. sage_wheels/share/singular/LIB/stdmodule.lib +547 -0
  460. sage_wheels/share/singular/LIB/stratify.lib +1070 -0
  461. sage_wheels/share/singular/LIB/surf.lib +506 -0
  462. sage_wheels/share/singular/LIB/surf_jupyter.lib +223 -0
  463. sage_wheels/share/singular/LIB/surfacesignature.lib +522 -0
  464. sage_wheels/share/singular/LIB/surfex.lib +1462 -0
  465. sage_wheels/share/singular/LIB/swalk.lib +877 -0
  466. sage_wheels/share/singular/LIB/symodstd.lib +1570 -0
  467. sage_wheels/share/singular/LIB/systhreads.lib +74 -0
  468. sage_wheels/share/singular/LIB/tasks.lib +1324 -0
  469. sage_wheels/share/singular/LIB/tateProdCplxNegGrad.lib +2412 -0
  470. sage_wheels/share/singular/LIB/teachstd.lib +858 -0
  471. sage_wheels/share/singular/LIB/template.lib +116 -0
  472. sage_wheels/share/singular/LIB/toric.lib +1119 -0
  473. sage_wheels/share/singular/LIB/transformation.lib +116 -0
  474. sage_wheels/share/singular/LIB/triang.lib +1197 -0
  475. sage_wheels/share/singular/LIB/tropical.lib +8741 -0
  476. sage_wheels/share/singular/LIB/tropicalEllipticCovers.lib +2922 -0
  477. sage_wheels/share/singular/LIB/tropicalNewton.lib +1128 -0
  478. sage_wheels/share/singular/LIB/tst.lib +1108 -0
  479. sage_wheels/share/singular/LIB/weierstr.lib +241 -0
  480. sage_wheels/share/singular/LIB/zeroset.lib +1478 -0
  481. sage_wheels/share/singular/emacs/.emacs-general +184 -0
  482. sage_wheels/share/singular/emacs/.emacs-singular +234 -0
  483. sage_wheels/share/singular/emacs/COPYING +44 -0
  484. sage_wheels/share/singular/emacs/cmd-cmpl.el +241 -0
  485. sage_wheels/share/singular/emacs/ex-cmpl.el +1681 -0
  486. sage_wheels/share/singular/emacs/hlp-cmpl.el +4318 -0
  487. sage_wheels/share/singular/emacs/lib-cmpl.el +179 -0
  488. sage_wheels/share/singular/emacs/singular.el +4273 -0
  489. sage_wheels/share/singular/emacs/singular.xpm +39 -0
  490. sage_wheels/share/singular/singular.idx +5002 -0
@@ -0,0 +1,899 @@
1
+ # sage_setup: distribution = sagemath-singular
2
+ """
3
+ The Fusion Ring of the Drinfeld Double of a Finite Group
4
+ """
5
+
6
+ # ****************************************************************************
7
+ # Copyright (C) 2023 Wenqi Li
8
+ # Daniel Bump <bump at match.stanford.edu>
9
+ # Travis Scrimshaw <tcscrims at gmail.com>
10
+ # Guillermo Aboumrad <gh_willieab>
11
+ #
12
+ # This program is free software: you can redistribute it and/or modify
13
+ # it under the terms of the GNU General Public License as published by
14
+ # the Free Software Foundation, either version 2 of the License, or
15
+ # (at your option) any later version.
16
+ # https://www.gnu.org/licenses/
17
+ # ****************************************************************************
18
+
19
+ from sage.categories.algebras_with_basis import AlgebrasWithBasis
20
+ from sage.combinat.free_module import CombinatorialFreeModule
21
+ from sage.rings.integer_ring import ZZ
22
+ from sage.misc.misc import inject_variable
23
+ from sage.misc.cachefunc import cached_method
24
+ from sage.sets.set import Set
25
+ from sage.rings.number_field.number_field import CyclotomicField
26
+ from sage.matrix.constructor import matrix
27
+
28
+
29
+ class FusionDouble(CombinatorialFreeModule):
30
+ r"""
31
+ The fusion ring corresponding to the Drinfeld double of a finite group.
32
+
33
+ This is the fusion ring of the modular tensor category of modules
34
+ over the Drinfeld double of a finite group. Usage is similar
35
+ to :class:`FusionRing`; we refer the reader to that class for more
36
+ information.
37
+
38
+ INPUT:
39
+
40
+ - ``G`` -- a finite group
41
+ - ``prefix`` -- (default: ``'s'``) a prefix for the names of simple objects
42
+ - ``inject_varables`` -- (optional) set to ``True`` to create variables
43
+ for the simple objects
44
+
45
+ REFERENCES:
46
+
47
+ - [BaKi2001]_ Chapter 3
48
+ - [Mas1995]_
49
+ - [CHW2015]_
50
+ - [Goff1999]_
51
+
52
+ EXAMPLES::
53
+
54
+ sage: G = DihedralGroup(5)
55
+ sage: H = FusionDouble(G, inject_variables=True)
56
+ sage: H.basis()
57
+ Finite family {0: s0, 1: s1, 2: s2, 3: s3, 4: s4, 5: s5, 6: s6, 7: s7, 8: s8,
58
+ 9: s9, 10: s10, 11: s11, 12: s12, 13: s13, 14: s14, 15: s15}
59
+ sage: for x in H.basis():
60
+ ....: print ("%s : %s"%(x,x^2))
61
+ ....:
62
+ s0 : s0
63
+ s1 : s0
64
+ s2 : s0 + s1 + s3
65
+ s3 : s0 + s1 + s2
66
+ s4 : s0 + s2 + s3 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15
67
+ s5 : s0 + s2 + s3 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15
68
+ s6 : s0 + s1 + s11
69
+ s7 : s0 + s1 + s13
70
+ s8 : s0 + s1 + s15
71
+ s9 : s0 + s1 + s12
72
+ s10 : s0 + s1 + s14
73
+ s11 : s0 + s1 + s6
74
+ s12 : s0 + s1 + s9
75
+ s13 : s0 + s1 + s7
76
+ s14 : s0 + s1 + s10
77
+ s15 : s0 + s1 + s8
78
+ sage: s4*s5
79
+ s1 + s2 + s3 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15
80
+ sage: s4.ribbon()
81
+ 1
82
+ sage: s5.ribbon()
83
+ -1
84
+ sage: s8.ribbon()
85
+ zeta5^3
86
+
87
+ If the fusion double is multiplicity-free, meaning that the fusion
88
+ coefficients `N_k^{ij}` are bounded by `1`, then the F-matrix may be
89
+ computed, by solving the pentagon and hexagon relations as described
90
+ in [Bond2007]_ and [Ab2022]_, just as for :class:`FusionRing`.
91
+ There is a caveat here, since even if the fusion rules are multiplicity-free,
92
+ if there are too many F-matrix values to compute, even if many of them are
93
+ zero, in the current implementation singular cannot create enough variables.
94
+ At least, this code can compute the F-matrix for the Fusion Double of the
95
+ symmetric group `S_3`, duplicating the result of [CHW2015]_.
96
+
97
+ ::
98
+
99
+ sage: G1 = SymmetricGroup(3)
100
+ sage: H1 = FusionDouble(G1, prefix='u', inject_variables=True)
101
+ sage: F = H1.get_fmatrix()
102
+
103
+ The above commands create the F-matrix. You can compute all of the
104
+ F-matrices with the command::
105
+
106
+ sage: H1.find_orthogonal_solution() # not tested (10-15 minutes)
107
+
108
+ Individual F-matrices may be computed thus::
109
+
110
+ sage: F.fmatrix(u3, u3, u3, u4) # not tested
111
+
112
+ See :class:`FMatrix` for more information.
113
+
114
+ Unfortunately beyond `S_3` the number of simple objects is seemingly
115
+ impractical. Although the :class:`FusionDouble` class and its methods
116
+ work well for groups of moderate size, the :class:`FMatrix` may not be
117
+ computable. For the dihedral group of order 8, there are already 22
118
+ simple objects, and the F-matrix seems out of reach. The actual limitation
119
+ is that singular will not create a polynomial ring in more than
120
+ `2^{15}-1 = 32767` symbols, and there are more than this many F-matrix
121
+ values to be computed for the dihedral group of order 8, so in the
122
+ current implementation, this FusionRing is out of reach.
123
+
124
+ It is an open problem to classify the finite groups whose fusion doubles
125
+ are multiplicity-free. Abelian groups, dihedral groups, dicyclic groups,
126
+ and all groups of order 16 are multiplicity-free. On the other hand, for
127
+ groups of order 32, some are multiplicity-free and others are not.
128
+ These can all be constructed using :class:`SmallPermutationGroup`.
129
+
130
+ EXAMPLES::
131
+
132
+ sage: G = SmallPermutationGroup(16,9)
133
+ sage: F = FusionDouble(G, prefix='b', inject_variables=True)
134
+ sage: b13^2 # long time (4s)
135
+ b0 + b3 + b4
136
+ """
137
+ @staticmethod
138
+ def __classcall_private__(cls, G, prefix='s', inject_variables=False):
139
+ """
140
+ Normalize input to ensure a unique representation.
141
+
142
+ EXAMPLES::
143
+
144
+ sage: H1 = FusionDouble(DihedralGroup(6), inject_variables=True)
145
+ sage: H2 = FusionDouble(DihedralGroup(6), prefix='s')
146
+ sage: H1 is H2
147
+ True
148
+ """
149
+ F = super().__classcall__(cls, G=G, prefix=prefix)
150
+ if inject_variables:
151
+ F.inject_variables()
152
+ return F
153
+
154
+ def __init__(self, G, prefix='s') -> None:
155
+ """
156
+ EXAMPLES::
157
+
158
+ sage: H = FusionDouble(DihedralGroup(6))
159
+ sage: TestSuite(H).run()
160
+ sage: H = FusionDouble(DihedralGroup(7))
161
+ sage: TestSuite(H).run() # long time
162
+
163
+ sage: F = FusionDouble(CyclicPermutationGroup(2))
164
+ sage: [F._repr_term(t) for t in F._names]
165
+ ['s0', 's1', 's2', 's3']
166
+ sage: F = FusionDouble(CyclicPermutationGroup(2))
167
+ sage: [F._latex_term(t) for t in F._names]
168
+ ['s_{0}', 's_{1}', 's_{2}', 's_{3}']
169
+
170
+ sage: FusionDouble(SymmetricGroup(4)).get_order()
171
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
172
+ """
173
+ self._G = G
174
+ self._names = {}
175
+ self._elt = {}
176
+ self._chi = {}
177
+ self._unit_index = None # index of the unit element
178
+ count = ZZ.zero()
179
+ for g in G.conjugacy_classes_representatives():
180
+ for chi in G.centralizer(g).irreducible_characters():
181
+ # NOTE: the trivial char is not necessarily the first one
182
+ self._names[count] = "%s%s" % (prefix, count)
183
+ self._elt[count] = g
184
+ self._chi[count] = chi
185
+ if self._unit_index is None and all(v == 1 for v in chi):
186
+ self._unit_index = count
187
+ count += ZZ.one()
188
+ self._cyclotomic_order = G.exponent()
189
+ self._basecoer = None
190
+ self._fusion_labels = None
191
+ self._field = None
192
+ cat = AlgebrasWithBasis(ZZ)
193
+ CombinatorialFreeModule.__init__(self, ZZ, list(self._names),
194
+ prefix=prefix, bracket=False, category=cat)
195
+
196
+ def _repr_(self) -> str:
197
+ """
198
+ EXAMPLES::
199
+
200
+ sage: FusionDouble(SymmetricGroup(3))
201
+ The Fusion Ring of the Drinfeld Double of Symmetric group of
202
+ order 3! as a permutation group
203
+ """
204
+ return "The Fusion Ring of the Drinfeld Double of %s" % self._G
205
+
206
+ def inject_variables(self):
207
+ """
208
+ Create variables for the simple objects in the global name space.
209
+
210
+ EXAMPLES::
211
+
212
+ sage: F = FusionDouble(DiCyclicGroup(3), prefix='d')
213
+ sage: F.inject_variables()
214
+ sage: d0 + d1 + d5
215
+ d0 + d1 + d5
216
+ """
217
+ for i, name in self._names.items():
218
+ inject_variable(name, self.monomial(i))
219
+
220
+ @cached_method
221
+ def _char_cache(self, i, g):
222
+ """
223
+ Return ``self._chi[i](g)``, cached here for speed.
224
+
225
+ TESTS::
226
+
227
+ sage: D = FusionDouble(SymmetricGroup(4))
228
+
229
+ sage: all(D._char_cache(b.support_of_term(), b.g()) == b.char()(b.g())
230
+ ....: for b in D.basis())
231
+ True
232
+ """
233
+ return self._chi[i](g)
234
+
235
+ @cached_method
236
+ def s_ij(self, i, j, unitary=False, base_coercion=True):
237
+ r"""
238
+ Return the element of the `S`-matrix of this fusion ring
239
+ corresponding to the given elements.
240
+
241
+ Without the unitary option set true, this is the unnormalized `S`-matrix
242
+ entry, denoted `\tilde{s}_{ij}`, in [BaKi2001]_ Chapter 3. The
243
+ normalized `S`-matrix entries are denoted `s_{ij}`.
244
+
245
+ INPUT:
246
+
247
+ - ``i``, ``j``, -- a pair of basis elements
248
+ - ``unitary`` -- boolean (default: ``False``); set to ``True`` to
249
+ obtain the unitary `S`-matrix
250
+
251
+ EXAMPLES::
252
+
253
+ sage: D = FusionDouble(SymmetricGroup(3), prefix='t', inject_variables=True)
254
+ sage: [D.s_ij(t2, x) for x in D.basis()]
255
+ [2, 2, 4, 0, 0, -2, -2, -2]
256
+ sage: [D.s_ij(t2, x, unitary=True) for x in D.basis()]
257
+ [1/3, 1/3, 2/3, 0, 0, -1/3, -1/3, -1/3]
258
+ """
259
+ sum_val = ZZ.zero()
260
+ G = self._G
261
+ i, = list(i._monomial_coefficients)
262
+ j, = list(j._monomial_coefficients)
263
+ a = self._elt[i]
264
+ b = self._elt[j]
265
+ for g in G:
266
+ gi = g.inverse()
267
+ conj = g * b * gi
268
+ if a * conj == conj * a:
269
+ sum_val += self._char_cache(i, conj) * self._char_cache(j, gi * a * g)
270
+ if unitary:
271
+ coef = 1 / (G.centralizer(a).order() * G.centralizer(b).order())
272
+ else:
273
+ coef = G.order() / (G.centralizer(a).order() * G.centralizer(b).order())
274
+ ret = coef * sum_val
275
+ if (not base_coercion) or (self._basecoer is None):
276
+ return ret
277
+ return self._basecoer(ret)
278
+
279
+ def s_ijconj(self, i, j, unitary=False, base_coercion=True):
280
+ r"""
281
+ Return the conjugate of the element of the `S`-matrix given by
282
+ ``self.s_ij(elt_i, elt_j, base_coercion=base_coercion)``.
283
+
284
+ .. SEEALSO::
285
+
286
+ :meth:`s_ij`
287
+
288
+ EXAMPLES::
289
+
290
+ sage: P=FusionDouble(CyclicPermutationGroup(3),prefix='p',inject_variables=True)
291
+ sage: P.s_ij(p1,p3)
292
+ zeta3
293
+ sage: P.s_ijconj(p1,p3)
294
+ -zeta3 - 1
295
+ """
296
+ return self.s_ij(i, j, unitary=unitary, base_coercion=base_coercion).conjugate()
297
+
298
+ def s_matrix(self, unitary=False, base_coercion=True):
299
+ r"""
300
+ Return the `S`-matrix of this fusion ring.
301
+
302
+ OPTIONAL:
303
+
304
+ - ``unitary`` -- boolean (default: ``False``); set to ``True`` to
305
+ obtain the unitary `S`-matrix
306
+
307
+ Without the ``unitary`` parameter, this is the matrix denoted
308
+ `\widetilde{s}` in [BaKi2001]_.
309
+
310
+ EXAMPLES::
311
+
312
+ sage: FusionDouble(SymmetricGroup(3)).s_matrix()
313
+ [ 1 1 2 3 3 2 2 2]
314
+ [ 1 1 2 -3 -3 2 2 2]
315
+ [ 2 2 4 0 0 -2 -2 -2]
316
+ [ 3 -3 0 3 -3 0 0 0]
317
+ [ 3 -3 0 -3 3 0 0 0]
318
+ [ 2 2 -2 0 0 4 -2 -2]
319
+ [ 2 2 -2 0 0 -2 -2 4]
320
+ [ 2 2 -2 0 0 -2 4 -2]
321
+ sage: FusionDouble(SymmetricGroup(3)).s_matrix(unitary=True)
322
+ [ 1/6 1/6 1/3 1/2 1/2 1/3 1/3 1/3]
323
+ [ 1/6 1/6 1/3 -1/2 -1/2 1/3 1/3 1/3]
324
+ [ 1/3 1/3 2/3 0 0 -1/3 -1/3 -1/3]
325
+ [ 1/2 -1/2 0 1/2 -1/2 0 0 0]
326
+ [ 1/2 -1/2 0 -1/2 1/2 0 0 0]
327
+ [ 1/3 1/3 -1/3 0 0 2/3 -1/3 -1/3]
328
+ [ 1/3 1/3 -1/3 0 0 -1/3 -1/3 2/3]
329
+ [ 1/3 1/3 -1/3 0 0 -1/3 2/3 -1/3]
330
+ """
331
+ b = self.basis()
332
+ S = matrix([[self.s_ij(b[x], b[y], unitary=unitary, base_coercion=base_coercion)
333
+ for x in self.get_order()] for y in self.get_order()])
334
+ return S
335
+
336
+ @cached_method
337
+ def N_ijk(self, i, j, k):
338
+ r"""
339
+ The symmetric invariant of three simple objects.
340
+
341
+ This is the dimension of
342
+
343
+ .. MATH::
344
+
345
+ Hom(i \otimes j \otimes k, s_0),
346
+
347
+ where `s_0` is the unit element (assuming ``prefix='s'``).
348
+ Method of computation is through the Verlinde formula,
349
+ deducing the values from the known values of the `S`-matrix.
350
+
351
+ EXAMPLES::
352
+
353
+ sage: A = FusionDouble(AlternatingGroup(4),prefix='a',inject_variables=True)
354
+ sage: [A.N_ijk(a10,a11,x) for x in A.basis()]
355
+ [0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
356
+
357
+ TESTS::
358
+
359
+ sage: F = FusionDouble(SymmetricGroup(4))
360
+ sage: from itertools import product
361
+ sage: B = list(F.basis())
362
+ sage: all(F.N_ijk(i,j,k).parent() is ZZ
363
+ ....: for i, j, k in product(B[::6], repeat=3))
364
+ True
365
+ """
366
+ sz = self.one()
367
+ return ZZ(sum(self.s_ij(i, r, unitary=True) * self.s_ij(j, r, unitary=True)
368
+ * self.s_ij(k, r, unitary=True) / self.s_ij(sz, r, unitary=True)
369
+ for r in self.basis()))
370
+
371
+ @cached_method
372
+ def Nk_ij(self, i, j, k, use_characters=False):
373
+ r"""
374
+ Return the fusion coefficient `N^k_{ij}`.
375
+
376
+ INPUT:
377
+
378
+ - ``i``, ``j``, ``k`` -- basis elements
379
+ - ``use_characters`` -- boolean (default: ``False``); see the algorithm
380
+ description below
381
+
382
+ ALGORITHM:
383
+
384
+ If ``use_characters=False``, then this is computed using
385
+ the Verlinde formula:
386
+
387
+ .. MATH::
388
+
389
+ N^k_{ij} = \sum_l \frac{s(i, \ell)\, s(j, \ell)\,
390
+ \overline{s(k, \ell)}}{s(I, \ell)}.
391
+
392
+ Otherwise we use a character theoretic method to compute the fusion
393
+ coefficient `N_{ij}^k` as follows. Each simple object, for example
394
+ `i` corresponds to a conjugacy class `\mathcal{C}_i` of the underlying
395
+ group `G`, and an irreducible character `\chi_i` of the centralizer
396
+ `C(g_i)` of a fixed representative `g_i` of `\mathcal{C}_i`. In addition
397
+ to the fixed representative `g_k` of the class `\mathcal{C}_i`
398
+ and `\mathcal{C}_j`, the formula will make use of variable elements
399
+ `h_i` and `h_j` that are subject to the condition `h_i h_j = g_k`.
400
+ See [GoMa2010]_ equation (7).
401
+
402
+ .. MATH::
403
+
404
+ \frac{|\mathcal{C}_k|}{|G|}
405
+ \sum_{\substack{h_i\in\mathcal{C}_i \\ h_j\in\mathcal{C}_j \\ h_ih_j=g_k}}
406
+ \lvert C(h_i)\cap C(h_j) \rvert \,
407
+ \langle \chi_i^{(h_i)} \chi_j^{(h_j)}, \chi_k \rangle_{C(h_i)\cap C(h_j)},
408
+
409
+ where `\chi_i^{(h_i)}` is the character `\chi_i` of `C(g_i)`
410
+ conjugated to a character of `C(h_i)`, when `h_i` is a conjugate
411
+ of the fixed representative `g_i`. More exactly, there exists `r_i`
412
+ such that `r_i g_i r_i^{-1} = h_i`, and then `\chi_i^{(h_i)}(x) =
413
+ \chi_i(r_i^{-1}xr_i)`, and this definition does not depend on the
414
+ choice of `r_i`.
415
+
416
+ .. NOTE::
417
+
418
+ This should be functionally equivalent, and testing shows
419
+ that it is, but it is slower.
420
+
421
+ EXAMPLES::
422
+
423
+ sage: A = FusionDouble(AlternatingGroup(4),prefix='aa',inject_variables=True)
424
+ sage: [A.Nk_ij(aa8,aa10,x) for x in A.basis()]
425
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1]
426
+
427
+ sage: B = FusionDouble(CyclicPermutationGroup(2))
428
+ sage: all(B.Nk_ij(x,y,z,use_characters=True) == B.Nk_ij(x,y,z)
429
+ ....: for x in B.basis() for y in B.basis() for z in B.basis())
430
+ True
431
+ """
432
+ if not use_characters:
433
+ return self.N_ijk(i, j, self.dual(k))
434
+
435
+ G = self._G
436
+ I = G.conjugacy_class(i.g())
437
+ J = G.conjugacy_class(j.g())
438
+ IJ = {I_elem * J_elem for I_elem in I for J_elem in J}
439
+ if k.g() not in IJ:
440
+ return ZZ.zero()
441
+
442
+ K = G.conjugacy_class(k.g())
443
+ CI = G.centralizer(i.g())
444
+ CJ = G.centralizer(j.g())
445
+ CK = G.centralizer(k.g())
446
+
447
+ c = K.cardinality() / G.order()
448
+ summands = [(I_elem, J_elem) for I_elem in I for J_elem in J if I_elem * J_elem == k.g()]
449
+ res = ZZ.zero()
450
+ ichar = i.char()
451
+ jchar = j.char()
452
+ kchar = k.char()
453
+ for p in summands:
454
+ I_elem, J_elem = p
455
+ for g in G:
456
+ ginv = g.inverse()
457
+ if ginv * i.g() * g == I_elem:
458
+ i_twist = g
459
+ if ginv * j.g() * g == J_elem:
460
+ j_twist = g
461
+ A = Set(i_twist.inverse() * zi * i_twist for zi in CI)
462
+ B = Set(j_twist.inverse() * zj * j_twist for zj in CJ)
463
+ inner_summands = A.intersection(B).intersection(Set(CK))
464
+ i_twist_inv = i_twist.inverse()
465
+ j_twist_inv = j_twist.inverse()
466
+ res += sum(ichar(i_twist * x * i_twist_inv) * jchar(j_twist * x * j_twist_inv) * kchar(x).conjugate()
467
+ for x in inner_summands)
468
+ return c * res
469
+
470
+ @cached_method
471
+ def field(self):
472
+ """
473
+ Return a cyclotomic field large enough to contain the values
474
+ of R-matrices and twists that can arise for this fusion ring.
475
+
476
+ EXAMPLES::
477
+
478
+ sage: FusionDouble(SymmetricGroup(3)).field()
479
+ Cyclotomic Field of order 24 and degree 8
480
+ """
481
+ return CyclotomicField(4 * self._cyclotomic_order)
482
+
483
+ def fvars_field(self):
484
+ r"""
485
+ Return a field containing the ``CyclotomicField`` computed by
486
+ :meth:`field` as well as all the F-symbols of the associated
487
+ ``FMatrix`` factory object.
488
+
489
+ This method is only available if ``self`` is multiplicity-free.
490
+
491
+ EXAMPLES::
492
+
493
+ sage: FusionDouble(SymmetricGroup(3)).fvars_field()
494
+ Cyclotomic Field of order 24 and degree 8
495
+ """
496
+ if self.is_multiplicity_free(verbose=False):
497
+ return self.get_fmatrix().field()
498
+ raise NotImplementedError("method is only available for multiplicity free fusion rings")
499
+
500
+ def root_of_unity(self, r, base_coercion=True):
501
+ r"""
502
+ Return `e^{i\pi r}` as an element of ``self.field()`` if possible.
503
+
504
+ INPUT:
505
+
506
+ - ``r`` -- a rational number
507
+
508
+ EXAMPLES::
509
+
510
+ sage: H = FusionDouble(DihedralGroup(6))
511
+ sage: H.field()
512
+ Cyclotomic Field of order 24 and degree 8
513
+ sage: for n in [1..7]:
514
+ ....: try:
515
+ ....: print (n,H.root_of_unity(2/n))
516
+ ....: except ValueError as err:
517
+ ....: print (n,err)
518
+ ....:
519
+ 1 1
520
+ 2 -1
521
+ 3 zeta24^4 - 1
522
+ 4 zeta24^6
523
+ 5 not a root of unity in the field
524
+ 6 zeta24^4
525
+ 7 not a root of unity in the field
526
+ """
527
+ n = 2 * r * self._cyclotomic_order
528
+ if n not in ZZ:
529
+ raise ValueError("not a root of unity in the field")
530
+ ret = self.field().gen() ** n
531
+ if (not base_coercion) or (self._basecoer is None):
532
+ return ret
533
+ return self._basecoer(ret)
534
+
535
+ @cached_method
536
+ def r_matrix(self, i, j, k, base_coercion=True):
537
+ r"""
538
+ Return the R-matrix entry corresponding to the subobject ``k``
539
+ in the tensor product of ``i`` with ``j``. This method is only
540
+ correct if the fusion coefficient ``N_{ij}^k\leq 1``. See the
541
+ :class:`FusionRing` method for more information, including
542
+ the reason for this caveat, and the algorithm.
543
+
544
+ EXAMPLES::
545
+
546
+ sage: C = FusionDouble(SymmetricGroup(3),prefix='c',inject_variables=True)
547
+ sage: c4*c5
548
+ c3 + c4
549
+ sage: [C.r_matrix(c4,c5,k) for k in [c3,c4]]
550
+ [-zeta24^6, 1]
551
+ sage: c6^2
552
+ c0 + c1 + c6
553
+ sage: [C.r_matrix(c6,c6,k) for k in [c0,c1,c6]]
554
+ [zeta3, -zeta3, -zeta3 - 1]
555
+ """
556
+ if self.Nk_ij(i, j, k) == 0:
557
+ return self.field().zero() if (not base_coercion) or (self._basecoer is None) else self.fvars_field().zero()
558
+
559
+ if i != j:
560
+ ret = self.root_of_unity((k.twist() - i.twist() - j.twist()) / 2)
561
+ else:
562
+ i0 = self.one()
563
+ B = self.basis()
564
+ ret = sum(y.ribbon()**2 / (i.ribbon() * x.ribbon()**2)
565
+ * self.s_ij(i0, y) * self.s_ij(i, z) * self.s_ijconj(x, z)
566
+ * self.s_ijconj(k, x) * self.s_ijconj(y, z) / self.s_ij(i0, z)
567
+ for x in B for y in B for z in B) / (self.total_q_order()**4)
568
+
569
+ if (not base_coercion) or (self._basecoer is None):
570
+ return ret
571
+ return self._basecoer(ret)
572
+
573
+ def global_q_dimension(self, base_coercion=True):
574
+ r"""
575
+ Return the global quantum dimension, which is the sum of the squares of the
576
+ quantum dimensions of the simple objects.
577
+
578
+ For the Drinfeld double, it is the square of the order of the underlying quantum group.
579
+
580
+ EXAMPLES::
581
+
582
+ sage: G = SymmetricGroup(4)
583
+ sage: H = FusionDouble(G)
584
+ sage: H.global_q_dimension()
585
+ 576
586
+ sage: sum(x.q_dimension()^2 for x in H.basis())
587
+ 576
588
+ """
589
+ ret = self._G.order() ** 2
590
+ if (not base_coercion) or (self._basecoer is None):
591
+ return ret
592
+ return self._basecoer(ret)
593
+
594
+ def total_q_order(self, base_coercion=True):
595
+ r"""
596
+ Return the positive square root of :meth:`self.global_q_dimension()
597
+ <global_q_dimension>` as an element of :meth:`self.field() <field>`.
598
+
599
+ For the Drinfeld double of a finite group `G`, this equals the
600
+ cardinality of `G`. This is also equal to `\sum d_i^2 \theta_i^{\pm 1}`,
601
+ where `i` runs through the simple objects, `d_i` is the quantum
602
+ dimension, and `\theta_i` is the twist. This sum with `\theta_i` is
603
+ denoted `p_-` in [BaKi2001]_ Chapter 3.
604
+
605
+ EXAMPLES::
606
+
607
+ sage: FusionDouble(DihedralGroup(7)).total_q_order()
608
+ 14
609
+ """
610
+ ret = self._G.order()
611
+ if (not base_coercion) or (self._basecoer is None):
612
+ return ret
613
+ return self._basecoer(ret)
614
+
615
+ D_minus = D_plus = total_q_order
616
+
617
+ def is_multiplicity_free(self, verbose=False) -> bool:
618
+ """
619
+ Return ``True`` if all fusion coefficients are at most 1.
620
+
621
+ EXAMPLES::
622
+
623
+ sage: FusionDouble(SymmetricGroup(3)).is_multiplicity_free()
624
+ True
625
+ sage: FusionDouble(SymmetricGroup(4)).is_multiplicity_free()
626
+ False
627
+
628
+ sage: FusionDouble(SymmetricGroup(3)).is_multiplicity_free(True)
629
+ Checking multiplicity freeness
630
+ True
631
+ sage: FusionDouble(SymmetricGroup(4)).is_multiplicity_free(True)
632
+ Checking multiplicity freeness
633
+ N(s2,s13,s13) = 2
634
+ False
635
+ """
636
+ if verbose:
637
+ print("Checking multiplicity freeness")
638
+ from itertools import product
639
+ for (i, j, k) in product(self.basis(), repeat=3):
640
+ if self.N_ijk(i, j, k) > 1:
641
+ print("N(%s,%s,%s) = %s" % (i, j, k, self.N_ijk(i, j, k)))
642
+ return False
643
+ return True
644
+
645
+ return all(self.N_ijk(i, j, k) <= 1 for i in self.basis()
646
+ for j in self.basis() for k in self.basis())
647
+
648
+ @cached_method
649
+ def one_basis(self):
650
+ r"""
651
+ The unit element of the ring, which is the first basis element.
652
+
653
+ EXAMPLES::
654
+
655
+ sage: FusionDouble(CyclicPermutationGroup(2), prefix='h').one()
656
+ h1
657
+ """
658
+ return self._unit_index
659
+
660
+ @cached_method
661
+ def dual(self, i):
662
+ r"""
663
+ Return the dual object ``i^\ast`` to ``i``.
664
+
665
+ The dual is also available as an element method of ``i``.
666
+
667
+ EXAMPLES::
668
+
669
+ sage: K = FusionDouble(CyclicPermutationGroup(3),prefix='k')
670
+ sage: [(x,K.dual(x)) for x in K.basis()]
671
+ [(k0, k0),
672
+ (k1, k2),
673
+ (k2, k1),
674
+ (k3, k6),
675
+ (k4, k8),
676
+ (k5, k7),
677
+ (k6, k3),
678
+ (k7, k5),
679
+ (k8, k4)]
680
+ sage: all(K.dual(x)==x.dual() for x in K.basis())
681
+ True
682
+ """
683
+ sz = self.one()
684
+ for j in self.basis():
685
+ if self.N_ijk(i, j, sz) > 0:
686
+ return j
687
+
688
+ def product_on_basis(self, a, b):
689
+ """
690
+ Return the product of two basis elements corresponding to keys `a` and `b`.
691
+
692
+ INPUT:
693
+
694
+ - ``a``, ``b`` -- keys for the dictionary ``self._names`` representing
695
+ simple objects
696
+
697
+ EXAMPLES::
698
+
699
+ sage: Q=FusionDouble(SymmetricGroup(3),prefix='q',inject_variables=True)
700
+ sage: q3*q4
701
+ q1 + q2 + q5 + q6 + q7
702
+ sage: Q._names
703
+ {0: 'q0', 1: 'q1', 2: 'q2', 3: 'q3', 4: 'q4', 5: 'q5', 6: 'q6', 7: 'q7'}
704
+ sage: Q.product_on_basis(3,4)
705
+ q1 + q2 + q5 + q6 + q7
706
+ """
707
+ d = {k.support_of_term(): val for k in self.basis()
708
+ if (val := self.N_ijk(self.monomial(a), self.monomial(b),
709
+ self.dual(k)))}
710
+ return self._from_dict(d, remove_zeros=False)
711
+
712
+ def group(self):
713
+ """
714
+ Return the underlying group.
715
+
716
+ EXAMPLES::
717
+
718
+ sage: FusionDouble(DiCyclicGroup(4)).group()
719
+ Dicyclic group of order 16 as a permutation group
720
+ """
721
+ return self._G
722
+
723
+ def get_fmatrix(self, *args, **kwargs):
724
+ r"""
725
+ Construct an :class:`FMatrix` factory to solve the pentagon and
726
+ hexagon relations and organize the resulting F-symbols.
727
+
728
+ EXAMPLES::
729
+
730
+ sage: f = FusionDouble(SymmetricGroup(3)).get_fmatrix(); f
731
+ F-Matrix factory for The Fusion Ring of the Drinfeld Double of
732
+ Symmetric group of order 3! as a permutation group
733
+ """
734
+ if not hasattr(self, 'fmats') or kwargs.get('new', False):
735
+ kwargs.pop('new', None)
736
+ from sage.algebras.fusion_rings.f_matrix import FMatrix
737
+ self.fmats = FMatrix(self, *args, **kwargs)
738
+ return self.fmats
739
+
740
+ class Element(CombinatorialFreeModule.Element):
741
+ def is_simple_object(self) -> bool:
742
+ r"""
743
+ Determine whether ``self`` is a simple object (basis element) of the fusion ring.
744
+
745
+ EXAMPLES::
746
+
747
+ sage: H = FusionDouble(CyclicPermutationGroup(2), prefix='g', inject_variables=True)
748
+ sage: [x.is_simple_object() for x in [g0, g1, g0+g1]]
749
+ [True, True, False]
750
+ """
751
+ return len(self._monomial_coefficients) == 1
752
+
753
+ def g(self):
754
+ r"""
755
+ The data determining a simple object consists of a conjugacy
756
+ class representative `g` and an irreducible character `\chi` of
757
+ the centralizer of `g`.
758
+
759
+ This returns the conjugacy class representative of the underlying
760
+ group corresponding to a simple object. See also :meth:`char`.
761
+
762
+ EXAMPLES::
763
+
764
+ sage: G = QuaternionGroup()
765
+ sage: H = FusionDouble(G, prefix='e', inject_variables=True)
766
+ sage: e10.g()
767
+ (1,3)(2,4)(5,7)(6,8)
768
+ sage: e10.char()
769
+ Character of Subgroup generated by [(1,2,3,4)(5,6,7,8), (1,5,3,7)(2,8,4,6)]
770
+ of (Quaternion group of order 8 as a permutation group)
771
+ """
772
+ return self.parent()._elt[self.support_of_term()]
773
+
774
+ def char(self):
775
+ r"""
776
+ Return the character `\chi` corresponding to ``self``.
777
+
778
+ The data determining a simple object consists of a conjugacy
779
+ class representative `g` and an irreducible character `\chi` of
780
+ the centralizer of `g`.
781
+
782
+ .. SEEALSO:: :meth:`g`
783
+
784
+ EXAMPLES::
785
+
786
+ sage: G = DihedralGroup(5)
787
+ sage: H = FusionDouble(G, prefix='f', inject_variables=True)
788
+ sage: f10.g()
789
+ (1,2,3,4,5)
790
+ sage: f10.char()
791
+ Character of Subgroup generated by [(1,2,3,4,5)] of
792
+ (Dihedral group of order 10 as a permutation group)
793
+ """
794
+ return self.parent()._chi[self.support_of_term()]
795
+
796
+ def ribbon(self, base_coercion=True):
797
+ """
798
+ Return the twist or ribbon of the simple object.
799
+
800
+ EXAMPLES::
801
+
802
+ sage: H = FusionDouble(CyclicPermutationGroup(3))
803
+ sage: [i.ribbon() for i in H.basis()]
804
+ [1, 1, 1, 1, zeta3, -zeta3 - 1, 1, -zeta3 - 1, zeta3]
805
+ """
806
+ i = self.support_of_term()
807
+ P = self.parent()
808
+ ret = P._char_cache(i, self.g()) / P._char_cache(i, P._G.one())
809
+ if (not base_coercion) or (P._basecoer is None):
810
+ return ret
811
+ return self.parent()._basecoer(ret)
812
+
813
+ def twist(self, reduced=True):
814
+ r"""
815
+ Return a rational number `h` such that `\theta = e^{i \pi h}`
816
+ is the twist of ``self``.
817
+
818
+ The quantity `e^{i \pi h}` is also available using :meth:`ribbon`.
819
+
820
+ This method is only available for simple objects.
821
+
822
+ EXAMPLES::
823
+
824
+ sage: Q=FusionDouble(CyclicPermutationGroup(3))
825
+ sage: [x.twist() for x in Q.basis()]
826
+ [0, 0, 0, 0, 2/3, 4/3, 0, 4/3, 2/3]
827
+ sage: [x.ribbon() for x in Q.basis()]
828
+ [1, 1, 1, 1, zeta3, -zeta3 - 1, 1, -zeta3 - 1, zeta3]
829
+
830
+ TESTS::
831
+
832
+ sage: H = FusionDouble(AlternatingGroup(4))
833
+ sage: sum(H.basis()).twist()
834
+ Traceback (most recent call last):
835
+ ...
836
+ ValueError: quantum twist is only available for simple objects
837
+ """
838
+ if not self.is_simple_object():
839
+ raise ValueError("quantum twist is only available for simple objects")
840
+ P = self.parent()
841
+ zeta = P.field().gen()
842
+ rib = self.ribbon()
843
+ norm = 2 * P._cyclotomic_order
844
+ for k in range(4 * P._cyclotomic_order):
845
+ if zeta ** k == rib:
846
+ return k / norm
847
+
848
+ def dual(self):
849
+ """
850
+ Return the dual of ``self``.
851
+
852
+ This method is only available for simple objects.
853
+
854
+ EXAMPLES::
855
+
856
+ sage: G = CyclicPermutationGroup(4)
857
+ sage: H = FusionDouble(G, prefix='j')
858
+ sage: [x for x in H.basis() if x == x.dual()]
859
+ [j0, j1, j8, j9]
860
+
861
+ TESTS::
862
+
863
+ sage: H = FusionDouble(AlternatingGroup(4))
864
+ sage: sum(H.basis()).dual()
865
+ Traceback (most recent call last):
866
+ ...
867
+ ValueError: dual is only available for simple objects
868
+ """
869
+ if not self.is_simple_object():
870
+ raise ValueError("dual is only available for simple objects")
871
+ return self.parent().dual(self)
872
+
873
+ @cached_method
874
+ def q_dimension(self, base_coercion=True):
875
+ """
876
+ Return the q-dimension of ``self``.
877
+
878
+ This method is only available for simple objects.
879
+
880
+ EXAMPLES::
881
+
882
+ sage: G = AlternatingGroup(4)
883
+ sage: H = FusionDouble(G)
884
+ sage: [x.q_dimension() for x in H.basis()]
885
+ [1, 1, 1, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4]
886
+ sage: sum(x.q_dimension()^2 for x in H.basis()) == G.order()^2
887
+ True
888
+
889
+ TESTS::
890
+
891
+ sage: H = FusionDouble(AlternatingGroup(4))
892
+ sage: sum(H.basis()).q_dimension()
893
+ Traceback (most recent call last):
894
+ ...
895
+ ValueError: quantum dimension is only available for simple objects
896
+ """
897
+ if not self.is_simple_object():
898
+ raise ValueError("quantum dimension is only available for simple objects")
899
+ return self.parent().s_ij(self, self.parent().one())