passagemath-categories 10.6.32__cp314-cp314t-musllinux_1_2_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.
- passagemath_categories-10.6.32.dist-info/METADATA +156 -0
- passagemath_categories-10.6.32.dist-info/RECORD +719 -0
- passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
- passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
- passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
- sage/all__sagemath_categories.py +28 -0
- sage/arith/all.py +38 -0
- sage/arith/constants.pxd +27 -0
- sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/functions.pxd +4 -0
- sage/arith/functions.pyx +221 -0
- sage/arith/misc.py +6552 -0
- sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/multi_modular.pxd +39 -0
- sage/arith/multi_modular.pyx +994 -0
- sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/rational_reconstruction.pxd +4 -0
- sage/arith/rational_reconstruction.pyx +115 -0
- sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/srange.pyx +571 -0
- sage/calculus/all__sagemath_categories.py +2 -0
- sage/calculus/functional.py +481 -0
- sage/calculus/functions.py +151 -0
- sage/categories/additive_groups.py +73 -0
- sage/categories/additive_magmas.py +1044 -0
- sage/categories/additive_monoids.py +114 -0
- sage/categories/additive_semigroups.py +184 -0
- sage/categories/affine_weyl_groups.py +238 -0
- sage/categories/algebra_ideals.py +95 -0
- sage/categories/algebra_modules.py +96 -0
- sage/categories/algebras.py +349 -0
- sage/categories/algebras_with_basis.py +377 -0
- sage/categories/all.py +160 -0
- sage/categories/aperiodic_semigroups.py +29 -0
- sage/categories/associative_algebras.py +47 -0
- sage/categories/bialgebras.py +101 -0
- sage/categories/bialgebras_with_basis.py +414 -0
- sage/categories/bimodules.py +206 -0
- sage/categories/chain_complexes.py +268 -0
- sage/categories/classical_crystals.py +480 -0
- sage/categories/coalgebras.py +405 -0
- sage/categories/coalgebras_with_basis.py +232 -0
- sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/coercion_methods.pyx +52 -0
- sage/categories/commutative_additive_groups.py +104 -0
- sage/categories/commutative_additive_monoids.py +45 -0
- sage/categories/commutative_additive_semigroups.py +48 -0
- sage/categories/commutative_algebra_ideals.py +87 -0
- sage/categories/commutative_algebras.py +94 -0
- sage/categories/commutative_ring_ideals.py +58 -0
- sage/categories/commutative_rings.py +736 -0
- sage/categories/complete_discrete_valuation.py +293 -0
- sage/categories/complex_reflection_groups.py +145 -0
- sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
- sage/categories/coxeter_group_algebras.py +186 -0
- sage/categories/coxeter_groups.py +3402 -0
- sage/categories/crystals.py +2628 -0
- sage/categories/cw_complexes.py +216 -0
- sage/categories/dedekind_domains.py +137 -0
- sage/categories/discrete_valuation.py +325 -0
- sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
- sage/categories/division_rings.py +114 -0
- sage/categories/domains.py +95 -0
- sage/categories/drinfeld_modules.py +789 -0
- sage/categories/dual.py +42 -0
- sage/categories/enumerated_sets.py +1146 -0
- sage/categories/euclidean_domains.py +271 -0
- sage/categories/examples/algebras_with_basis.py +102 -0
- sage/categories/examples/all.py +1 -0
- sage/categories/examples/commutative_additive_monoids.py +130 -0
- sage/categories/examples/commutative_additive_semigroups.py +199 -0
- sage/categories/examples/coxeter_groups.py +8 -0
- sage/categories/examples/crystals.py +236 -0
- sage/categories/examples/cw_complexes.py +163 -0
- sage/categories/examples/facade_sets.py +187 -0
- sage/categories/examples/filtered_algebras_with_basis.py +204 -0
- sage/categories/examples/filtered_modules_with_basis.py +154 -0
- sage/categories/examples/finite_coxeter_groups.py +252 -0
- sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
- sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
- sage/categories/examples/finite_enumerated_sets.py +208 -0
- sage/categories/examples/finite_monoids.py +150 -0
- sage/categories/examples/finite_semigroups.py +190 -0
- sage/categories/examples/finite_weyl_groups.py +191 -0
- sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
- sage/categories/examples/graded_modules_with_basis.py +168 -0
- sage/categories/examples/graphs.py +122 -0
- sage/categories/examples/hopf_algebras_with_basis.py +145 -0
- sage/categories/examples/infinite_enumerated_sets.py +190 -0
- sage/categories/examples/lie_algebras.py +352 -0
- sage/categories/examples/lie_algebras_with_basis.py +196 -0
- sage/categories/examples/magmas.py +162 -0
- sage/categories/examples/manifolds.py +94 -0
- sage/categories/examples/monoids.py +144 -0
- sage/categories/examples/posets.py +178 -0
- sage/categories/examples/semigroups.py +580 -0
- sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/examples/semigroups_cython.pyx +221 -0
- sage/categories/examples/semirings.py +249 -0
- sage/categories/examples/sets_cat.py +706 -0
- sage/categories/examples/sets_with_grading.py +101 -0
- sage/categories/examples/with_realizations.py +542 -0
- sage/categories/fields.py +991 -0
- sage/categories/filtered_algebras.py +63 -0
- sage/categories/filtered_algebras_with_basis.py +548 -0
- sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
- sage/categories/filtered_modules.py +210 -0
- sage/categories/filtered_modules_with_basis.py +1209 -0
- sage/categories/finite_complex_reflection_groups.py +1506 -0
- sage/categories/finite_coxeter_groups.py +1138 -0
- sage/categories/finite_crystals.py +103 -0
- sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
- sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
- sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
- sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
- sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
- sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
- sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
- sage/categories/finite_enumerated_sets.py +769 -0
- sage/categories/finite_fields.py +252 -0
- sage/categories/finite_groups.py +256 -0
- sage/categories/finite_lattice_posets.py +242 -0
- sage/categories/finite_monoids.py +316 -0
- sage/categories/finite_permutation_groups.py +339 -0
- sage/categories/finite_posets.py +1994 -0
- sage/categories/finite_semigroups.py +136 -0
- sage/categories/finite_sets.py +93 -0
- sage/categories/finite_weyl_groups.py +39 -0
- sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
- sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
- sage/categories/finitely_generated_magmas.py +57 -0
- sage/categories/finitely_generated_semigroups.py +214 -0
- sage/categories/function_fields.py +76 -0
- sage/categories/g_sets.py +77 -0
- sage/categories/gcd_domains.py +65 -0
- sage/categories/generalized_coxeter_groups.py +94 -0
- sage/categories/graded_algebras.py +85 -0
- sage/categories/graded_algebras_with_basis.py +258 -0
- sage/categories/graded_bialgebras.py +32 -0
- sage/categories/graded_bialgebras_with_basis.py +32 -0
- sage/categories/graded_coalgebras.py +65 -0
- sage/categories/graded_coalgebras_with_basis.py +51 -0
- sage/categories/graded_hopf_algebras.py +41 -0
- sage/categories/graded_hopf_algebras_with_basis.py +169 -0
- sage/categories/graded_lie_algebras.py +91 -0
- sage/categories/graded_lie_algebras_with_basis.py +44 -0
- sage/categories/graded_lie_conformal_algebras.py +74 -0
- sage/categories/graded_modules.py +133 -0
- sage/categories/graded_modules_with_basis.py +329 -0
- sage/categories/graphs.py +138 -0
- sage/categories/group_algebras.py +430 -0
- sage/categories/groupoid.py +94 -0
- sage/categories/groups.py +667 -0
- sage/categories/h_trivial_semigroups.py +64 -0
- sage/categories/hecke_modules.py +185 -0
- sage/categories/highest_weight_crystals.py +980 -0
- sage/categories/hopf_algebras.py +219 -0
- sage/categories/hopf_algebras_with_basis.py +309 -0
- sage/categories/infinite_enumerated_sets.py +115 -0
- sage/categories/integral_domains.py +203 -0
- sage/categories/j_trivial_semigroups.py +29 -0
- sage/categories/kac_moody_algebras.py +82 -0
- sage/categories/kahler_algebras.py +203 -0
- sage/categories/l_trivial_semigroups.py +63 -0
- sage/categories/lambda_bracket_algebras.py +280 -0
- sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
- sage/categories/lattice_posets.py +89 -0
- sage/categories/left_modules.py +49 -0
- sage/categories/lie_algebras.py +1070 -0
- sage/categories/lie_algebras_with_basis.py +261 -0
- sage/categories/lie_conformal_algebras.py +350 -0
- sage/categories/lie_conformal_algebras_with_basis.py +147 -0
- sage/categories/lie_groups.py +73 -0
- sage/categories/loop_crystals.py +1290 -0
- sage/categories/magmas.py +1189 -0
- sage/categories/magmas_and_additive_magmas.py +149 -0
- sage/categories/magmatic_algebras.py +365 -0
- sage/categories/manifolds.py +352 -0
- sage/categories/matrix_algebras.py +40 -0
- sage/categories/metric_spaces.py +387 -0
- sage/categories/modular_abelian_varieties.py +78 -0
- sage/categories/modules.py +989 -0
- sage/categories/modules_with_basis.py +2794 -0
- sage/categories/monoid_algebras.py +38 -0
- sage/categories/monoids.py +739 -0
- sage/categories/noetherian_rings.py +87 -0
- sage/categories/number_fields.py +242 -0
- sage/categories/ore_modules.py +189 -0
- sage/categories/partially_ordered_monoids.py +49 -0
- sage/categories/permutation_groups.py +63 -0
- sage/categories/pointed_sets.py +42 -0
- sage/categories/polyhedra.py +74 -0
- sage/categories/poor_man_map.py +270 -0
- sage/categories/posets.py +722 -0
- sage/categories/principal_ideal_domains.py +270 -0
- sage/categories/quantum_group_representations.py +543 -0
- sage/categories/quotient_fields.py +728 -0
- sage/categories/r_trivial_semigroups.py +45 -0
- sage/categories/regular_crystals.py +898 -0
- sage/categories/regular_supercrystals.py +170 -0
- sage/categories/right_modules.py +49 -0
- sage/categories/ring_ideals.py +74 -0
- sage/categories/rings.py +1904 -0
- sage/categories/rngs.py +175 -0
- sage/categories/schemes.py +393 -0
- sage/categories/semigroups.py +1060 -0
- sage/categories/semirings.py +71 -0
- sage/categories/semisimple_algebras.py +114 -0
- sage/categories/sets_with_grading.py +235 -0
- sage/categories/shephard_groups.py +43 -0
- sage/categories/signed_tensor.py +120 -0
- sage/categories/simplicial_complexes.py +134 -0
- sage/categories/simplicial_sets.py +1206 -0
- sage/categories/super_algebras.py +149 -0
- sage/categories/super_algebras_with_basis.py +144 -0
- sage/categories/super_hopf_algebras_with_basis.py +126 -0
- sage/categories/super_lie_conformal_algebras.py +193 -0
- sage/categories/super_modules.py +229 -0
- sage/categories/super_modules_with_basis.py +193 -0
- sage/categories/supercommutative_algebras.py +99 -0
- sage/categories/supercrystals.py +406 -0
- sage/categories/tensor.py +110 -0
- sage/categories/topological_spaces.py +170 -0
- sage/categories/triangular_kac_moody_algebras.py +439 -0
- sage/categories/tutorial.py +58 -0
- sage/categories/unique_factorization_domains.py +318 -0
- sage/categories/unital_algebras.py +426 -0
- sage/categories/vector_bundles.py +159 -0
- sage/categories/vector_spaces.py +357 -0
- sage/categories/weyl_groups.py +853 -0
- sage/combinat/all__sagemath_categories.py +34 -0
- sage/combinat/backtrack.py +180 -0
- sage/combinat/combinat.py +2269 -0
- sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/combinat_cython.pxd +6 -0
- sage/combinat/combinat_cython.pyx +390 -0
- sage/combinat/combination.py +796 -0
- sage/combinat/combinatorial_map.py +416 -0
- sage/combinat/composition.py +2192 -0
- sage/combinat/dlx.py +510 -0
- sage/combinat/integer_lists/__init__.py +7 -0
- sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/base.pxd +16 -0
- sage/combinat/integer_lists/base.pyx +713 -0
- sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/invlex.pxd +4 -0
- sage/combinat/integer_lists/invlex.pyx +1650 -0
- sage/combinat/integer_lists/lists.py +328 -0
- sage/combinat/integer_lists/nn.py +48 -0
- sage/combinat/integer_vector.py +1818 -0
- sage/combinat/integer_vector_weighted.py +413 -0
- sage/combinat/matrices/all__sagemath_categories.py +5 -0
- sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/matrices/dancing_links.pyx +1159 -0
- sage/combinat/matrices/dancing_links_c.h +380 -0
- sage/combinat/matrices/dlxcpp.py +136 -0
- sage/combinat/partition.py +10070 -0
- sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/partitions.pyx +743 -0
- sage/combinat/permutation.py +10168 -0
- sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/permutation_cython.pxd +11 -0
- sage/combinat/permutation_cython.pyx +407 -0
- sage/combinat/q_analogues.py +1090 -0
- sage/combinat/ranker.py +268 -0
- sage/combinat/subset.py +1561 -0
- sage/combinat/subsets_hereditary.py +202 -0
- sage/combinat/subsets_pairwise.py +184 -0
- sage/combinat/tools.py +63 -0
- sage/combinat/tuple.py +348 -0
- sage/data_structures/all.py +2 -0
- sage/data_structures/all__sagemath_categories.py +2 -0
- sage/data_structures/binary_matrix.pxd +138 -0
- sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/binary_search.pxd +3 -0
- sage/data_structures/binary_search.pyx +66 -0
- sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset.pxd +40 -0
- sage/data_structures/bitset.pyx +2385 -0
- sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset_base.pxd +926 -0
- sage/data_structures/bitset_base.pyx +117 -0
- sage/data_structures/bitset_intrinsics.h +487 -0
- sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/blas_dict.pxd +12 -0
- sage/data_structures/blas_dict.pyx +469 -0
- sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/list_of_pairs.pxd +16 -0
- sage/data_structures/list_of_pairs.pyx +122 -0
- sage/data_structures/mutable_poset.py +3312 -0
- sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/pairing_heap.h +346 -0
- sage/data_structures/pairing_heap.pxd +88 -0
- sage/data_structures/pairing_heap.pyx +1464 -0
- sage/data_structures/sparse_bitset.pxd +62 -0
- sage/data_structures/stream.py +5070 -0
- sage/databases/all__sagemath_categories.py +7 -0
- sage/databases/sql_db.py +2236 -0
- sage/ext/all__sagemath_categories.py +3 -0
- sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_callable.pxd +4 -0
- sage/ext/fast_callable.pyx +2746 -0
- sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_eval.pxd +1 -0
- sage/ext/fast_eval.pyx +102 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_categories.py +2 -0
- sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_el.pxd +18 -0
- sage/ext/interpreters/wrapper_el.pyx +148 -0
- sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_py.pxd +17 -0
- sage/ext/interpreters/wrapper_py.pyx +133 -0
- sage/functions/airy.py +937 -0
- sage/functions/all.py +97 -0
- sage/functions/bessel.py +2102 -0
- sage/functions/error.py +784 -0
- sage/functions/exp_integral.py +1529 -0
- sage/functions/gamma.py +1087 -0
- sage/functions/generalized.py +672 -0
- sage/functions/hyperbolic.py +747 -0
- sage/functions/hypergeometric.py +1156 -0
- sage/functions/jacobi.py +1705 -0
- sage/functions/log.py +1402 -0
- sage/functions/min_max.py +338 -0
- sage/functions/orthogonal_polys.py +3106 -0
- sage/functions/other.py +2303 -0
- sage/functions/piecewise.py +1505 -0
- sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/functions/prime_pi.pyx +262 -0
- sage/functions/special.py +1212 -0
- sage/functions/spike_function.py +278 -0
- sage/functions/transcendental.py +690 -0
- sage/functions/trig.py +1062 -0
- sage/functions/wigner.py +726 -0
- sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/geometry/abc.pyx +82 -0
- sage/geometry/all__sagemath_categories.py +1 -0
- sage/groups/all__sagemath_categories.py +11 -0
- sage/groups/generic.py +1733 -0
- sage/groups/groups_catalog.py +113 -0
- sage/groups/perm_gps/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/all.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
- sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
- sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
- sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
- sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
- sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
- sage/interfaces/abc.py +140 -0
- sage/interfaces/all.py +58 -0
- sage/interfaces/all__sagemath_categories.py +1 -0
- sage/interfaces/expect.py +1643 -0
- sage/interfaces/interface.py +1682 -0
- sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/process.pxd +5 -0
- sage/interfaces/process.pyx +288 -0
- sage/interfaces/quit.py +167 -0
- sage/interfaces/sage0.py +604 -0
- sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/sagespawn.pyx +308 -0
- sage/interfaces/tab_completion.py +101 -0
- sage/misc/all__sagemath_categories.py +78 -0
- sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/allocator.pxd +6 -0
- sage/misc/allocator.pyx +47 -0
- sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/binary_tree.pxd +29 -0
- sage/misc/binary_tree.pyx +537 -0
- sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/callable_dict.pyx +89 -0
- sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/citation.pyx +159 -0
- sage/misc/converting_dict.py +293 -0
- sage/misc/defaults.py +129 -0
- sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/derivative.pyx +223 -0
- sage/misc/functional.py +2005 -0
- sage/misc/html.py +589 -0
- sage/misc/latex.py +2673 -0
- sage/misc/latex_macros.py +236 -0
- sage/misc/latex_standalone.py +1833 -0
- sage/misc/map_threaded.py +38 -0
- sage/misc/mathml.py +76 -0
- sage/misc/method_decorator.py +88 -0
- sage/misc/mrange.py +755 -0
- sage/misc/multireplace.py +41 -0
- sage/misc/object_multiplexer.py +92 -0
- sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/parser.pyx +1107 -0
- sage/misc/random_testing.py +264 -0
- sage/misc/rest_index_of_methods.py +377 -0
- sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/search.pxd +2 -0
- sage/misc/search.pyx +68 -0
- sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/stopgap.pyx +95 -0
- sage/misc/table.py +853 -0
- sage/monoids/all__sagemath_categories.py +1 -0
- sage/monoids/indexed_free_monoid.py +1071 -0
- sage/monoids/monoid.py +82 -0
- sage/numerical/all__sagemath_categories.py +1 -0
- sage/numerical/backends/all__sagemath_categories.py +1 -0
- sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_backend.pxd +61 -0
- sage/numerical/backends/generic_backend.pyx +1893 -0
- sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_sdp_backend.pxd +38 -0
- sage/numerical/backends/generic_sdp_backend.pyx +755 -0
- sage/parallel/all.py +6 -0
- sage/parallel/decorate.py +575 -0
- sage/parallel/map_reduce.py +1997 -0
- sage/parallel/multiprocessing_sage.py +76 -0
- sage/parallel/ncpus.py +35 -0
- sage/parallel/parallelism.py +364 -0
- sage/parallel/reference.py +47 -0
- sage/parallel/use_fork.py +333 -0
- sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/abc.pxd +31 -0
- sage/rings/abc.pyx +526 -0
- sage/rings/algebraic_closure_finite_field.py +1154 -0
- sage/rings/all__sagemath_categories.py +91 -0
- sage/rings/big_oh.py +227 -0
- sage/rings/continued_fraction.py +2754 -0
- sage/rings/continued_fraction_gosper.py +220 -0
- sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/factorint.pyx +295 -0
- sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fast_arith.pxd +21 -0
- sage/rings/fast_arith.pyx +535 -0
- sage/rings/finite_rings/all__sagemath_categories.py +9 -0
- sage/rings/finite_rings/conway_polynomials.py +542 -0
- sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_base.pxd +12 -0
- sage/rings/finite_rings/element_base.pyx +1176 -0
- sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/finite_field_base.pxd +7 -0
- sage/rings/finite_rings/finite_field_base.pyx +2171 -0
- sage/rings/finite_rings/finite_field_constructor.py +827 -0
- sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
- sage/rings/finite_rings/galois_group.py +154 -0
- sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_finite_field.pxd +23 -0
- sage/rings/finite_rings/hom_finite_field.pyx +856 -0
- sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
- sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
- sage/rings/finite_rings/homset.py +357 -0
- sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/integer_mod.pxd +56 -0
- sage/rings/finite_rings/integer_mod.pyx +4586 -0
- sage/rings/finite_rings/integer_mod_limits.h +11 -0
- sage/rings/finite_rings/integer_mod_ring.py +2044 -0
- sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/residue_field.pxd +30 -0
- sage/rings/finite_rings/residue_field.pyx +1811 -0
- sage/rings/finite_rings/stdint.pxd +19 -0
- sage/rings/fraction_field.py +1452 -0
- sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fraction_field_element.pyx +1357 -0
- sage/rings/function_field/all.py +7 -0
- sage/rings/function_field/all__sagemath_categories.py +2 -0
- sage/rings/function_field/constructor.py +218 -0
- sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element.pxd +11 -0
- sage/rings/function_field/element.pyx +1008 -0
- sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element_rational.pyx +513 -0
- sage/rings/function_field/extensions.py +230 -0
- sage/rings/function_field/function_field.py +1468 -0
- sage/rings/function_field/function_field_rational.py +1005 -0
- sage/rings/function_field/ideal.py +1155 -0
- sage/rings/function_field/ideal_rational.py +629 -0
- sage/rings/function_field/jacobian_base.py +826 -0
- sage/rings/function_field/jacobian_hess.py +1053 -0
- sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
- sage/rings/function_field/maps.py +1039 -0
- sage/rings/function_field/order.py +281 -0
- sage/rings/function_field/order_basis.py +586 -0
- sage/rings/function_field/order_rational.py +576 -0
- sage/rings/function_field/place.py +426 -0
- sage/rings/function_field/place_rational.py +181 -0
- sage/rings/generic.py +320 -0
- sage/rings/homset.py +332 -0
- sage/rings/ideal.py +1885 -0
- sage/rings/ideal_monoid.py +215 -0
- sage/rings/infinity.py +1890 -0
- sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer.pxd +45 -0
- sage/rings/integer.pyx +7874 -0
- sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer_ring.pxd +8 -0
- sage/rings/integer_ring.pyx +1693 -0
- sage/rings/laurent_series_ring.py +931 -0
- sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/laurent_series_ring_element.pxd +11 -0
- sage/rings/laurent_series_ring_element.pyx +1927 -0
- sage/rings/lazy_series.py +7815 -0
- sage/rings/lazy_series_ring.py +4356 -0
- sage/rings/localization.py +1043 -0
- sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/morphism.pxd +39 -0
- sage/rings/morphism.pyx +3299 -0
- sage/rings/multi_power_series_ring.py +1145 -0
- sage/rings/multi_power_series_ring_element.py +2184 -0
- sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/noncommutative_ideals.pyx +423 -0
- sage/rings/number_field/all__sagemath_categories.py +1 -0
- sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_base.pxd +8 -0
- sage/rings/number_field/number_field_base.pyx +507 -0
- sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_element_base.pxd +6 -0
- sage/rings/number_field/number_field_element_base.pyx +36 -0
- sage/rings/number_field/number_field_ideal.py +3550 -0
- sage/rings/padics/all__sagemath_categories.py +4 -0
- sage/rings/padics/local_generic.py +1670 -0
- sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/local_generic_element.pxd +5 -0
- sage/rings/padics/local_generic_element.pyx +1017 -0
- sage/rings/padics/misc.py +256 -0
- sage/rings/padics/padic_generic.py +1911 -0
- sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/pow_computer.pxd +38 -0
- sage/rings/padics/pow_computer.pyx +671 -0
- sage/rings/padics/precision_error.py +24 -0
- sage/rings/polynomial/all__sagemath_categories.py +25 -0
- sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/commutative_polynomial.pxd +6 -0
- sage/rings/polynomial/commutative_polynomial.pyx +24 -0
- sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/cyclotomic.pyx +404 -0
- sage/rings/polynomial/flatten.py +711 -0
- sage/rings/polynomial/ideal.py +102 -0
- sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
- sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
- sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial.pxd +18 -0
- sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
- sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
- sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
- sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
- sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial.pxd +12 -0
- sage/rings/polynomial/multi_polynomial.pyx +3082 -0
- sage/rings/polynomial/multi_polynomial_element.py +2570 -0
- sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
- sage/rings/polynomial/multi_polynomial_ring.py +947 -0
- sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
- sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
- sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polydict.pxd +45 -0
- sage/rings/polynomial/polydict.pyx +2701 -0
- sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_compiled.pxd +59 -0
- sage/rings/polynomial/polynomial_compiled.pyx +509 -0
- sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_element.pxd +64 -0
- sage/rings/polynomial/polynomial_element.pyx +13255 -0
- sage/rings/polynomial/polynomial_element_generic.py +1637 -0
- sage/rings/polynomial/polynomial_fateman.py +97 -0
- sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
- sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
- sage/rings/polynomial/polynomial_ring.py +3784 -0
- sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
- sage/rings/polynomial/polynomial_singular_interface.py +549 -0
- sage/rings/polynomial/symmetric_ideal.py +989 -0
- sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/symmetric_reduction.pxd +8 -0
- sage/rings/polynomial/symmetric_reduction.pyx +669 -0
- sage/rings/polynomial/term_order.py +2279 -0
- sage/rings/polynomial/toy_buchberger.py +449 -0
- sage/rings/polynomial/toy_d_basis.py +387 -0
- sage/rings/polynomial/toy_variety.py +362 -0
- sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_mpoly.pxd +9 -0
- sage/rings/power_series_mpoly.pyx +161 -0
- sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_poly.pxd +10 -0
- sage/rings/power_series_poly.pyx +1317 -0
- sage/rings/power_series_ring.py +1441 -0
- sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_ring_element.pxd +12 -0
- sage/rings/power_series_ring_element.pyx +3028 -0
- sage/rings/puiseux_series_ring.py +487 -0
- sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/puiseux_series_ring_element.pxd +7 -0
- sage/rings/puiseux_series_ring_element.pyx +1055 -0
- sage/rings/qqbar_decorators.py +167 -0
- sage/rings/quotient_ring.py +1598 -0
- sage/rings/quotient_ring_element.py +979 -0
- sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/rational.pxd +20 -0
- sage/rings/rational.pyx +4284 -0
- sage/rings/rational_field.py +1730 -0
- sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_double.pxd +16 -0
- sage/rings/real_double.pyx +2218 -0
- sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_lazy.pxd +30 -0
- sage/rings/real_lazy.pyx +1773 -0
- sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/ring.pxd +30 -0
- sage/rings/ring.pyx +850 -0
- sage/rings/semirings/all.py +3 -0
- sage/rings/semirings/non_negative_integer_semiring.py +107 -0
- sage/rings/semirings/tropical_mpolynomial.py +972 -0
- sage/rings/semirings/tropical_polynomial.py +997 -0
- sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/semirings/tropical_semiring.pyx +676 -0
- sage/rings/semirings/tropical_variety.py +1701 -0
- sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/sum_of_squares.pxd +3 -0
- sage/rings/sum_of_squares.pyx +336 -0
- sage/rings/tests.py +504 -0
- sage/schemes/affine/affine_homset.py +508 -0
- sage/schemes/affine/affine_morphism.py +1574 -0
- sage/schemes/affine/affine_point.py +460 -0
- sage/schemes/affine/affine_rational_point.py +308 -0
- sage/schemes/affine/affine_space.py +1264 -0
- sage/schemes/affine/affine_subscheme.py +592 -0
- sage/schemes/affine/all.py +25 -0
- sage/schemes/all__sagemath_categories.py +5 -0
- sage/schemes/generic/algebraic_scheme.py +2092 -0
- sage/schemes/generic/all.py +5 -0
- sage/schemes/generic/ambient_space.py +400 -0
- sage/schemes/generic/divisor.py +465 -0
- sage/schemes/generic/divisor_group.py +313 -0
- sage/schemes/generic/glue.py +84 -0
- sage/schemes/generic/homset.py +820 -0
- sage/schemes/generic/hypersurface.py +234 -0
- sage/schemes/generic/morphism.py +2107 -0
- sage/schemes/generic/point.py +237 -0
- sage/schemes/generic/scheme.py +1190 -0
- sage/schemes/generic/spec.py +199 -0
- sage/schemes/product_projective/all.py +6 -0
- sage/schemes/product_projective/homset.py +236 -0
- sage/schemes/product_projective/morphism.py +517 -0
- sage/schemes/product_projective/point.py +568 -0
- sage/schemes/product_projective/rational_point.py +550 -0
- sage/schemes/product_projective/space.py +1301 -0
- sage/schemes/product_projective/subscheme.py +466 -0
- sage/schemes/projective/all.py +24 -0
- sage/schemes/projective/proj_bdd_height.py +453 -0
- sage/schemes/projective/projective_homset.py +718 -0
- sage/schemes/projective/projective_morphism.py +2792 -0
- sage/schemes/projective/projective_point.py +1484 -0
- sage/schemes/projective/projective_rational_point.py +569 -0
- sage/schemes/projective/projective_space.py +2571 -0
- sage/schemes/projective/projective_subscheme.py +1574 -0
- sage/sets/all.py +17 -0
- sage/sets/cartesian_product.py +376 -0
- sage/sets/condition_set.py +525 -0
- sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/disjoint_set.pxd +36 -0
- sage/sets/disjoint_set.pyx +998 -0
- sage/sets/disjoint_union_enumerated_sets.py +625 -0
- sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/family.pxd +12 -0
- sage/sets/family.pyx +1556 -0
- sage/sets/finite_enumerated_set.py +406 -0
- sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/finite_set_map_cy.pxd +34 -0
- sage/sets/finite_set_map_cy.pyx +708 -0
- sage/sets/finite_set_maps.py +591 -0
- sage/sets/image_set.py +448 -0
- sage/sets/integer_range.py +829 -0
- sage/sets/non_negative_integers.py +241 -0
- sage/sets/positive_integers.py +93 -0
- sage/sets/primes.py +188 -0
- sage/sets/real_set.py +2760 -0
- sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/recursively_enumerated_set.pxd +31 -0
- sage/sets/recursively_enumerated_set.pyx +2082 -0
- sage/sets/set.py +2083 -0
- sage/sets/set_from_iterator.py +1021 -0
- sage/sets/totally_ordered_finite_set.py +329 -0
- sage/symbolic/all__sagemath_categories.py +1 -0
- sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/symbolic/function.pxd +29 -0
- sage/symbolic/function.pyx +1488 -0
- sage/symbolic/symbols.py +56 -0
- sage/tests/all__sagemath_categories.py +1 -0
- sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/cython.pyx +37 -0
- sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/stl_vector.pyx +171 -0
- sage/typeset/all.py +6 -0
- sage/typeset/ascii_art.py +295 -0
- sage/typeset/character_art.py +789 -0
- sage/typeset/character_art_factory.py +572 -0
- sage/typeset/symbols.py +334 -0
- sage/typeset/unicode_art.py +183 -0
- sage/typeset/unicode_characters.py +101 -0
|
@@ -0,0 +1,1860 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Finite dimensional algebras with basis
|
|
4
|
+
|
|
5
|
+
.. TODO::
|
|
6
|
+
|
|
7
|
+
Quotients of polynomial rings.
|
|
8
|
+
|
|
9
|
+
Quotients in general.
|
|
10
|
+
|
|
11
|
+
Matrix rings.
|
|
12
|
+
|
|
13
|
+
REFERENCES:
|
|
14
|
+
|
|
15
|
+
- [CR1962]_
|
|
16
|
+
"""
|
|
17
|
+
#*****************************************************************************
|
|
18
|
+
# Copyright (C) 2008 Teresa Gomez-Diaz (CNRS) <Teresa.Gomez-Diaz@univ-mlv.fr>
|
|
19
|
+
# 2011-2015 Nicolas M. Thiéry <nthiery at users.sf.net>
|
|
20
|
+
# 2011-2015 Franco Saliola <saliola@gmail.com>
|
|
21
|
+
# 2014-2015 Aladin Virmaux <aladin.virmaux at u-psud.fr>
|
|
22
|
+
#
|
|
23
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
24
|
+
# http://www.gnu.org/licenses/
|
|
25
|
+
#******************************************************************************
|
|
26
|
+
|
|
27
|
+
import operator
|
|
28
|
+
from sage.misc.cachefunc import cached_method
|
|
29
|
+
from sage.misc.abstract_method import abstract_method
|
|
30
|
+
from sage.misc.lazy_attribute import lazy_attribute
|
|
31
|
+
from sage.categories.category_with_axiom import CategoryWithAxiom_over_base_ring
|
|
32
|
+
from sage.categories.algebras import Algebras
|
|
33
|
+
from sage.categories.associative_algebras import AssociativeAlgebras
|
|
34
|
+
from sage.categories.tensor import TensorProductsCategory
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class FiniteDimensionalAlgebrasWithBasis(CategoryWithAxiom_over_base_ring):
|
|
38
|
+
r"""
|
|
39
|
+
The category of finite dimensional algebras with a distinguished basis.
|
|
40
|
+
|
|
41
|
+
These algebras are assumed to be associative and
|
|
42
|
+
unital.
|
|
43
|
+
|
|
44
|
+
EXAMPLES::
|
|
45
|
+
|
|
46
|
+
sage: C = FiniteDimensionalAlgebrasWithBasis(QQ); C
|
|
47
|
+
Category of finite dimensional algebras with basis over Rational Field
|
|
48
|
+
sage: C.super_categories()
|
|
49
|
+
[Category of algebras with basis over Rational Field,
|
|
50
|
+
Category of finite dimensional magmatic algebras with basis over Rational Field]
|
|
51
|
+
sage: C.example() # needs sage.modules
|
|
52
|
+
An example of a finite dimensional algebra with basis:
|
|
53
|
+
the path algebra of the Kronecker quiver
|
|
54
|
+
(containing the arrows a:x->y and b:x->y) over Rational Field
|
|
55
|
+
|
|
56
|
+
TESTS::
|
|
57
|
+
|
|
58
|
+
sage: # needs sage.graphs sage.modules
|
|
59
|
+
sage: TestSuite(C).run()
|
|
60
|
+
sage: C is Algebras(QQ).FiniteDimensional().WithBasis()
|
|
61
|
+
True
|
|
62
|
+
sage: C is Algebras(QQ).WithBasis().FiniteDimensional()
|
|
63
|
+
True
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
class ParentMethods:
|
|
67
|
+
|
|
68
|
+
@cached_method
|
|
69
|
+
def radical_basis(self):
|
|
70
|
+
r"""
|
|
71
|
+
Return a basis of the Jacobson radical of this algebra.
|
|
72
|
+
|
|
73
|
+
.. NOTE::
|
|
74
|
+
|
|
75
|
+
This implementation handles algebras over fields of
|
|
76
|
+
characteristic zero (using Dixon's lemma) or fields of
|
|
77
|
+
characteristic `p` in which we can compute `x^{1/p}`
|
|
78
|
+
[FR1985]_, [Eb1989]_.
|
|
79
|
+
|
|
80
|
+
OUTPUT: list of elements of ``self``
|
|
81
|
+
|
|
82
|
+
.. SEEALSO:: :meth:`radical`, :class:`Algebras.Semisimple`
|
|
83
|
+
|
|
84
|
+
EXAMPLES::
|
|
85
|
+
|
|
86
|
+
sage: # needs sage.graphs sage.modules
|
|
87
|
+
sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
|
|
88
|
+
An example of a finite dimensional algebra with basis:
|
|
89
|
+
the path algebra of the Kronecker quiver
|
|
90
|
+
(containing the arrows a:x->y and b:x->y) over Rational Field
|
|
91
|
+
sage: A.radical_basis()
|
|
92
|
+
(a, b)
|
|
93
|
+
|
|
94
|
+
We construct the group algebra of the Klein Four-Group
|
|
95
|
+
over the rationals::
|
|
96
|
+
|
|
97
|
+
sage: A = KleinFourGroup().algebra(QQ) # needs sage.groups sage.modules
|
|
98
|
+
|
|
99
|
+
This algebra belongs to the category of finite dimensional
|
|
100
|
+
algebras over the rationals::
|
|
101
|
+
|
|
102
|
+
sage: A in Algebras(QQ).FiniteDimensional().WithBasis() # needs sage.groups sage.modules
|
|
103
|
+
True
|
|
104
|
+
|
|
105
|
+
Since the field has characteristic `0`, Maschke's Theorem
|
|
106
|
+
tells us that the group algebra is semisimple. So its
|
|
107
|
+
radical is the zero ideal::
|
|
108
|
+
|
|
109
|
+
sage: A in Algebras(QQ).Semisimple() # needs sage.groups sage.modules
|
|
110
|
+
True
|
|
111
|
+
sage: A.radical_basis() # needs sage.groups sage.modules
|
|
112
|
+
()
|
|
113
|
+
|
|
114
|
+
Let's work instead over a field of characteristic `2`::
|
|
115
|
+
|
|
116
|
+
sage: A = KleinFourGroup().algebra(GF(2)) # needs sage.groups sage.modules
|
|
117
|
+
sage: A in Algebras(GF(2)).Semisimple() # needs sage.groups sage.modules
|
|
118
|
+
False
|
|
119
|
+
sage: A.radical_basis() # needs sage.groups sage.modules
|
|
120
|
+
(() + (1,2)(3,4), (3,4) + (1,2)(3,4), (1,2) + (1,2)(3,4))
|
|
121
|
+
|
|
122
|
+
We now implement the algebra `A = K[x] / (x^p-1)`, where `K`
|
|
123
|
+
is a finite field of characteristic `p`, and check its
|
|
124
|
+
radical; alas, we currently need to wrap `A` to make it a
|
|
125
|
+
proper :class:`ModulesWithBasis`::
|
|
126
|
+
|
|
127
|
+
sage: # needs sage.modules
|
|
128
|
+
sage: class AnAlgebra(CombinatorialFreeModule):
|
|
129
|
+
....: def __init__(self, F):
|
|
130
|
+
....: R.<x> = PolynomialRing(F)
|
|
131
|
+
....: I = R.ideal(x**F.characteristic()-F.one())
|
|
132
|
+
....: self._xbar = R.quotient(I).gen()
|
|
133
|
+
....: basis_keys = [self._xbar**i for i in range(F.characteristic())]
|
|
134
|
+
....: CombinatorialFreeModule.__init__(self, F, basis_keys,
|
|
135
|
+
....: category=Algebras(F).FiniteDimensional().WithBasis())
|
|
136
|
+
....: def one(self):
|
|
137
|
+
....: return self.basis()[self.base_ring().one()]
|
|
138
|
+
....: def product_on_basis(self, w1, w2):
|
|
139
|
+
....: return self.from_vector(vector(w1*w2))
|
|
140
|
+
sage: AnAlgebra(GF(3)).radical_basis() # needs sage.libs.pari
|
|
141
|
+
(B[1] + 2*B[xbar^2], B[xbar] + 2*B[xbar^2])
|
|
142
|
+
sage: AnAlgebra(GF(16,'a')).radical_basis() # needs sage.rings.finite_rings
|
|
143
|
+
(B[1] + B[xbar],)
|
|
144
|
+
sage: AnAlgebra(GF(49,'a')).radical_basis() # needs sage.rings.finite_rings
|
|
145
|
+
(B[1] + 6*B[xbar^6], B[xbar] + 6*B[xbar^6], B[xbar^2] + 6*B[xbar^6],
|
|
146
|
+
B[xbar^3] + 6*B[xbar^6], B[xbar^4] + 6*B[xbar^6], B[xbar^5] + 6*B[xbar^6])
|
|
147
|
+
|
|
148
|
+
We compute the radical basis in a subalgebra using
|
|
149
|
+
the inherited product::
|
|
150
|
+
|
|
151
|
+
sage: # needs sage.combinat sage.modules
|
|
152
|
+
sage: scoeffs = {('a','e'): {'a':1}, ('b','e'): {'a':1, 'b':1},
|
|
153
|
+
....: ('c','d'): {'a':1}, ('c','e'): {'c':1}}
|
|
154
|
+
sage: L.<a,b,c,d,e> = LieAlgebra(QQ, scoeffs)
|
|
155
|
+
sage: MS = MatrixSpace(QQ, 5)
|
|
156
|
+
sage: A = MS.subalgebra([bg.adjoint_matrix() for bg in L.lie_algebra_generators()])
|
|
157
|
+
sage: A.radical_basis()
|
|
158
|
+
(B[1], B[2], B[3], B[4], B[5])
|
|
159
|
+
|
|
160
|
+
TESTS::
|
|
161
|
+
|
|
162
|
+
sage: # needs sage.groups sage.modules
|
|
163
|
+
sage: A = KleinFourGroup().algebra(GF(2))
|
|
164
|
+
sage: A.radical_basis()
|
|
165
|
+
(() + (1,2)(3,4), (3,4) + (1,2)(3,4), (1,2) + (1,2)(3,4))
|
|
166
|
+
sage: A = KleinFourGroup().algebra(QQ, category=Monoids())
|
|
167
|
+
sage: A.radical_basis.__module__
|
|
168
|
+
'sage.categories.finite_dimensional_algebras_with_basis'
|
|
169
|
+
sage: A.radical_basis()
|
|
170
|
+
()
|
|
171
|
+
"""
|
|
172
|
+
F = self.base_ring()
|
|
173
|
+
if not F.is_field():
|
|
174
|
+
raise NotImplementedError("the base ring must be a field")
|
|
175
|
+
p = F.characteristic()
|
|
176
|
+
from sage.matrix.constructor import matrix
|
|
177
|
+
from sage.modules.free_module_element import vector
|
|
178
|
+
|
|
179
|
+
if p == 0:
|
|
180
|
+
B = self.basis()
|
|
181
|
+
product_on_basis = self.product_on_basis
|
|
182
|
+
if product_on_basis is NotImplemented:
|
|
183
|
+
def product_on_basis(i, j):
|
|
184
|
+
return B[i] * B[j]
|
|
185
|
+
|
|
186
|
+
zero = F.zero()
|
|
187
|
+
keys = B.keys()
|
|
188
|
+
cache = [{(i, j): c for i in keys
|
|
189
|
+
for j, c in product_on_basis(y, i).monomial_coefficients().items()}
|
|
190
|
+
for y in keys]
|
|
191
|
+
mat = [[F.sum(x.get((j, i), zero) * c for (i,j), c in y.items())
|
|
192
|
+
for x in cache]
|
|
193
|
+
for y in cache]
|
|
194
|
+
|
|
195
|
+
mat = matrix(F, mat)
|
|
196
|
+
rad_basis = mat.kernel().basis()
|
|
197
|
+
|
|
198
|
+
else:
|
|
199
|
+
# TODO: some finite field elements in Sage have both an
|
|
200
|
+
# ``nth_root`` method and a ``pth_root`` method (such as ``GF(9,'a')``),
|
|
201
|
+
# some only have a ``nth_root`` element such as ``GF(2)``
|
|
202
|
+
# I imagine that ``pth_root`` would be fastest, but it is not
|
|
203
|
+
# always available....
|
|
204
|
+
if hasattr(F.one(), 'nth_root'):
|
|
205
|
+
def root_fcn(s, x):
|
|
206
|
+
return x.nth_root(s)
|
|
207
|
+
else:
|
|
208
|
+
def root_fcn(s, x):
|
|
209
|
+
return x ** (1 / s)
|
|
210
|
+
|
|
211
|
+
s = 1
|
|
212
|
+
n = self.dimension()
|
|
213
|
+
B = [b.on_left_matrix() for b in self.basis()]
|
|
214
|
+
while s <= n:
|
|
215
|
+
# we use that p_{AB}(x) = p_{BA}(x) here
|
|
216
|
+
data = [[None]*(len(B)+1) for _ in B]
|
|
217
|
+
for i, b in enumerate(B):
|
|
218
|
+
for j, bb in enumerate(B[i:], start=i):
|
|
219
|
+
val = (-1)**s * (b*bb).charpoly()[n-s]
|
|
220
|
+
data[i][j] = data[j][i] = val
|
|
221
|
+
data[i][-1] = (-1)**s * b.charpoly()[n-s]
|
|
222
|
+
C = matrix(data).left_kernel().basis()
|
|
223
|
+
if 1 < s < F.order():
|
|
224
|
+
C = [vector(F, [root_fcn(s, ci) for ci in c]) for c in C]
|
|
225
|
+
B = [sum(ci * b for (ci, b) in zip(c, B)) for c in C]
|
|
226
|
+
s = p * s
|
|
227
|
+
e = vector(self.one())
|
|
228
|
+
rad_basis = [b * e for b in B]
|
|
229
|
+
|
|
230
|
+
return tuple([self.from_vector(vec) for vec in rad_basis])
|
|
231
|
+
|
|
232
|
+
@cached_method
|
|
233
|
+
def radical(self):
|
|
234
|
+
r"""
|
|
235
|
+
Return the Jacobson radical of ``self``.
|
|
236
|
+
|
|
237
|
+
This uses :meth:`radical_basis`, whose default
|
|
238
|
+
implementation handles algebras over fields of
|
|
239
|
+
characteristic zero or fields of characteristic `p` in
|
|
240
|
+
which we can compute `x^{1/p}`.
|
|
241
|
+
|
|
242
|
+
.. SEEALSO:: :meth:`radical_basis`, :meth:`semisimple_quotient`
|
|
243
|
+
|
|
244
|
+
EXAMPLES::
|
|
245
|
+
|
|
246
|
+
sage: # needs sage.graphs sage.modules
|
|
247
|
+
sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
|
|
248
|
+
An example of a finite dimensional algebra with basis:
|
|
249
|
+
the path algebra of the Kronecker quiver
|
|
250
|
+
(containing the arrows a:x->y and b:x->y) over Rational Field
|
|
251
|
+
sage: radical = A.radical(); radical
|
|
252
|
+
Radical of An example of a finite dimensional algebra with basis:
|
|
253
|
+
the path algebra of the Kronecker quiver
|
|
254
|
+
(containing the arrows a:x->y and b:x->y) over Rational Field
|
|
255
|
+
|
|
256
|
+
The radical is an ideal of `A`, and thus a finite
|
|
257
|
+
dimensional non unital associative algebra::
|
|
258
|
+
|
|
259
|
+
sage: # needs sage.graphs sage.modules
|
|
260
|
+
sage: from sage.categories.associative_algebras import AssociativeAlgebras
|
|
261
|
+
sage: radical in AssociativeAlgebras(QQ).WithBasis().FiniteDimensional()
|
|
262
|
+
True
|
|
263
|
+
sage: radical in Algebras(QQ)
|
|
264
|
+
False
|
|
265
|
+
|
|
266
|
+
sage: # needs sage.graphs sage.modules
|
|
267
|
+
sage: radical.dimension()
|
|
268
|
+
2
|
|
269
|
+
sage: radical.basis()
|
|
270
|
+
Finite family {0: B[0], 1: B[1]}
|
|
271
|
+
sage: radical.ambient() is A
|
|
272
|
+
True
|
|
273
|
+
sage: [c.lift() for c in radical.basis()]
|
|
274
|
+
[a, b]
|
|
275
|
+
|
|
276
|
+
.. TODO::
|
|
277
|
+
|
|
278
|
+
- Tell Sage that the radical is in fact an ideal;
|
|
279
|
+
- Pickling by construction, as ``A.center()``;
|
|
280
|
+
- Lazy evaluation of ``_repr_``.
|
|
281
|
+
|
|
282
|
+
TESTS::
|
|
283
|
+
|
|
284
|
+
sage: # needs sage.graphs sage.modules
|
|
285
|
+
sage: TestSuite(radical).run()
|
|
286
|
+
"""
|
|
287
|
+
category = AssociativeAlgebras(self.category().base_ring()).WithBasis().FiniteDimensional().Subobjects()
|
|
288
|
+
radical = self.submodule(self.radical_basis(),
|
|
289
|
+
category=category,
|
|
290
|
+
already_echelonized=True)
|
|
291
|
+
radical.rename("Radical of {}".format(self))
|
|
292
|
+
return radical
|
|
293
|
+
|
|
294
|
+
@cached_method
|
|
295
|
+
def semisimple_quotient(self):
|
|
296
|
+
"""
|
|
297
|
+
Return the semisimple quotient of ``self``.
|
|
298
|
+
|
|
299
|
+
This is the quotient of ``self`` by its radical.
|
|
300
|
+
|
|
301
|
+
.. SEEALSO:: :meth:`radical`
|
|
302
|
+
|
|
303
|
+
EXAMPLES::
|
|
304
|
+
|
|
305
|
+
sage: # needs sage.graphs sage.modules
|
|
306
|
+
sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
|
|
307
|
+
An example of a finite dimensional algebra with basis:
|
|
308
|
+
the path algebra of the Kronecker quiver
|
|
309
|
+
(containing the arrows a:x->y and b:x->y) over Rational Field
|
|
310
|
+
sage: a,b,x,y = sorted(A.basis())
|
|
311
|
+
sage: S = A.semisimple_quotient(); S
|
|
312
|
+
Semisimple quotient of An example of a finite dimensional algebra with basis:
|
|
313
|
+
the path algebra of the Kronecker quiver
|
|
314
|
+
(containing the arrows a:x->y and b:x->y) over Rational Field
|
|
315
|
+
sage: S in Algebras(QQ).Semisimple()
|
|
316
|
+
True
|
|
317
|
+
sage: S.basis()
|
|
318
|
+
Finite family {'x': B['x'], 'y': B['y']}
|
|
319
|
+
sage: xs,ys = sorted(S.basis())
|
|
320
|
+
sage: (xs + ys) * xs
|
|
321
|
+
B['x']
|
|
322
|
+
|
|
323
|
+
Sanity check: the semisimple quotient of the `n`-th
|
|
324
|
+
descent algebra of the symmetric group is of dimension the
|
|
325
|
+
number of partitions of `n`::
|
|
326
|
+
|
|
327
|
+
sage: [ DescentAlgebra(QQ,n).B().semisimple_quotient().dimension() # needs sage.combinat sage.groups sage.modules
|
|
328
|
+
....: for n in range(6) ]
|
|
329
|
+
[1, 1, 2, 3, 5, 7]
|
|
330
|
+
sage: [Partitions(n).cardinality() for n in range(10)] # needs sage.combinat sage.libs.flint
|
|
331
|
+
[1, 1, 2, 3, 5, 7, 11, 15, 22, 30]
|
|
332
|
+
|
|
333
|
+
.. TODO::
|
|
334
|
+
|
|
335
|
+
- Pickling by construction, as ``A.semisimple_quotient()``?
|
|
336
|
+
- Lazy evaluation of ``_repr_``
|
|
337
|
+
|
|
338
|
+
TESTS::
|
|
339
|
+
|
|
340
|
+
sage: TestSuite(S).run() # needs sage.graphs sage.modules
|
|
341
|
+
"""
|
|
342
|
+
ring = self.base_ring()
|
|
343
|
+
category = Algebras(ring).WithBasis().FiniteDimensional().Quotients().Semisimple()
|
|
344
|
+
result = self.quotient_module(self.radical(), category=category)
|
|
345
|
+
result.rename("Semisimple quotient of {}".format(self))
|
|
346
|
+
return result
|
|
347
|
+
|
|
348
|
+
@cached_method
|
|
349
|
+
def center_basis(self):
|
|
350
|
+
r"""
|
|
351
|
+
Return a basis of the center of ``self``.
|
|
352
|
+
|
|
353
|
+
OUTPUT: list of elements of ``self``
|
|
354
|
+
|
|
355
|
+
.. SEEALSO:: :meth:`center`
|
|
356
|
+
|
|
357
|
+
EXAMPLES::
|
|
358
|
+
|
|
359
|
+
sage: # needs sage.graphs sage.modules
|
|
360
|
+
sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
|
|
361
|
+
An example of a finite dimensional algebra with basis:
|
|
362
|
+
the path algebra of the Kronecker quiver
|
|
363
|
+
(containing the arrows a:x->y and b:x->y) over Rational Field
|
|
364
|
+
sage: A.center_basis()
|
|
365
|
+
(x + y,)
|
|
366
|
+
"""
|
|
367
|
+
return self.annihilator_basis(self.algebra_generators(), self.bracket)
|
|
368
|
+
|
|
369
|
+
@cached_method
|
|
370
|
+
def center(self):
|
|
371
|
+
r"""
|
|
372
|
+
Return the center of ``self``.
|
|
373
|
+
|
|
374
|
+
.. SEEALSO:: :meth:`center_basis`
|
|
375
|
+
|
|
376
|
+
EXAMPLES::
|
|
377
|
+
|
|
378
|
+
sage: # needs sage.graphs sage.modules
|
|
379
|
+
sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
|
|
380
|
+
An example of a finite dimensional algebra with basis:
|
|
381
|
+
the path algebra of the Kronecker quiver
|
|
382
|
+
(containing the arrows a:x->y and b:x->y) over Rational Field
|
|
383
|
+
sage: center = A.center(); center
|
|
384
|
+
Center of An example of a finite dimensional algebra with basis:
|
|
385
|
+
the path algebra of the Kronecker quiver
|
|
386
|
+
(containing the arrows a:x->y and b:x->y) over Rational Field
|
|
387
|
+
sage: center in Algebras(QQ).WithBasis().FiniteDimensional().Commutative()
|
|
388
|
+
True
|
|
389
|
+
sage: center.dimension()
|
|
390
|
+
1
|
|
391
|
+
sage: center.basis()
|
|
392
|
+
Finite family {0: B[0]}
|
|
393
|
+
sage: center.ambient() is A
|
|
394
|
+
True
|
|
395
|
+
sage: [c.lift() for c in center.basis()]
|
|
396
|
+
[x + y]
|
|
397
|
+
|
|
398
|
+
The center of a semisimple algebra is semisimple::
|
|
399
|
+
|
|
400
|
+
sage: A = DihedralGroup(6).algebra(QQ) # needs sage.groups sage.modules
|
|
401
|
+
sage: A.center() in Algebras(QQ).Semisimple() # needs sage.groups sage.modules
|
|
402
|
+
True
|
|
403
|
+
|
|
404
|
+
.. TODO::
|
|
405
|
+
|
|
406
|
+
- Pickling by construction, as ``A.center()``?
|
|
407
|
+
- Lazy evaluation of ``_repr_``
|
|
408
|
+
|
|
409
|
+
TESTS::
|
|
410
|
+
|
|
411
|
+
sage: TestSuite(center).run() # needs sage.graphs sage.modules
|
|
412
|
+
"""
|
|
413
|
+
category = Algebras(self.base_ring()).FiniteDimensional().Subobjects().Commutative().WithBasis()
|
|
414
|
+
if self in Algebras.Semisimple:
|
|
415
|
+
category = category.Semisimple()
|
|
416
|
+
center = self.submodule(self.center_basis(),
|
|
417
|
+
category=category,
|
|
418
|
+
already_echelonized=True)
|
|
419
|
+
center.rename("Center of {}".format(self))
|
|
420
|
+
return center
|
|
421
|
+
|
|
422
|
+
def subalgebra(self, gens, category=None, *args, **opts):
|
|
423
|
+
r"""
|
|
424
|
+
Return the subalgebra of ``self`` generated by ``gens``.
|
|
425
|
+
|
|
426
|
+
Here, ``gens`` is an iterable containing elements of
|
|
427
|
+
``self``.
|
|
428
|
+
|
|
429
|
+
EXAMPLES::
|
|
430
|
+
|
|
431
|
+
sage: # needs sage.combinat sage.modules
|
|
432
|
+
sage: scoeffs = {('a','e'): {'a':1}, ('b','e'): {'a':1, 'b':1},
|
|
433
|
+
....: ('c','d'): {'a':1}, ('c','e'): {'c':1}}
|
|
434
|
+
sage: L.<a,b,c,d,e> = LieAlgebra(QQ, scoeffs)
|
|
435
|
+
sage: MS = MatrixSpace(QQ, 5)
|
|
436
|
+
sage: A = MS.subalgebra([bg.adjoint_matrix() for bg in L.lie_algebra_generators()])
|
|
437
|
+
sage: A.dimension()
|
|
438
|
+
7
|
|
439
|
+
|
|
440
|
+
sage: # needs sage.combinat sage.modules
|
|
441
|
+
sage: L.<x,y,z> = LieAlgebra(GF(3), {('x','z'): {'x':1, 'y':1}, ('y','z'): {'y':1}})
|
|
442
|
+
sage: MS = MatrixSpace(L.base_ring(), L.dimension())
|
|
443
|
+
sage: gens = [b.adjoint_matrix() for b in L.basis()]
|
|
444
|
+
sage: A = MS.subalgebra(gens)
|
|
445
|
+
sage: A.dimension()
|
|
446
|
+
5
|
|
447
|
+
"""
|
|
448
|
+
# add the unit to make sure it is unital
|
|
449
|
+
basis = []
|
|
450
|
+
new_elts = [self(g) for g in gens] + [self.one()]
|
|
451
|
+
while new_elts:
|
|
452
|
+
basis = self.echelon_form(basis + new_elts)
|
|
453
|
+
trailsupp = {b.trailing_support(): b for b in basis}
|
|
454
|
+
sortsupp = sorted(trailsupp)
|
|
455
|
+
new_elts = []
|
|
456
|
+
# We (re)implement the reduction here
|
|
457
|
+
for b in basis:
|
|
458
|
+
for bp in basis:
|
|
459
|
+
elt = b * bp
|
|
460
|
+
for s in sortsupp:
|
|
461
|
+
c = elt[s]
|
|
462
|
+
if c:
|
|
463
|
+
elt -= c / trailsupp[s].trailing_coefficient() * trailsupp[s]
|
|
464
|
+
if elt:
|
|
465
|
+
new_elts.append(elt)
|
|
466
|
+
C = FiniteDimensionalAlgebrasWithBasis(self.category().base_ring())
|
|
467
|
+
category = C.Subobjects().or_subcategory(category)
|
|
468
|
+
return self.submodule(basis, check=False, already_echelonized=True,
|
|
469
|
+
category=category)
|
|
470
|
+
|
|
471
|
+
def ideal_submodule(self, gens, side='left', category=None, *args, **opts):
|
|
472
|
+
r"""
|
|
473
|
+
Return the ``side`` ideal of ``self`` generated by ``gens``
|
|
474
|
+
as a submodule.
|
|
475
|
+
|
|
476
|
+
Here, ``gens`` is an iterable containing elements of
|
|
477
|
+
``self`` or a single element of ``self``,
|
|
478
|
+
and ``side`` is either ``'left'`` or
|
|
479
|
+
``'right'`` or ``'twosided'``.
|
|
480
|
+
|
|
481
|
+
.. TODO::
|
|
482
|
+
|
|
483
|
+
This is not generally compatible with the implementation of
|
|
484
|
+
the ideals. This method should be folded into the ``ideal``
|
|
485
|
+
method after the corresponding classes are refactored to
|
|
486
|
+
be compatible.
|
|
487
|
+
|
|
488
|
+
EXAMPLES::
|
|
489
|
+
|
|
490
|
+
sage: # needs sage.combinat sage.modules
|
|
491
|
+
sage: scoeffs = {('a','e'): {'a':1}, ('b','e'): {'a':1, 'b':1},
|
|
492
|
+
....: ('c','d'): {'a':1}, ('c','e'): {'c':1}}
|
|
493
|
+
sage: L.<a,b,c,d,e> = LieAlgebra(QQ, scoeffs)
|
|
494
|
+
sage: MS = MatrixSpace(QQ, 5)
|
|
495
|
+
sage: I = MS.ideal_submodule([bg.adjoint_matrix() for bg in L.lie_algebra_generators()])
|
|
496
|
+
sage: I.dimension()
|
|
497
|
+
25
|
|
498
|
+
"""
|
|
499
|
+
C = AssociativeAlgebras(self.category().base_ring()).WithBasis().FiniteDimensional()
|
|
500
|
+
category = C.Subobjects().or_subcategory(category)
|
|
501
|
+
if gens in self:
|
|
502
|
+
gens = [self(gens)]
|
|
503
|
+
else:
|
|
504
|
+
gens = [self(g) for g in gens]
|
|
505
|
+
if side == 'left':
|
|
506
|
+
return self.submodule([b * g for b in self.basis() for g in gens],
|
|
507
|
+
category=category, *args, **opts)
|
|
508
|
+
if side == 'right':
|
|
509
|
+
return self.submodule([g * b for b in self.basis() for g in gens],
|
|
510
|
+
category=category, *args, **opts)
|
|
511
|
+
if side == 'twosided':
|
|
512
|
+
return self.submodule([b * g * bp for b in self.basis()
|
|
513
|
+
for bp in self.basis() for g in gens],
|
|
514
|
+
category=category, *args, **opts)
|
|
515
|
+
raise ValueError("side must be either 'left', 'right', or 'twosided'")
|
|
516
|
+
|
|
517
|
+
def principal_ideal(self, a, side='left', *args, **opts):
|
|
518
|
+
r"""
|
|
519
|
+
Construct the ``side`` principal ideal generated by ``a``.
|
|
520
|
+
|
|
521
|
+
INPUT:
|
|
522
|
+
|
|
523
|
+
- ``a`` -- an element
|
|
524
|
+
- ``side`` -- ``left`` (default) or ``right`` or ``twosided``
|
|
525
|
+
- ``coerce`` -- ignored, for compatibility with categories
|
|
526
|
+
|
|
527
|
+
EXAMPLES:
|
|
528
|
+
|
|
529
|
+
In order to highlight the difference between left and
|
|
530
|
+
right principal ideals, our first example deals with a
|
|
531
|
+
noncommutative algebra::
|
|
532
|
+
|
|
533
|
+
sage: # needs sage.graphs sage.modules
|
|
534
|
+
sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
|
|
535
|
+
An example of a finite dimensional algebra with basis:
|
|
536
|
+
the path algebra of the Kronecker quiver
|
|
537
|
+
(containing the arrows a:x->y and b:x->y) over Rational Field
|
|
538
|
+
sage: x, y, a, b = A.basis()
|
|
539
|
+
|
|
540
|
+
In this algebra, multiplication on the right by `x`
|
|
541
|
+
annihilates all basis elements but `x`::
|
|
542
|
+
|
|
543
|
+
sage: x*x, y*x, a*x, b*x # needs sage.graphs sage.modules
|
|
544
|
+
(x, 0, 0, 0)
|
|
545
|
+
|
|
546
|
+
so the left ideal generated by `x` is one-dimensional::
|
|
547
|
+
|
|
548
|
+
sage: Ax = A.principal_ideal(x, side='left'); Ax # needs sage.graphs sage.modules
|
|
549
|
+
Free module generated by {0} over Rational Field
|
|
550
|
+
sage: [B.lift() for B in Ax.basis()] # needs sage.graphs sage.modules
|
|
551
|
+
[x]
|
|
552
|
+
|
|
553
|
+
Multiplication on the left by `x` annihilates
|
|
554
|
+
only `x` and fixes the other basis elements::
|
|
555
|
+
|
|
556
|
+
sage: x*x, x*y, x*a, x*b # needs sage.graphs sage.modules
|
|
557
|
+
(x, 0, a, b)
|
|
558
|
+
|
|
559
|
+
so the right ideal generated by `x` is 3-dimensional::
|
|
560
|
+
|
|
561
|
+
sage: xA = A.principal_ideal(x, side='right'); xA # needs sage.graphs sage.modules
|
|
562
|
+
Free module generated by {0, 1, 2} over Rational Field
|
|
563
|
+
sage: [B.lift() for B in xA.basis()] # needs sage.graphs sage.modules
|
|
564
|
+
[x, a, b]
|
|
565
|
+
|
|
566
|
+
For another example::
|
|
567
|
+
|
|
568
|
+
sage: # needs sage.modules
|
|
569
|
+
sage: A = MatrixSpace(QQ, 2)
|
|
570
|
+
sage: A.basis()
|
|
571
|
+
Finite family {(0, 0): [1 0]
|
|
572
|
+
[0 0], (0, 1): [0 1]
|
|
573
|
+
[0 0], (1, 0): [0 0]
|
|
574
|
+
[1 0], (1, 1): [0 0]
|
|
575
|
+
[0 1]}
|
|
576
|
+
sage: e = list(A.basis())
|
|
577
|
+
sage: [b.lift() for b in A.principal_ideal(e[0], side="left").basis()]
|
|
578
|
+
[
|
|
579
|
+
[1 0] [0 0]
|
|
580
|
+
[0 0], [1 0]
|
|
581
|
+
]
|
|
582
|
+
sage: [b.lift() for b in A.principal_ideal(e[0], side="right").basis()]
|
|
583
|
+
[
|
|
584
|
+
[1 0] [0 1]
|
|
585
|
+
[0 0], [0 0]
|
|
586
|
+
]
|
|
587
|
+
sage: [b.lift() for b in A.principal_ideal(e[0], side="twosided").basis()]
|
|
588
|
+
[
|
|
589
|
+
[1 0] [0 1] [0 0] [0 0]
|
|
590
|
+
[0 0], [0 0], [1 0], [0 1]
|
|
591
|
+
]
|
|
592
|
+
|
|
593
|
+
.. SEEALSO::
|
|
594
|
+
|
|
595
|
+
- :meth:`peirce_summand`
|
|
596
|
+
"""
|
|
597
|
+
opts.pop("coerce", None)
|
|
598
|
+
if side == 'right':
|
|
599
|
+
return self.submodule([a * b
|
|
600
|
+
for b in self.basis()], *args, **opts)
|
|
601
|
+
if side == 'left':
|
|
602
|
+
return self.submodule([b * a
|
|
603
|
+
for b in self.basis()], *args, **opts)
|
|
604
|
+
if side == 'twosided':
|
|
605
|
+
return self.submodule([b1 * a * b2 for b1 in self.basis()
|
|
606
|
+
for b2 in self.basis()], *args, **opts)
|
|
607
|
+
raise ValueError("side must be either 'left', 'right', or 'twosided'")
|
|
608
|
+
|
|
609
|
+
@cached_method
|
|
610
|
+
def orthogonal_idempotents_central_mod_radical(self):
|
|
611
|
+
r"""
|
|
612
|
+
Return a family of orthogonal idempotents of ``self`` that project
|
|
613
|
+
on the central orthogonal idempotents of the semisimple quotient.
|
|
614
|
+
|
|
615
|
+
.. TODO::
|
|
616
|
+
|
|
617
|
+
The implementation assumes that the algebra
|
|
618
|
+
is split over its base field.
|
|
619
|
+
|
|
620
|
+
OUTPUT:
|
|
621
|
+
|
|
622
|
+
- a list of orthogonal idempotents obtained by lifting the central
|
|
623
|
+
orthogonal idempotents of the semisimple quotient.
|
|
624
|
+
|
|
625
|
+
ALGORITHM:
|
|
626
|
+
|
|
627
|
+
The orthogonal idempotents of `A` are obtained by lifting the
|
|
628
|
+
central orthogonal idempotents of the semisimple quotient
|
|
629
|
+
`\overline{A}`.
|
|
630
|
+
|
|
631
|
+
Namely, let `(\overline{f_i})` be the central orthogonal
|
|
632
|
+
idempotents of the semisimple quotient of `A`. We
|
|
633
|
+
recursively construct orthogonal idempotents of `A` by the
|
|
634
|
+
following procedure: assuming `(f_i)_{i < n}` is a set of
|
|
635
|
+
already constructed orthogonal idempotents, we construct
|
|
636
|
+
`f_k` by idempotent lifting of `(1-f) g (1-f)`, where `g`
|
|
637
|
+
is any lift of `\overline{e_k}` and `f=\sum_{i<k} f_i`.
|
|
638
|
+
|
|
639
|
+
See [CR1962]_ for correctness and termination proofs.
|
|
640
|
+
|
|
641
|
+
.. SEEALSO::
|
|
642
|
+
|
|
643
|
+
- :meth:`Algebras.SemiSimple.FiniteDimensional.WithBasis.ParentMethods.central_orthogonal_idempotents`
|
|
644
|
+
- :meth:`idempotent_lift`
|
|
645
|
+
|
|
646
|
+
EXAMPLES::
|
|
647
|
+
|
|
648
|
+
sage: # needs sage.graphs sage.modules
|
|
649
|
+
sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
|
|
650
|
+
An example of a finite dimensional algebra with basis:
|
|
651
|
+
the path algebra of the Kronecker quiver
|
|
652
|
+
(containing the arrows a:x->y and b:x->y) over Rational Field
|
|
653
|
+
sage: A.orthogonal_idempotents_central_mod_radical() # needs sage.rings.number_field
|
|
654
|
+
(x, y)
|
|
655
|
+
|
|
656
|
+
::
|
|
657
|
+
|
|
658
|
+
sage: # needs sage.modules sage.rings.number_field
|
|
659
|
+
sage: Z12 = Monoids().Finite().example(); Z12
|
|
660
|
+
An example of a finite multiplicative monoid: the integers modulo 12
|
|
661
|
+
sage: A = Z12.algebra(QQ)
|
|
662
|
+
sage: idempotents = A.orthogonal_idempotents_central_mod_radical()
|
|
663
|
+
sage: sorted(idempotents, key=str)
|
|
664
|
+
[-B[0] + 1/2*B[4] + 1/2*B[8],
|
|
665
|
+
1/2*B[4] - 1/2*B[8],
|
|
666
|
+
1/2*B[9] + 1/2*B[3] - B[0],
|
|
667
|
+
1/2*B[9] - 1/2*B[3],
|
|
668
|
+
1/4*B[1] + 1/4*B[11] - 1/4*B[5] - 1/4*B[7],
|
|
669
|
+
1/4*B[1] - 1/2*B[9] + 1/4*B[5] - 1/4*B[7] + 1/2*B[3] - 1/4*B[11],
|
|
670
|
+
1/4*B[1] - 1/2*B[9] - 1/2*B[3] + 1/4*B[11] + 1/4*B[5] + 1/4*B[7] + B[0] - 1/2*B[4] - 1/2*B[8],
|
|
671
|
+
1/4*B[1] - 1/4*B[5] + 1/4*B[7] - 1/4*B[11] - 1/2*B[4] + 1/2*B[8],
|
|
672
|
+
B[0]]
|
|
673
|
+
sage: sum(idempotents) == 1
|
|
674
|
+
True
|
|
675
|
+
sage: all(e*e == e for e in idempotents)
|
|
676
|
+
True
|
|
677
|
+
sage: all(e*f == 0 and f*e == 0
|
|
678
|
+
....: for e in idempotents for f in idempotents if e != f)
|
|
679
|
+
True
|
|
680
|
+
|
|
681
|
+
This is best tested with::
|
|
682
|
+
|
|
683
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents(idempotents) # needs sage.graphs sage.modules sage.rings.number_field
|
|
684
|
+
True
|
|
685
|
+
|
|
686
|
+
We construct orthogonal idempotents for the algebra of the
|
|
687
|
+
`0`-Hecke monoid::
|
|
688
|
+
|
|
689
|
+
sage: # needs sage.combinat sage.graphs sage.groups sage.modules
|
|
690
|
+
sage: from sage.monoids.hecke_monoid import HeckeMonoid
|
|
691
|
+
sage: A = HeckeMonoid(SymmetricGroup(4)).algebra(QQ)
|
|
692
|
+
sage: idempotents = A.orthogonal_idempotents_central_mod_radical()
|
|
693
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents(idempotents)
|
|
694
|
+
True
|
|
695
|
+
"""
|
|
696
|
+
one = self.one()
|
|
697
|
+
# Construction of the orthogonal idempotents
|
|
698
|
+
idempotents = []
|
|
699
|
+
f = self.zero()
|
|
700
|
+
for g in self.semisimple_quotient().central_orthogonal_idempotents():
|
|
701
|
+
fi = self.idempotent_lift((one - f) * g.lift() * (one - f))
|
|
702
|
+
idempotents.append(fi)
|
|
703
|
+
f = f + fi
|
|
704
|
+
return tuple(idempotents)
|
|
705
|
+
|
|
706
|
+
def idempotent_lift(self, x):
|
|
707
|
+
r"""
|
|
708
|
+
Lift an idempotent of the semisimple quotient into an idempotent of ``self``.
|
|
709
|
+
|
|
710
|
+
Let `A` be this finite dimensional algebra and `\pi` be
|
|
711
|
+
the projection `A \rightarrow \overline{A}` on its
|
|
712
|
+
semisimple quotient. Let `\overline{x}` be an idempotent
|
|
713
|
+
of `\overline A`, and `x` any lift thereof in `A`. This
|
|
714
|
+
returns an idempotent `e` of `A` such that `\pi(e)=\pi(x)`
|
|
715
|
+
and `e` is a polynomial in `x`.
|
|
716
|
+
|
|
717
|
+
INPUT:
|
|
718
|
+
|
|
719
|
+
- ``x`` -- an element of `A` that projects on an idempotent
|
|
720
|
+
`\overline x` of the semisimple quotient of `A`.
|
|
721
|
+
Alternatively one may give as input the idempotent
|
|
722
|
+
`\overline{x}`, in which case some lift thereof will be
|
|
723
|
+
taken for `x`.
|
|
724
|
+
|
|
725
|
+
OUTPUT: the idempotent `e` of ``self``
|
|
726
|
+
|
|
727
|
+
ALGORITHM:
|
|
728
|
+
|
|
729
|
+
Iterate the formula `1 - (1 - x^2)^2` until having an
|
|
730
|
+
idempotent.
|
|
731
|
+
|
|
732
|
+
See [CR1962]_ for correctness and termination proofs.
|
|
733
|
+
|
|
734
|
+
EXAMPLES::
|
|
735
|
+
|
|
736
|
+
sage: # needs sage.graphs sage.modules
|
|
737
|
+
sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example()
|
|
738
|
+
sage: S = A.semisimple_quotient()
|
|
739
|
+
sage: A.idempotent_lift(S.basis()['x'])
|
|
740
|
+
x
|
|
741
|
+
sage: A.idempotent_lift(A.basis()['y'])
|
|
742
|
+
y
|
|
743
|
+
|
|
744
|
+
A less trivial example::
|
|
745
|
+
|
|
746
|
+
sage: # needs sage.combinat sage.modules
|
|
747
|
+
sage: B = DescentAlgebra(QQ, 4).B()
|
|
748
|
+
sage: a = 1/8*B[[1, 1, 1, 1]] - 1/2*B[[2, 1, 1]] + 1/2*B[[2, 2]]
|
|
749
|
+
sage: a ** 2 == a # not idempotent, but idempotent mod radical
|
|
750
|
+
False
|
|
751
|
+
sage: al = B.idempotent_lift(a)
|
|
752
|
+
sage: al ** 2 == al
|
|
753
|
+
True
|
|
754
|
+
sage: (a - al) ** 2
|
|
755
|
+
0
|
|
756
|
+
"""
|
|
757
|
+
if not self.is_parent_of(x):
|
|
758
|
+
x = x.lift()
|
|
759
|
+
p = self.semisimple_quotient().retract(x)
|
|
760
|
+
if p * p != p:
|
|
761
|
+
raise ValueError("%s does not retract to an idempotent." % p)
|
|
762
|
+
x_prev = None
|
|
763
|
+
while x != x_prev:
|
|
764
|
+
tmp = x
|
|
765
|
+
y = x ** 2
|
|
766
|
+
x = 2*y - y**2 # == one - (one - x**2)**2
|
|
767
|
+
x_prev = tmp
|
|
768
|
+
return x
|
|
769
|
+
|
|
770
|
+
@cached_method
|
|
771
|
+
def cartan_invariants_matrix(self):
|
|
772
|
+
r"""
|
|
773
|
+
Return the Cartan invariants matrix of the algebra.
|
|
774
|
+
|
|
775
|
+
OUTPUT: a matrix of nonnegative integers
|
|
776
|
+
|
|
777
|
+
.. TODO::
|
|
778
|
+
|
|
779
|
+
Both the implementation and the documentation
|
|
780
|
+
assume that the algebra is split over its
|
|
781
|
+
base field.
|
|
782
|
+
|
|
783
|
+
Let `A` be this finite-dimensional algebra and
|
|
784
|
+
`(S_i)_{i\in I}` be representatives of the right simple
|
|
785
|
+
modules of `A`. Note that their adjoints `S_i^*` are
|
|
786
|
+
representatives of the left simple modules.
|
|
787
|
+
|
|
788
|
+
Let `(P^L_i)_{i\in I}` and `(P^R_i)_{i\in I}` be
|
|
789
|
+
respectively representatives of the corresponding
|
|
790
|
+
indecomposable projective left and right modules of `A`.
|
|
791
|
+
In particular, we assume that the indexing is consistent
|
|
792
|
+
so that `S_i^*=\operatorname{top} P^L_i` and
|
|
793
|
+
`S_i=\operatorname{top} P^R_i`.
|
|
794
|
+
|
|
795
|
+
The *Cartan invariant matrix* `(C_{i,j})_{i,j\in I}` is a
|
|
796
|
+
matrix of nonnegative integers that encodes much of the
|
|
797
|
+
representation theory of `A`; namely:
|
|
798
|
+
|
|
799
|
+
- `C_{i,j}` counts how many times `S_i^*\otimes S_j`
|
|
800
|
+
appears as composition factor of `A` seen as a bimodule
|
|
801
|
+
over itself;
|
|
802
|
+
|
|
803
|
+
- `C_{i,j}=\dim Hom_A(P^R_j, P^R_i)`;
|
|
804
|
+
|
|
805
|
+
- `C_{i,j}` counts how many times `S_j` appears as
|
|
806
|
+
composition factor of `P^R_i`;
|
|
807
|
+
|
|
808
|
+
- `C_{i,j}=\dim Hom_A(P^L_i, P^L_j)`;
|
|
809
|
+
|
|
810
|
+
- `C_{i,j}` counts how many times `S_i^*` appears as
|
|
811
|
+
composition factor of `P^L_j`.
|
|
812
|
+
|
|
813
|
+
In the commutative case, the Cartan invariant matrix is
|
|
814
|
+
diagonal. In the context of solving systems of
|
|
815
|
+
multivariate polynomial equations of dimension zero, `A`
|
|
816
|
+
is the quotient of the polynomial ring by the ideal
|
|
817
|
+
generated by the equations, the simple modules correspond
|
|
818
|
+
to the roots, and the numbers `C_{i,i}` give the
|
|
819
|
+
multiplicities of those roots.
|
|
820
|
+
|
|
821
|
+
.. NOTE::
|
|
822
|
+
|
|
823
|
+
For simplicity, the current implementation assumes
|
|
824
|
+
that the index set `I` is of the form
|
|
825
|
+
`\{0,\dots,n-1\}`. Better indexations will be possible
|
|
826
|
+
in the future.
|
|
827
|
+
|
|
828
|
+
ALGORITHM:
|
|
829
|
+
|
|
830
|
+
The Cartan invariant matrix of `A` is computed from the
|
|
831
|
+
dimension of the summands of its Peirce decomposition.
|
|
832
|
+
|
|
833
|
+
.. SEEALSO::
|
|
834
|
+
|
|
835
|
+
- :meth:`peirce_decomposition`
|
|
836
|
+
- :meth:`isotypic_projective_modules`
|
|
837
|
+
|
|
838
|
+
EXAMPLES:
|
|
839
|
+
|
|
840
|
+
For a semisimple algebra, in particular for group algebras
|
|
841
|
+
in characteristic zero, the Cartan invariants matrix is
|
|
842
|
+
the identity::
|
|
843
|
+
|
|
844
|
+
sage: A3 = SymmetricGroup(3).algebra(QQ) # needs sage.combinat sage.groups sage.modules
|
|
845
|
+
sage: A3.cartan_invariants_matrix() # needs sage.combinat sage.groups sage.modules
|
|
846
|
+
[1 0 0]
|
|
847
|
+
[0 1 0]
|
|
848
|
+
[0 0 1]
|
|
849
|
+
|
|
850
|
+
For the path algebra of a quiver, the Cartan invariants
|
|
851
|
+
matrix counts the number of paths between two vertices::
|
|
852
|
+
|
|
853
|
+
sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example()
|
|
854
|
+
sage: A.cartan_invariants_matrix() # needs sage.modules sage.rings.number_field
|
|
855
|
+
[1 2]
|
|
856
|
+
[0 1]
|
|
857
|
+
|
|
858
|
+
In the commutative case, the Cartan invariant matrix is diagonal::
|
|
859
|
+
|
|
860
|
+
sage: Z12 = Monoids().Finite().example(); Z12
|
|
861
|
+
An example of a finite multiplicative monoid: the integers modulo 12
|
|
862
|
+
sage: A = Z12.algebra(QQ) # needs sage.modules
|
|
863
|
+
sage: A.cartan_invariants_matrix() # needs sage.modules sage.rings.number_field
|
|
864
|
+
[1 0 0 0 0 0 0 0 0]
|
|
865
|
+
[0 1 0 0 0 0 0 0 0]
|
|
866
|
+
[0 0 2 0 0 0 0 0 0]
|
|
867
|
+
[0 0 0 1 0 0 0 0 0]
|
|
868
|
+
[0 0 0 0 2 0 0 0 0]
|
|
869
|
+
[0 0 0 0 0 1 0 0 0]
|
|
870
|
+
[0 0 0 0 0 0 1 0 0]
|
|
871
|
+
[0 0 0 0 0 0 0 2 0]
|
|
872
|
+
[0 0 0 0 0 0 0 0 1]
|
|
873
|
+
|
|
874
|
+
With the algebra of the `0`-Hecke monoid::
|
|
875
|
+
|
|
876
|
+
sage: # needs sage.combinat sage.groups sage.modules
|
|
877
|
+
sage: from sage.monoids.hecke_monoid import HeckeMonoid
|
|
878
|
+
sage: A = HeckeMonoid(SymmetricGroup(4)).algebra(QQ)
|
|
879
|
+
sage: A.cartan_invariants_matrix() # needs sage.rings.number_field
|
|
880
|
+
[1 0 0 0 0 0 0 0]
|
|
881
|
+
[0 2 1 0 1 1 0 0]
|
|
882
|
+
[0 1 1 0 1 0 0 0]
|
|
883
|
+
[0 0 0 1 0 1 1 0]
|
|
884
|
+
[0 1 1 0 1 0 0 0]
|
|
885
|
+
[0 1 0 1 0 2 1 0]
|
|
886
|
+
[0 0 0 1 0 1 1 0]
|
|
887
|
+
[0 0 0 0 0 0 0 1]
|
|
888
|
+
"""
|
|
889
|
+
from sage.matrix.constructor import Matrix
|
|
890
|
+
from sage.rings.integer_ring import ZZ
|
|
891
|
+
A_quo = self.semisimple_quotient()
|
|
892
|
+
idempotents_quo = A_quo.central_orthogonal_idempotents()
|
|
893
|
+
# Dimension of simple modules
|
|
894
|
+
dim_simples = [A_quo.principal_ideal(e).dimension().sqrt()
|
|
895
|
+
for e in idempotents_quo]
|
|
896
|
+
# Orthogonal idempotents
|
|
897
|
+
idempotents = self.orthogonal_idempotents_central_mod_radical()
|
|
898
|
+
|
|
899
|
+
def C(i, j):
|
|
900
|
+
summand = self.peirce_summand(idempotents[i], idempotents[j])
|
|
901
|
+
return summand.dimension() / (dim_simples[i] * dim_simples[j])
|
|
902
|
+
m = Matrix(ZZ, len(idempotents), C)
|
|
903
|
+
m.set_immutable()
|
|
904
|
+
return m
|
|
905
|
+
|
|
906
|
+
def isotypic_projective_modules(self, side='left'):
|
|
907
|
+
r"""
|
|
908
|
+
Return the isotypic projective ``side`` ``self``-modules.
|
|
909
|
+
|
|
910
|
+
.. TODO::
|
|
911
|
+
|
|
912
|
+
The current implementation assumes that the
|
|
913
|
+
algebra is split over its base field.
|
|
914
|
+
|
|
915
|
+
Let `P_i` be representatives of the indecomposable
|
|
916
|
+
projective ``side``-modules of this finite dimensional
|
|
917
|
+
algebra `A`, and `S_i` be the associated simple modules.
|
|
918
|
+
|
|
919
|
+
The regular ``side`` representation of `A` can be
|
|
920
|
+
decomposed as a direct sum `A = \bigoplus_i Q_i` where
|
|
921
|
+
each `Q_i` is an isotypic projective module; namely `Q_i`
|
|
922
|
+
is the direct sum of `\dim S_i` copies of the
|
|
923
|
+
indecomposable projective module `P_i`. This decomposition
|
|
924
|
+
is not unique.
|
|
925
|
+
|
|
926
|
+
The isotypic projective modules are constructed as
|
|
927
|
+
`Q_i=e_iA`, where the `(e_i)_i` is the decomposition of
|
|
928
|
+
the identity into orthogonal idempotents obtained by
|
|
929
|
+
lifting the central orthogonal idempotents of the
|
|
930
|
+
semisimple quotient of `A`.
|
|
931
|
+
|
|
932
|
+
INPUT:
|
|
933
|
+
|
|
934
|
+
- ``side`` -- ``'left'`` or ``'right'`` (default: ``'left'``)
|
|
935
|
+
|
|
936
|
+
OUTPUT: list of subspaces of ``self``
|
|
937
|
+
|
|
938
|
+
EXAMPLES::
|
|
939
|
+
|
|
940
|
+
sage: # needs sage.graphs sage.modules sage.rings.number_field
|
|
941
|
+
sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
|
|
942
|
+
An example of a finite dimensional algebra with basis:
|
|
943
|
+
the path algebra of the Kronecker quiver
|
|
944
|
+
(containing the arrows a:x->y and b:x->y) over Rational Field
|
|
945
|
+
sage: Q = A.isotypic_projective_modules(side='left'); Q
|
|
946
|
+
[Free module generated by {0} over Rational Field,
|
|
947
|
+
Free module generated by {0, 1, 2} over Rational Field]
|
|
948
|
+
sage: [[x.lift() for x in Qi.basis()]
|
|
949
|
+
....: for Qi in Q]
|
|
950
|
+
[[x],
|
|
951
|
+
[y, a, b]]
|
|
952
|
+
|
|
953
|
+
We check that the sum of the dimensions of the isotypic
|
|
954
|
+
projective modules is the dimension of ``self``::
|
|
955
|
+
|
|
956
|
+
sage: sum([Qi.dimension() for Qi in Q]) == A.dimension() # needs sage.graphs sage.modules sage.rings.number_field
|
|
957
|
+
True
|
|
958
|
+
|
|
959
|
+
.. SEEALSO::
|
|
960
|
+
|
|
961
|
+
- :meth:`orthogonal_idempotents_central_mod_radical`
|
|
962
|
+
- :meth:`peirce_decomposition`
|
|
963
|
+
"""
|
|
964
|
+
return [self.principal_ideal(e, side) for e in
|
|
965
|
+
self.orthogonal_idempotents_central_mod_radical()]
|
|
966
|
+
|
|
967
|
+
@cached_method
|
|
968
|
+
def peirce_summand(self, ei, ej):
|
|
969
|
+
r"""
|
|
970
|
+
Return the Peirce decomposition summand `e_i A e_j`.
|
|
971
|
+
|
|
972
|
+
INPUT:
|
|
973
|
+
|
|
974
|
+
- ``self`` -- an algebra `A`
|
|
975
|
+
|
|
976
|
+
- ``ei``, ``ej`` -- two idempotents of `A`
|
|
977
|
+
|
|
978
|
+
OUTPUT: `e_i A e_j`, as a subspace of `A`
|
|
979
|
+
|
|
980
|
+
.. SEEALSO::
|
|
981
|
+
|
|
982
|
+
- :meth:`peirce_decomposition`
|
|
983
|
+
- :meth:`principal_ideal`
|
|
984
|
+
|
|
985
|
+
EXAMPLES::
|
|
986
|
+
|
|
987
|
+
sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example()
|
|
988
|
+
sage: idemp = A.orthogonal_idempotents_central_mod_radical() # needs sage.rings.number_field
|
|
989
|
+
sage: A.peirce_summand(idemp[0], idemp[1]) # needs sage.rings.number_field
|
|
990
|
+
Free module generated by {0, 1} over Rational Field
|
|
991
|
+
sage: A.peirce_summand(idemp[1], idemp[0]) # needs sage.rings.number_field
|
|
992
|
+
Free module generated by {} over Rational Field
|
|
993
|
+
|
|
994
|
+
We recover the `2\times2` block of `\QQ[S_4]`
|
|
995
|
+
corresponding to the unique simple module of dimension `2`
|
|
996
|
+
of the symmetric group `S_4`::
|
|
997
|
+
|
|
998
|
+
sage: # needs sage.combinat sage.groups sage.rings.number_field
|
|
999
|
+
sage: A4 = SymmetricGroup(4).algebra(QQ)
|
|
1000
|
+
sage: e = A4.central_orthogonal_idempotents()[2]
|
|
1001
|
+
sage: A4.peirce_summand(e, e)
|
|
1002
|
+
Free module generated by {0, 1, 2, 3} over Rational Field
|
|
1003
|
+
|
|
1004
|
+
TESTS:
|
|
1005
|
+
|
|
1006
|
+
We check each idempotent belongs to its own Peirce summand
|
|
1007
|
+
(see :issue:`24687`)::
|
|
1008
|
+
|
|
1009
|
+
sage: # needs sage.combinat sage.groups sage.rings.number_field
|
|
1010
|
+
sage: from sage.monoids.hecke_monoid import HeckeMonoid
|
|
1011
|
+
sage: M = HeckeMonoid(SymmetricGroup(4))
|
|
1012
|
+
sage: A = M.algebra(QQ)
|
|
1013
|
+
sage: Idms = A.orthogonal_idempotents_central_mod_radical()
|
|
1014
|
+
sage: all(A.peirce_summand(e, e).retract(e)
|
|
1015
|
+
....: in A.peirce_summand(e, e) for e in Idms)
|
|
1016
|
+
True
|
|
1017
|
+
"""
|
|
1018
|
+
B = self.basis()
|
|
1019
|
+
phi = self.module_morphism(on_basis=lambda k: ei * B[k] * ej,
|
|
1020
|
+
codomain=self, triangular='lower')
|
|
1021
|
+
ideal = phi.matrix(side='right').image()
|
|
1022
|
+
|
|
1023
|
+
return self.submodule([self.from_vector(v) for v in ideal.basis()],
|
|
1024
|
+
already_echelonized=True)
|
|
1025
|
+
|
|
1026
|
+
def peirce_decomposition(self, idempotents=None, check=True):
|
|
1027
|
+
r"""
|
|
1028
|
+
Return a Peirce decomposition of ``self``.
|
|
1029
|
+
|
|
1030
|
+
Let `(e_i)_i` be a collection of orthogonal idempotents of
|
|
1031
|
+
`A` with sum `1`. The *Peirce decomposition* of `A` is the
|
|
1032
|
+
decomposition of `A` into the direct sum of the subspaces
|
|
1033
|
+
`e_i A e_j`.
|
|
1034
|
+
|
|
1035
|
+
With the default collection of orthogonal idempotents, one has
|
|
1036
|
+
|
|
1037
|
+
.. MATH::
|
|
1038
|
+
|
|
1039
|
+
\dim e_i A e_j = C_{i,j} \dim S_i \dim S_j
|
|
1040
|
+
|
|
1041
|
+
where `(S_i)_i` are the simple modules of `A` and
|
|
1042
|
+
`(C_{i,j})_{i, j}` is the Cartan invariants matrix.
|
|
1043
|
+
|
|
1044
|
+
INPUT:
|
|
1045
|
+
|
|
1046
|
+
- ``idempotents`` -- list of orthogonal idempotents
|
|
1047
|
+
`(e_i)_{i=0,\ldots,n}` of the algebra that sum to `1`
|
|
1048
|
+
(default: the idempotents returned by
|
|
1049
|
+
:meth:`orthogonal_idempotents_central_mod_radical`)
|
|
1050
|
+
|
|
1051
|
+
- ``check`` -- boolean (default: ``True``); whether to check that
|
|
1052
|
+
the idempotents are indeed orthogonal and idempotent and
|
|
1053
|
+
sum to `1`
|
|
1054
|
+
|
|
1055
|
+
OUTPUT:
|
|
1056
|
+
|
|
1057
|
+
A list of lists `l` such that ``l[i][j]`` is the subspace
|
|
1058
|
+
`e_i A e_j`.
|
|
1059
|
+
|
|
1060
|
+
.. SEEALSO::
|
|
1061
|
+
|
|
1062
|
+
- :meth:`orthogonal_idempotents_central_mod_radical`
|
|
1063
|
+
- :meth:`cartan_invariants_matrix`
|
|
1064
|
+
|
|
1065
|
+
EXAMPLES::
|
|
1066
|
+
|
|
1067
|
+
sage: # needs sage.graphs sage.groups sage.modules sage.rings.number_field
|
|
1068
|
+
sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
|
|
1069
|
+
An example of a finite dimensional algebra with basis:
|
|
1070
|
+
the path algebra of the Kronecker quiver
|
|
1071
|
+
(containing the arrows a:x->y and b:x->y) over Rational Field
|
|
1072
|
+
sage: A.orthogonal_idempotents_central_mod_radical()
|
|
1073
|
+
(x, y)
|
|
1074
|
+
sage: decomposition = A.peirce_decomposition(); decomposition
|
|
1075
|
+
[[Free module generated by {0} over Rational Field,
|
|
1076
|
+
Free module generated by {0, 1} over Rational Field],
|
|
1077
|
+
[Free module generated by {} over Rational Field,
|
|
1078
|
+
Free module generated by {0} over Rational Field]]
|
|
1079
|
+
sage: [ [[x.lift() for x in decomposition[i][j].basis()]
|
|
1080
|
+
....: for j in range(2)]
|
|
1081
|
+
....: for i in range(2)]
|
|
1082
|
+
[[[x], [a, b]],
|
|
1083
|
+
[[], [y]]]
|
|
1084
|
+
|
|
1085
|
+
We recover that the group algebra of the symmetric group
|
|
1086
|
+
`S_4` is a block matrix algebra::
|
|
1087
|
+
|
|
1088
|
+
sage: # needs sage.combinat sage.groups sage.modules sage.rings.number_field
|
|
1089
|
+
sage: A = SymmetricGroup(4).algebra(QQ)
|
|
1090
|
+
sage: decomposition = A.peirce_decomposition() # long time
|
|
1091
|
+
sage: [[decomposition[i][j].dimension() # long time (4s)
|
|
1092
|
+
....: for j in range(len(decomposition))]
|
|
1093
|
+
....: for i in range(len(decomposition))]
|
|
1094
|
+
[[9, 0, 0, 0, 0],
|
|
1095
|
+
[0, 9, 0, 0, 0],
|
|
1096
|
+
[0, 0, 4, 0, 0],
|
|
1097
|
+
[0, 0, 0, 1, 0],
|
|
1098
|
+
[0, 0, 0, 0, 1]]
|
|
1099
|
+
|
|
1100
|
+
The dimension of each block is `d^2`, where `d` is the
|
|
1101
|
+
dimension of the corresponding simple module of `S_4`. The
|
|
1102
|
+
latter are given by::
|
|
1103
|
+
|
|
1104
|
+
sage: [p.standard_tableaux().cardinality() for p in Partitions(4)] # needs sage.combinat
|
|
1105
|
+
[1, 3, 2, 3, 1]
|
|
1106
|
+
"""
|
|
1107
|
+
if idempotents is None:
|
|
1108
|
+
idempotents = self.orthogonal_idempotents_central_mod_radical()
|
|
1109
|
+
if check:
|
|
1110
|
+
if not self.is_identity_decomposition_into_orthogonal_idempotents(idempotents):
|
|
1111
|
+
raise ValueError("Not a decomposition of the identity into orthogonal idempotents")
|
|
1112
|
+
return [[self.peirce_summand(ei, ej) for ej in idempotents]
|
|
1113
|
+
for ei in idempotents]
|
|
1114
|
+
|
|
1115
|
+
def is_identity_decomposition_into_orthogonal_idempotents(self, l):
|
|
1116
|
+
r"""
|
|
1117
|
+
Return whether ``l`` is a decomposition of the identity
|
|
1118
|
+
into orthogonal idempotents.
|
|
1119
|
+
|
|
1120
|
+
INPUT:
|
|
1121
|
+
|
|
1122
|
+
- ``l`` -- list or iterable of elements of ``self``
|
|
1123
|
+
|
|
1124
|
+
EXAMPLES::
|
|
1125
|
+
|
|
1126
|
+
sage: # needs sage.graphs sage.modules
|
|
1127
|
+
sage: A = FiniteDimensionalAlgebrasWithBasis(QQ).example(); A
|
|
1128
|
+
An example of a finite dimensional algebra with basis:
|
|
1129
|
+
the path algebra of the Kronecker quiver
|
|
1130
|
+
(containing the arrows a:x->y and b:x->y) over Rational Field
|
|
1131
|
+
sage: x,y,a,b = A.algebra_generators(); x,y,a,b
|
|
1132
|
+
(x, y, a, b)
|
|
1133
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents([A.one()])
|
|
1134
|
+
True
|
|
1135
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents([x, y])
|
|
1136
|
+
True
|
|
1137
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents([x + a, y - a])
|
|
1138
|
+
True
|
|
1139
|
+
|
|
1140
|
+
Here the idempotents do not sum up to `1`::
|
|
1141
|
+
|
|
1142
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents([x]) # needs sage.graphs sage.modules
|
|
1143
|
+
False
|
|
1144
|
+
|
|
1145
|
+
Here `1+x` and `-x` are neither idempotent nor orthogonal::
|
|
1146
|
+
|
|
1147
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents([1 + x, -x]) # needs sage.graphs sage.modules
|
|
1148
|
+
False
|
|
1149
|
+
|
|
1150
|
+
With the algebra of the `0`-Hecke monoid::
|
|
1151
|
+
|
|
1152
|
+
sage: # needs sage.combinat sage.groups sage.modules sage.rings.number_field
|
|
1153
|
+
sage: from sage.monoids.hecke_monoid import HeckeMonoid
|
|
1154
|
+
sage: A = HeckeMonoid(SymmetricGroup(4)).algebra(QQ)
|
|
1155
|
+
sage: idempotents = A.orthogonal_idempotents_central_mod_radical()
|
|
1156
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents(idempotents)
|
|
1157
|
+
True
|
|
1158
|
+
|
|
1159
|
+
Here are some more counterexamples:
|
|
1160
|
+
|
|
1161
|
+
1. Some orthogonal elements summing to `1` but not being
|
|
1162
|
+
idempotent::
|
|
1163
|
+
|
|
1164
|
+
sage: # needs sage.libs.pari sage.modules
|
|
1165
|
+
sage: class PQAlgebra(CombinatorialFreeModule):
|
|
1166
|
+
....: def __init__(self, F, p):
|
|
1167
|
+
....: # Construct the quotient algebra F[x] / p,
|
|
1168
|
+
....: # where p is a univariate polynomial.
|
|
1169
|
+
....: R = parent(p); x = R.gen()
|
|
1170
|
+
....: I = R.ideal(p)
|
|
1171
|
+
....: self._xbar = R.quotient(I).gen()
|
|
1172
|
+
....: basis_keys = [self._xbar**i for i in range(p.degree())]
|
|
1173
|
+
....: CombinatorialFreeModule.__init__(self, F, basis_keys,
|
|
1174
|
+
....: category=Algebras(F).FiniteDimensional().WithBasis())
|
|
1175
|
+
....: def x(self):
|
|
1176
|
+
....: return self(self._xbar)
|
|
1177
|
+
....: def one(self):
|
|
1178
|
+
....: return self.basis()[self.base_ring().one()]
|
|
1179
|
+
....: def product_on_basis(self, w1, w2):
|
|
1180
|
+
....: return self.from_vector(vector(w1*w2))
|
|
1181
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
1182
|
+
sage: A = PQAlgebra(QQ, x**3 - x**2 + x + 1); y = A.x()
|
|
1183
|
+
sage: a, b = y, 1 - y
|
|
1184
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents((a, b))
|
|
1185
|
+
False
|
|
1186
|
+
|
|
1187
|
+
For comparison::
|
|
1188
|
+
|
|
1189
|
+
sage: # needs sage.libs.pari sage.modules
|
|
1190
|
+
sage: A = PQAlgebra(QQ, x**2 - x); y = A.x()
|
|
1191
|
+
sage: a, b = y, 1-y
|
|
1192
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents((a, b))
|
|
1193
|
+
True
|
|
1194
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents((a, A.zero(), b))
|
|
1195
|
+
True
|
|
1196
|
+
sage: A = PQAlgebra(QQ, x**3 - x**2 + x - 1); y = A.x()
|
|
1197
|
+
sage: a = (y**2 + 1) / 2
|
|
1198
|
+
sage: b = 1 - a
|
|
1199
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents((a, b))
|
|
1200
|
+
True
|
|
1201
|
+
|
|
1202
|
+
2. Some idempotents summing to 1 but not orthogonal::
|
|
1203
|
+
|
|
1204
|
+
sage: # needs sage.libs.pari sage.modules
|
|
1205
|
+
sage: R.<x> = PolynomialRing(GF(2))
|
|
1206
|
+
sage: A = PQAlgebra(GF(2), x)
|
|
1207
|
+
sage: a = A.one()
|
|
1208
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents((a,))
|
|
1209
|
+
True
|
|
1210
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents((a, a, a))
|
|
1211
|
+
False
|
|
1212
|
+
|
|
1213
|
+
3. Some orthogonal idempotents not summing to the identity::
|
|
1214
|
+
|
|
1215
|
+
sage: # needs sage.libs.pari sage.modules
|
|
1216
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents((a,a))
|
|
1217
|
+
False
|
|
1218
|
+
sage: A.is_identity_decomposition_into_orthogonal_idempotents(())
|
|
1219
|
+
False
|
|
1220
|
+
"""
|
|
1221
|
+
return (self.sum(l) == self.one()
|
|
1222
|
+
and all(e*e == e for e in l)
|
|
1223
|
+
and all(e*f == 0 and f*e == 0 for i, e in enumerate(l)
|
|
1224
|
+
for f in l[:i]))
|
|
1225
|
+
|
|
1226
|
+
@cached_method
|
|
1227
|
+
def is_commutative(self) -> bool:
|
|
1228
|
+
"""
|
|
1229
|
+
Return whether ``self`` is a commutative algebra.
|
|
1230
|
+
|
|
1231
|
+
EXAMPLES::
|
|
1232
|
+
|
|
1233
|
+
sage: # needs sage.combinat sage.groups
|
|
1234
|
+
sage: S4 = SymmetricGroupAlgebra(QQ, 4)
|
|
1235
|
+
sage: S4.is_commutative()
|
|
1236
|
+
False
|
|
1237
|
+
sage: S2 = SymmetricGroupAlgebra(QQ, 2)
|
|
1238
|
+
sage: S2.is_commutative()
|
|
1239
|
+
True
|
|
1240
|
+
"""
|
|
1241
|
+
B = list(self.basis())
|
|
1242
|
+
try: # See if 1 is a basis element, if so, remove it
|
|
1243
|
+
B.remove(self.one())
|
|
1244
|
+
except ValueError:
|
|
1245
|
+
pass
|
|
1246
|
+
return all(b*bp == bp*b for i,b in enumerate(B) for bp in B[i+1:])
|
|
1247
|
+
|
|
1248
|
+
class ElementMethods:
|
|
1249
|
+
|
|
1250
|
+
def to_matrix(self, base_ring=None, action=operator.mul, side='left'):
|
|
1251
|
+
"""
|
|
1252
|
+
Return the matrix of the action of ``self`` on the algebra.
|
|
1253
|
+
|
|
1254
|
+
INPUT:
|
|
1255
|
+
|
|
1256
|
+
- ``base_ring`` -- the base ring for the matrix to be constructed
|
|
1257
|
+
- ``action`` -- a bivariate function (default: :func:`operator.mul`)
|
|
1258
|
+
- ``side`` -- ``'left'`` or ``'right'`` (default: ``'left'``)
|
|
1259
|
+
|
|
1260
|
+
EXAMPLES::
|
|
1261
|
+
|
|
1262
|
+
sage: # needs sage.combinat sage.groups
|
|
1263
|
+
sage: QS3 = SymmetricGroupAlgebra(QQ, 3)
|
|
1264
|
+
sage: a = QS3([2,1,3])
|
|
1265
|
+
sage: a.to_matrix(side='left')
|
|
1266
|
+
[0 0 1 0 0 0]
|
|
1267
|
+
[0 0 0 0 1 0]
|
|
1268
|
+
[1 0 0 0 0 0]
|
|
1269
|
+
[0 0 0 0 0 1]
|
|
1270
|
+
[0 1 0 0 0 0]
|
|
1271
|
+
[0 0 0 1 0 0]
|
|
1272
|
+
sage: a.to_matrix(side='right')
|
|
1273
|
+
[0 0 1 0 0 0]
|
|
1274
|
+
[0 0 0 1 0 0]
|
|
1275
|
+
[1 0 0 0 0 0]
|
|
1276
|
+
[0 1 0 0 0 0]
|
|
1277
|
+
[0 0 0 0 0 1]
|
|
1278
|
+
[0 0 0 0 1 0]
|
|
1279
|
+
sage: a.to_matrix(base_ring=RDF, side='left')
|
|
1280
|
+
[0.0 0.0 1.0 0.0 0.0 0.0]
|
|
1281
|
+
[0.0 0.0 0.0 0.0 1.0 0.0]
|
|
1282
|
+
[1.0 0.0 0.0 0.0 0.0 0.0]
|
|
1283
|
+
[0.0 0.0 0.0 0.0 0.0 1.0]
|
|
1284
|
+
[0.0 1.0 0.0 0.0 0.0 0.0]
|
|
1285
|
+
[0.0 0.0 0.0 1.0 0.0 0.0]
|
|
1286
|
+
|
|
1287
|
+
AUTHORS: Mike Hansen, ...
|
|
1288
|
+
"""
|
|
1289
|
+
basis = self.parent().basis()
|
|
1290
|
+
action_left = action
|
|
1291
|
+
if side == 'right':
|
|
1292
|
+
action = lambda x: action_left(basis[x], self)
|
|
1293
|
+
else:
|
|
1294
|
+
action = lambda x: action_left(self, basis[x])
|
|
1295
|
+
endo = self.parent().module_morphism(on_basis=action, codomain=self.parent())
|
|
1296
|
+
return endo.matrix(base_ring=base_ring)
|
|
1297
|
+
|
|
1298
|
+
_matrix_ = to_matrix # For temporary backward compatibility
|
|
1299
|
+
on_left_matrix = to_matrix
|
|
1300
|
+
|
|
1301
|
+
def __invert__(self):
|
|
1302
|
+
r"""
|
|
1303
|
+
Return the inverse of ``self`` if it exists, and
|
|
1304
|
+
otherwise raise an error.
|
|
1305
|
+
|
|
1306
|
+
.. WARNING::
|
|
1307
|
+
|
|
1308
|
+
This always returns the inverse or fails on elements
|
|
1309
|
+
that are not invertible when the base ring is a field.
|
|
1310
|
+
In other cases, it may fail to find an inverse even
|
|
1311
|
+
if one exists if we cannot solve a linear system of
|
|
1312
|
+
equations over (the fraction field of) the base ring.
|
|
1313
|
+
|
|
1314
|
+
EXAMPLES::
|
|
1315
|
+
|
|
1316
|
+
sage: # needs sage.combinat sage.groups
|
|
1317
|
+
sage: QS3 = SymmetricGroupAlgebra(QQ, 3)
|
|
1318
|
+
sage: P = Permutation
|
|
1319
|
+
sage: a = 3 * QS3(P([1,2,3])) + QS3(P([1,3,2])) + QS3(P([2,1,3]))
|
|
1320
|
+
sage: b = ~a; b
|
|
1321
|
+
9/20*[1, 2, 3] - 7/40*[1, 3, 2] - 7/40*[2, 1, 3]
|
|
1322
|
+
+ 3/40*[2, 3, 1] + 3/40*[3, 1, 2] - 1/20*[3, 2, 1]
|
|
1323
|
+
sage: a * b
|
|
1324
|
+
[1, 2, 3]
|
|
1325
|
+
sage: ~b == a
|
|
1326
|
+
True
|
|
1327
|
+
sage: a = 3 * QS3.one()
|
|
1328
|
+
sage: b = ~a
|
|
1329
|
+
sage: b * a == QS3.one()
|
|
1330
|
+
True
|
|
1331
|
+
sage: b == 1/3 * QS3.one()
|
|
1332
|
+
True
|
|
1333
|
+
sage: ~b == a
|
|
1334
|
+
True
|
|
1335
|
+
|
|
1336
|
+
sage: R.<t> = QQ[]
|
|
1337
|
+
sage: RS3 = SymmetricGroupAlgebra(R, 3) # needs sage.combinat sage.groups
|
|
1338
|
+
sage: a = RS3(P([1,2,3])) - RS3(P([1,3,2])) + RS3(P([2,1,3])); ~a # needs sage.combinat sage.groups
|
|
1339
|
+
-1/2*[1, 3, 2] + 1/2*[2, 1, 3] + 1/2*[2, 3, 1] + 1/2*[3, 1, 2]
|
|
1340
|
+
|
|
1341
|
+
Some examples on elements that do not have an inverse::
|
|
1342
|
+
|
|
1343
|
+
sage: # needs sage.combinat sage.groups
|
|
1344
|
+
sage: c = 2 * QS3(P([1,2,3])) + QS3(P([1,3,2])) + QS3(P([2,1,3]))
|
|
1345
|
+
sage: ~c
|
|
1346
|
+
Traceback (most recent call last):
|
|
1347
|
+
...
|
|
1348
|
+
ValueError: cannot invert self (= 2*[1, 2, 3] + [1, 3, 2] + [2, 1, 3])
|
|
1349
|
+
sage: ZS3 = SymmetricGroupAlgebra(ZZ, 3)
|
|
1350
|
+
sage: aZ = 3 * ZS3(P([1,2,3])) + ZS3(P([1,3,2])) + ZS3(P([2,1,3]))
|
|
1351
|
+
sage: ~aZ
|
|
1352
|
+
Traceback (most recent call last):
|
|
1353
|
+
...
|
|
1354
|
+
ValueError: cannot invert self (= 3*[1, 2, 3] + [1, 3, 2] + [2, 1, 3])
|
|
1355
|
+
sage: x = 2 * ZS3.one()
|
|
1356
|
+
sage: ~x
|
|
1357
|
+
Traceback (most recent call last):
|
|
1358
|
+
...
|
|
1359
|
+
ValueError: cannot invert self (= 2*[1, 2, 3])
|
|
1360
|
+
|
|
1361
|
+
TESTS:
|
|
1362
|
+
|
|
1363
|
+
An algebra that does not define ``one_basis()``::
|
|
1364
|
+
|
|
1365
|
+
sage: # needs sage.combinat sage.groups
|
|
1366
|
+
sage: I = DescentAlgebra(QQ, 3).I()
|
|
1367
|
+
sage: a = 3 * I.one()
|
|
1368
|
+
sage: ~a == 1/3 * I.one()
|
|
1369
|
+
True
|
|
1370
|
+
"""
|
|
1371
|
+
alg = self.parent()
|
|
1372
|
+
R = alg.base_ring()
|
|
1373
|
+
ob = None
|
|
1374
|
+
try:
|
|
1375
|
+
ob = alg.one_basis()
|
|
1376
|
+
except (AttributeError, TypeError, ValueError):
|
|
1377
|
+
pass
|
|
1378
|
+
if ob is not None:
|
|
1379
|
+
# inverting a scalar multiple of 1
|
|
1380
|
+
# (a trivial but frequent use case)
|
|
1381
|
+
mc = self.monomial_coefficients(copy=False)
|
|
1382
|
+
if len(mc) == 1 and ob in mc:
|
|
1383
|
+
try:
|
|
1384
|
+
return alg.term(ob, R(~mc[ob]))
|
|
1385
|
+
except (ValueError, TypeError):
|
|
1386
|
+
raise ValueError("cannot invert self (= %s)" % self)
|
|
1387
|
+
|
|
1388
|
+
e = alg.one().to_vector()
|
|
1389
|
+
A = self.to_matrix()
|
|
1390
|
+
try:
|
|
1391
|
+
inv = A.solve_right(e)
|
|
1392
|
+
inv.change_ring(R)
|
|
1393
|
+
return alg.from_vector(inv)
|
|
1394
|
+
except (ValueError, TypeError):
|
|
1395
|
+
raise ValueError("cannot invert self (= %s)" % self)
|
|
1396
|
+
|
|
1397
|
+
class Cellular(CategoryWithAxiom_over_base_ring):
|
|
1398
|
+
r"""
|
|
1399
|
+
Cellular algebras.
|
|
1400
|
+
|
|
1401
|
+
Let `R` be a commutative ring. A `R`-algebra `A` is a
|
|
1402
|
+
*cellular algebra* if it has a *cell datum*, which is
|
|
1403
|
+
a tuple `(\Lambda, i, M, C)`, where `\Lambda` is finite
|
|
1404
|
+
poset with order `\ge`, if `\mu \in \Lambda` then `T(\mu)`
|
|
1405
|
+
is a finite set and
|
|
1406
|
+
|
|
1407
|
+
.. MATH::
|
|
1408
|
+
|
|
1409
|
+
C \colon \coprod_{\mu\in\Lambda}T(\mu) \times T(\mu)
|
|
1410
|
+
\longrightarrow A; (\mu,s,t) \mapsto c^\mu_{st}
|
|
1411
|
+
\text{ is an injective map}
|
|
1412
|
+
|
|
1413
|
+
such that the following holds:
|
|
1414
|
+
|
|
1415
|
+
* The set `\{c^\mu_{st}\mid \mu\in\Lambda, s,t\in T(\mu)\}` is a
|
|
1416
|
+
basis of `A`.
|
|
1417
|
+
* If `a \in A` and `\mu\in\Lambda, s,t \in T(\mu)` then:
|
|
1418
|
+
|
|
1419
|
+
.. MATH::
|
|
1420
|
+
|
|
1421
|
+
a c^\mu_{st} = \sum_{u\in T(\mu)} r_a(s,u) c^\mu_{ut}
|
|
1422
|
+
\pmod{A^{>\mu}},
|
|
1423
|
+
|
|
1424
|
+
where `A^{>\mu}` is spanned by
|
|
1425
|
+
|
|
1426
|
+
.. MATH::
|
|
1427
|
+
|
|
1428
|
+
\{ c^\nu_{ab} \mid \nu > \mu \text{ and } a,b \in T(\nu) \}.
|
|
1429
|
+
|
|
1430
|
+
Moreover, the scalar `r_a(s,u)` depends only on `a`, `s` and
|
|
1431
|
+
`u` and, in particular, is independent of `t`.
|
|
1432
|
+
|
|
1433
|
+
* The map `\iota \colon A \longrightarrow A; c^\mu_{st} \mapsto
|
|
1434
|
+
c^\mu_{ts}` is an algebra anti-isomorphism.
|
|
1435
|
+
|
|
1436
|
+
A *cellular basis* for `A` is any basis of the form
|
|
1437
|
+
`\{c^\mu_{st} \mid \mu \in \Lambda, s,t \in T(\mu)\}`.
|
|
1438
|
+
|
|
1439
|
+
Note that in particular, the scalars `r_a(u, s)` in the second
|
|
1440
|
+
condition do not depend on `t`.
|
|
1441
|
+
|
|
1442
|
+
REFERENCES:
|
|
1443
|
+
|
|
1444
|
+
- [GrLe1996]_
|
|
1445
|
+
- [KX1998]_
|
|
1446
|
+
- [Mat1999]_
|
|
1447
|
+
- :wikipedia:`Cellular_algebra`
|
|
1448
|
+
- http://webusers.imj-prg.fr/~bernhard.keller/ictp2006/lecturenotes/xi.pdf
|
|
1449
|
+
"""
|
|
1450
|
+
class ParentMethods:
|
|
1451
|
+
def _test_cellular(self, **options):
|
|
1452
|
+
"""
|
|
1453
|
+
Check that ``self`` satisfies the properties of a
|
|
1454
|
+
cellular algebra.
|
|
1455
|
+
|
|
1456
|
+
EXAMPLES::
|
|
1457
|
+
|
|
1458
|
+
sage: S = SymmetricGroupAlgebra(QQ, 3) # needs sage.combinat sage.groups sage.modules
|
|
1459
|
+
sage: S._test_cellular() # needs sage.combinat sage.groups sage.modules
|
|
1460
|
+
"""
|
|
1461
|
+
tester = self._tester(**options)
|
|
1462
|
+
cell_basis = self.cellular_basis()
|
|
1463
|
+
B = cell_basis.basis()
|
|
1464
|
+
P = self.cell_poset()
|
|
1465
|
+
for mu in P:
|
|
1466
|
+
C = self.cell_module_indices(mu)
|
|
1467
|
+
for s in C:
|
|
1468
|
+
t = C[0]
|
|
1469
|
+
vals = []
|
|
1470
|
+
basis_elt = B[(mu, s, t)]
|
|
1471
|
+
for a in B:
|
|
1472
|
+
elt = a * basis_elt
|
|
1473
|
+
tester.assertTrue( all(P.lt(i[0], mu) or i[2] == t
|
|
1474
|
+
for i in elt.support()) )
|
|
1475
|
+
vals.append([elt[(mu, u, t)] for u in C])
|
|
1476
|
+
for t in C[1:]:
|
|
1477
|
+
basis_elt = B[(mu, s, t)]
|
|
1478
|
+
for i,a in enumerate(B):
|
|
1479
|
+
elt = a * basis_elt
|
|
1480
|
+
tester.assertTrue( all(P.lt(i[0], mu) or i[2] == t
|
|
1481
|
+
for i in elt.support()) )
|
|
1482
|
+
tester.assertEqual(vals[i], [elt[(mu, u, t)]
|
|
1483
|
+
for u in C])
|
|
1484
|
+
|
|
1485
|
+
@abstract_method
|
|
1486
|
+
def cell_poset(self):
|
|
1487
|
+
"""
|
|
1488
|
+
Return the cell poset of ``self``.
|
|
1489
|
+
|
|
1490
|
+
EXAMPLES::
|
|
1491
|
+
|
|
1492
|
+
sage: S = SymmetricGroupAlgebra(QQ, 4) # needs sage.combinat sage.groups
|
|
1493
|
+
sage: S.cell_poset() # needs sage.combinat sage.groups
|
|
1494
|
+
Finite poset containing 5 elements
|
|
1495
|
+
"""
|
|
1496
|
+
|
|
1497
|
+
@abstract_method
|
|
1498
|
+
def cell_module_indices(self, mu):
|
|
1499
|
+
r"""
|
|
1500
|
+
Return the indices of the cell module of ``self``
|
|
1501
|
+
indexed by ``mu`` .
|
|
1502
|
+
|
|
1503
|
+
This is the finite set `M(\lambda)`.
|
|
1504
|
+
|
|
1505
|
+
EXAMPLES::
|
|
1506
|
+
|
|
1507
|
+
sage: S = SymmetricGroupAlgebra(QQ, 3) # needs sage.combinat sage.groups
|
|
1508
|
+
sage: S.cell_module_indices([2,1]) # needs sage.combinat sage.groups
|
|
1509
|
+
Standard tableaux of shape [2, 1]
|
|
1510
|
+
"""
|
|
1511
|
+
|
|
1512
|
+
@abstract_method(optional=True)
|
|
1513
|
+
def _to_cellular_element(self, i):
|
|
1514
|
+
"""
|
|
1515
|
+
Return the image of the basis index ``i`` in the
|
|
1516
|
+
cellular basis of ``self``.
|
|
1517
|
+
|
|
1518
|
+
EXAMPLES::
|
|
1519
|
+
|
|
1520
|
+
sage: S = SymmetricGroupAlgebra(QQ, 3) # needs sage.combinat sage.groups
|
|
1521
|
+
sage: S._to_cellular_element # no implementation currently uses this # needs sage.combinat sage.groups
|
|
1522
|
+
NotImplemented
|
|
1523
|
+
"""
|
|
1524
|
+
|
|
1525
|
+
@abstract_method(optional=True)
|
|
1526
|
+
def _from_cellular_index(self, x):
|
|
1527
|
+
"""
|
|
1528
|
+
Return the image in ``self`` from the index of the
|
|
1529
|
+
cellular basis ``x``.
|
|
1530
|
+
|
|
1531
|
+
EXAMPLES::
|
|
1532
|
+
|
|
1533
|
+
sage: # needs sage.combinat sage.groups
|
|
1534
|
+
sage: S = SymmetricGroupAlgebra(QQ, 3)
|
|
1535
|
+
sage: mu = Partition([2,1])
|
|
1536
|
+
sage: s = StandardTableau([[1,2],[3]])
|
|
1537
|
+
sage: t = StandardTableau([[1,3],[2]])
|
|
1538
|
+
sage: S._from_cellular_index((mu, s, t))
|
|
1539
|
+
1/4*[1, 3, 2] - 1/4*[2, 3, 1] + 1/4*[3, 1, 2] - 1/4*[3, 2, 1]
|
|
1540
|
+
"""
|
|
1541
|
+
|
|
1542
|
+
def cellular_involution(self, x):
|
|
1543
|
+
"""
|
|
1544
|
+
Return the cellular involution of ``x`` in ``self``.
|
|
1545
|
+
|
|
1546
|
+
EXAMPLES::
|
|
1547
|
+
|
|
1548
|
+
sage: S = SymmetricGroupAlgebra(QQ, 3) # needs sage.combinat sage.groups
|
|
1549
|
+
sage: for b in S.basis(): b, S.cellular_involution(b) # needs sage.combinat sage.groups
|
|
1550
|
+
([1, 2, 3], [1, 2, 3])
|
|
1551
|
+
([1, 3, 2], 49/48*[1, 3, 2] + 7/48*[2, 3, 1]
|
|
1552
|
+
- 7/48*[3, 1, 2] - 1/48*[3, 2, 1])
|
|
1553
|
+
([2, 1, 3], [2, 1, 3])
|
|
1554
|
+
([2, 3, 1], -7/48*[1, 3, 2] - 1/48*[2, 3, 1]
|
|
1555
|
+
+ 49/48*[3, 1, 2] + 7/48*[3, 2, 1])
|
|
1556
|
+
([3, 1, 2], 7/48*[1, 3, 2] + 49/48*[2, 3, 1]
|
|
1557
|
+
- 1/48*[3, 1, 2] - 7/48*[3, 2, 1])
|
|
1558
|
+
([3, 2, 1], -1/48*[1, 3, 2] - 7/48*[2, 3, 1]
|
|
1559
|
+
+ 7/48*[3, 1, 2] + 49/48*[3, 2, 1])
|
|
1560
|
+
"""
|
|
1561
|
+
C = self.cellular_basis()
|
|
1562
|
+
if C is self:
|
|
1563
|
+
M = x.monomial_coefficients(copy=False)
|
|
1564
|
+
return self._from_dict({(i[0], i[2], i[1]): M[i] for i in M},
|
|
1565
|
+
remove_zeros=False)
|
|
1566
|
+
return self(C(x).cellular_involution())
|
|
1567
|
+
|
|
1568
|
+
@cached_method
|
|
1569
|
+
def cells(self):
|
|
1570
|
+
"""
|
|
1571
|
+
Return the cells of ``self``.
|
|
1572
|
+
|
|
1573
|
+
EXAMPLES::
|
|
1574
|
+
|
|
1575
|
+
sage: S = SymmetricGroupAlgebra(QQ, 3) # needs sage.combinat sage.groups
|
|
1576
|
+
sage: dict(S.cells()) # needs sage.combinat sage.groups
|
|
1577
|
+
{[1, 1, 1]: Standard tableaux of shape [1, 1, 1],
|
|
1578
|
+
[2, 1]: Standard tableaux of shape [2, 1],
|
|
1579
|
+
[3]: Standard tableaux of shape [3]}
|
|
1580
|
+
"""
|
|
1581
|
+
from sage.sets.family import Family
|
|
1582
|
+
return Family(self.cell_poset(), self.cell_module_indices)
|
|
1583
|
+
|
|
1584
|
+
def cellular_basis(self):
|
|
1585
|
+
"""
|
|
1586
|
+
Return the cellular basis of ``self``.
|
|
1587
|
+
|
|
1588
|
+
EXAMPLES::
|
|
1589
|
+
|
|
1590
|
+
sage: S = SymmetricGroupAlgebra(QQ, 3) # needs sage.combinat sage.groups
|
|
1591
|
+
sage: S.cellular_basis() # needs sage.combinat sage.groups
|
|
1592
|
+
Cellular basis of Symmetric group algebra of order 3
|
|
1593
|
+
over Rational Field
|
|
1594
|
+
"""
|
|
1595
|
+
from sage.algebras.cellular_basis import CellularBasis
|
|
1596
|
+
return CellularBasis(self)
|
|
1597
|
+
|
|
1598
|
+
def cell_module(self, mu, **kwds):
|
|
1599
|
+
"""
|
|
1600
|
+
Return the cell module indexed by ``mu``.
|
|
1601
|
+
|
|
1602
|
+
EXAMPLES::
|
|
1603
|
+
|
|
1604
|
+
sage: S = SymmetricGroupAlgebra(QQ, 3) # needs sage.combinat sage.graphs sage.groups
|
|
1605
|
+
sage: S.cell_module(Partition([2,1])) # needs sage.combinat sage.graphs sage.groups
|
|
1606
|
+
Cell module indexed by [2, 1] of Cellular basis of
|
|
1607
|
+
Symmetric group algebra of order 3 over Rational Field
|
|
1608
|
+
"""
|
|
1609
|
+
from sage.modules.with_basis.cell_module import CellModule
|
|
1610
|
+
return CellModule(self.cellular_basis(), mu, **kwds)
|
|
1611
|
+
|
|
1612
|
+
@cached_method
|
|
1613
|
+
def simple_module_parameterization(self):
|
|
1614
|
+
r"""
|
|
1615
|
+
Return a parameterization of the simple modules of ``self``.
|
|
1616
|
+
|
|
1617
|
+
The set of simple modules are parameterized by
|
|
1618
|
+
`\lambda \in \Lambda` such that the cell module
|
|
1619
|
+
bilinear form `\Phi_{\lambda} \neq 0`.
|
|
1620
|
+
|
|
1621
|
+
EXAMPLES::
|
|
1622
|
+
|
|
1623
|
+
sage: # needs sage.combinat sage.graphs sage.modules
|
|
1624
|
+
sage: TL = TemperleyLiebAlgebra(5, 30, QQ) # semisimple
|
|
1625
|
+
sage: len(TL.radical_basis())
|
|
1626
|
+
0
|
|
1627
|
+
sage: TL.simple_module_parameterization()
|
|
1628
|
+
(1, 3, 5)
|
|
1629
|
+
sage: TL = TemperleyLiebAlgebra(5, 1, QQ) # not semisimple
|
|
1630
|
+
sage: len(TL.radical_basis())
|
|
1631
|
+
24
|
|
1632
|
+
sage: TL.simple_module_parameterization()
|
|
1633
|
+
(1, 3, 5)
|
|
1634
|
+
sage: TL = TemperleyLiebAlgebra(6, 30, QQ) # semisimple
|
|
1635
|
+
sage: all(TL.cell_module(la).dimension()
|
|
1636
|
+
....: == TL.cell_module(la).simple_module().dimension()
|
|
1637
|
+
....: for la in TL.simple_module_parameterization())
|
|
1638
|
+
True
|
|
1639
|
+
sage: TL.simple_module_parameterization()
|
|
1640
|
+
(0, 2, 4, 6)
|
|
1641
|
+
sage: TL = TemperleyLiebAlgebra(6, 0, QQ) # not semisimple
|
|
1642
|
+
sage: TL.simple_module_parameterization()
|
|
1643
|
+
(2, 4, 6)
|
|
1644
|
+
"""
|
|
1645
|
+
return tuple([mu for mu in self.cell_poset()
|
|
1646
|
+
if self.cell_module(mu).nonzero_bilinear_form()])
|
|
1647
|
+
|
|
1648
|
+
class ElementMethods:
|
|
1649
|
+
def cellular_involution(self):
|
|
1650
|
+
"""
|
|
1651
|
+
Return the cellular involution on ``self``.
|
|
1652
|
+
|
|
1653
|
+
EXAMPLES::
|
|
1654
|
+
|
|
1655
|
+
sage: # needs sage,combinat sage.groups
|
|
1656
|
+
sage: S = SymmetricGroupAlgebra(QQ, 4)
|
|
1657
|
+
sage: elt = S([3,1,2,4])
|
|
1658
|
+
sage: ci = elt.cellular_involution(); ci
|
|
1659
|
+
7/48*[1, 3, 2, 4] + 49/48*[2, 3, 1, 4]
|
|
1660
|
+
- 1/48*[3, 1, 2, 4] - 7/48*[3, 2, 1, 4]
|
|
1661
|
+
sage: ci.cellular_involution()
|
|
1662
|
+
[3, 1, 2, 4]
|
|
1663
|
+
"""
|
|
1664
|
+
return self.parent().cellular_involution(self)
|
|
1665
|
+
|
|
1666
|
+
class TensorProducts(TensorProductsCategory):
|
|
1667
|
+
"""
|
|
1668
|
+
The category of cellular algebras constructed by tensor
|
|
1669
|
+
product of cellular algebras.
|
|
1670
|
+
"""
|
|
1671
|
+
@cached_method
|
|
1672
|
+
def extra_super_categories(self):
|
|
1673
|
+
"""
|
|
1674
|
+
Tensor products of cellular algebras are cellular.
|
|
1675
|
+
|
|
1676
|
+
EXAMPLES::
|
|
1677
|
+
|
|
1678
|
+
sage: cat = Algebras(QQ).FiniteDimensional().WithBasis()
|
|
1679
|
+
sage: cat.Cellular().TensorProducts().extra_super_categories()
|
|
1680
|
+
[Category of finite dimensional cellular algebras with basis
|
|
1681
|
+
over Rational Field]
|
|
1682
|
+
"""
|
|
1683
|
+
return [self.base_category()]
|
|
1684
|
+
|
|
1685
|
+
class ParentMethods:
|
|
1686
|
+
@cached_method
|
|
1687
|
+
def cell_poset(self):
|
|
1688
|
+
"""
|
|
1689
|
+
Return the cell poset of ``self``.
|
|
1690
|
+
|
|
1691
|
+
EXAMPLES::
|
|
1692
|
+
|
|
1693
|
+
sage: # needs sage.combinar sage.groups
|
|
1694
|
+
sage: S2 = SymmetricGroupAlgebra(QQ, 2)
|
|
1695
|
+
sage: S3 = SymmetricGroupAlgebra(QQ, 3)
|
|
1696
|
+
sage: T = S2.tensor(S3)
|
|
1697
|
+
sage: T.cell_poset() # needs sage.graphs
|
|
1698
|
+
Finite poset containing 6 elements
|
|
1699
|
+
"""
|
|
1700
|
+
ret = self._sets[0].cell_poset()
|
|
1701
|
+
for A in self._sets[1:]:
|
|
1702
|
+
ret = ret.product(A.cell_poset())
|
|
1703
|
+
return ret
|
|
1704
|
+
|
|
1705
|
+
def cell_module_indices(self, mu):
|
|
1706
|
+
r"""
|
|
1707
|
+
Return the indices of the cell module of ``self``
|
|
1708
|
+
indexed by ``mu`` .
|
|
1709
|
+
|
|
1710
|
+
This is the finite set `M(\lambda)`.
|
|
1711
|
+
|
|
1712
|
+
EXAMPLES::
|
|
1713
|
+
|
|
1714
|
+
sage: # needs sage.combinat sage.groups
|
|
1715
|
+
sage: S2 = SymmetricGroupAlgebra(QQ, 2)
|
|
1716
|
+
sage: S3 = SymmetricGroupAlgebra(QQ, 3)
|
|
1717
|
+
sage: T = S2.tensor(S3)
|
|
1718
|
+
sage: T.cell_module_indices(([1,1], [2,1]))
|
|
1719
|
+
The Cartesian product of (Standard tableaux of shape [1, 1],
|
|
1720
|
+
Standard tableaux of shape [2, 1])
|
|
1721
|
+
"""
|
|
1722
|
+
from sage.categories.cartesian_product import cartesian_product
|
|
1723
|
+
return cartesian_product([self._sets[i].cell_module_indices(x)
|
|
1724
|
+
for i,x in enumerate(mu)])
|
|
1725
|
+
|
|
1726
|
+
@lazy_attribute
|
|
1727
|
+
def cellular_involution(self):
|
|
1728
|
+
"""
|
|
1729
|
+
Return the image of the cellular involution of the basis
|
|
1730
|
+
element indexed by ``i``.
|
|
1731
|
+
|
|
1732
|
+
EXAMPLES::
|
|
1733
|
+
|
|
1734
|
+
sage: # needs sage.combinat sage.groups
|
|
1735
|
+
sage: S2 = SymmetricGroupAlgebra(QQ, 2)
|
|
1736
|
+
sage: S3 = SymmetricGroupAlgebra(QQ, 3)
|
|
1737
|
+
sage: T = S2.tensor(S3)
|
|
1738
|
+
sage: for b in T.basis(): b, T.cellular_involution(b)
|
|
1739
|
+
([1, 2] # [1, 2, 3], [1, 2] # [1, 2, 3])
|
|
1740
|
+
([1, 2] # [1, 3, 2],
|
|
1741
|
+
49/48*[1, 2] # [1, 3, 2] + 7/48*[1, 2] # [2, 3, 1]
|
|
1742
|
+
- 7/48*[1, 2] # [3, 1, 2] - 1/48*[1, 2] # [3, 2, 1])
|
|
1743
|
+
([1, 2] # [2, 1, 3], [1, 2] # [2, 1, 3])
|
|
1744
|
+
([1, 2] # [2, 3, 1],
|
|
1745
|
+
-7/48*[1, 2] # [1, 3, 2] - 1/48*[1, 2] # [2, 3, 1]
|
|
1746
|
+
+ 49/48*[1, 2] # [3, 1, 2] + 7/48*[1, 2] # [3, 2, 1])
|
|
1747
|
+
([1, 2] # [3, 1, 2],
|
|
1748
|
+
7/48*[1, 2] # [1, 3, 2] + 49/48*[1, 2] # [2, 3, 1]
|
|
1749
|
+
- 1/48*[1, 2] # [3, 1, 2] - 7/48*[1, 2] # [3, 2, 1])
|
|
1750
|
+
([1, 2] # [3, 2, 1],
|
|
1751
|
+
-1/48*[1, 2] # [1, 3, 2] - 7/48*[1, 2] # [2, 3, 1]
|
|
1752
|
+
+ 7/48*[1, 2] # [3, 1, 2] + 49/48*[1, 2] # [3, 2, 1])
|
|
1753
|
+
([2, 1] # [1, 2, 3], [2, 1] # [1, 2, 3])
|
|
1754
|
+
([2, 1] # [1, 3, 2],
|
|
1755
|
+
49/48*[2, 1] # [1, 3, 2] + 7/48*[2, 1] # [2, 3, 1]
|
|
1756
|
+
- 7/48*[2, 1] # [3, 1, 2] - 1/48*[2, 1] # [3, 2, 1])
|
|
1757
|
+
([2, 1] # [2, 1, 3], [2, 1] # [2, 1, 3])
|
|
1758
|
+
([2, 1] # [2, 3, 1],
|
|
1759
|
+
-7/48*[2, 1] # [1, 3, 2] - 1/48*[2, 1] # [2, 3, 1]
|
|
1760
|
+
+ 49/48*[2, 1] # [3, 1, 2] + 7/48*[2, 1] # [3, 2, 1])
|
|
1761
|
+
([2, 1] # [3, 1, 2],
|
|
1762
|
+
7/48*[2, 1] # [1, 3, 2] + 49/48*[2, 1] # [2, 3, 1]
|
|
1763
|
+
- 1/48*[2, 1] # [3, 1, 2] - 7/48*[2, 1] # [3, 2, 1])
|
|
1764
|
+
([2, 1] # [3, 2, 1],
|
|
1765
|
+
-1/48*[2, 1] # [1, 3, 2] - 7/48*[2, 1] # [2, 3, 1]
|
|
1766
|
+
+ 7/48*[2, 1] # [3, 1, 2] + 49/48*[2, 1] # [3, 2, 1])
|
|
1767
|
+
"""
|
|
1768
|
+
if self.cellular_basis() is self:
|
|
1769
|
+
def func(x):
|
|
1770
|
+
M = x.monomial_coefficients(copy=False)
|
|
1771
|
+
return self._from_dict({(i[0], i[2], i[1]): M[i] for i in M},
|
|
1772
|
+
remove_zeros=False)
|
|
1773
|
+
return self.module_morphism(function=func, codomain=self)
|
|
1774
|
+
|
|
1775
|
+
def on_basis(i):
|
|
1776
|
+
return self._tensor_of_elements([A.basis()[i[j]].cellular_involution()
|
|
1777
|
+
for j, A in enumerate(self._sets)])
|
|
1778
|
+
return self.module_morphism(on_basis, codomain=self)
|
|
1779
|
+
|
|
1780
|
+
@cached_method
|
|
1781
|
+
def _to_cellular_element(self, i):
|
|
1782
|
+
"""
|
|
1783
|
+
Return the image of the basis index ``i`` in the
|
|
1784
|
+
cellular basis of ``self``.
|
|
1785
|
+
|
|
1786
|
+
EXAMPLES::
|
|
1787
|
+
|
|
1788
|
+
sage: # needs sage.combinat sage.groups
|
|
1789
|
+
sage: S2 = SymmetricGroupAlgebra(QQ, 2)
|
|
1790
|
+
sage: S3 = SymmetricGroupAlgebra(QQ, 3)
|
|
1791
|
+
sage: T = S2.tensor(S3)
|
|
1792
|
+
sage: all(T(T._to_cellular_element(k)).leading_support() == k
|
|
1793
|
+
....: for k in T.basis().keys())
|
|
1794
|
+
True
|
|
1795
|
+
"""
|
|
1796
|
+
C = [A.cellular_basis() for A in self._sets]
|
|
1797
|
+
elts = [C[j](self._sets[j].basis()[ij]) for j, ij in enumerate(i)]
|
|
1798
|
+
from sage.categories.tensor import tensor
|
|
1799
|
+
T = tensor(C)
|
|
1800
|
+
temp = T._tensor_of_elements(elts)
|
|
1801
|
+
B = self.cellular_basis()
|
|
1802
|
+
M = temp.monomial_coefficients(copy=False)
|
|
1803
|
+
|
|
1804
|
+
def convert_index(i):
|
|
1805
|
+
mu = []
|
|
1806
|
+
s = []
|
|
1807
|
+
t = []
|
|
1808
|
+
for a, b, c in i:
|
|
1809
|
+
mu.append(a)
|
|
1810
|
+
s.append(b)
|
|
1811
|
+
t.append(c)
|
|
1812
|
+
C = self.cell_module_indices(mu)
|
|
1813
|
+
return (tuple(mu), C(s), C(t))
|
|
1814
|
+
return B._from_dict({convert_index(i): M[i] for i in M},
|
|
1815
|
+
remove_zeros=False)
|
|
1816
|
+
|
|
1817
|
+
@cached_method
|
|
1818
|
+
def _from_cellular_index(self, x):
|
|
1819
|
+
"""
|
|
1820
|
+
Return the image in ``self`` from the index of the
|
|
1821
|
+
cellular basis ``x``.
|
|
1822
|
+
|
|
1823
|
+
EXAMPLES::
|
|
1824
|
+
|
|
1825
|
+
sage: # needs sage.combinat sage.groups
|
|
1826
|
+
sage: S2 = SymmetricGroupAlgebra(QQ, 2)
|
|
1827
|
+
sage: S3 = SymmetricGroupAlgebra(QQ, 3)
|
|
1828
|
+
sage: T = S2.tensor(S3)
|
|
1829
|
+
sage: C = T.cellular_basis()
|
|
1830
|
+
sage: all(C(T._from_cellular_index(k)).leading_support() == k
|
|
1831
|
+
....: for k in C.basis().keys())
|
|
1832
|
+
True
|
|
1833
|
+
"""
|
|
1834
|
+
elts = [A(A.cellular_basis().basis()[ (x[0][i], x[1][i], x[2][i]) ])
|
|
1835
|
+
for i,A in enumerate(self._sets)]
|
|
1836
|
+
return self._tensor_of_elements(elts)
|
|
1837
|
+
|
|
1838
|
+
class SubcategoryMethods:
|
|
1839
|
+
@cached_method
|
|
1840
|
+
def Cellular(self):
|
|
1841
|
+
"""
|
|
1842
|
+
Return the full subcategory of the cellular objects
|
|
1843
|
+
of ``self``.
|
|
1844
|
+
|
|
1845
|
+
.. SEEALSO:: :wikipedia:`Cellular_algebra`
|
|
1846
|
+
|
|
1847
|
+
EXAMPLES::
|
|
1848
|
+
|
|
1849
|
+
sage: Algebras(QQ).FiniteDimensional().WithBasis().Cellular()
|
|
1850
|
+
Category of finite dimensional cellular algebras with basis
|
|
1851
|
+
over Rational Field
|
|
1852
|
+
|
|
1853
|
+
TESTS::
|
|
1854
|
+
|
|
1855
|
+
sage: cat = Algebras(QQ).FiniteDimensional().WithBasis()
|
|
1856
|
+
sage: TestSuite(cat.Cellular()).run()
|
|
1857
|
+
sage: HopfAlgebras(QQ).FiniteDimensional().WithBasis().Cellular.__module__
|
|
1858
|
+
'sage.categories.finite_dimensional_algebras_with_basis'
|
|
1859
|
+
"""
|
|
1860
|
+
return self._with_axiom('Cellular')
|