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,1209 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Filtered Modules With Basis
|
|
4
|
+
|
|
5
|
+
A *filtered module with basis* over a ring `R` means
|
|
6
|
+
(for the purpose of this code) a filtered `R`-module `M`
|
|
7
|
+
with filtration `(F_i)_{i \in I}` (typically `I = \NN`)
|
|
8
|
+
endowed with a basis `(b_j)_{j \in J}` of `M` and a partition
|
|
9
|
+
`J = \bigsqcup_{i \in I} J_i` of the set `J` (it is allowed
|
|
10
|
+
that some `J_i` are empty) such that for every `n \in I`,
|
|
11
|
+
the subfamily `(b_j)_{j \in U_n}`, where
|
|
12
|
+
`U_n = \bigcup_{i \leq n} J_i`, is a basis of the
|
|
13
|
+
`R`-submodule `F_n`.
|
|
14
|
+
|
|
15
|
+
For every `i \in I`, the `R`-submodule of `M` spanned by
|
|
16
|
+
`(b_j)_{j \in J_i}` is called the `i`-*th graded component*
|
|
17
|
+
(aka the `i`-*th homogeneous component*) of the filtered
|
|
18
|
+
module with basis `M`; the elements of this submodule are
|
|
19
|
+
referred to as *homogeneous elements of degree* `i`.
|
|
20
|
+
|
|
21
|
+
See the class documentation
|
|
22
|
+
:class:`~sage.categories.filtered_modules_with_basis.FilteredModulesWithBasis`
|
|
23
|
+
for further details.
|
|
24
|
+
"""
|
|
25
|
+
#*****************************************************************************
|
|
26
|
+
# Copyright (C) 2014 Travis Scrimshaw <tscrim at ucdavis.edu>
|
|
27
|
+
#
|
|
28
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
29
|
+
# http://www.gnu.org/licenses/
|
|
30
|
+
#******************************************************************************
|
|
31
|
+
|
|
32
|
+
from sage.categories.filtered_modules import FilteredModulesCategory
|
|
33
|
+
from sage.misc.abstract_method import abstract_method
|
|
34
|
+
from sage.misc.cachefunc import cached_method
|
|
35
|
+
from sage.categories.subobjects import SubobjectsCategory
|
|
36
|
+
from sage.categories.category_with_axiom import CategoryWithAxiom_over_base_ring
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class FilteredModulesWithBasis(FilteredModulesCategory):
|
|
40
|
+
r"""
|
|
41
|
+
The category of filtered modules with a distinguished basis.
|
|
42
|
+
|
|
43
|
+
A *filtered module with basis* over a ring `R` means
|
|
44
|
+
(for the purpose of this code) a filtered `R`-module `M`
|
|
45
|
+
with filtration `(F_i)_{i \in I}` (typically `I = \NN`)
|
|
46
|
+
endowed with a basis `(b_j)_{j \in J}` of `M` and a partition
|
|
47
|
+
`J = \bigsqcup_{i \in I} J_i` of the set `J` (it is allowed
|
|
48
|
+
that some `J_i` are empty) such that for every `n \in I`,
|
|
49
|
+
the subfamily `(b_j)_{j \in U_n}`, where
|
|
50
|
+
`U_n = \bigcup_{i \leq n} J_i`, is a basis of the
|
|
51
|
+
`R`-submodule `F_n`.
|
|
52
|
+
|
|
53
|
+
For every `i \in I`, the `R`-submodule of `M` spanned by
|
|
54
|
+
`(b_j)_{j \in J_i}` is called the `i`-*th graded component*
|
|
55
|
+
(aka the `i`-*th homogeneous component*) of the filtered
|
|
56
|
+
module with basis `M`; the elements of this submodule are
|
|
57
|
+
referred to as *homogeneous elements of degree* `i`.
|
|
58
|
+
The `R`-module `M` is the direct sum of its `i`-th graded
|
|
59
|
+
components over all `i \in I`, and thus becomes a graded
|
|
60
|
+
`R`-module with basis.
|
|
61
|
+
Conversely, any graded `R`-module with basis canonically
|
|
62
|
+
becomes a filtered `R`-module with basis (by defining
|
|
63
|
+
`F_n = \bigoplus_{i \leq n} G_i` where `G_i` is the `i`-th
|
|
64
|
+
graded component, and defining `J_i` as the indexing set
|
|
65
|
+
of the basis of the `i`-th graded component). Hence, the
|
|
66
|
+
notion of a filtered `R`-module with basis is equivalent
|
|
67
|
+
to the notion of a graded `R`-module with basis.
|
|
68
|
+
|
|
69
|
+
However, the *category* of filtered `R`-modules with basis is not
|
|
70
|
+
the category of graded `R`-modules with basis. Indeed, the *morphisms*
|
|
71
|
+
of filtered `R`-modules with basis are defined to be morphisms of
|
|
72
|
+
`R`-modules which send each `F_n` of the domain to the corresponding
|
|
73
|
+
`F_n` of the target; in contrast, the morphisms of graded `R`-modules
|
|
74
|
+
with basis must preserve each homogeneous component. Also,
|
|
75
|
+
the notion of a filtered algebra with basis differs from
|
|
76
|
+
that of a graded algebra with basis.
|
|
77
|
+
|
|
78
|
+
.. NOTE::
|
|
79
|
+
|
|
80
|
+
Currently, to make use of the functionality of this class,
|
|
81
|
+
an instance of ``FilteredModulesWithBasis`` should fulfill
|
|
82
|
+
the contract of a :class:`CombinatorialFreeModule` (most
|
|
83
|
+
likely by inheriting from it). It should also have the
|
|
84
|
+
indexing set `J` encoded as its ``_indices`` attribute,
|
|
85
|
+
and ``_indices.subset(size=i)`` should yield the subset
|
|
86
|
+
`J_i` (as an iterable). If the latter conditions are not
|
|
87
|
+
satisfied, then :meth:`basis` must be overridden.
|
|
88
|
+
|
|
89
|
+
.. NOTE::
|
|
90
|
+
|
|
91
|
+
One should implement a ``degree_on_basis`` method in the parent
|
|
92
|
+
class in order to fully utilize the methods of this category.
|
|
93
|
+
This might become a required abstract method in the future.
|
|
94
|
+
|
|
95
|
+
EXAMPLES::
|
|
96
|
+
|
|
97
|
+
sage: C = ModulesWithBasis(ZZ).Filtered(); C
|
|
98
|
+
Category of filtered modules with basis over Integer Ring
|
|
99
|
+
sage: sorted(C.super_categories(), key=str)
|
|
100
|
+
[Category of filtered modules over Integer Ring,
|
|
101
|
+
Category of modules with basis over Integer Ring]
|
|
102
|
+
sage: C is ModulesWithBasis(ZZ).Filtered()
|
|
103
|
+
True
|
|
104
|
+
|
|
105
|
+
TESTS::
|
|
106
|
+
|
|
107
|
+
sage: C = ModulesWithBasis(ZZ).Filtered()
|
|
108
|
+
sage: TestSuite(C).run()
|
|
109
|
+
sage: C = ModulesWithBasis(QQ).Filtered()
|
|
110
|
+
sage: TestSuite(C).run()
|
|
111
|
+
"""
|
|
112
|
+
class ParentMethods:
|
|
113
|
+
# TODO: which syntax do we prefer?
|
|
114
|
+
# A.basis(degree = 3)
|
|
115
|
+
# A.basis().subset(degree=3)
|
|
116
|
+
|
|
117
|
+
# This is related to the following design question:
|
|
118
|
+
# If F = (f_i)_{i\in I} is a family, should ``F.subset(degree = 3)``
|
|
119
|
+
# be the elements of F of degree 3 or those whose index is of degree 3?
|
|
120
|
+
|
|
121
|
+
@cached_method
|
|
122
|
+
def basis(self, d=None):
|
|
123
|
+
r"""
|
|
124
|
+
Return the basis for (the ``d``-th homogeneous component
|
|
125
|
+
of) ``self``.
|
|
126
|
+
|
|
127
|
+
INPUT:
|
|
128
|
+
|
|
129
|
+
- ``d`` -- (default: ``None``) nonnegative integer
|
|
130
|
+
or ``None``
|
|
131
|
+
|
|
132
|
+
OUTPUT:
|
|
133
|
+
|
|
134
|
+
If ``d`` is ``None``, returns the basis of the module.
|
|
135
|
+
Otherwise, returns the basis of the homogeneous component
|
|
136
|
+
of degree ``d`` (i.e., the subfamily of the basis of the
|
|
137
|
+
whole module which consists only of the basis vectors
|
|
138
|
+
lying in `F_d \setminus \bigcup_{i<d} F_i`).
|
|
139
|
+
|
|
140
|
+
The basis is always returned as a family.
|
|
141
|
+
|
|
142
|
+
EXAMPLES::
|
|
143
|
+
|
|
144
|
+
sage: A = ModulesWithBasis(ZZ).Filtered().example()
|
|
145
|
+
sage: A.basis(4)
|
|
146
|
+
Lazy family (Term map from Partitions to An example of a
|
|
147
|
+
filtered module with basis: the free module on partitions
|
|
148
|
+
over Integer Ring(i))_{i in Partitions of the integer 4}
|
|
149
|
+
|
|
150
|
+
Without arguments, the full basis is returned::
|
|
151
|
+
|
|
152
|
+
sage: A.basis()
|
|
153
|
+
Lazy family (Term map from Partitions to An example of a
|
|
154
|
+
filtered module with basis: the free module on partitions
|
|
155
|
+
over Integer Ring(i))_{i in Partitions}
|
|
156
|
+
sage: A.basis()
|
|
157
|
+
Lazy family (Term map from Partitions to An example of a
|
|
158
|
+
filtered module with basis: the free module on partitions
|
|
159
|
+
over Integer Ring(i))_{i in Partitions}
|
|
160
|
+
|
|
161
|
+
Checking this method on a filtered algebra. Note that this
|
|
162
|
+
will typically raise a :exc:`NotImplementedError` when this
|
|
163
|
+
feature is not implemented. ::
|
|
164
|
+
|
|
165
|
+
sage: A = AlgebrasWithBasis(ZZ).Filtered().example()
|
|
166
|
+
sage: A.basis(4)
|
|
167
|
+
Traceback (most recent call last):
|
|
168
|
+
...
|
|
169
|
+
NotImplementedError: infinite set
|
|
170
|
+
|
|
171
|
+
Without arguments, the full basis is returned::
|
|
172
|
+
|
|
173
|
+
sage: A.basis()
|
|
174
|
+
Lazy family (Term map from Free abelian monoid indexed by
|
|
175
|
+
{'x', 'y', 'z'} to An example of a filtered algebra with
|
|
176
|
+
basis: the universal enveloping algebra of Lie algebra
|
|
177
|
+
of RR^3 with cross product over Integer Ring(i))_{i in
|
|
178
|
+
Free abelian monoid indexed by {'x', 'y', 'z'}}
|
|
179
|
+
|
|
180
|
+
An example with a graded algebra::
|
|
181
|
+
|
|
182
|
+
sage: E.<x,y> = ExteriorAlgebra(QQ)
|
|
183
|
+
sage: E.basis()
|
|
184
|
+
Lazy family (Term map from Subsets of {0,1} to
|
|
185
|
+
The exterior algebra of rank 2 over Rational Field(i))_{i in
|
|
186
|
+
Subsets of {0,1}}
|
|
187
|
+
"""
|
|
188
|
+
if d is None:
|
|
189
|
+
from sage.sets.family import Family
|
|
190
|
+
return Family(self._indices, self.monomial)
|
|
191
|
+
else:
|
|
192
|
+
return self.homogeneous_component_basis(d)
|
|
193
|
+
|
|
194
|
+
# TODO: Change `list(self._indices)` to `self._indices` and move
|
|
195
|
+
# this fallback to the category of finite-dimensional filtered
|
|
196
|
+
# modules with basis when it is implemented and the MRO issues
|
|
197
|
+
# are fixed (see trac #19397)
|
|
198
|
+
def homogeneous_component_basis(self, d):
|
|
199
|
+
"""
|
|
200
|
+
Return a basis for the ``d``-th homogeneous component of ``self``.
|
|
201
|
+
|
|
202
|
+
EXAMPLES::
|
|
203
|
+
|
|
204
|
+
sage: A = GradedModulesWithBasis(ZZ).example()
|
|
205
|
+
sage: A.homogeneous_component_basis(4)
|
|
206
|
+
Lazy family (Term map
|
|
207
|
+
from Partitions
|
|
208
|
+
to An example of a graded module with basis: the free module
|
|
209
|
+
on partitions over Integer Ring(i))_{i in Partitions of the integer 4}
|
|
210
|
+
|
|
211
|
+
sage: # needs sage.modules
|
|
212
|
+
sage: cat = GradedModulesWithBasis(ZZ)
|
|
213
|
+
sage: C = CombinatorialFreeModule(ZZ, ['a', 'b'], category=cat)
|
|
214
|
+
sage: C.degree_on_basis = lambda x: 1 if x == 'a' else 2
|
|
215
|
+
sage: C.homogeneous_component_basis(1)
|
|
216
|
+
Finite family {'a': B['a']}
|
|
217
|
+
sage: C.homogeneous_component_basis(2)
|
|
218
|
+
Finite family {'b': B['b']}
|
|
219
|
+
"""
|
|
220
|
+
from sage.sets.family import Family
|
|
221
|
+
try:
|
|
222
|
+
S = self._indices.subset(size=d)
|
|
223
|
+
except (AttributeError, ValueError, TypeError):
|
|
224
|
+
S = [i for i in list(self._indices) if self.degree_on_basis(i) == d]
|
|
225
|
+
return Family(S, self.monomial)
|
|
226
|
+
|
|
227
|
+
def homogeneous_component(self, d):
|
|
228
|
+
"""
|
|
229
|
+
Return the ``d``-th homogeneous component of ``self``.
|
|
230
|
+
|
|
231
|
+
EXAMPLES::
|
|
232
|
+
|
|
233
|
+
sage: A = GradedModulesWithBasis(ZZ).example()
|
|
234
|
+
sage: A.homogeneous_component(4)
|
|
235
|
+
Degree 4 homogeneous component of An example of a graded module
|
|
236
|
+
with basis: the free module on partitions over Integer Ring
|
|
237
|
+
"""
|
|
238
|
+
from sage.categories.modules_with_basis import ModulesWithBasis
|
|
239
|
+
from sage.categories.filtered_algebras import FilteredAlgebras
|
|
240
|
+
if self.base_ring() in FilteredAlgebras:
|
|
241
|
+
raise NotImplementedError("this is only a natural module over"
|
|
242
|
+
" the degree 0 component of the filtered"
|
|
243
|
+
" algebra and coordinate rings are not"
|
|
244
|
+
" yet implemented for submodules")
|
|
245
|
+
category = ModulesWithBasis(self.category().base_ring())
|
|
246
|
+
M = self.submodule(self.homogeneous_component_basis(d),
|
|
247
|
+
category=category,
|
|
248
|
+
already_echelonized=True)
|
|
249
|
+
M.rename("Degree {} homogeneous component of {}".format(d, self))
|
|
250
|
+
return M
|
|
251
|
+
|
|
252
|
+
def hilbert_series(self, prec=None):
|
|
253
|
+
r"""
|
|
254
|
+
Return the Hilbert series of ``self``.
|
|
255
|
+
|
|
256
|
+
Let `R` be a commutative ring (with unit). Let
|
|
257
|
+
`M = \bigcup_{n=0}^{\infty} M_n` be a filtered `R`-module.
|
|
258
|
+
The *Hilbert series* of `M` is the formal power series
|
|
259
|
+
|
|
260
|
+
.. MATH::
|
|
261
|
+
|
|
262
|
+
H(t) = \sum_{n=0}^{\infty} \ell(M_n / M_{n-1}) t^n,
|
|
263
|
+
|
|
264
|
+
where `\ell(N)` is the *length* of `N`, which is the
|
|
265
|
+
longest chain of submodules (over `R`), and by convention
|
|
266
|
+
`M_{-1} = \{0\}`. By the assumptions of the category,
|
|
267
|
+
`M_n / M_{n-1}` is a free `R`-module, and so `\ell(M_n / M_{n-1})`
|
|
268
|
+
is equal to the rank of `M_n / M_{n-1}`.
|
|
269
|
+
|
|
270
|
+
INPUT:
|
|
271
|
+
|
|
272
|
+
- ``prec`` -- (default: `\infty`) the precision
|
|
273
|
+
|
|
274
|
+
OUTPUT:
|
|
275
|
+
|
|
276
|
+
If the precision is finite, then this returns an element in the
|
|
277
|
+
:class:`PowerSeriesRing` over ``ZZ``. Otherwise it returns an
|
|
278
|
+
element in the :class:`LazyPowerSeriesRing` over ``ZZ``.
|
|
279
|
+
|
|
280
|
+
EXAMPLES::
|
|
281
|
+
|
|
282
|
+
sage: # needs sage.combinat
|
|
283
|
+
sage: A = GradedModulesWithBasis(ZZ).example()
|
|
284
|
+
sage: A.hilbert_series()
|
|
285
|
+
1 + t + 2*t^2 + 3*t^3 + 5*t^4 + 7*t^5 + 11*t^6 + O(t^7)
|
|
286
|
+
sage: A.hilbert_series(10)
|
|
287
|
+
1 + t + 2*t^2 + 3*t^3 + 5*t^4 + 7*t^5 + 11*t^6 + 15*t^7 + 22*t^8 + 30*t^9 + O(t^10)
|
|
288
|
+
"""
|
|
289
|
+
from sage.rings.integer_ring import ZZ
|
|
290
|
+
if prec is None:
|
|
291
|
+
from sage.rings.lazy_series_ring import LazyPowerSeriesRing
|
|
292
|
+
R = LazyPowerSeriesRing(ZZ, 't')
|
|
293
|
+
return R(lambda n: self.homogeneous_component_basis(n).cardinality())
|
|
294
|
+
from sage.rings.power_series_ring import PowerSeriesRing
|
|
295
|
+
R = PowerSeriesRing(ZZ, 't')
|
|
296
|
+
elt = R([self.homogeneous_component_basis(n).cardinality() for n in range(prec)])
|
|
297
|
+
return elt.O(prec)
|
|
298
|
+
|
|
299
|
+
def graded_algebra(self):
|
|
300
|
+
r"""
|
|
301
|
+
Return the associated graded module to ``self``.
|
|
302
|
+
|
|
303
|
+
See :class:`~sage.algebras.associated_graded.AssociatedGradedAlgebra`
|
|
304
|
+
for the definition and the properties of this.
|
|
305
|
+
|
|
306
|
+
If the filtered module ``self`` with basis is called `A`,
|
|
307
|
+
then this method returns `\operatorname{gr} A`. The method
|
|
308
|
+
:meth:`to_graded_conversion` returns the canonical
|
|
309
|
+
`R`-module isomorphism `A \to \operatorname{gr} A` induced
|
|
310
|
+
by the basis of `A`, and the method
|
|
311
|
+
:meth:`from_graded_conversion` returns the inverse of this
|
|
312
|
+
isomorphism. The method :meth:`projection` projects
|
|
313
|
+
elements of `A` onto `\operatorname{gr} A` according to
|
|
314
|
+
their place in the filtration on `A`.
|
|
315
|
+
|
|
316
|
+
.. WARNING::
|
|
317
|
+
|
|
318
|
+
When not overridden, this method returns the default
|
|
319
|
+
implementation of an associated graded module --
|
|
320
|
+
namely, ``AssociatedGradedAlgebra(self)``, where
|
|
321
|
+
``AssociatedGradedAlgebra`` is
|
|
322
|
+
:class:`~sage.algebras.associated_graded.AssociatedGradedAlgebra`.
|
|
323
|
+
But some instances of :class:`FilteredModulesWithBasis`
|
|
324
|
+
override this method, as the associated graded module
|
|
325
|
+
often is (isomorphic) to a simpler object (for instance,
|
|
326
|
+
the associated graded module of a graded module can be
|
|
327
|
+
identified with the graded module itself). Generic code
|
|
328
|
+
that uses associated graded modules (such as the code
|
|
329
|
+
of the :meth:`induced_graded_map` method below) should
|
|
330
|
+
make sure to only communicate with them via the
|
|
331
|
+
:meth:`to_graded_conversion`,
|
|
332
|
+
:meth:`from_graded_conversion` and
|
|
333
|
+
:meth:`projection` methods (in particular,
|
|
334
|
+
do not expect there to be a conversion from ``self``
|
|
335
|
+
to ``self.graded_algebra()``; this currently does not
|
|
336
|
+
work for Clifford algebras). Similarly, when
|
|
337
|
+
overriding :meth:`graded_algebra`, make sure to
|
|
338
|
+
accordingly redefine these three methods, unless their
|
|
339
|
+
definitions below still apply to your case (this will
|
|
340
|
+
happen whenever the basis of your :meth:`graded_algebra`
|
|
341
|
+
has the same indexing set as ``self``, and the partition
|
|
342
|
+
of this indexing set according to degree is the same as
|
|
343
|
+
for ``self``).
|
|
344
|
+
|
|
345
|
+
EXAMPLES::
|
|
346
|
+
|
|
347
|
+
sage: # needs sage.combinat sage.modules
|
|
348
|
+
sage: A = ModulesWithBasis(ZZ).Filtered().example()
|
|
349
|
+
sage: A.graded_algebra()
|
|
350
|
+
Graded Module of An example of a filtered module with basis:
|
|
351
|
+
the free module on partitions over Integer Ring
|
|
352
|
+
"""
|
|
353
|
+
from sage.algebras.associated_graded import AssociatedGradedAlgebra
|
|
354
|
+
return AssociatedGradedAlgebra(self)
|
|
355
|
+
|
|
356
|
+
# Maps
|
|
357
|
+
|
|
358
|
+
def to_graded_conversion(self):
|
|
359
|
+
r"""
|
|
360
|
+
Return the canonical `R`-module isomorphism
|
|
361
|
+
`A \to \operatorname{gr} A` induced by the basis of `A`
|
|
362
|
+
(where `A = ` ``self``).
|
|
363
|
+
|
|
364
|
+
This is an isomorphism of `R`-modules. See
|
|
365
|
+
the class documentation :class:`AssociatedGradedAlgebra`.
|
|
366
|
+
|
|
367
|
+
.. SEEALSO::
|
|
368
|
+
|
|
369
|
+
:meth:`from_graded_conversion`
|
|
370
|
+
|
|
371
|
+
EXAMPLES::
|
|
372
|
+
|
|
373
|
+
sage: # needs sage.combinat sage.modules
|
|
374
|
+
sage: A = Modules(QQ).WithBasis().Filtered().example()
|
|
375
|
+
sage: p = -2 * A.an_element(); p
|
|
376
|
+
-4*P[] - 4*P[1] - 6*P[2]
|
|
377
|
+
sage: q = A.to_graded_conversion()(p); q
|
|
378
|
+
-4*Bbar[[]] - 4*Bbar[[1]] - 6*Bbar[[2]]
|
|
379
|
+
sage: q.parent() is A.graded_algebra()
|
|
380
|
+
True
|
|
381
|
+
"""
|
|
382
|
+
base_one = self.base_ring().one()
|
|
383
|
+
return self.module_morphism(diagonal=lambda x: base_one,
|
|
384
|
+
codomain=self.graded_algebra())
|
|
385
|
+
|
|
386
|
+
def from_graded_conversion(self):
|
|
387
|
+
r"""
|
|
388
|
+
Return the inverse of the canonical `R`-module isomorphism
|
|
389
|
+
`A \to \operatorname{gr} A` induced by the basis of `A`
|
|
390
|
+
(where `A = ` ``self``). This inverse is an isomorphism
|
|
391
|
+
`\operatorname{gr} A \to A`.
|
|
392
|
+
|
|
393
|
+
This is an isomorphism of `R`-modules. See
|
|
394
|
+
the class documentation :class:`AssociatedGradedAlgebra`.
|
|
395
|
+
|
|
396
|
+
.. SEEALSO::
|
|
397
|
+
|
|
398
|
+
:meth:`to_graded_conversion`
|
|
399
|
+
|
|
400
|
+
EXAMPLES::
|
|
401
|
+
|
|
402
|
+
sage: # needs sage.combinat sage.modules
|
|
403
|
+
sage: A = Modules(QQ).WithBasis().Filtered().example()
|
|
404
|
+
sage: p = -2 * A.an_element(); p
|
|
405
|
+
-4*P[] - 4*P[1] - 6*P[2]
|
|
406
|
+
sage: q = A.to_graded_conversion()(p); q
|
|
407
|
+
-4*Bbar[[]] - 4*Bbar[[1]] - 6*Bbar[[2]]
|
|
408
|
+
sage: A.from_graded_conversion()(q) == p
|
|
409
|
+
True
|
|
410
|
+
sage: q.parent() is A.graded_algebra()
|
|
411
|
+
True
|
|
412
|
+
"""
|
|
413
|
+
base_one = self.base_ring().one()
|
|
414
|
+
return self.graded_algebra().module_morphism(diagonal=lambda x: base_one,
|
|
415
|
+
codomain=self)
|
|
416
|
+
|
|
417
|
+
def projection(self, i):
|
|
418
|
+
r"""
|
|
419
|
+
Return the `i`-th projection `p_i : F_i \to G_i` (in the
|
|
420
|
+
notations of the class documentation
|
|
421
|
+
:class:`AssociatedGradedAlgebra`, where `A = ` ``self``).
|
|
422
|
+
|
|
423
|
+
This method actually does not return the map `p_i` itself,
|
|
424
|
+
but an extension of `p_i` to the whole `R`-module `A`.
|
|
425
|
+
This extension is the composition of the `R`-module
|
|
426
|
+
isomorphism `A \to \operatorname{gr} A` with the canonical
|
|
427
|
+
projection of the graded `R`-module `\operatorname{gr} A`
|
|
428
|
+
onto its `i`-th graded component `G_i`. The codomain of
|
|
429
|
+
this map is `\operatorname{gr} A`, although its actual
|
|
430
|
+
image is `G_i`. The map `p_i` is obtained from this map
|
|
431
|
+
by restricting its domain to `F_i` and its image to `G_i`.
|
|
432
|
+
|
|
433
|
+
EXAMPLES::
|
|
434
|
+
|
|
435
|
+
sage: # needs sage.combinat sage.modules
|
|
436
|
+
sage: A = Modules(ZZ).WithBasis().Filtered().example()
|
|
437
|
+
sage: p = -2 * A.an_element(); p
|
|
438
|
+
-4*P[] - 4*P[1] - 6*P[2]
|
|
439
|
+
sage: q = A.projection(2)(p); q
|
|
440
|
+
-6*Bbar[[2]]
|
|
441
|
+
sage: q.parent() is A.graded_algebra()
|
|
442
|
+
True
|
|
443
|
+
sage: A.projection(3)(p)
|
|
444
|
+
0
|
|
445
|
+
"""
|
|
446
|
+
base_zero = self.base_ring().zero()
|
|
447
|
+
base_one = self.base_ring().one()
|
|
448
|
+
grA = self.graded_algebra()
|
|
449
|
+
proj = lambda x: (base_one if self.degree_on_basis(x) == i
|
|
450
|
+
else base_zero)
|
|
451
|
+
return self.module_morphism(diagonal=proj, codomain=grA)
|
|
452
|
+
|
|
453
|
+
def induced_graded_map(self, other, f):
|
|
454
|
+
r"""
|
|
455
|
+
Return the graded linear map between the associated graded
|
|
456
|
+
modules of ``self`` and ``other`` canonically induced by
|
|
457
|
+
the filtration-preserving map ``f : self -> other``.
|
|
458
|
+
|
|
459
|
+
Let `A` and `B` be two filtered modules with basis, and let
|
|
460
|
+
`(F_i)_{i \in I}` and `(G_i)_{i \in I}` be their
|
|
461
|
+
filtrations. Let `f : A \to B` be a linear map which
|
|
462
|
+
preserves the filtration (i.e., satisfies `f(F_i) \subseteq
|
|
463
|
+
G_i` for all `i \in I`). Then, there is a canonically
|
|
464
|
+
defined graded linear map
|
|
465
|
+
`\operatorname{gr} f : \operatorname{gr} A \to
|
|
466
|
+
\operatorname{gr} B` which satisfies
|
|
467
|
+
|
|
468
|
+
.. MATH::
|
|
469
|
+
|
|
470
|
+
(\operatorname{gr} f) (p_i(a)) = p_i(f(a))
|
|
471
|
+
\qquad \text{for all } i \in I \text{ and } a \in F_i ,
|
|
472
|
+
|
|
473
|
+
where the `p_i` on the left hand side is the canonical
|
|
474
|
+
projection from `F_i` onto the `i`-th graded component
|
|
475
|
+
of `\operatorname{gr} A`, while the `p_i` on the right
|
|
476
|
+
hand side is the canonical projection from `G_i` onto
|
|
477
|
+
the `i`-th graded component of `\operatorname{gr} B`.
|
|
478
|
+
|
|
479
|
+
INPUT:
|
|
480
|
+
|
|
481
|
+
- ``other`` -- a filtered algebra with basis
|
|
482
|
+
|
|
483
|
+
- ``f`` -- a filtration-preserving linear map from ``self``
|
|
484
|
+
to ``other`` (can be given as a morphism or as a function)
|
|
485
|
+
|
|
486
|
+
OUTPUT: the graded linear map `\operatorname{gr} f`
|
|
487
|
+
|
|
488
|
+
EXAMPLES:
|
|
489
|
+
|
|
490
|
+
**Example 1.**
|
|
491
|
+
|
|
492
|
+
We start with the free `\QQ`-module with basis the set of all
|
|
493
|
+
partitions::
|
|
494
|
+
|
|
495
|
+
sage: A = Modules(QQ).WithBasis().Filtered().example(); A # needs sage.modules
|
|
496
|
+
An example of a filtered module with basis: the free module
|
|
497
|
+
on partitions over Rational Field
|
|
498
|
+
sage: M = A.indices(); M # needs sage.modules
|
|
499
|
+
Partitions
|
|
500
|
+
sage: p1, p2, p21, p321 = [A.basis()[Partition(i)] # needs sage.modules
|
|
501
|
+
....: for i in [[1], [2], [2,1], [3,2,1]]]
|
|
502
|
+
|
|
503
|
+
Let us define a map from ``A`` to itself which acts on the
|
|
504
|
+
basis by sending every partition `\lambda` to the sum of
|
|
505
|
+
the conjugates of all partitions `\mu` for which
|
|
506
|
+
`\lambda / \mu` is a horizontal strip::
|
|
507
|
+
|
|
508
|
+
sage: # needs sage.combinat sage.modules
|
|
509
|
+
sage: def map_on_basis(lam):
|
|
510
|
+
....: def mus(k):
|
|
511
|
+
....: return lam.remove_horizontal_border_strip(k)
|
|
512
|
+
....: return A.sum_of_monomials([Partition(mu).conjugate()
|
|
513
|
+
....: for k in range(sum(lam) + 1)
|
|
514
|
+
....: for mu in mus(k)])
|
|
515
|
+
sage: f = A.module_morphism(on_basis=map_on_basis,
|
|
516
|
+
....: codomain=A)
|
|
517
|
+
sage: f(p1)
|
|
518
|
+
P[] + P[1]
|
|
519
|
+
sage: f(p2)
|
|
520
|
+
P[] + P[1] + P[1, 1]
|
|
521
|
+
sage: f(p21)
|
|
522
|
+
P[1] + P[1, 1] + P[2] + P[2, 1]
|
|
523
|
+
sage: f(p21 - p1)
|
|
524
|
+
-P[] + P[1, 1] + P[2] + P[2, 1]
|
|
525
|
+
sage: f(p321)
|
|
526
|
+
P[2, 1] + P[2, 1, 1] + P[2, 2] + P[2, 2, 1]
|
|
527
|
+
+ P[3, 1] + P[3, 1, 1] + P[3, 2] + P[3, 2, 1]
|
|
528
|
+
|
|
529
|
+
We now compute `\operatorname{gr} f` ::
|
|
530
|
+
|
|
531
|
+
sage: # needs sage.combinat sage.modules
|
|
532
|
+
sage: grA = A.graded_algebra(); grA
|
|
533
|
+
Graded Module of An example of a filtered module with basis:
|
|
534
|
+
the free module on partitions over Rational Field
|
|
535
|
+
sage: pp1, pp2, pp21, pp321 = [A.to_graded_conversion()(i)
|
|
536
|
+
....: for i in [p1, p2, p21, p321]]
|
|
537
|
+
sage: pp2 + 4 * pp21
|
|
538
|
+
Bbar[[2]] + 4*Bbar[[2, 1]]
|
|
539
|
+
sage: grf = A.induced_graded_map(A, f); grf
|
|
540
|
+
Generic endomorphism of Graded Module of
|
|
541
|
+
An example of a filtered module with basis:
|
|
542
|
+
the free module on partitions over Rational Field
|
|
543
|
+
sage: grf(pp1)
|
|
544
|
+
Bbar[[1]]
|
|
545
|
+
sage: grf(pp2 + 4 * pp21)
|
|
546
|
+
Bbar[[1, 1]] + 4*Bbar[[2, 1]]
|
|
547
|
+
|
|
548
|
+
**Example 2.**
|
|
549
|
+
|
|
550
|
+
We shall now construct `\operatorname{gr} f` for a
|
|
551
|
+
different map `f` out of the same ``A``; the new map
|
|
552
|
+
`f` will lead into a graded algebra already, namely into
|
|
553
|
+
the algebra of symmetric functions::
|
|
554
|
+
|
|
555
|
+
sage: # needs sage.combinat sage.modules
|
|
556
|
+
sage: h = SymmetricFunctions(QQ).h()
|
|
557
|
+
sage: def map_on_basis(lam): # redefining map_on_basis
|
|
558
|
+
....: def mus(k):
|
|
559
|
+
....: return lam.remove_horizontal_border_strip(k)
|
|
560
|
+
....: return h.sum_of_monomials([Partition(mu).conjugate()
|
|
561
|
+
....: for k in range(sum(lam) + 1)
|
|
562
|
+
....: for mu in mus(k)])
|
|
563
|
+
sage: f = A.module_morphism(on_basis=map_on_basis,
|
|
564
|
+
....: codomain=h) # redefining f
|
|
565
|
+
sage: f(p1)
|
|
566
|
+
h[] + h[1]
|
|
567
|
+
sage: f(p2)
|
|
568
|
+
h[] + h[1] + h[1, 1]
|
|
569
|
+
sage: f(A.zero())
|
|
570
|
+
0
|
|
571
|
+
sage: f(p2 - 3*p1)
|
|
572
|
+
-2*h[] - 2*h[1] + h[1, 1]
|
|
573
|
+
|
|
574
|
+
The algebra ``h`` of symmetric functions in the `h`-basis
|
|
575
|
+
is already graded, so its associated graded algebra is
|
|
576
|
+
implemented as itself::
|
|
577
|
+
|
|
578
|
+
sage: # needs sage.combinat sage.modules
|
|
579
|
+
sage: grh = h.graded_algebra(); grh is h
|
|
580
|
+
True
|
|
581
|
+
sage: grf = A.induced_graded_map(h, f); grf
|
|
582
|
+
Generic morphism:
|
|
583
|
+
From: Graded Module of An example of a filtered
|
|
584
|
+
module with basis: the free module on partitions
|
|
585
|
+
over Rational Field
|
|
586
|
+
To: Symmetric Functions over Rational Field
|
|
587
|
+
in the homogeneous basis
|
|
588
|
+
sage: grf(pp1)
|
|
589
|
+
h[1]
|
|
590
|
+
sage: grf(pp2)
|
|
591
|
+
h[1, 1]
|
|
592
|
+
sage: grf(pp321)
|
|
593
|
+
h[3, 2, 1]
|
|
594
|
+
sage: grf(pp2 - 3*pp1)
|
|
595
|
+
-3*h[1] + h[1, 1]
|
|
596
|
+
sage: grf(pp21)
|
|
597
|
+
h[2, 1]
|
|
598
|
+
sage: grf(grA.zero())
|
|
599
|
+
0
|
|
600
|
+
|
|
601
|
+
**Example 3.**
|
|
602
|
+
|
|
603
|
+
After having had a graded module as the codomain, let us try to
|
|
604
|
+
have one as the domain instead. Our new ``f`` will go from ``h``
|
|
605
|
+
to ``A``::
|
|
606
|
+
|
|
607
|
+
sage: # needs sage.combinat sage.modules
|
|
608
|
+
sage: def map_on_basis(lam): # redefining map_on_basis
|
|
609
|
+
....: def mus(k):
|
|
610
|
+
....: return lam.remove_horizontal_border_strip(k)
|
|
611
|
+
....: return A.sum_of_monomials([Partition(mu).conjugate()
|
|
612
|
+
....: for k in range(sum(lam) + 1)
|
|
613
|
+
....: for mu in mus(k)])
|
|
614
|
+
sage: f = h.module_morphism(on_basis=map_on_basis,
|
|
615
|
+
....: codomain=A) # redefining f
|
|
616
|
+
sage: f(h[1])
|
|
617
|
+
P[] + P[1]
|
|
618
|
+
sage: f(h[2])
|
|
619
|
+
P[] + P[1] + P[1, 1]
|
|
620
|
+
sage: f(h[1, 1])
|
|
621
|
+
P[1] + P[2]
|
|
622
|
+
sage: f(h[2, 2])
|
|
623
|
+
P[1, 1] + P[2, 1] + P[2, 2]
|
|
624
|
+
sage: f(h[3, 2, 1])
|
|
625
|
+
P[2, 1] + P[2, 1, 1] + P[2, 2] + P[2, 2, 1]
|
|
626
|
+
+ P[3, 1] + P[3, 1, 1] + P[3, 2] + P[3, 2, 1]
|
|
627
|
+
sage: f(h.one())
|
|
628
|
+
P[]
|
|
629
|
+
sage: grf = h.induced_graded_map(A, f); grf
|
|
630
|
+
Generic morphism:
|
|
631
|
+
From: Symmetric Functions over Rational Field
|
|
632
|
+
in the homogeneous basis
|
|
633
|
+
To: Graded Module of An example of a filtered
|
|
634
|
+
module with basis: the free module on partitions
|
|
635
|
+
over Rational Field
|
|
636
|
+
sage: grf(h[1])
|
|
637
|
+
Bbar[[1]]
|
|
638
|
+
sage: grf(h[2])
|
|
639
|
+
Bbar[[1, 1]]
|
|
640
|
+
sage: grf(h[1, 1])
|
|
641
|
+
Bbar[[2]]
|
|
642
|
+
sage: grf(h[2, 2])
|
|
643
|
+
Bbar[[2, 2]]
|
|
644
|
+
sage: grf(h[3, 2, 1])
|
|
645
|
+
Bbar[[3, 2, 1]]
|
|
646
|
+
sage: grf(h.one())
|
|
647
|
+
Bbar[[]]
|
|
648
|
+
|
|
649
|
+
**Example 4.**
|
|
650
|
+
|
|
651
|
+
The construct `\operatorname{gr} f` also makes sense when `f`
|
|
652
|
+
is a filtration-preserving map between graded modules. ::
|
|
653
|
+
|
|
654
|
+
sage: # needs sage.combinat sage.modules
|
|
655
|
+
sage: def map_on_basis(lam): # redefining map_on_basis
|
|
656
|
+
....: def mus(k):
|
|
657
|
+
....: return lam.remove_horizontal_border_strip(k)
|
|
658
|
+
....: return h.sum_of_monomials([Partition(mu).conjugate()
|
|
659
|
+
....: for k in range(sum(lam) + 1)
|
|
660
|
+
....: for mu in mus(k)])
|
|
661
|
+
sage: f = h.module_morphism(on_basis=map_on_basis,
|
|
662
|
+
....: codomain=h) # redefining f
|
|
663
|
+
sage: f(h[1])
|
|
664
|
+
h[] + h[1]
|
|
665
|
+
sage: f(h[2])
|
|
666
|
+
h[] + h[1] + h[1, 1]
|
|
667
|
+
sage: f(h[1, 1])
|
|
668
|
+
h[1] + h[2]
|
|
669
|
+
sage: f(h[2, 1])
|
|
670
|
+
h[1] + h[1, 1] + h[2] + h[2, 1]
|
|
671
|
+
sage: f(h.one())
|
|
672
|
+
h[]
|
|
673
|
+
sage: grf = h.induced_graded_map(h, f); grf
|
|
674
|
+
Generic endomorphism of
|
|
675
|
+
Symmetric Functions over Rational Field in the homogeneous basis
|
|
676
|
+
sage: grf(h[1])
|
|
677
|
+
h[1]
|
|
678
|
+
sage: grf(h[2])
|
|
679
|
+
h[1, 1]
|
|
680
|
+
sage: grf(h[1, 1])
|
|
681
|
+
h[2]
|
|
682
|
+
sage: grf(h[2, 1])
|
|
683
|
+
h[2, 1]
|
|
684
|
+
sage: grf(h.one())
|
|
685
|
+
h[]
|
|
686
|
+
"""
|
|
687
|
+
grA = self.graded_algebra()
|
|
688
|
+
grB = other.graded_algebra()
|
|
689
|
+
from sage.categories.graded_modules_with_basis import GradedModulesWithBasis
|
|
690
|
+
cat = GradedModulesWithBasis(self.base_ring())
|
|
691
|
+
from_gr = self.from_graded_conversion()
|
|
692
|
+
|
|
693
|
+
def on_basis(m):
|
|
694
|
+
i = grA.degree_on_basis(m)
|
|
695
|
+
lifted_img_of_m = f(from_gr(grA.monomial(m)))
|
|
696
|
+
return other.projection(i)(lifted_img_of_m)
|
|
697
|
+
return grA.module_morphism(on_basis=on_basis,
|
|
698
|
+
codomain=grB, category=cat)
|
|
699
|
+
# If we could assume that the projection of the basis
|
|
700
|
+
# element of ``self`` indexed by an index ``m`` is the
|
|
701
|
+
# basis element of ``grA`` indexed by ``m``, then this
|
|
702
|
+
# could go faster:
|
|
703
|
+
#
|
|
704
|
+
# def on_basis(m):
|
|
705
|
+
# i = grA.degree_on_basis(m)
|
|
706
|
+
# return grB.projection(i)(f(self.monomial(m)))
|
|
707
|
+
# return grA.module_morphism(on_basis=on_basis,
|
|
708
|
+
# codomain=grB, category=cat)
|
|
709
|
+
#
|
|
710
|
+
# But this assumption might come back to bite us in the
|
|
711
|
+
# ass one day. What do you think?
|
|
712
|
+
|
|
713
|
+
class ElementMethods:
|
|
714
|
+
|
|
715
|
+
def is_homogeneous(self):
|
|
716
|
+
r"""
|
|
717
|
+
Return whether the element ``self`` is homogeneous.
|
|
718
|
+
|
|
719
|
+
EXAMPLES::
|
|
720
|
+
|
|
721
|
+
sage: # needs sage.combinat sage.modules
|
|
722
|
+
sage: A = ModulesWithBasis(ZZ).Filtered().example()
|
|
723
|
+
sage: x = A(Partition((3,2,1)))
|
|
724
|
+
sage: y = A(Partition((4,4,1)))
|
|
725
|
+
sage: z = A(Partition((2,2,2)))
|
|
726
|
+
sage: (3*x).is_homogeneous()
|
|
727
|
+
True
|
|
728
|
+
sage: (x - y).is_homogeneous()
|
|
729
|
+
False
|
|
730
|
+
sage: (x+2*z).is_homogeneous()
|
|
731
|
+
True
|
|
732
|
+
|
|
733
|
+
Here is an example with a graded algebra::
|
|
734
|
+
|
|
735
|
+
sage: # needs sage.combinat sage.modules
|
|
736
|
+
sage: S = NonCommutativeSymmetricFunctions(QQ).S()
|
|
737
|
+
sage: (x, y) = (S[2], S[3])
|
|
738
|
+
sage: (3*x).is_homogeneous()
|
|
739
|
+
True
|
|
740
|
+
sage: (x^3 - y^2).is_homogeneous()
|
|
741
|
+
True
|
|
742
|
+
sage: ((x + y)^2).is_homogeneous()
|
|
743
|
+
False
|
|
744
|
+
|
|
745
|
+
Let us now test a filtered algebra (but remember that the
|
|
746
|
+
notion of homogeneity now depends on the choice of a
|
|
747
|
+
basis, or at least on a definition of homogeneous
|
|
748
|
+
components)::
|
|
749
|
+
|
|
750
|
+
sage: A = AlgebrasWithBasis(QQ).Filtered().example()
|
|
751
|
+
sage: x,y,z = A.algebra_generators()
|
|
752
|
+
sage: (x*y).is_homogeneous()
|
|
753
|
+
True
|
|
754
|
+
sage: (y*x).is_homogeneous()
|
|
755
|
+
False
|
|
756
|
+
sage: A.one().is_homogeneous()
|
|
757
|
+
True
|
|
758
|
+
sage: A.zero().is_homogeneous()
|
|
759
|
+
True
|
|
760
|
+
sage: (A.one()+x).is_homogeneous()
|
|
761
|
+
False
|
|
762
|
+
"""
|
|
763
|
+
degree_on_basis = self.parent().degree_on_basis
|
|
764
|
+
degree = None
|
|
765
|
+
for m in self.support():
|
|
766
|
+
if degree is None:
|
|
767
|
+
degree = degree_on_basis(m)
|
|
768
|
+
else:
|
|
769
|
+
if degree != degree_on_basis(m):
|
|
770
|
+
return False
|
|
771
|
+
return True
|
|
772
|
+
|
|
773
|
+
@abstract_method(optional=True)
|
|
774
|
+
def degree_on_basis(self, m):
|
|
775
|
+
r"""
|
|
776
|
+
Return the degree of the basis element indexed by ``m``
|
|
777
|
+
in ``self``.
|
|
778
|
+
|
|
779
|
+
EXAMPLES::
|
|
780
|
+
|
|
781
|
+
sage: A = GradedModulesWithBasis(QQ).example() # needs sage.modules
|
|
782
|
+
sage: A.degree_on_basis(Partition((2,1))) # needs sage.modules
|
|
783
|
+
3
|
|
784
|
+
sage: A.degree_on_basis(Partition((4,2,1,1,1,1))) # needs sage.modules
|
|
785
|
+
10
|
|
786
|
+
"""
|
|
787
|
+
|
|
788
|
+
def homogeneous_degree(self):
|
|
789
|
+
r"""
|
|
790
|
+
The degree of a nonzero homogeneous element ``self`` in the
|
|
791
|
+
filtered module.
|
|
792
|
+
|
|
793
|
+
.. NOTE::
|
|
794
|
+
|
|
795
|
+
This raises an error if the element is not homogeneous.
|
|
796
|
+
To compute the maximum of the degrees of the homogeneous
|
|
797
|
+
summands of a (not necessarily homogeneous) element, use
|
|
798
|
+
:meth:`maximal_degree` instead.
|
|
799
|
+
|
|
800
|
+
EXAMPLES::
|
|
801
|
+
|
|
802
|
+
sage: # needs sage.combinat sage.modules
|
|
803
|
+
sage: A = ModulesWithBasis(ZZ).Filtered().example()
|
|
804
|
+
sage: x = A(Partition((3,2,1)))
|
|
805
|
+
sage: y = A(Partition((4,4,1)))
|
|
806
|
+
sage: z = A(Partition((2,2,2)))
|
|
807
|
+
sage: x.degree()
|
|
808
|
+
6
|
|
809
|
+
sage: (x + 2*z).degree()
|
|
810
|
+
6
|
|
811
|
+
sage: (y - x).degree()
|
|
812
|
+
Traceback (most recent call last):
|
|
813
|
+
...
|
|
814
|
+
ValueError: element is not homogeneous
|
|
815
|
+
|
|
816
|
+
An example in a graded algebra::
|
|
817
|
+
|
|
818
|
+
sage: # needs sage.combinat sage.modules
|
|
819
|
+
sage: S = NonCommutativeSymmetricFunctions(QQ).S()
|
|
820
|
+
sage: (x, y) = (S[2], S[3])
|
|
821
|
+
sage: x.homogeneous_degree()
|
|
822
|
+
2
|
|
823
|
+
sage: (x^3 + 4*y^2).homogeneous_degree()
|
|
824
|
+
6
|
|
825
|
+
sage: ((1 + x)^3).homogeneous_degree()
|
|
826
|
+
Traceback (most recent call last):
|
|
827
|
+
...
|
|
828
|
+
ValueError: element is not homogeneous
|
|
829
|
+
|
|
830
|
+
Let us now test a filtered algebra (but remember that the
|
|
831
|
+
notion of homogeneity now depends on the choice of a
|
|
832
|
+
basis)::
|
|
833
|
+
|
|
834
|
+
sage: A = AlgebrasWithBasis(QQ).Filtered().example()
|
|
835
|
+
sage: x,y,z = A.algebra_generators()
|
|
836
|
+
sage: (x*y).homogeneous_degree()
|
|
837
|
+
2
|
|
838
|
+
sage: (y*x).homogeneous_degree()
|
|
839
|
+
Traceback (most recent call last):
|
|
840
|
+
...
|
|
841
|
+
ValueError: element is not homogeneous
|
|
842
|
+
sage: A.one().homogeneous_degree()
|
|
843
|
+
0
|
|
844
|
+
|
|
845
|
+
TESTS::
|
|
846
|
+
|
|
847
|
+
sage: S = NonCommutativeSymmetricFunctions(QQ).S() # needs sage.combinat sage.modules
|
|
848
|
+
sage: S.zero().degree() # needs sage.combinat sage.modules
|
|
849
|
+
Traceback (most recent call last):
|
|
850
|
+
...
|
|
851
|
+
ValueError: the zero element does not have a well-defined degree
|
|
852
|
+
"""
|
|
853
|
+
if not self.support():
|
|
854
|
+
raise ValueError("the zero element does not have a well-defined degree")
|
|
855
|
+
if not self.is_homogeneous():
|
|
856
|
+
raise ValueError("element is not homogeneous")
|
|
857
|
+
return self.parent().degree_on_basis(next(iter(self.support())))
|
|
858
|
+
|
|
859
|
+
# default choice for degree; will be overridden as necessary
|
|
860
|
+
degree = homogeneous_degree
|
|
861
|
+
|
|
862
|
+
def maximal_degree(self):
|
|
863
|
+
"""
|
|
864
|
+
The maximum of the degrees of the homogeneous components
|
|
865
|
+
of ``self``.
|
|
866
|
+
|
|
867
|
+
This is also the smallest `i` such that ``self`` belongs
|
|
868
|
+
to `F_i`. Hence, it does not depend on the basis of the
|
|
869
|
+
parent of ``self``.
|
|
870
|
+
|
|
871
|
+
.. SEEALSO:: :meth:`homogeneous_degree`
|
|
872
|
+
|
|
873
|
+
EXAMPLES::
|
|
874
|
+
|
|
875
|
+
sage: # needs sage.combinat sage.modules
|
|
876
|
+
sage: A = ModulesWithBasis(ZZ).Filtered().example()
|
|
877
|
+
sage: x = A(Partition((3,2,1)))
|
|
878
|
+
sage: y = A(Partition((4,4,1)))
|
|
879
|
+
sage: z = A(Partition((2,2,2)))
|
|
880
|
+
sage: x.maximal_degree()
|
|
881
|
+
6
|
|
882
|
+
sage: (x + 2*z).maximal_degree()
|
|
883
|
+
6
|
|
884
|
+
sage: (y - x).maximal_degree()
|
|
885
|
+
9
|
|
886
|
+
sage: (3*z).maximal_degree()
|
|
887
|
+
6
|
|
888
|
+
|
|
889
|
+
Now, we test this on a graded algebra::
|
|
890
|
+
|
|
891
|
+
sage: # needs sage.combinat sage.modules
|
|
892
|
+
sage: S = NonCommutativeSymmetricFunctions(QQ).S()
|
|
893
|
+
sage: (x, y) = (S[2], S[3])
|
|
894
|
+
sage: x.maximal_degree()
|
|
895
|
+
2
|
|
896
|
+
sage: (x^3 + 4*y^2).maximal_degree()
|
|
897
|
+
6
|
|
898
|
+
sage: ((1 + x)^3).maximal_degree()
|
|
899
|
+
6
|
|
900
|
+
|
|
901
|
+
Let us now test a filtered algebra::
|
|
902
|
+
|
|
903
|
+
sage: # needs sage.combinat sage.modules
|
|
904
|
+
sage: A = AlgebrasWithBasis(QQ).Filtered().example()
|
|
905
|
+
sage: x,y,z = A.algebra_generators()
|
|
906
|
+
sage: (x*y).maximal_degree()
|
|
907
|
+
2
|
|
908
|
+
sage: (y*x).maximal_degree()
|
|
909
|
+
2
|
|
910
|
+
sage: A.one().maximal_degree()
|
|
911
|
+
0
|
|
912
|
+
sage: A.zero().maximal_degree()
|
|
913
|
+
Traceback (most recent call last):
|
|
914
|
+
...
|
|
915
|
+
ValueError: the zero element does not have a well-defined degree
|
|
916
|
+
sage: (A.one()+x).maximal_degree()
|
|
917
|
+
1
|
|
918
|
+
|
|
919
|
+
TESTS::
|
|
920
|
+
|
|
921
|
+
sage: S = NonCommutativeSymmetricFunctions(QQ).S() # needs sage.combinat sage.modules
|
|
922
|
+
sage: S.zero().degree() # needs sage.combinat sage.modules
|
|
923
|
+
Traceback (most recent call last):
|
|
924
|
+
...
|
|
925
|
+
ValueError: the zero element does not have a well-defined degree
|
|
926
|
+
"""
|
|
927
|
+
if self.is_zero():
|
|
928
|
+
raise ValueError("the zero element does not have a well-defined degree")
|
|
929
|
+
degree_on_basis = self.parent().degree_on_basis
|
|
930
|
+
return max(degree_on_basis(m) for m in self.support())
|
|
931
|
+
|
|
932
|
+
def homogeneous_component(self, n):
|
|
933
|
+
r"""
|
|
934
|
+
Return the homogeneous component of degree ``n`` of the
|
|
935
|
+
element ``self``.
|
|
936
|
+
|
|
937
|
+
Let `m` be an element of a filtered `R`-module `M` with
|
|
938
|
+
basis. Then, `m` can be uniquely written in the form
|
|
939
|
+
`m = \sum_{i \in I} m_i`, where each `m_i` is a
|
|
940
|
+
homogeneous element of degree `i`. For `n \in I`, we
|
|
941
|
+
define the homogeneous component of degree `n` of the
|
|
942
|
+
element `m` to be `m_n`.
|
|
943
|
+
|
|
944
|
+
EXAMPLES::
|
|
945
|
+
|
|
946
|
+
sage: # needs sage.combinat sage.modules
|
|
947
|
+
sage: A = ModulesWithBasis(ZZ).Filtered().example()
|
|
948
|
+
sage: x = A.an_element(); x
|
|
949
|
+
2*P[] + 2*P[1] + 3*P[2]
|
|
950
|
+
sage: x.homogeneous_component(-1)
|
|
951
|
+
0
|
|
952
|
+
sage: x.homogeneous_component(0)
|
|
953
|
+
2*P[]
|
|
954
|
+
sage: x.homogeneous_component(1)
|
|
955
|
+
2*P[1]
|
|
956
|
+
sage: x.homogeneous_component(2)
|
|
957
|
+
3*P[2]
|
|
958
|
+
sage: x.homogeneous_component(3)
|
|
959
|
+
0
|
|
960
|
+
|
|
961
|
+
sage: # needs sage.combinat sage.modules
|
|
962
|
+
sage: A = ModulesWithBasis(ZZ).Graded().example()
|
|
963
|
+
sage: x = A.an_element(); x
|
|
964
|
+
2*P[] + 2*P[1] + 3*P[2]
|
|
965
|
+
sage: x.homogeneous_component(-1)
|
|
966
|
+
0
|
|
967
|
+
sage: x.homogeneous_component(0)
|
|
968
|
+
2*P[]
|
|
969
|
+
sage: x.homogeneous_component(1)
|
|
970
|
+
2*P[1]
|
|
971
|
+
sage: x.homogeneous_component(2)
|
|
972
|
+
3*P[2]
|
|
973
|
+
sage: x.homogeneous_component(3)
|
|
974
|
+
0
|
|
975
|
+
|
|
976
|
+
sage: A = AlgebrasWithBasis(ZZ).Filtered().example()
|
|
977
|
+
sage: G = A.algebra_generators()
|
|
978
|
+
sage: g = A.an_element() - 2 * G['x'] * G['y']; g
|
|
979
|
+
U['x']^2*U['y']^2*U['z']^3 - 2*U['x']*U['y']
|
|
980
|
+
+ 2*U['x'] + 3*U['y'] + 1
|
|
981
|
+
sage: g.homogeneous_component(-1)
|
|
982
|
+
0
|
|
983
|
+
sage: g.homogeneous_component(0)
|
|
984
|
+
1
|
|
985
|
+
sage: g.homogeneous_component(2)
|
|
986
|
+
-2*U['x']*U['y']
|
|
987
|
+
sage: g.homogeneous_component(5)
|
|
988
|
+
0
|
|
989
|
+
sage: g.homogeneous_component(7)
|
|
990
|
+
U['x']^2*U['y']^2*U['z']^3
|
|
991
|
+
sage: g.homogeneous_component(8)
|
|
992
|
+
0
|
|
993
|
+
|
|
994
|
+
TESTS:
|
|
995
|
+
|
|
996
|
+
Check that this really returns ``A.zero()`` and not a plain ``0``::
|
|
997
|
+
|
|
998
|
+
sage: # needs sage.combinat sage.modules
|
|
999
|
+
sage: A = ModulesWithBasis(ZZ).Filtered().example()
|
|
1000
|
+
sage: x = A.an_element()
|
|
1001
|
+
sage: x.homogeneous_component(3).parent() is A
|
|
1002
|
+
True
|
|
1003
|
+
"""
|
|
1004
|
+
degree_on_basis = self.parent().degree_on_basis
|
|
1005
|
+
return self.parent().sum_of_terms((i, c)
|
|
1006
|
+
for (i, c) in self
|
|
1007
|
+
if degree_on_basis(i) == n)
|
|
1008
|
+
|
|
1009
|
+
def truncate(self, n):
|
|
1010
|
+
"""
|
|
1011
|
+
Return the sum of the homogeneous components of degree
|
|
1012
|
+
strictly less than ``n`` of ``self``.
|
|
1013
|
+
|
|
1014
|
+
See :meth:`homogeneous_component` for the notion of a
|
|
1015
|
+
homogeneous component.
|
|
1016
|
+
|
|
1017
|
+
EXAMPLES::
|
|
1018
|
+
|
|
1019
|
+
sage: # needs sage.combinat sage.modules
|
|
1020
|
+
sage: A = ModulesWithBasis(ZZ).Filtered().example()
|
|
1021
|
+
sage: x = A.an_element(); x
|
|
1022
|
+
2*P[] + 2*P[1] + 3*P[2]
|
|
1023
|
+
sage: x.truncate(0)
|
|
1024
|
+
0
|
|
1025
|
+
sage: x.truncate(1)
|
|
1026
|
+
2*P[]
|
|
1027
|
+
sage: x.truncate(2)
|
|
1028
|
+
2*P[] + 2*P[1]
|
|
1029
|
+
sage: x.truncate(3)
|
|
1030
|
+
2*P[] + 2*P[1] + 3*P[2]
|
|
1031
|
+
|
|
1032
|
+
sage: # needs sage.combinat sage.modules
|
|
1033
|
+
sage: A = ModulesWithBasis(ZZ).Graded().example()
|
|
1034
|
+
sage: x = A.an_element(); x
|
|
1035
|
+
2*P[] + 2*P[1] + 3*P[2]
|
|
1036
|
+
sage: x.truncate(0)
|
|
1037
|
+
0
|
|
1038
|
+
sage: x.truncate(1)
|
|
1039
|
+
2*P[]
|
|
1040
|
+
sage: x.truncate(2)
|
|
1041
|
+
2*P[] + 2*P[1]
|
|
1042
|
+
sage: x.truncate(3)
|
|
1043
|
+
2*P[] + 2*P[1] + 3*P[2]
|
|
1044
|
+
|
|
1045
|
+
sage: A = AlgebrasWithBasis(ZZ).Filtered().example()
|
|
1046
|
+
sage: G = A.algebra_generators()
|
|
1047
|
+
sage: g = A.an_element() - 2 * G['x'] * G['y']; g
|
|
1048
|
+
U['x']^2*U['y']^2*U['z']^3 - 2*U['x']*U['y']
|
|
1049
|
+
+ 2*U['x'] + 3*U['y'] + 1
|
|
1050
|
+
sage: g.truncate(-1)
|
|
1051
|
+
0
|
|
1052
|
+
sage: g.truncate(0)
|
|
1053
|
+
0
|
|
1054
|
+
sage: g.truncate(2)
|
|
1055
|
+
2*U['x'] + 3*U['y'] + 1
|
|
1056
|
+
sage: g.truncate(3)
|
|
1057
|
+
-2*U['x']*U['y'] + 2*U['x'] + 3*U['y'] + 1
|
|
1058
|
+
sage: g.truncate(5)
|
|
1059
|
+
-2*U['x']*U['y'] + 2*U['x'] + 3*U['y'] + 1
|
|
1060
|
+
sage: g.truncate(7)
|
|
1061
|
+
-2*U['x']*U['y'] + 2*U['x'] + 3*U['y'] + 1
|
|
1062
|
+
sage: g.truncate(8)
|
|
1063
|
+
U['x']^2*U['y']^2*U['z']^3 - 2*U['x']*U['y']
|
|
1064
|
+
+ 2*U['x'] + 3*U['y'] + 1
|
|
1065
|
+
|
|
1066
|
+
TESTS:
|
|
1067
|
+
|
|
1068
|
+
Check that this really return ``A.zero()`` and not a plain ``0``::
|
|
1069
|
+
|
|
1070
|
+
sage: # needs sage.combinat sage.modules
|
|
1071
|
+
sage: A = ModulesWithBasis(ZZ).Filtered().example()
|
|
1072
|
+
sage: x = A.an_element()
|
|
1073
|
+
sage: x.truncate(0).parent() is A
|
|
1074
|
+
True
|
|
1075
|
+
"""
|
|
1076
|
+
degree_on_basis = self.parent().degree_on_basis
|
|
1077
|
+
return self.parent().sum_of_terms((i, c) for (i, c) in self
|
|
1078
|
+
if degree_on_basis(i) < n)
|
|
1079
|
+
|
|
1080
|
+
class Subobjects(SubobjectsCategory):
|
|
1081
|
+
class ParentMethods:
|
|
1082
|
+
def degree_on_basis(self, m):
|
|
1083
|
+
r"""
|
|
1084
|
+
Return the degree of the basis element indexed by ``m``
|
|
1085
|
+
in ``self``.
|
|
1086
|
+
|
|
1087
|
+
EXAMPLES::
|
|
1088
|
+
|
|
1089
|
+
sage: # needs sage.modules
|
|
1090
|
+
sage: E.<x,y,z> = ExteriorAlgebra(QQ)
|
|
1091
|
+
sage: S = E.submodule([x + y, x*y - y*z, y])
|
|
1092
|
+
sage: B = S.basis()
|
|
1093
|
+
sage: [B[0].lift(), B[1].lift(), B[2].lift()]
|
|
1094
|
+
[x, y, x*y - y*z]
|
|
1095
|
+
sage: S.degree_on_basis(0)
|
|
1096
|
+
1
|
|
1097
|
+
sage: S.degree_on_basis(1)
|
|
1098
|
+
1
|
|
1099
|
+
sage: S.degree_on_basis(2)
|
|
1100
|
+
2
|
|
1101
|
+
"""
|
|
1102
|
+
return self.basis()[m].lift().degree()
|
|
1103
|
+
|
|
1104
|
+
class ElementMethods:
|
|
1105
|
+
def degree(self):
|
|
1106
|
+
r"""
|
|
1107
|
+
Return the degree of ``self``.
|
|
1108
|
+
|
|
1109
|
+
EXAMPLES::
|
|
1110
|
+
|
|
1111
|
+
sage: # needs sage.modules
|
|
1112
|
+
sage: E.<x,y,z> = ExteriorAlgebra(QQ)
|
|
1113
|
+
sage: S = E.submodule([x + y, x*y - y*z, y])
|
|
1114
|
+
sage: B = S.basis()
|
|
1115
|
+
sage: [B[0].lift(), B[1].lift(), B[2].lift()]
|
|
1116
|
+
[x, y, x*y - y*z]
|
|
1117
|
+
sage: B[0].degree()
|
|
1118
|
+
1
|
|
1119
|
+
sage: B[1].degree()
|
|
1120
|
+
1
|
|
1121
|
+
sage: (B[0] + 3*B[1]).degree()
|
|
1122
|
+
1
|
|
1123
|
+
|
|
1124
|
+
The degree of inhomogeneous elements is not defined
|
|
1125
|
+
(following the behavior of the exterior algebra)::
|
|
1126
|
+
|
|
1127
|
+
sage: (B[0] + B[2]).degree() # needs sage.modules
|
|
1128
|
+
Traceback (most recent call last):
|
|
1129
|
+
...
|
|
1130
|
+
ValueError: element is not homogeneous
|
|
1131
|
+
|
|
1132
|
+
We can still get the maximal degree::
|
|
1133
|
+
|
|
1134
|
+
sage: (B[0] + B[2]).maximal_degree() # needs sage.modules
|
|
1135
|
+
2
|
|
1136
|
+
"""
|
|
1137
|
+
return self.lift().degree()
|
|
1138
|
+
|
|
1139
|
+
def maximal_degree(self):
|
|
1140
|
+
r"""
|
|
1141
|
+
The maximum of the degrees of the homogeneous components
|
|
1142
|
+
of ``self``.
|
|
1143
|
+
|
|
1144
|
+
This is also the smallest `i` such that ``self`` belongs
|
|
1145
|
+
to `F_i`. Hence, it does not depend on the basis of the
|
|
1146
|
+
parent of ``self``.
|
|
1147
|
+
|
|
1148
|
+
.. SEEALSO:: :meth:`homogeneous_degree`
|
|
1149
|
+
|
|
1150
|
+
EXAMPLES::
|
|
1151
|
+
|
|
1152
|
+
sage: # needs sage.modules
|
|
1153
|
+
sage: E.<x,y,z> = ExteriorAlgebra(QQ)
|
|
1154
|
+
sage: F = E.submodule([x + 1, x*y - 1])
|
|
1155
|
+
sage: B = F.basis()
|
|
1156
|
+
sage: [B[0].lift(), B[1].lift()]
|
|
1157
|
+
[-x*y + 1, x*y + x]
|
|
1158
|
+
sage: B[0].maximal_degree()
|
|
1159
|
+
2
|
|
1160
|
+
sage: B[1].maximal_degree()
|
|
1161
|
+
2
|
|
1162
|
+
"""
|
|
1163
|
+
return self.lift().maximal_degree()
|
|
1164
|
+
|
|
1165
|
+
class FiniteDimensional(CategoryWithAxiom_over_base_ring):
|
|
1166
|
+
class ParentMethods:
|
|
1167
|
+
def hilbert_series(self, prec=None):
|
|
1168
|
+
r"""
|
|
1169
|
+
Return the Hilbert series of ``self`` as a polynomial.
|
|
1170
|
+
|
|
1171
|
+
Let `R` be a commutative ring (with unit). Let
|
|
1172
|
+
`M = \bigcup_{n=0}^{\infty} M_n` be a filtered `R`-module.
|
|
1173
|
+
The *Hilbert series* of `M` is the formal power series
|
|
1174
|
+
|
|
1175
|
+
.. MATH::
|
|
1176
|
+
|
|
1177
|
+
H(t) = \sum_{n=0}^{\infty} \ell(M_n / M_{n-1}) t^n,
|
|
1178
|
+
|
|
1179
|
+
where `\ell(N)` is the *length* of `N`, which is the
|
|
1180
|
+
longest chain of submodules (over `R`), and by convention
|
|
1181
|
+
`M_{-1} = \{0\}`. By the assumptions of the category,
|
|
1182
|
+
`M_n / M_{n-1}` is a free `R`-module, and so
|
|
1183
|
+
`\ell(M_n / M_{n-1})` is equal to the rank of `M_n / M_{n-1}`.
|
|
1184
|
+
|
|
1185
|
+
EXAMPLES::
|
|
1186
|
+
|
|
1187
|
+
sage: # needs sage.geometry.polyhedron sage.graphs
|
|
1188
|
+
sage: OS = hyperplane_arrangements.braid(3).orlik_solomon_algebra(QQ)
|
|
1189
|
+
sage: OS.hilbert_series()
|
|
1190
|
+
2*t^2 + 3*t + 1
|
|
1191
|
+
|
|
1192
|
+
sage: # needs sage.combinat sage.modules
|
|
1193
|
+
sage: OS = matroids.Uniform(5, 3).orlik_solomon_algebra(ZZ)
|
|
1194
|
+
sage: OS.hilbert_series()
|
|
1195
|
+
t^3 + 3*t^2 + 3*t + 1
|
|
1196
|
+
|
|
1197
|
+
sage: # needs sage.combinat sage.modules
|
|
1198
|
+
sage: OS = matroids.PG(2, 3).orlik_solomon_algebra(ZZ['x','y'])
|
|
1199
|
+
sage: OS.hilbert_series()
|
|
1200
|
+
27*t^3 + 39*t^2 + 13*t + 1
|
|
1201
|
+
"""
|
|
1202
|
+
from collections import defaultdict
|
|
1203
|
+
from sage.rings.integer_ring import ZZ
|
|
1204
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
1205
|
+
PR = PolynomialRing(ZZ, 't')
|
|
1206
|
+
dims = defaultdict(ZZ)
|
|
1207
|
+
for b in self.basis():
|
|
1208
|
+
dims[b.homogeneous_degree()] += 1
|
|
1209
|
+
return PR(dims)
|