passagemath-singular 10.6.31rc3__cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.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.
- PySingular.cpython-314-x86_64-linux-gnu.so +0 -0
- passagemath_singular-10.6.31rc3.dist-info/METADATA +183 -0
- passagemath_singular-10.6.31rc3.dist-info/RECORD +491 -0
- passagemath_singular-10.6.31rc3.dist-info/WHEEL +6 -0
- passagemath_singular-10.6.31rc3.dist-info/top_level.txt +3 -0
- passagemath_singular.libs/libSingular-4-20aec911.4.1.so +0 -0
- passagemath_singular.libs/libcddgmp-21acf0c6.so.0.1.3 +0 -0
- passagemath_singular.libs/libfactory-4-fcee31da.4.1.so +0 -0
- passagemath_singular.libs/libflint-66e12231.so.21.0.0 +0 -0
- passagemath_singular.libs/libgf2x-a4cdec90.so.3.0.0 +0 -0
- passagemath_singular.libs/libgfortran-83c28eba.so.5.0.0 +0 -0
- passagemath_singular.libs/libgmp-6e109695.so.10.5.0 +0 -0
- passagemath_singular.libs/libgsl-cda90e79.so.28.0.0 +0 -0
- passagemath_singular.libs/libmpfr-82690d50.so.6.2.1 +0 -0
- passagemath_singular.libs/libntl-e6f0d543.so.44.0.1 +0 -0
- passagemath_singular.libs/libomalloc-0-5c9e866e.9.6.so +0 -0
- passagemath_singular.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
- passagemath_singular.libs/libpolys-4-5c0a87e0.4.1.so +0 -0
- passagemath_singular.libs/libquadmath-2284e583.so.0.0.0 +0 -0
- passagemath_singular.libs/libreadline-ea270e21.so.8.2 +0 -0
- passagemath_singular.libs/libsingular_resources-4-a1aafc6d.4.1.so +0 -0
- passagemath_singular.libs/libtinfo-ceb117d9.so.6.3 +0 -0
- sage/algebras/all__sagemath_singular.py +3 -0
- sage/algebras/fusion_rings/all.py +19 -0
- sage/algebras/fusion_rings/f_matrix.py +2448 -0
- sage/algebras/fusion_rings/fast_parallel_fmats_methods.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/fusion_rings/fast_parallel_fmats_methods.pxd +5 -0
- sage/algebras/fusion_rings/fast_parallel_fmats_methods.pyx +538 -0
- sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pxd +3 -0
- sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pyx +331 -0
- sage/algebras/fusion_rings/fusion_double.py +899 -0
- sage/algebras/fusion_rings/fusion_ring.py +1580 -0
- sage/algebras/fusion_rings/poly_tup_engine.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/fusion_rings/poly_tup_engine.pxd +24 -0
- sage/algebras/fusion_rings/poly_tup_engine.pyx +579 -0
- sage/algebras/fusion_rings/shm_managers.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/fusion_rings/shm_managers.pxd +24 -0
- sage/algebras/fusion_rings/shm_managers.pyx +780 -0
- sage/algebras/letterplace/all.py +1 -0
- sage/algebras/letterplace/free_algebra_element_letterplace.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/letterplace/free_algebra_element_letterplace.pxd +18 -0
- sage/algebras/letterplace/free_algebra_element_letterplace.pyx +755 -0
- sage/algebras/letterplace/free_algebra_letterplace.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/letterplace/free_algebra_letterplace.pxd +35 -0
- sage/algebras/letterplace/free_algebra_letterplace.pyx +914 -0
- sage/algebras/letterplace/letterplace_ideal.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/letterplace/letterplace_ideal.pyx +408 -0
- sage/algebras/quatalg/all.py +2 -0
- sage/algebras/quatalg/quaternion_algebra.py +4778 -0
- sage/algebras/quatalg/quaternion_algebra_cython.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/quatalg/quaternion_algebra_cython.pyx +261 -0
- sage/algebras/quatalg/quaternion_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/quatalg/quaternion_algebra_element.pxd +29 -0
- sage/algebras/quatalg/quaternion_algebra_element.pyx +2176 -0
- sage/all__sagemath_singular.py +11 -0
- sage/ext_data/all__sagemath_singular.py +1 -0
- sage/ext_data/singular/function_field/core.lib +98 -0
- sage/interfaces/all__sagemath_singular.py +1 -0
- sage/interfaces/singular.py +2835 -0
- sage/libs/all__sagemath_singular.py +1 -0
- sage/libs/singular/__init__.py +1 -0
- sage/libs/singular/decl.pxd +1168 -0
- sage/libs/singular/function.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/singular/function.pxd +87 -0
- sage/libs/singular/function.pyx +1901 -0
- sage/libs/singular/function_factory.py +61 -0
- sage/libs/singular/groebner_strategy.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/singular/groebner_strategy.pxd +22 -0
- sage/libs/singular/groebner_strategy.pyx +582 -0
- sage/libs/singular/option.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/singular/option.pyx +671 -0
- sage/libs/singular/polynomial.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/singular/polynomial.pxd +39 -0
- sage/libs/singular/polynomial.pyx +661 -0
- sage/libs/singular/ring.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/singular/ring.pxd +58 -0
- sage/libs/singular/ring.pyx +893 -0
- sage/libs/singular/singular.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/singular/singular.pxd +72 -0
- sage/libs/singular/singular.pyx +1944 -0
- sage/libs/singular/standard_options.py +145 -0
- sage/matrix/all__sagemath_singular.py +1 -0
- sage/matrix/matrix_mpolynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_mpolynomial_dense.pxd +7 -0
- sage/matrix/matrix_mpolynomial_dense.pyx +615 -0
- sage/rings/all__sagemath_singular.py +1 -0
- sage/rings/function_field/all__sagemath_singular.py +1 -0
- sage/rings/function_field/derivations_polymod.py +911 -0
- sage/rings/function_field/element_polymod.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/function_field/element_polymod.pyx +406 -0
- sage/rings/function_field/function_field_polymod.py +2611 -0
- sage/rings/function_field/ideal_polymod.py +1775 -0
- sage/rings/function_field/order_polymod.py +1475 -0
- sage/rings/function_field/place_polymod.py +681 -0
- sage/rings/polynomial/all__sagemath_singular.py +1 -0
- sage/rings/polynomial/multi_polynomial_ideal_libsingular.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/multi_polynomial_ideal_libsingular.pxd +5 -0
- sage/rings/polynomial/multi_polynomial_ideal_libsingular.pyx +339 -0
- sage/rings/polynomial/multi_polynomial_libsingular.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/multi_polynomial_libsingular.pxd +30 -0
- sage/rings/polynomial/multi_polynomial_libsingular.pyx +6277 -0
- sage/rings/polynomial/plural.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/plural.pxd +48 -0
- sage/rings/polynomial/plural.pyx +3171 -0
- sage/symbolic/all__sagemath_singular.py +1 -0
- sage/symbolic/comparison_impl.pxi +428 -0
- sage/symbolic/constants_c_impl.pxi +178 -0
- sage/symbolic/expression.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/symbolic/expression.pxd +7 -0
- sage/symbolic/expression.pyx +14200 -0
- sage/symbolic/getitem_impl.pxi +202 -0
- sage/symbolic/pynac.pxi +572 -0
- sage/symbolic/pynac_constant_impl.pxi +133 -0
- sage/symbolic/pynac_function_impl.pxi +206 -0
- sage/symbolic/pynac_impl.pxi +2576 -0
- sage/symbolic/pynac_wrap.h +124 -0
- sage/symbolic/series_impl.pxi +272 -0
- sage/symbolic/substitution_map_impl.pxi +94 -0
- sage_wheels/bin/ESingular +0 -0
- sage_wheels/bin/Singular +0 -0
- sage_wheels/bin/TSingular +0 -0
- sage_wheels/lib/singular/MOD/cohomo.la +41 -0
- sage_wheels/lib/singular/MOD/cohomo.so +0 -0
- sage_wheels/lib/singular/MOD/customstd.la +41 -0
- sage_wheels/lib/singular/MOD/customstd.so +0 -0
- sage_wheels/lib/singular/MOD/freealgebra.la +41 -0
- sage_wheels/lib/singular/MOD/freealgebra.so +0 -0
- sage_wheels/lib/singular/MOD/gfanlib.la +41 -0
- sage_wheels/lib/singular/MOD/gfanlib.so +0 -0
- sage_wheels/lib/singular/MOD/gitfan.la +41 -0
- sage_wheels/lib/singular/MOD/gitfan.so +0 -0
- sage_wheels/lib/singular/MOD/interval.la +41 -0
- sage_wheels/lib/singular/MOD/interval.so +0 -0
- sage_wheels/lib/singular/MOD/loctriv.la +41 -0
- sage_wheels/lib/singular/MOD/loctriv.so +0 -0
- sage_wheels/lib/singular/MOD/machinelearning.la +41 -0
- sage_wheels/lib/singular/MOD/machinelearning.so +0 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.la +41 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.so +0 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.la +41 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.so +0 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldQ.la +41 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldQ.so +0 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldZp.la +41 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldZp.so +0 -0
- sage_wheels/lib/singular/MOD/partialgb.la +41 -0
- sage_wheels/lib/singular/MOD/partialgb.so +0 -0
- sage_wheels/lib/singular/MOD/pyobject.la +41 -0
- sage_wheels/lib/singular/MOD/pyobject.so +0 -0
- sage_wheels/lib/singular/MOD/singmathic.la +41 -0
- sage_wheels/lib/singular/MOD/singmathic.so +0 -0
- sage_wheels/lib/singular/MOD/sispasm.la +41 -0
- sage_wheels/lib/singular/MOD/sispasm.so +0 -0
- sage_wheels/lib/singular/MOD/subsets.la +41 -0
- sage_wheels/lib/singular/MOD/subsets.so +0 -0
- sage_wheels/lib/singular/MOD/systhreads.la +41 -0
- sage_wheels/lib/singular/MOD/systhreads.so +0 -0
- sage_wheels/lib/singular/MOD/syzextra.la +41 -0
- sage_wheels/lib/singular/MOD/syzextra.so +0 -0
- sage_wheels/libexec/singular/MOD/change_cost +0 -0
- sage_wheels/libexec/singular/MOD/singularsurf +11 -0
- sage_wheels/libexec/singular/MOD/singularsurf_jupyter +9 -0
- sage_wheels/libexec/singular/MOD/singularsurf_win +10 -0
- sage_wheels/libexec/singular/MOD/solve_IP +0 -0
- sage_wheels/libexec/singular/MOD/surfex +16 -0
- sage_wheels/libexec/singular/MOD/toric_ideal +0 -0
- sage_wheels/share/factory/gftables/10201 +342 -0
- sage_wheels/share/factory/gftables/1024 +37 -0
- sage_wheels/share/factory/gftables/10609 +356 -0
- sage_wheels/share/factory/gftables/11449 +384 -0
- sage_wheels/share/factory/gftables/11881 +398 -0
- sage_wheels/share/factory/gftables/121 +6 -0
- sage_wheels/share/factory/gftables/12167 +408 -0
- sage_wheels/share/factory/gftables/125 +7 -0
- sage_wheels/share/factory/gftables/12769 +428 -0
- sage_wheels/share/factory/gftables/128 +7 -0
- sage_wheels/share/factory/gftables/1331 +47 -0
- sage_wheels/share/factory/gftables/1369 +48 -0
- sage_wheels/share/factory/gftables/14641 +490 -0
- sage_wheels/share/factory/gftables/15625 +523 -0
- sage_wheels/share/factory/gftables/16 +3 -0
- sage_wheels/share/factory/gftables/16129 +540 -0
- sage_wheels/share/factory/gftables/16384 +549 -0
- sage_wheels/share/factory/gftables/16807 +563 -0
- sage_wheels/share/factory/gftables/1681 +58 -0
- sage_wheels/share/factory/gftables/169 +8 -0
- sage_wheels/share/factory/gftables/17161 +574 -0
- sage_wheels/share/factory/gftables/1849 +64 -0
- sage_wheels/share/factory/gftables/18769 +628 -0
- sage_wheels/share/factory/gftables/19321 +646 -0
- sage_wheels/share/factory/gftables/19683 +659 -0
- sage_wheels/share/factory/gftables/2048 +71 -0
- sage_wheels/share/factory/gftables/2187 +75 -0
- sage_wheels/share/factory/gftables/2197 +76 -0
- sage_wheels/share/factory/gftables/2209 +76 -0
- sage_wheels/share/factory/gftables/22201 +742 -0
- sage_wheels/share/factory/gftables/22801 +762 -0
- sage_wheels/share/factory/gftables/2401 +82 -0
- sage_wheels/share/factory/gftables/243 +11 -0
- sage_wheels/share/factory/gftables/24389 +815 -0
- sage_wheels/share/factory/gftables/24649 +824 -0
- sage_wheels/share/factory/gftables/25 +3 -0
- sage_wheels/share/factory/gftables/256 +11 -0
- sage_wheels/share/factory/gftables/26569 +888 -0
- sage_wheels/share/factory/gftables/27 +3 -0
- sage_wheels/share/factory/gftables/27889 +932 -0
- sage_wheels/share/factory/gftables/2809 +96 -0
- sage_wheels/share/factory/gftables/28561 +954 -0
- sage_wheels/share/factory/gftables/289 +12 -0
- sage_wheels/share/factory/gftables/29791 +995 -0
- sage_wheels/share/factory/gftables/29929 +1000 -0
- sage_wheels/share/factory/gftables/3125 +107 -0
- sage_wheels/share/factory/gftables/32 +4 -0
- sage_wheels/share/factory/gftables/32041 +1070 -0
- sage_wheels/share/factory/gftables/32761 +1094 -0
- sage_wheels/share/factory/gftables/32768 +1095 -0
- sage_wheels/share/factory/gftables/343 +14 -0
- sage_wheels/share/factory/gftables/3481 +118 -0
- sage_wheels/share/factory/gftables/361 +14 -0
- sage_wheels/share/factory/gftables/36481 +1218 -0
- sage_wheels/share/factory/gftables/3721 +126 -0
- sage_wheels/share/factory/gftables/37249 +1244 -0
- sage_wheels/share/factory/gftables/38809 +1296 -0
- sage_wheels/share/factory/gftables/39601 +1322 -0
- sage_wheels/share/factory/gftables/4 +3 -0
- sage_wheels/share/factory/gftables/4096 +139 -0
- sage_wheels/share/factory/gftables/44521 +1486 -0
- sage_wheels/share/factory/gftables/4489 +152 -0
- sage_wheels/share/factory/gftables/49 +4 -0
- sage_wheels/share/factory/gftables/4913 +166 -0
- sage_wheels/share/factory/gftables/49729 +1660 -0
- sage_wheels/share/factory/gftables/5041 +170 -0
- sage_wheels/share/factory/gftables/50653 +1691 -0
- sage_wheels/share/factory/gftables/512 +20 -0
- sage_wheels/share/factory/gftables/51529 +1720 -0
- sage_wheels/share/factory/gftables/52441 +1750 -0
- sage_wheels/share/factory/gftables/529 +20 -0
- sage_wheels/share/factory/gftables/5329 +180 -0
- sage_wheels/share/factory/gftables/54289 +1812 -0
- sage_wheels/share/factory/gftables/57121 +1906 -0
- sage_wheels/share/factory/gftables/58081 +1938 -0
- sage_wheels/share/factory/gftables/59049 +1971 -0
- sage_wheels/share/factory/gftables/6241 +210 -0
- sage_wheels/share/factory/gftables/625 +23 -0
- sage_wheels/share/factory/gftables/63001 +2102 -0
- sage_wheels/share/factory/gftables/64 +5 -0
- sage_wheels/share/factory/gftables/6561 +221 -0
- sage_wheels/share/factory/gftables/6859 +231 -0
- sage_wheels/share/factory/gftables/6889 +232 -0
- sage_wheels/share/factory/gftables/729 +27 -0
- sage_wheels/share/factory/gftables/7921 +266 -0
- sage_wheels/share/factory/gftables/8 +3 -0
- sage_wheels/share/factory/gftables/81 +5 -0
- sage_wheels/share/factory/gftables/8192 +276 -0
- sage_wheels/share/factory/gftables/841 +30 -0
- sage_wheels/share/factory/gftables/9 +3 -0
- sage_wheels/share/factory/gftables/9409 +316 -0
- sage_wheels/share/factory/gftables/961 +34 -0
- sage_wheels/share/info/singular.info +191898 -0
- sage_wheels/share/singular/LIB/GND.lib +1359 -0
- sage_wheels/share/singular/LIB/JMBTest.lib +976 -0
- sage_wheels/share/singular/LIB/JMSConst.lib +1363 -0
- sage_wheels/share/singular/LIB/KVequiv.lib +699 -0
- sage_wheels/share/singular/LIB/SingularityDBM.lib +491 -0
- sage_wheels/share/singular/LIB/VecField.lib +1542 -0
- sage_wheels/share/singular/LIB/absfact.lib +959 -0
- sage_wheels/share/singular/LIB/ainvar.lib +730 -0
- sage_wheels/share/singular/LIB/aksaka.lib +419 -0
- sage_wheels/share/singular/LIB/alexpoly.lib +2542 -0
- sage_wheels/share/singular/LIB/algebra.lib +1193 -0
- sage_wheels/share/singular/LIB/all.lib +136 -0
- sage_wheels/share/singular/LIB/arcpoint.lib +514 -0
- sage_wheels/share/singular/LIB/arnold.lib +4553 -0
- sage_wheels/share/singular/LIB/arnoldclassify.lib +2058 -0
- sage_wheels/share/singular/LIB/arr.lib +3486 -0
- sage_wheels/share/singular/LIB/assprimeszerodim.lib +755 -0
- sage_wheels/share/singular/LIB/autgradalg.lib +3361 -0
- sage_wheels/share/singular/LIB/bfun.lib +1964 -0
- sage_wheels/share/singular/LIB/bimodules.lib +774 -0
- sage_wheels/share/singular/LIB/brillnoether.lib +226 -0
- sage_wheels/share/singular/LIB/brnoeth.lib +5017 -0
- sage_wheels/share/singular/LIB/central.lib +2169 -0
- sage_wheels/share/singular/LIB/chern.lib +4162 -0
- sage_wheels/share/singular/LIB/cimonom.lib +571 -0
- sage_wheels/share/singular/LIB/cisimplicial.lib +1835 -0
- sage_wheels/share/singular/LIB/classify.lib +3239 -0
- sage_wheels/share/singular/LIB/classify2.lib +1462 -0
- sage_wheels/share/singular/LIB/classifyMapGerms.lib +1515 -0
- sage_wheels/share/singular/LIB/classify_aeq.lib +3253 -0
- sage_wheels/share/singular/LIB/classifyceq.lib +2092 -0
- sage_wheels/share/singular/LIB/classifyci.lib +1133 -0
- sage_wheels/share/singular/LIB/combinat.lib +91 -0
- sage_wheels/share/singular/LIB/compregb.lib +276 -0
- sage_wheels/share/singular/LIB/control.lib +1636 -0
- sage_wheels/share/singular/LIB/crypto.lib +3795 -0
- sage_wheels/share/singular/LIB/curveInv.lib +667 -0
- sage_wheels/share/singular/LIB/curvepar.lib +1817 -0
- sage_wheels/share/singular/LIB/customstd.lib +100 -0
- sage_wheels/share/singular/LIB/deRham.lib +5979 -0
- sage_wheels/share/singular/LIB/decodegb.lib +2134 -0
- sage_wheels/share/singular/LIB/decomp.lib +1655 -0
- sage_wheels/share/singular/LIB/deflation.lib +872 -0
- sage_wheels/share/singular/LIB/deform.lib +925 -0
- sage_wheels/share/singular/LIB/difform.lib +3055 -0
- sage_wheels/share/singular/LIB/divisors.lib +750 -0
- sage_wheels/share/singular/LIB/dmod.lib +5817 -0
- sage_wheels/share/singular/LIB/dmodapp.lib +3269 -0
- sage_wheels/share/singular/LIB/dmodideal.lib +1211 -0
- sage_wheels/share/singular/LIB/dmodloc.lib +2645 -0
- sage_wheels/share/singular/LIB/dmodvar.lib +818 -0
- sage_wheels/share/singular/LIB/dummy.lib +17 -0
- sage_wheels/share/singular/LIB/elim.lib +1009 -0
- sage_wheels/share/singular/LIB/ellipticcovers.lib +548 -0
- sage_wheels/share/singular/LIB/enumpoints.lib +146 -0
- sage_wheels/share/singular/LIB/equising.lib +2127 -0
- sage_wheels/share/singular/LIB/ffmodstd.lib +2384 -0
- sage_wheels/share/singular/LIB/ffsolve.lib +1289 -0
- sage_wheels/share/singular/LIB/findifs.lib +778 -0
- sage_wheels/share/singular/LIB/finitediff.lib +1768 -0
- sage_wheels/share/singular/LIB/finvar.lib +7989 -0
- sage_wheels/share/singular/LIB/fpadim.lib +2429 -0
- sage_wheels/share/singular/LIB/fpalgebras.lib +1666 -0
- sage_wheels/share/singular/LIB/fpaprops.lib +1462 -0
- sage_wheels/share/singular/LIB/freegb.lib +3853 -0
- sage_wheels/share/singular/LIB/general.lib +1350 -0
- sage_wheels/share/singular/LIB/gfan.lib +1768 -0
- sage_wheels/share/singular/LIB/gitfan.lib +3130 -0
- sage_wheels/share/singular/LIB/gkdim.lib +99 -0
- sage_wheels/share/singular/LIB/gmspoly.lib +589 -0
- sage_wheels/share/singular/LIB/gmssing.lib +1739 -0
- sage_wheels/share/singular/LIB/goettsche.lib +909 -0
- sage_wheels/share/singular/LIB/graal.lib +1366 -0
- sage_wheels/share/singular/LIB/gradedModules.lib +2541 -0
- sage_wheels/share/singular/LIB/graphics.lib +360 -0
- sage_wheels/share/singular/LIB/grobcov.lib +7706 -0
- sage_wheels/share/singular/LIB/groups.lib +1123 -0
- sage_wheels/share/singular/LIB/grwalk.lib +507 -0
- sage_wheels/share/singular/LIB/hdepth.lib +194 -0
- sage_wheels/share/singular/LIB/help.cnf +57 -0
- sage_wheels/share/singular/LIB/hess.lib +1946 -0
- sage_wheels/share/singular/LIB/hnoether.lib +4292 -0
- sage_wheels/share/singular/LIB/hodge.lib +400 -0
- sage_wheels/share/singular/LIB/homolog.lib +1965 -0
- sage_wheels/share/singular/LIB/hyperel.lib +975 -0
- sage_wheels/share/singular/LIB/inout.lib +679 -0
- sage_wheels/share/singular/LIB/integralbasis.lib +6224 -0
- sage_wheels/share/singular/LIB/interval.lib +1418 -0
- sage_wheels/share/singular/LIB/intprog.lib +778 -0
- sage_wheels/share/singular/LIB/invar.lib +443 -0
- sage_wheels/share/singular/LIB/involut.lib +980 -0
- sage_wheels/share/singular/LIB/jacobson.lib +1215 -0
- sage_wheels/share/singular/LIB/kskernel.lib +534 -0
- sage_wheels/share/singular/LIB/latex.lib +3146 -0
- sage_wheels/share/singular/LIB/lejeune.lib +651 -0
- sage_wheels/share/singular/LIB/linalg.lib +2040 -0
- sage_wheels/share/singular/LIB/locnormal.lib +212 -0
- sage_wheels/share/singular/LIB/lrcalc.lib +526 -0
- sage_wheels/share/singular/LIB/makedbm.lib +294 -0
- sage_wheels/share/singular/LIB/mathml.lib +813 -0
- sage_wheels/share/singular/LIB/matrix.lib +1372 -0
- sage_wheels/share/singular/LIB/maxlike.lib +1132 -0
- sage_wheels/share/singular/LIB/methods.lib +212 -0
- sage_wheels/share/singular/LIB/moddiq.lib +322 -0
- sage_wheels/share/singular/LIB/modfinduni.lib +181 -0
- sage_wheels/share/singular/LIB/modnormal.lib +218 -0
- sage_wheels/share/singular/LIB/modprimdec.lib +1278 -0
- sage_wheels/share/singular/LIB/modquotient.lib +269 -0
- sage_wheels/share/singular/LIB/modstd.lib +1024 -0
- sage_wheels/share/singular/LIB/modular.lib +545 -0
- sage_wheels/share/singular/LIB/modules.lib +2561 -0
- sage_wheels/share/singular/LIB/modwalk.lib +609 -0
- sage_wheels/share/singular/LIB/mondromy.lib +1016 -0
- sage_wheels/share/singular/LIB/monomialideal.lib +3851 -0
- sage_wheels/share/singular/LIB/mprimdec.lib +2353 -0
- sage_wheels/share/singular/LIB/mregular.lib +1863 -0
- sage_wheels/share/singular/LIB/multigrading.lib +5629 -0
- sage_wheels/share/singular/LIB/ncHilb.lib +777 -0
- sage_wheels/share/singular/LIB/ncModslimgb.lib +791 -0
- sage_wheels/share/singular/LIB/ncalg.lib +16311 -0
- sage_wheels/share/singular/LIB/ncall.lib +31 -0
- sage_wheels/share/singular/LIB/ncdecomp.lib +468 -0
- sage_wheels/share/singular/LIB/ncfactor.lib +13371 -0
- sage_wheels/share/singular/LIB/ncfrac.lib +1023 -0
- sage_wheels/share/singular/LIB/nchilbert.lib +448 -0
- sage_wheels/share/singular/LIB/nchomolog.lib +759 -0
- sage_wheels/share/singular/LIB/ncloc.lib +361 -0
- sage_wheels/share/singular/LIB/ncpreim.lib +795 -0
- sage_wheels/share/singular/LIB/ncrat.lib +2849 -0
- sage_wheels/share/singular/LIB/nctools.lib +1887 -0
- sage_wheels/share/singular/LIB/nets.lib +1456 -0
- sage_wheels/share/singular/LIB/nfmodstd.lib +1000 -0
- sage_wheels/share/singular/LIB/nfmodsyz.lib +732 -0
- sage_wheels/share/singular/LIB/noether.lib +1106 -0
- sage_wheels/share/singular/LIB/normal.lib +8700 -0
- sage_wheels/share/singular/LIB/normaliz.lib +2226 -0
- sage_wheels/share/singular/LIB/ntsolve.lib +362 -0
- sage_wheels/share/singular/LIB/numerAlg.lib +560 -0
- sage_wheels/share/singular/LIB/numerDecom.lib +2261 -0
- sage_wheels/share/singular/LIB/olga.lib +1933 -0
- sage_wheels/share/singular/LIB/orbitparam.lib +351 -0
- sage_wheels/share/singular/LIB/parallel.lib +319 -0
- sage_wheels/share/singular/LIB/paraplanecurves.lib +3110 -0
- sage_wheels/share/singular/LIB/perron.lib +202 -0
- sage_wheels/share/singular/LIB/pfd.lib +2223 -0
- sage_wheels/share/singular/LIB/phindex.lib +642 -0
- sage_wheels/share/singular/LIB/pointid.lib +673 -0
- sage_wheels/share/singular/LIB/polybori.lib +1430 -0
- sage_wheels/share/singular/LIB/polyclass.lib +525 -0
- sage_wheels/share/singular/LIB/polylib.lib +1174 -0
- sage_wheels/share/singular/LIB/polymake.lib +1902 -0
- sage_wheels/share/singular/LIB/presolve.lib +1533 -0
- sage_wheels/share/singular/LIB/primdec.lib +9576 -0
- sage_wheels/share/singular/LIB/primdecint.lib +1782 -0
- sage_wheels/share/singular/LIB/primitiv.lib +401 -0
- sage_wheels/share/singular/LIB/puiseuxexpansions.lib +1631 -0
- sage_wheels/share/singular/LIB/purityfiltration.lib +960 -0
- sage_wheels/share/singular/LIB/qhmoduli.lib +1561 -0
- sage_wheels/share/singular/LIB/qmatrix.lib +293 -0
- sage_wheels/share/singular/LIB/random.lib +455 -0
- sage_wheels/share/singular/LIB/ratgb.lib +489 -0
- sage_wheels/share/singular/LIB/realclassify.lib +5759 -0
- sage_wheels/share/singular/LIB/realizationMatroids.lib +772 -0
- sage_wheels/share/singular/LIB/realrad.lib +1197 -0
- sage_wheels/share/singular/LIB/recover.lib +2628 -0
- sage_wheels/share/singular/LIB/redcgs.lib +3984 -0
- sage_wheels/share/singular/LIB/reesclos.lib +465 -0
- sage_wheels/share/singular/LIB/resbinomial.lib +2802 -0
- sage_wheels/share/singular/LIB/resgraph.lib +789 -0
- sage_wheels/share/singular/LIB/resjung.lib +820 -0
- sage_wheels/share/singular/LIB/resolve.lib +5110 -0
- sage_wheels/share/singular/LIB/resources.lib +170 -0
- sage_wheels/share/singular/LIB/reszeta.lib +5473 -0
- sage_wheels/share/singular/LIB/ring.lib +1328 -0
- sage_wheels/share/singular/LIB/ringgb.lib +343 -0
- sage_wheels/share/singular/LIB/rinvar.lib +1153 -0
- sage_wheels/share/singular/LIB/rootisolation.lib +1481 -0
- sage_wheels/share/singular/LIB/rootsmr.lib +709 -0
- sage_wheels/share/singular/LIB/rootsur.lib +886 -0
- sage_wheels/share/singular/LIB/rstandard.lib +607 -0
- sage_wheels/share/singular/LIB/rwalk.lib +336 -0
- sage_wheels/share/singular/LIB/sagbi.lib +1353 -0
- sage_wheels/share/singular/LIB/sagbiNormaliz.lib +1622 -0
- sage_wheels/share/singular/LIB/sagbiNormaliz0.lib +1498 -0
- sage_wheels/share/singular/LIB/sagbigrob.lib +449 -0
- sage_wheels/share/singular/LIB/schreyer.lib +321 -0
- sage_wheels/share/singular/LIB/schubert.lib +2551 -0
- sage_wheels/share/singular/LIB/sets.lib +524 -0
- sage_wheels/share/singular/LIB/sheafcoh.lib +1663 -0
- sage_wheels/share/singular/LIB/signcond.lib +437 -0
- sage_wheels/share/singular/LIB/sing.lib +1094 -0
- sage_wheels/share/singular/LIB/sing4ti2.lib +419 -0
- sage_wheels/share/singular/LIB/solve.lib +2243 -0
- sage_wheels/share/singular/LIB/spcurve.lib +1077 -0
- sage_wheels/share/singular/LIB/spectrum.lib +62 -0
- sage_wheels/share/singular/LIB/sresext.lib +757 -0
- sage_wheels/share/singular/LIB/ssi.lib +143 -0
- sage_wheels/share/singular/LIB/standard.lib +2769 -0
- sage_wheels/share/singular/LIB/stanleyreisner.lib +473 -0
- sage_wheels/share/singular/LIB/stdmodule.lib +547 -0
- sage_wheels/share/singular/LIB/stratify.lib +1070 -0
- sage_wheels/share/singular/LIB/surf.lib +506 -0
- sage_wheels/share/singular/LIB/surf_jupyter.lib +223 -0
- sage_wheels/share/singular/LIB/surfacesignature.lib +522 -0
- sage_wheels/share/singular/LIB/surfex.lib +1462 -0
- sage_wheels/share/singular/LIB/swalk.lib +877 -0
- sage_wheels/share/singular/LIB/symodstd.lib +1570 -0
- sage_wheels/share/singular/LIB/systhreads.lib +74 -0
- sage_wheels/share/singular/LIB/tasks.lib +1324 -0
- sage_wheels/share/singular/LIB/tateProdCplxNegGrad.lib +2412 -0
- sage_wheels/share/singular/LIB/teachstd.lib +858 -0
- sage_wheels/share/singular/LIB/template.lib +116 -0
- sage_wheels/share/singular/LIB/toric.lib +1119 -0
- sage_wheels/share/singular/LIB/transformation.lib +116 -0
- sage_wheels/share/singular/LIB/triang.lib +1197 -0
- sage_wheels/share/singular/LIB/tropical.lib +8741 -0
- sage_wheels/share/singular/LIB/tropicalEllipticCovers.lib +2922 -0
- sage_wheels/share/singular/LIB/tropicalNewton.lib +1128 -0
- sage_wheels/share/singular/LIB/tst.lib +1108 -0
- sage_wheels/share/singular/LIB/weierstr.lib +241 -0
- sage_wheels/share/singular/LIB/zeroset.lib +1478 -0
- sage_wheels/share/singular/emacs/.emacs-general +184 -0
- sage_wheels/share/singular/emacs/.emacs-singular +234 -0
- sage_wheels/share/singular/emacs/COPYING +44 -0
- sage_wheels/share/singular/emacs/cmd-cmpl.el +241 -0
- sage_wheels/share/singular/emacs/ex-cmpl.el +1681 -0
- sage_wheels/share/singular/emacs/hlp-cmpl.el +4318 -0
- sage_wheels/share/singular/emacs/lib-cmpl.el +179 -0
- sage_wheels/share/singular/emacs/singular.el +4273 -0
- sage_wheels/share/singular/emacs/singular.xpm +39 -0
- 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())
|