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,1206 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Simplicial Sets
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# Copyright (C) 2015 John H. Palmieri <palmieri at math.washington.edu>
|
|
7
|
+
#
|
|
8
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
9
|
+
# https://www.gnu.org/licenses/
|
|
10
|
+
# *****************************************************************************
|
|
11
|
+
|
|
12
|
+
from sage.categories.category_singleton import Category_singleton
|
|
13
|
+
from sage.categories.category_with_axiom import CategoryWithAxiom
|
|
14
|
+
from sage.categories.homsets import HomsetsCategory
|
|
15
|
+
from sage.categories.sets_cat import Sets
|
|
16
|
+
from sage.functions.generalized import sign
|
|
17
|
+
from sage.misc.cachefunc import cached_method
|
|
18
|
+
from sage.misc.lazy_import import lazy_import
|
|
19
|
+
from sage.misc.misc_c import prod
|
|
20
|
+
from sage.rings.infinity import Infinity
|
|
21
|
+
from sage.rings.integer import Integer
|
|
22
|
+
from sage.rings.integer_ring import ZZ
|
|
23
|
+
|
|
24
|
+
lazy_import('sage.matrix.constructor', 'matrix')
|
|
25
|
+
lazy_import('sage.matrix.special', 'identity_matrix')
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class SimplicialSets(Category_singleton):
|
|
29
|
+
r"""
|
|
30
|
+
The category of simplicial sets.
|
|
31
|
+
|
|
32
|
+
A simplicial set `X` is a collection of sets `X_i`, indexed by
|
|
33
|
+
the nonnegative integers, together with maps
|
|
34
|
+
|
|
35
|
+
.. math::
|
|
36
|
+
|
|
37
|
+
d_i: X_n \to X_{n-1}, \quad 0 \leq i \leq n \quad \text{(face maps)} \\
|
|
38
|
+
s_j: X_n \to X_{n+1}, \quad 0 \leq j \leq n \quad \text{(degeneracy maps)}
|
|
39
|
+
|
|
40
|
+
satisfying the *simplicial identities*:
|
|
41
|
+
|
|
42
|
+
.. math::
|
|
43
|
+
|
|
44
|
+
d_i d_j &= d_{j-1} d_i \quad \text{if } i<j \\
|
|
45
|
+
d_i s_j &= s_{j-1} d_i \quad \text{if } i<j \\
|
|
46
|
+
d_j s_j &= 1 = d_{j+1} s_j \\
|
|
47
|
+
d_i s_j &= s_{j} d_{i-1} \quad \text{if } i>j+1 \\
|
|
48
|
+
s_i s_j &= s_{j+1} s_{i} \quad \text{if } i \leq j
|
|
49
|
+
|
|
50
|
+
Morphisms are sequences of maps `f_i : X_i \to Y_i` which commute
|
|
51
|
+
with the face and degeneracy maps.
|
|
52
|
+
|
|
53
|
+
EXAMPLES::
|
|
54
|
+
|
|
55
|
+
sage: from sage.categories.simplicial_sets import SimplicialSets
|
|
56
|
+
sage: C = SimplicialSets(); C
|
|
57
|
+
Category of simplicial sets
|
|
58
|
+
|
|
59
|
+
TESTS::
|
|
60
|
+
|
|
61
|
+
sage: TestSuite(C).run()
|
|
62
|
+
"""
|
|
63
|
+
@cached_method
|
|
64
|
+
def super_categories(self):
|
|
65
|
+
"""
|
|
66
|
+
EXAMPLES::
|
|
67
|
+
|
|
68
|
+
sage: from sage.categories.simplicial_sets import SimplicialSets
|
|
69
|
+
sage: SimplicialSets().super_categories()
|
|
70
|
+
[Category of sets]
|
|
71
|
+
"""
|
|
72
|
+
return [Sets()]
|
|
73
|
+
|
|
74
|
+
class ParentMethods:
|
|
75
|
+
def is_finite(self):
|
|
76
|
+
"""
|
|
77
|
+
Return ``True`` if this simplicial set is finite, i.e., has a
|
|
78
|
+
finite number of nondegenerate simplices.
|
|
79
|
+
|
|
80
|
+
EXAMPLES::
|
|
81
|
+
|
|
82
|
+
sage: simplicial_sets.Torus().is_finite() # needs sage.graphs
|
|
83
|
+
True
|
|
84
|
+
sage: C5 = groups.misc.MultiplicativeAbelian([5]) # needs sage.graphs sage.groups
|
|
85
|
+
sage: simplicial_sets.ClassifyingSpace(C5).is_finite() # needs sage.graphs sage.groups
|
|
86
|
+
False
|
|
87
|
+
"""
|
|
88
|
+
return SimplicialSets.Finite() in self.categories()
|
|
89
|
+
|
|
90
|
+
def is_pointed(self):
|
|
91
|
+
"""
|
|
92
|
+
Return ``True`` if this simplicial set is pointed, i.e., has a
|
|
93
|
+
base point.
|
|
94
|
+
|
|
95
|
+
EXAMPLES::
|
|
96
|
+
|
|
97
|
+
sage: # needs sage.graphs
|
|
98
|
+
sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
|
|
99
|
+
sage: v = AbstractSimplex(0)
|
|
100
|
+
sage: w = AbstractSimplex(0)
|
|
101
|
+
sage: e = AbstractSimplex(1)
|
|
102
|
+
sage: X = SimplicialSet({e: (v, w)})
|
|
103
|
+
sage: Y = SimplicialSet({e: (v, w)}, base_point=w)
|
|
104
|
+
sage: X.is_pointed()
|
|
105
|
+
False
|
|
106
|
+
sage: Y.is_pointed()
|
|
107
|
+
True
|
|
108
|
+
"""
|
|
109
|
+
return SimplicialSets.Pointed() in self.categories()
|
|
110
|
+
|
|
111
|
+
def set_base_point(self, point):
|
|
112
|
+
"""
|
|
113
|
+
Return a copy of this simplicial set in which the base point is
|
|
114
|
+
set to ``point``.
|
|
115
|
+
|
|
116
|
+
INPUT:
|
|
117
|
+
|
|
118
|
+
- ``point`` -- a 0-simplex in this simplicial set
|
|
119
|
+
|
|
120
|
+
EXAMPLES::
|
|
121
|
+
|
|
122
|
+
sage: # needs sage.graphs
|
|
123
|
+
sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
|
|
124
|
+
sage: v = AbstractSimplex(0, name='v_0')
|
|
125
|
+
sage: w = AbstractSimplex(0, name='w_0')
|
|
126
|
+
sage: e = AbstractSimplex(1)
|
|
127
|
+
sage: X = SimplicialSet({e: (v, w)})
|
|
128
|
+
sage: Y = SimplicialSet({e: (v, w)}, base_point=w)
|
|
129
|
+
sage: Y.base_point()
|
|
130
|
+
w_0
|
|
131
|
+
sage: X_star = X.set_base_point(w)
|
|
132
|
+
sage: X_star.base_point()
|
|
133
|
+
w_0
|
|
134
|
+
sage: Y_star = Y.set_base_point(v)
|
|
135
|
+
sage: Y_star.base_point()
|
|
136
|
+
v_0
|
|
137
|
+
|
|
138
|
+
TESTS::
|
|
139
|
+
|
|
140
|
+
sage: X.set_base_point(e) # needs sage.graphs
|
|
141
|
+
Traceback (most recent call last):
|
|
142
|
+
...
|
|
143
|
+
ValueError: the "point" is not a zero-simplex
|
|
144
|
+
sage: pt = AbstractSimplex(0) # needs sage.graphs
|
|
145
|
+
sage: X.set_base_point(pt) # needs sage.graphs
|
|
146
|
+
Traceback (most recent call last):
|
|
147
|
+
...
|
|
148
|
+
ValueError: the point is not a simplex in this simplicial set
|
|
149
|
+
"""
|
|
150
|
+
from sage.topology.simplicial_set import SimplicialSet
|
|
151
|
+
if point.dimension() != 0:
|
|
152
|
+
raise ValueError('the "point" is not a zero-simplex')
|
|
153
|
+
if point not in self._simplices:
|
|
154
|
+
raise ValueError('the point is not a simplex in this '
|
|
155
|
+
'simplicial set')
|
|
156
|
+
return SimplicialSet(self.face_data(), base_point=point)
|
|
157
|
+
|
|
158
|
+
class Homsets(HomsetsCategory):
|
|
159
|
+
class Endset(CategoryWithAxiom):
|
|
160
|
+
class ParentMethods:
|
|
161
|
+
def one(self):
|
|
162
|
+
r"""
|
|
163
|
+
Return the identity morphism in `\operatorname{Hom}(S, S)`.
|
|
164
|
+
|
|
165
|
+
EXAMPLES::
|
|
166
|
+
|
|
167
|
+
sage: T = simplicial_sets.Torus() # needs sage.graphs
|
|
168
|
+
sage: Hom(T, T).identity() # needs sage.graphs
|
|
169
|
+
Simplicial set endomorphism of Torus
|
|
170
|
+
Defn: Identity map
|
|
171
|
+
"""
|
|
172
|
+
from sage.topology.simplicial_set_morphism import SimplicialSetMorphism
|
|
173
|
+
return SimplicialSetMorphism(domain=self.domain(),
|
|
174
|
+
codomain=self.codomain(),
|
|
175
|
+
identity=True)
|
|
176
|
+
|
|
177
|
+
class Finite(CategoryWithAxiom):
|
|
178
|
+
"""
|
|
179
|
+
Category of finite simplicial sets.
|
|
180
|
+
|
|
181
|
+
The objects are simplicial sets with finitely many
|
|
182
|
+
non-degenerate simplices.
|
|
183
|
+
"""
|
|
184
|
+
pass
|
|
185
|
+
|
|
186
|
+
class SubcategoryMethods:
|
|
187
|
+
def Pointed(self):
|
|
188
|
+
"""
|
|
189
|
+
A simplicial set is *pointed* if it has a distinguished base
|
|
190
|
+
point.
|
|
191
|
+
|
|
192
|
+
EXAMPLES::
|
|
193
|
+
|
|
194
|
+
sage: from sage.categories.simplicial_sets import SimplicialSets
|
|
195
|
+
sage: SimplicialSets().Pointed().Finite()
|
|
196
|
+
Category of finite pointed simplicial sets
|
|
197
|
+
sage: SimplicialSets().Finite().Pointed()
|
|
198
|
+
Category of finite pointed simplicial sets
|
|
199
|
+
"""
|
|
200
|
+
return self._with_axiom("Pointed")
|
|
201
|
+
|
|
202
|
+
class Pointed(CategoryWithAxiom):
|
|
203
|
+
class ParentMethods:
|
|
204
|
+
def base_point(self):
|
|
205
|
+
"""
|
|
206
|
+
Return this simplicial set's base point.
|
|
207
|
+
|
|
208
|
+
EXAMPLES::
|
|
209
|
+
|
|
210
|
+
sage: # needs sage.graphs
|
|
211
|
+
sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
|
|
212
|
+
sage: v = AbstractSimplex(0, name='*')
|
|
213
|
+
sage: e = AbstractSimplex(1)
|
|
214
|
+
sage: S1 = SimplicialSet({e: (v, v)}, base_point=v)
|
|
215
|
+
sage: S1.is_pointed()
|
|
216
|
+
True
|
|
217
|
+
sage: S1.base_point()
|
|
218
|
+
*
|
|
219
|
+
"""
|
|
220
|
+
return self._basepoint
|
|
221
|
+
|
|
222
|
+
def base_point_map(self, domain=None):
|
|
223
|
+
"""
|
|
224
|
+
Return a map from a one-point space to this one, with image the
|
|
225
|
+
base point.
|
|
226
|
+
|
|
227
|
+
This raises an error if this simplicial set does not have a
|
|
228
|
+
base point.
|
|
229
|
+
|
|
230
|
+
INPUT:
|
|
231
|
+
|
|
232
|
+
- ``domain`` -- (default: ``None``) use this to specify a
|
|
233
|
+
particular one-point space as the domain. The default
|
|
234
|
+
behavior is to use the
|
|
235
|
+
:func:`sage.topology.simplicial_set.Point` function to use a
|
|
236
|
+
standard one-point space.
|
|
237
|
+
|
|
238
|
+
EXAMPLES::
|
|
239
|
+
|
|
240
|
+
sage: # needs sage.graphs
|
|
241
|
+
sage: T = simplicial_sets.Torus()
|
|
242
|
+
sage: f = T.base_point_map(); f
|
|
243
|
+
Simplicial set morphism:
|
|
244
|
+
From: Point
|
|
245
|
+
To: Torus
|
|
246
|
+
Defn: Constant map at (v_0, v_0)
|
|
247
|
+
sage: S3 = simplicial_sets.Sphere(3)
|
|
248
|
+
sage: g = S3.base_point_map()
|
|
249
|
+
sage: f.domain() == g.domain()
|
|
250
|
+
True
|
|
251
|
+
sage: RP3 = simplicial_sets.RealProjectiveSpace(3) # needs sage.groups
|
|
252
|
+
sage: temp = simplicial_sets.Simplex(0)
|
|
253
|
+
sage: pt = temp.set_base_point(temp.n_cells(0)[0])
|
|
254
|
+
sage: h = RP3.base_point_map(domain=pt) # needs sage.groups
|
|
255
|
+
sage: f.domain() == h.domain() # needs sage.groups
|
|
256
|
+
False
|
|
257
|
+
|
|
258
|
+
sage: C5 = groups.misc.MultiplicativeAbelian([5]) # needs sage.graphs sage.groups
|
|
259
|
+
sage: BC5 = simplicial_sets.ClassifyingSpace(C5) # needs sage.graphs sage.groups
|
|
260
|
+
sage: BC5.base_point_map() # needs sage.graphs sage.groups
|
|
261
|
+
Simplicial set morphism:
|
|
262
|
+
From: Point
|
|
263
|
+
To: Classifying space of Multiplicative Abelian group isomorphic to C5
|
|
264
|
+
Defn: Constant map at 1
|
|
265
|
+
"""
|
|
266
|
+
from sage.topology.simplicial_set_examples import Point
|
|
267
|
+
if domain is None:
|
|
268
|
+
domain = Point()
|
|
269
|
+
else:
|
|
270
|
+
if len(domain._simplices) > 1:
|
|
271
|
+
raise ValueError('domain has more than one nondegenerate simplex')
|
|
272
|
+
target = self.base_point()
|
|
273
|
+
return domain.Hom(self).constant_map(point=target)
|
|
274
|
+
|
|
275
|
+
def fundamental_group(self, simplify=True):
|
|
276
|
+
r"""
|
|
277
|
+
Return the fundamental group of this pointed simplicial set.
|
|
278
|
+
|
|
279
|
+
INPUT:
|
|
280
|
+
|
|
281
|
+
- ``simplify`` -- boolean (default: ``True``); if
|
|
282
|
+
``False``, then return a presentation of the group
|
|
283
|
+
in terms of generators and relations. If ``True``,
|
|
284
|
+
the default, simplify as much as GAP is able to.
|
|
285
|
+
|
|
286
|
+
Algorithm: we compute the edge-path group -- see
|
|
287
|
+
Section 19 of [Kan1958]_ and
|
|
288
|
+
:wikipedia:`Fundamental_group`. Choose a spanning tree
|
|
289
|
+
for the connected component of the 1-skeleton
|
|
290
|
+
containing the base point, and then the group's
|
|
291
|
+
generators are given by the non-degenerate
|
|
292
|
+
edges. There are two types of relations: `e=1` if `e`
|
|
293
|
+
is in the spanning tree, and for every 2-simplex, if
|
|
294
|
+
its faces are `e_0`, `e_1`, and `e_2`, then we impose
|
|
295
|
+
the relation `e_0 e_1^{-1} e_2 = 1`, where we first
|
|
296
|
+
set `e_i=1` if `e_i` is degenerate.
|
|
297
|
+
|
|
298
|
+
EXAMPLES::
|
|
299
|
+
|
|
300
|
+
sage: S1 = simplicial_sets.Sphere(1) # needs sage.graphs
|
|
301
|
+
sage: eight = S1.wedge(S1) # needs sage.graphs
|
|
302
|
+
sage: eight.fundamental_group() # free group on 2 generators # needs sage.graphs sage.groups
|
|
303
|
+
Finitely presented group < e0, e1 | >
|
|
304
|
+
|
|
305
|
+
The fundamental group of a disjoint union of course depends on
|
|
306
|
+
the choice of base point::
|
|
307
|
+
|
|
308
|
+
sage: T = simplicial_sets.Torus() # needs sage.graphs
|
|
309
|
+
sage: K = simplicial_sets.KleinBottle() # needs sage.graphs
|
|
310
|
+
sage: X = T.disjoint_union(K) # needs sage.graphs
|
|
311
|
+
|
|
312
|
+
sage: # needs sage.graphs
|
|
313
|
+
sage: X_0 = X.set_base_point(X.n_cells(0)[0])
|
|
314
|
+
sage: X_0.fundamental_group().is_abelian() # needs sage.groups
|
|
315
|
+
True
|
|
316
|
+
sage: X_1 = X.set_base_point(X.n_cells(0)[1])
|
|
317
|
+
sage: X_1.fundamental_group().is_abelian() # needs sage.groups
|
|
318
|
+
False
|
|
319
|
+
|
|
320
|
+
sage: RP3 = simplicial_sets.RealProjectiveSpace(3) # needs sage.graphs sage.groups
|
|
321
|
+
sage: RP3.fundamental_group() # needs sage.graphs sage.groups
|
|
322
|
+
Finitely presented group < e | e^2 >
|
|
323
|
+
|
|
324
|
+
Compute the fundamental group of some classifying spaces::
|
|
325
|
+
|
|
326
|
+
sage: C5 = groups.misc.MultiplicativeAbelian([5]) # needs sage.graphs sage.groups
|
|
327
|
+
sage: BC5 = C5.nerve() # needs sage.graphs sage.groups
|
|
328
|
+
sage: BC5.fundamental_group() # needs sage.graphs sage.groups
|
|
329
|
+
Finitely presented group < e0 | e0^5 >
|
|
330
|
+
|
|
331
|
+
sage: # needs sage.graphs sage.groups
|
|
332
|
+
sage: Sigma3 = groups.permutation.Symmetric(3)
|
|
333
|
+
sage: BSigma3 = Sigma3.nerve()
|
|
334
|
+
sage: pi = BSigma3.fundamental_group(); pi
|
|
335
|
+
Finitely presented group < e1, e2 | e2^2, e1^3, (e2*e1)^2 >
|
|
336
|
+
sage: pi.order()
|
|
337
|
+
6
|
|
338
|
+
sage: pi.is_abelian()
|
|
339
|
+
False
|
|
340
|
+
|
|
341
|
+
The sphere has a trivial fundamental group::
|
|
342
|
+
|
|
343
|
+
sage: S2 = simplicial_sets.Sphere(2) # needs sage.graphs
|
|
344
|
+
sage: S2.fundamental_group() # needs sage.graphs sage.groups
|
|
345
|
+
Finitely presented group < | >
|
|
346
|
+
"""
|
|
347
|
+
# Import this here to prevent importing libgap upon startup.
|
|
348
|
+
from sage.groups.free_group import FreeGroup
|
|
349
|
+
if not self.n_cells(1):
|
|
350
|
+
return FreeGroup([]).quotient([])
|
|
351
|
+
FG = self._universal_cover_dict()[0]
|
|
352
|
+
if simplify:
|
|
353
|
+
return FG.simplified()
|
|
354
|
+
else:
|
|
355
|
+
return FG
|
|
356
|
+
|
|
357
|
+
def _universal_cover_dict(self):
|
|
358
|
+
r"""
|
|
359
|
+
Return the fundamental group and dictionary sending each edge to
|
|
360
|
+
the corresponding group element
|
|
361
|
+
|
|
362
|
+
TESTS::
|
|
363
|
+
|
|
364
|
+
sage: RP2 = simplicial_sets.RealProjectiveSpace(2) # needs sage.graphs sage.groups
|
|
365
|
+
sage: RP2._universal_cover_dict() # needs sage.graphs sage.groups
|
|
366
|
+
(Finitely presented group < e | e^2 >, {f: e})
|
|
367
|
+
sage: RP2.nondegenerate_simplices() # needs sage.graphs sage.groups
|
|
368
|
+
[1, f, f * f]
|
|
369
|
+
"""
|
|
370
|
+
from sage.groups.free_group import FreeGroup
|
|
371
|
+
graph = self.graph()
|
|
372
|
+
if not self.is_connected():
|
|
373
|
+
graph = graph.subgraph(self.base_point())
|
|
374
|
+
edges = [e[2] for e in graph.edges(sort=False)]
|
|
375
|
+
spanning_tree = [e[2] for e in graph.min_spanning_tree()]
|
|
376
|
+
gens = [e for e in edges if e not in spanning_tree]
|
|
377
|
+
gens_dict = dict(zip(gens, range(len(gens))))
|
|
378
|
+
FG = FreeGroup(len(gens), 'e')
|
|
379
|
+
rels = []
|
|
380
|
+
|
|
381
|
+
for f in self.n_cells(2):
|
|
382
|
+
z = {}
|
|
383
|
+
for i, sigma in enumerate(self.faces(f)):
|
|
384
|
+
if sigma in spanning_tree:
|
|
385
|
+
z[i] = FG.one()
|
|
386
|
+
elif sigma.is_degenerate():
|
|
387
|
+
z[i] = FG.one()
|
|
388
|
+
elif sigma in edges:
|
|
389
|
+
z[i] = FG.gen(gens_dict[sigma])
|
|
390
|
+
else:
|
|
391
|
+
# sigma is not in the correct connected component.
|
|
392
|
+
z[i] = FG.one()
|
|
393
|
+
rels.append(z[0]*z[1].inverse()*z[2])
|
|
394
|
+
G = FG.quotient(rels)
|
|
395
|
+
char = {g: G.gen(i) for i, g in enumerate(gens)}
|
|
396
|
+
for e in edges:
|
|
397
|
+
if e not in gens:
|
|
398
|
+
char[e] = G.one()
|
|
399
|
+
return (G, char)
|
|
400
|
+
|
|
401
|
+
def universal_cover_map(self):
|
|
402
|
+
r"""
|
|
403
|
+
Return the universal covering map of the simplicial set.
|
|
404
|
+
|
|
405
|
+
It requires the fundamental group to be finite.
|
|
406
|
+
|
|
407
|
+
EXAMPLES::
|
|
408
|
+
|
|
409
|
+
sage: RP2 = simplicial_sets.RealProjectiveSpace(2) # needs sage.graphs sage.groups
|
|
410
|
+
sage: phi = RP2.universal_cover_map(); phi # needs sage.graphs sage.groups gap_package_polenta
|
|
411
|
+
Simplicial set morphism:
|
|
412
|
+
From: Simplicial set with 6 non-degenerate simplices
|
|
413
|
+
To: RP^2
|
|
414
|
+
Defn: [(1, 1), (1, e), (f, 1), (f, e), (f * f, 1), (f * f, e)]
|
|
415
|
+
--> [1, 1, f, f, f * f, f * f]
|
|
416
|
+
sage: phi.domain().face_data() # needs sage.graphs sage.groups gap_package_polenta
|
|
417
|
+
{(1, 1): None,
|
|
418
|
+
(1, e): None,
|
|
419
|
+
(f, 1): ((1, e), (1, 1)),
|
|
420
|
+
(f, e): ((1, 1), (1, e)),
|
|
421
|
+
(f * f, 1): ((f, e), s_0 (1, 1), (f, 1)),
|
|
422
|
+
(f * f, e): ((f, 1), s_0 (1, e), (f, e))}
|
|
423
|
+
"""
|
|
424
|
+
edges = self.n_cells(1)
|
|
425
|
+
if not edges:
|
|
426
|
+
return self.identity()
|
|
427
|
+
G, char = self._universal_cover_dict()
|
|
428
|
+
return self.covering_map(char)
|
|
429
|
+
|
|
430
|
+
def covering_map(self, character):
|
|
431
|
+
r"""
|
|
432
|
+
Return the covering map associated to a character.
|
|
433
|
+
|
|
434
|
+
The character is represented by a dictionary that assigns an
|
|
435
|
+
element of a finite group to each nondegenerate 1-dimensional
|
|
436
|
+
cell. It should correspond to an epimorphism from the fundamental
|
|
437
|
+
group.
|
|
438
|
+
|
|
439
|
+
INPUT:
|
|
440
|
+
|
|
441
|
+
- ``character`` -- dictionary
|
|
442
|
+
|
|
443
|
+
EXAMPLES::
|
|
444
|
+
|
|
445
|
+
sage: # needs sage.graphs sage.groups
|
|
446
|
+
sage: S1 = simplicial_sets.Sphere(1)
|
|
447
|
+
sage: S1_ = simplicial_sets.Sphere(1)
|
|
448
|
+
sage: S1_.n_cells(1)[0].rename("sigma_1'")
|
|
449
|
+
sage: W = S1.wedge(S1_)
|
|
450
|
+
sage: G = CyclicPermutationGroup(3)
|
|
451
|
+
sage: a, b = W.n_cells(1)
|
|
452
|
+
sage: C = W.covering_map({a : G.gen(0), b : G.one()}); C
|
|
453
|
+
Simplicial set morphism:
|
|
454
|
+
From: Simplicial set with 9 non-degenerate simplices
|
|
455
|
+
To: Wedge: (S^1 v S^1)
|
|
456
|
+
Defn: [(*, ()), (*, (1,2,3)), (*, (1,3,2)), (sigma_1', ()),
|
|
457
|
+
(sigma_1', (1,2,3)), (sigma_1', (1,3,2)), (sigma_1, ()),
|
|
458
|
+
(sigma_1, (1,2,3)), (sigma_1, (1,3,2))]
|
|
459
|
+
--> [*, *, *, sigma_1', sigma_1', sigma_1', sigma_1, sigma_1, sigma_1]
|
|
460
|
+
sage: C.domain()
|
|
461
|
+
Simplicial set with 9 non-degenerate simplices
|
|
462
|
+
sage: C.domain().face_data()
|
|
463
|
+
{(*, ()): None,
|
|
464
|
+
(*, (1,2,3)): None,
|
|
465
|
+
(*, (1,3,2)): None,
|
|
466
|
+
(sigma_1', ()): ((*, ()), (*, ())),
|
|
467
|
+
(sigma_1', (1,2,3)): ((*, (1,2,3)), (*, (1,2,3))),
|
|
468
|
+
(sigma_1', (1,3,2)): ((*, (1,3,2)), (*, (1,3,2))),
|
|
469
|
+
(sigma_1, ()): ((*, (1,2,3)), (*, ())),
|
|
470
|
+
(sigma_1, (1,2,3)): ((*, (1,3,2)), (*, (1,2,3))),
|
|
471
|
+
(sigma_1, (1,3,2)): ((*, ()), (*, (1,3,2)))}
|
|
472
|
+
"""
|
|
473
|
+
from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
|
|
474
|
+
from sage.topology.simplicial_set_morphism import SimplicialSetMorphism
|
|
475
|
+
char = dict(character.items())
|
|
476
|
+
G = list(char.values())[0].parent()
|
|
477
|
+
if not G.is_finite():
|
|
478
|
+
raise NotImplementedError("can only compute universal covers of spaces with finite fundamental group")
|
|
479
|
+
cells_dict = {}
|
|
480
|
+
faces_dict = {}
|
|
481
|
+
|
|
482
|
+
for s in self.n_cells(0):
|
|
483
|
+
for g in G:
|
|
484
|
+
cell = AbstractSimplex(0, name="({}, {})".format(s, g))
|
|
485
|
+
cells_dict[(s, g)] = cell
|
|
486
|
+
char[s] = G.one()
|
|
487
|
+
|
|
488
|
+
for d in range(1, self.dimension() + 1):
|
|
489
|
+
for s in self.all_n_simplices(d):
|
|
490
|
+
if s not in char.keys():
|
|
491
|
+
if d == 1 and s.is_degenerate():
|
|
492
|
+
char[s] = G.one()
|
|
493
|
+
elif s.is_degenerate():
|
|
494
|
+
if 0 in s.degeneracies():
|
|
495
|
+
char[s] = G.one()
|
|
496
|
+
else:
|
|
497
|
+
char[s] = char[s.nondegenerate()]
|
|
498
|
+
else:
|
|
499
|
+
char[s] = char[self.face(s, d)]
|
|
500
|
+
if s.is_nondegenerate():
|
|
501
|
+
for g in G:
|
|
502
|
+
cell = AbstractSimplex(d, name="({}, {})".format(s, g))
|
|
503
|
+
cells_dict[(s, g)] = cell
|
|
504
|
+
faces = self.faces(s)
|
|
505
|
+
f0 = faces[0]
|
|
506
|
+
for h in G:
|
|
507
|
+
if h == g*char[s]:
|
|
508
|
+
lifted = h
|
|
509
|
+
break
|
|
510
|
+
grelems = [cells_dict[(f0.nondegenerate(), lifted)].apply_degeneracies(*f0.degeneracies())]
|
|
511
|
+
grelems.extend(cells_dict[(f.nondegenerate(), g)].apply_degeneracies(*f.degeneracies()) for f in faces[1:])
|
|
512
|
+
faces_dict[cell] = grelems
|
|
513
|
+
cover = SimplicialSet(faces_dict, base_point=cells_dict[(self.base_point(), G.one())])
|
|
514
|
+
cover_map_data = {c: s[0] for (s, c) in cells_dict.items()}
|
|
515
|
+
return SimplicialSetMorphism(data=cover_map_data, domain=cover, codomain=self)
|
|
516
|
+
|
|
517
|
+
def cover(self, character):
|
|
518
|
+
r"""
|
|
519
|
+
Return the cover of the simplicial set associated to a character
|
|
520
|
+
of the fundamental group.
|
|
521
|
+
|
|
522
|
+
The character is represented by a dictionary, that assigns an
|
|
523
|
+
element of a finite group to each nondegenerate 1-dimensional
|
|
524
|
+
cell. It should correspond to an epimorphism from the fundamental
|
|
525
|
+
group.
|
|
526
|
+
|
|
527
|
+
INPUT:
|
|
528
|
+
|
|
529
|
+
- ``character`` -- dictionary
|
|
530
|
+
|
|
531
|
+
EXAMPLES::
|
|
532
|
+
|
|
533
|
+
sage: # needs sage.graphs sage.groups
|
|
534
|
+
sage: S1 = simplicial_sets.Sphere(1)
|
|
535
|
+
sage: S1_ = simplicial_sets.Sphere(1)
|
|
536
|
+
sage: S1_.n_cells(1)[0].rename("sigma_1'")
|
|
537
|
+
sage: W = S1.wedge(S1_)
|
|
538
|
+
sage: G = CyclicPermutationGroup(3)
|
|
539
|
+
sage: (a, b) = W.n_cells(1)
|
|
540
|
+
sage: C = W.cover({a : G.gen(0), b : G.gen(0)^2})
|
|
541
|
+
sage: C.face_data()
|
|
542
|
+
{(*, ()): None,
|
|
543
|
+
(*, (1,2,3)): None,
|
|
544
|
+
(*, (1,3,2)): None,
|
|
545
|
+
(sigma_1', ()): ((*, (1,3,2)), (*, ())),
|
|
546
|
+
(sigma_1', (1,2,3)): ((*, ()), (*, (1,2,3))),
|
|
547
|
+
(sigma_1', (1,3,2)): ((*, (1,2,3)), (*, (1,3,2))),
|
|
548
|
+
(sigma_1, ()): ((*, (1,2,3)), (*, ())),
|
|
549
|
+
(sigma_1, (1,2,3)): ((*, (1,3,2)), (*, (1,2,3))),
|
|
550
|
+
(sigma_1, (1,3,2)): ((*, ()), (*, (1,3,2)))}
|
|
551
|
+
sage: C.homology(1) # needs sage.modules
|
|
552
|
+
Z x Z x Z x Z
|
|
553
|
+
sage: C.fundamental_group()
|
|
554
|
+
Finitely presented group < e0, e1, e2, e3 | >
|
|
555
|
+
"""
|
|
556
|
+
return self.covering_map(character).domain()
|
|
557
|
+
|
|
558
|
+
def universal_cover(self):
|
|
559
|
+
r"""
|
|
560
|
+
Return the universal cover of the simplicial set.
|
|
561
|
+
The fundamental group must be finite in order to ensure that the
|
|
562
|
+
universal cover is a simplicial set of finite type.
|
|
563
|
+
|
|
564
|
+
EXAMPLES::
|
|
565
|
+
|
|
566
|
+
sage: # needs sage.graphs sage.groups
|
|
567
|
+
sage: RP3 = simplicial_sets.RealProjectiveSpace(3)
|
|
568
|
+
sage: C = RP3.universal_cover(); C
|
|
569
|
+
Simplicial set with 8 non-degenerate simplices
|
|
570
|
+
sage: C.face_data() # needs gap_package_polenta
|
|
571
|
+
{(1, 1): None,
|
|
572
|
+
(1, e): None,
|
|
573
|
+
(f, 1): ((1, e), (1, 1)),
|
|
574
|
+
(f, e): ((1, 1), (1, e)),
|
|
575
|
+
(f * f, 1): ((f, e), s_0 (1, 1), (f, 1)),
|
|
576
|
+
(f * f, e): ((f, 1), s_0 (1, e), (f, e)),
|
|
577
|
+
(f * f * f, 1): ((f * f, e), s_0 (f, 1), s_1 (f, 1), (f * f, 1)),
|
|
578
|
+
(f * f * f, e): ((f * f, 1), s_0 (f, e), s_1 (f, e), (f * f, e))}
|
|
579
|
+
sage: C.fundamental_group()
|
|
580
|
+
Finitely presented group < | >
|
|
581
|
+
|
|
582
|
+
TESTS::
|
|
583
|
+
|
|
584
|
+
sage: # needs sage.graphs sage.groups
|
|
585
|
+
sage: RP2 = simplicial_sets.RealProjectiveSpace(2)
|
|
586
|
+
sage: S3 = simplicial_sets.Sphere(3)
|
|
587
|
+
sage: X = S3.wedge(RP2)
|
|
588
|
+
sage: XU = X.universal_cover()
|
|
589
|
+
sage: [XU.homology(i) for i in range(5)]
|
|
590
|
+
[0, 0, Z, Z x Z, 0]
|
|
591
|
+
|
|
592
|
+
"""
|
|
593
|
+
return self.universal_cover_map().domain()
|
|
594
|
+
|
|
595
|
+
def _canonical_twisting_operator(self):
|
|
596
|
+
r"""
|
|
597
|
+
The canonical twisting operator corresponds to the abelianization of the fundamental
|
|
598
|
+
group. It assigns each edge to the corresponding element in the algebra of the
|
|
599
|
+
abelianization of the fundamental group, which is a quotient of a Laurent polynomial
|
|
600
|
+
ring.
|
|
601
|
+
|
|
602
|
+
EXAMPLES::
|
|
603
|
+
|
|
604
|
+
sage: # needs sage.combinat sage.graphs sage.groups
|
|
605
|
+
sage: X = simplicial_sets.Torus()
|
|
606
|
+
sage: d = X._canonical_twisting_operator()
|
|
607
|
+
sage: d
|
|
608
|
+
{(s_0 v_0, sigma_1): f2, (sigma_1, s_0 v_0): f1*f2^-1, (sigma_1, sigma_1): f1}
|
|
609
|
+
sage: list(d.values())[0].parent()
|
|
610
|
+
Multivariate Laurent Polynomial Ring in f1, f2 over Integer Ring
|
|
611
|
+
sage: Y = simplicial_sets.RealProjectiveSpace(2)
|
|
612
|
+
sage: d2 = Y._canonical_twisting_operator()
|
|
613
|
+
sage: d2
|
|
614
|
+
{f: F1bar}
|
|
615
|
+
sage: list(d2.values())[0].parent()
|
|
616
|
+
Quotient of Univariate Laurent Polynomial Ring in F1 over Integer Ring by the ideal (-1 + F1^2)
|
|
617
|
+
"""
|
|
618
|
+
G, d = self._universal_cover_dict()
|
|
619
|
+
abelG, R, I, images = G.abelianization_to_algebra(ZZ)
|
|
620
|
+
QRP = R.quotient_ring(I)
|
|
621
|
+
res = {}
|
|
622
|
+
for s, el in d.items():
|
|
623
|
+
res[s] = QRP(prod(images[abs(a)-1]**sign(a) for a in el.Tietze()))
|
|
624
|
+
return res
|
|
625
|
+
|
|
626
|
+
def twisted_chain_complex(self, twisting_operator=None, dimensions=None, augmented=False,
|
|
627
|
+
cochain=False, verbose=False, subcomplex=None,
|
|
628
|
+
check=False):
|
|
629
|
+
r"""
|
|
630
|
+
Return the normalized chain complex twisted by some operator.
|
|
631
|
+
|
|
632
|
+
A twisting operator is a map from the set of simplices to some algebra.
|
|
633
|
+
The differentials are then twisted by this operator.
|
|
634
|
+
|
|
635
|
+
INPUT:
|
|
636
|
+
|
|
637
|
+
- ``twisting_operator`` -- dictionary, associating the twist of each
|
|
638
|
+
simplex. If it is not given, the canonical one (associated to the
|
|
639
|
+
laurent polynomial ring abelianization of the fundamental group, ignoring
|
|
640
|
+
torsion) is used.
|
|
641
|
+
|
|
642
|
+
- ``dimensions`` -- if ``None``, compute the chain complex in all
|
|
643
|
+
dimensions. If a list or tuple of integers, compute the
|
|
644
|
+
chain complex in those dimensions, setting the chain groups
|
|
645
|
+
in all other dimensions to zero.
|
|
646
|
+
|
|
647
|
+
- ``augmented`` -- boolean (default: ``False``); if ``True``,
|
|
648
|
+
return the augmented chain complex (that is, include a class
|
|
649
|
+
in dimension `-1` corresponding to the empty cell).
|
|
650
|
+
|
|
651
|
+
- ``cochain`` -- boolean (default: ``False``); if ``True``,
|
|
652
|
+
return the cochain complex (that is, the dual of the chain
|
|
653
|
+
complex).
|
|
654
|
+
|
|
655
|
+
- ``verbose`` -- boolean (default: ``False``); ignored
|
|
656
|
+
|
|
657
|
+
- ``subcomplex`` -- (default: ``None``) if present,
|
|
658
|
+
compute the chain complex relative to this subcomplex
|
|
659
|
+
|
|
660
|
+
- ``check`` -- boolean (default: ``False``); if ``True``, make
|
|
661
|
+
sure that the chain complex is actually a chain complex:
|
|
662
|
+
the differentials are composable and their product is zero.
|
|
663
|
+
|
|
664
|
+
The normalized chain complex of a simplicial set is isomorphic
|
|
665
|
+
to the chain complex obtained by modding out by degenerate
|
|
666
|
+
simplices, and the latter is what is actually constructed
|
|
667
|
+
here.
|
|
668
|
+
|
|
669
|
+
EXAMPLES::
|
|
670
|
+
|
|
671
|
+
sage: # needs sage.graphs sage.modules
|
|
672
|
+
sage: W = simplicial_sets.Sphere(1).wedge(simplicial_sets.Sphere(2))
|
|
673
|
+
sage: W.nondegenerate_simplices()
|
|
674
|
+
[*, sigma_1, sigma_2]
|
|
675
|
+
sage: s1 = W.nondegenerate_simplices()[1]
|
|
676
|
+
sage: L.<t> = LaurentPolynomialRing(QQ)
|
|
677
|
+
sage: tw = {s1:t}
|
|
678
|
+
sage: ChC = W.twisted_chain_complex(tw)
|
|
679
|
+
sage: ChC.differential(1)
|
|
680
|
+
[-1 + t]
|
|
681
|
+
sage: ChC.differential(2)
|
|
682
|
+
[0]
|
|
683
|
+
|
|
684
|
+
::
|
|
685
|
+
|
|
686
|
+
sage: # needs sage.combinat sage.graphs sage.groups
|
|
687
|
+
sage: X = simplicial_sets.Torus()
|
|
688
|
+
sage: C = X.twisted_chain_complex()
|
|
689
|
+
sage: C.differential(1)
|
|
690
|
+
[ f2 - 1 f1*f2^-1 - 1 f1 - 1]
|
|
691
|
+
sage: C.differential(2)
|
|
692
|
+
[ 1 f1*f2^-1]
|
|
693
|
+
[ f2 1]
|
|
694
|
+
[ -1 -1]
|
|
695
|
+
sage: C.differential(3)
|
|
696
|
+
[]
|
|
697
|
+
|
|
698
|
+
::
|
|
699
|
+
|
|
700
|
+
sage: # needs sage.combinat sage.graphs sage.modules
|
|
701
|
+
sage: Y = simplicial_sets.RealProjectiveSpace(2)
|
|
702
|
+
sage: C = Y.twisted_chain_complex()
|
|
703
|
+
sage: C.differential(1)
|
|
704
|
+
[-1 + F1]
|
|
705
|
+
sage: C.differential(2)
|
|
706
|
+
[1 + F1]
|
|
707
|
+
sage: C.differential(3)
|
|
708
|
+
[]
|
|
709
|
+
"""
|
|
710
|
+
from sage.homology.chain_complex import ChainComplex
|
|
711
|
+
from sage.structure.element import get_coercion_model
|
|
712
|
+
cm = get_coercion_model()
|
|
713
|
+
|
|
714
|
+
if twisting_operator:
|
|
715
|
+
twop = twisting_operator
|
|
716
|
+
else:
|
|
717
|
+
di = self._canonical_twisting_operator()
|
|
718
|
+
if hasattr(list(di.values())[0], "lift"):
|
|
719
|
+
twop = {a: b.lift() for a, b in di.items()}
|
|
720
|
+
else:
|
|
721
|
+
twop = di
|
|
722
|
+
|
|
723
|
+
def twist(s):
|
|
724
|
+
if s in twop:
|
|
725
|
+
return twop[s]
|
|
726
|
+
if s.dimension() > 1:
|
|
727
|
+
return twist(self.face(s, s.dimension()))
|
|
728
|
+
return 1
|
|
729
|
+
base_ring = cm.common_parent(*twop.values())
|
|
730
|
+
|
|
731
|
+
if dimensions is None:
|
|
732
|
+
if not self.cells(): # Empty
|
|
733
|
+
if cochain:
|
|
734
|
+
return ChainComplex({-1: matrix(base_ring, 0, 0)},
|
|
735
|
+
degree_of_differential=1)
|
|
736
|
+
return ChainComplex({0: matrix(base_ring, 0, 0)},
|
|
737
|
+
degree_of_differential=-1)
|
|
738
|
+
dimensions = list(range(self.dimension() + 1))
|
|
739
|
+
else:
|
|
740
|
+
if not isinstance(dimensions, (list, tuple, range)):
|
|
741
|
+
dimensions = list(range(dimensions - 1, dimensions + 2))
|
|
742
|
+
else:
|
|
743
|
+
dimensions = [n for n in dimensions if n >= 0]
|
|
744
|
+
if not dimensions:
|
|
745
|
+
# Return the empty chain complex.
|
|
746
|
+
if cochain:
|
|
747
|
+
return ChainComplex(base_ring=base_ring, degree=1)
|
|
748
|
+
else:
|
|
749
|
+
return ChainComplex(base_ring=base_ring, degree=-1)
|
|
750
|
+
|
|
751
|
+
differentials = {}
|
|
752
|
+
# Convert the tuple self._data to a dictionary indexed by the
|
|
753
|
+
# non-degenerate simplices.
|
|
754
|
+
if subcomplex:
|
|
755
|
+
X = self.quotient(subcomplex)
|
|
756
|
+
face_data = X.face_data()
|
|
757
|
+
nondegens = X.nondegenerate_simplices()
|
|
758
|
+
else:
|
|
759
|
+
face_data = self.face_data()
|
|
760
|
+
nondegens = self.nondegenerate_simplices()
|
|
761
|
+
# simplices: dictionary indexed by dimension, values the list
|
|
762
|
+
# of non-degenerate simplices in that dimension.
|
|
763
|
+
simplices = {}
|
|
764
|
+
for sigma in nondegens:
|
|
765
|
+
if sigma.dimension() in simplices:
|
|
766
|
+
simplices[sigma.dimension()].append(sigma)
|
|
767
|
+
else:
|
|
768
|
+
simplices[sigma.dimension()] = [sigma]
|
|
769
|
+
first = dimensions.pop(0)
|
|
770
|
+
if first in simplices:
|
|
771
|
+
rank = len(simplices[first])
|
|
772
|
+
current = sorted(simplices[first])
|
|
773
|
+
else:
|
|
774
|
+
rank = 0
|
|
775
|
+
current = []
|
|
776
|
+
if augmented and first == 0:
|
|
777
|
+
differentials[first-1] = matrix(base_ring, 0, 1)
|
|
778
|
+
differentials[first] = matrix(base_ring, 1, rank,
|
|
779
|
+
[1] * rank)
|
|
780
|
+
else:
|
|
781
|
+
differentials[first] = matrix(base_ring, 0, rank)
|
|
782
|
+
|
|
783
|
+
for d in dimensions:
|
|
784
|
+
old_rank = rank
|
|
785
|
+
faces = {_[1]: _[0] for _ in enumerate(current)}
|
|
786
|
+
if d in simplices:
|
|
787
|
+
current = sorted(simplices[d])
|
|
788
|
+
rank = len(current)
|
|
789
|
+
# old_rank: number of simplices in dimension d-1.
|
|
790
|
+
# faces: list of simplices in dimension d-1.
|
|
791
|
+
# rank: number of simplices in dimension d.
|
|
792
|
+
# current: list of simplices in dimension d.
|
|
793
|
+
if not faces:
|
|
794
|
+
differentials[d] = matrix(base_ring, old_rank, rank)
|
|
795
|
+
else:
|
|
796
|
+
matrix_data = {}
|
|
797
|
+
for col, sigma in enumerate(current):
|
|
798
|
+
sign = 1
|
|
799
|
+
twists = len(face_data[sigma]) * [1]
|
|
800
|
+
twists[0] = twist(sigma)
|
|
801
|
+
for (ch, tau) in zip(twists, face_data[sigma]):
|
|
802
|
+
if tau.is_nondegenerate():
|
|
803
|
+
row = faces[tau]
|
|
804
|
+
if (row, col) in matrix_data:
|
|
805
|
+
matrix_data[(row, col)] += sign*ch
|
|
806
|
+
else:
|
|
807
|
+
matrix_data[(row, col)] = sign*ch
|
|
808
|
+
sign *= -1
|
|
809
|
+
|
|
810
|
+
differentials[d] = matrix(base_ring, old_rank,
|
|
811
|
+
rank, matrix_data, sparse=False)
|
|
812
|
+
|
|
813
|
+
else:
|
|
814
|
+
rank = 0
|
|
815
|
+
current = []
|
|
816
|
+
differentials[d] = matrix(base_ring, old_rank, rank, sparse=False)
|
|
817
|
+
|
|
818
|
+
if cochain:
|
|
819
|
+
new_diffs = {d - 1: diff_d.transpose()
|
|
820
|
+
for d, diff_d in differentials.items()}
|
|
821
|
+
return ChainComplex(new_diffs, degree_of_differential=1,
|
|
822
|
+
check=check)
|
|
823
|
+
return ChainComplex(differentials, degree_of_differential=-1,
|
|
824
|
+
check=check)
|
|
825
|
+
|
|
826
|
+
def twisted_homology(self, n, reduced=False):
|
|
827
|
+
r"""
|
|
828
|
+
The `n`-th twisted homology module of the simplicial set with respect to
|
|
829
|
+
the abelianization of the fundamental_group.
|
|
830
|
+
|
|
831
|
+
It is a module over a polynomial ring, including relations to make some
|
|
832
|
+
variables the multiplicative inverses of others.
|
|
833
|
+
|
|
834
|
+
INPUT:
|
|
835
|
+
|
|
836
|
+
- ``n`` -- positive integer
|
|
837
|
+
|
|
838
|
+
- ``reduced`` -- boolean (default: ``False``); if set to True,
|
|
839
|
+
the presentation matrix will be reduced
|
|
840
|
+
|
|
841
|
+
EXAMPLES::
|
|
842
|
+
|
|
843
|
+
sage: # needs sage.graphs sage.libs.singular
|
|
844
|
+
sage: X = simplicial_sets.Sphere(1).wedge(simplicial_sets.Sphere(2))
|
|
845
|
+
sage: X.twisted_homology(1)
|
|
846
|
+
Quotient module by Submodule of Ambient free module of rank 0 over the integral domain Multivariate Polynomial Ring in f1, f1inv over Integer Ring
|
|
847
|
+
Generated by the rows of the matrix:
|
|
848
|
+
[]
|
|
849
|
+
sage: X.twisted_homology(2)
|
|
850
|
+
Quotient module by Submodule of Ambient free module of rank 1 over the integral domain Multivariate Polynomial Ring in f1, f1inv over Integer Ring
|
|
851
|
+
Generated by the rows of the matrix:
|
|
852
|
+
[f1*f1inv - 1]
|
|
853
|
+
|
|
854
|
+
::
|
|
855
|
+
|
|
856
|
+
sage: # needs sage.graphs sage.libs.singular
|
|
857
|
+
sage: Y = simplicial_sets.Torus()
|
|
858
|
+
sage: Y.twisted_homology(1)
|
|
859
|
+
Quotient module by Submodule of Ambient free module of rank 5 over the integral domain Multivariate Polynomial Ring in f1, f1inv, f2, f2inv over Integer Ring
|
|
860
|
+
Generated by the rows of the matrix:
|
|
861
|
+
[ 1 0 0 0 0]
|
|
862
|
+
[ 0 1 0 0 0]
|
|
863
|
+
[ 0 0 1 0 0]
|
|
864
|
+
[ 0 0 0 1 0]
|
|
865
|
+
[ 0 0 0 0 1]
|
|
866
|
+
[f1*f1inv - 1 0 0 0 0]
|
|
867
|
+
[ 0 f1*f1inv - 1 0 0 0]
|
|
868
|
+
[ 0 0 f1*f1inv - 1 0 0]
|
|
869
|
+
[ 0 0 0 f1*f1inv - 1 0]
|
|
870
|
+
[ 0 0 0 0 f1*f1inv - 1]
|
|
871
|
+
[f2*f2inv - 1 0 0 0 0]
|
|
872
|
+
[ 0 f2*f2inv - 1 0 0 0]
|
|
873
|
+
[ 0 0 f2*f2inv - 1 0 0]
|
|
874
|
+
[ 0 0 0 f2*f2inv - 1 0]
|
|
875
|
+
[ 0 0 0 0 f2*f2inv - 1]
|
|
876
|
+
sage: Y.twisted_homology(2)
|
|
877
|
+
Quotient module by Submodule of Ambient free module of rank 0 over the integral domain Multivariate Polynomial Ring in f1, f1inv, f2, f2inv over Integer Ring
|
|
878
|
+
Generated by the rows of the matrix:
|
|
879
|
+
[]
|
|
880
|
+
sage: Y.twisted_homology(1, reduced=True)
|
|
881
|
+
Quotient module by Submodule of Ambient free module of rank 5 over the integral domain Multivariate Polynomial Ring in f1, f1inv, f2, f2inv over Integer Ring
|
|
882
|
+
Generated by the rows of the matrix:
|
|
883
|
+
[1 0 0 0 0]
|
|
884
|
+
[0 1 0 0 0]
|
|
885
|
+
[0 0 1 0 0]
|
|
886
|
+
[0 0 0 1 0]
|
|
887
|
+
[0 0 0 0 1]
|
|
888
|
+
|
|
889
|
+
TESTS::
|
|
890
|
+
|
|
891
|
+
sage: # needs sage.graphs sage.libs.singular
|
|
892
|
+
sage: X = simplicial_sets.PresentationComplex(groups.presentation.FGAbelian((3,2)))
|
|
893
|
+
sage: TW2 = X.twisted_homology(2, reduced=True)
|
|
894
|
+
sage: M = TW2.relations_matrix()
|
|
895
|
+
sage: from sage.libs.singular.function import singular_function
|
|
896
|
+
sage: vdim = singular_function("vdim")
|
|
897
|
+
sage: vdim(M.T, ring=M.base_ring())
|
|
898
|
+
// ** considering the image in Q[...]
|
|
899
|
+
// ** _ is no standard basis
|
|
900
|
+
5
|
|
901
|
+
sage: X.universal_cover().homology(2)
|
|
902
|
+
Z^5
|
|
903
|
+
sage: from sage.libs.singular.function import singular_function
|
|
904
|
+
"""
|
|
905
|
+
from sage.libs.singular.function import singular_function
|
|
906
|
+
from sage.libs.singular.option import opt_verb
|
|
907
|
+
opt_verb['not_warn_sb'] = True
|
|
908
|
+
singstd = singular_function("std")
|
|
909
|
+
singsyz = singular_function("syz")
|
|
910
|
+
singred = singular_function("reduce")
|
|
911
|
+
singlift = singular_function("lift")
|
|
912
|
+
G, d = self._universal_cover_dict()
|
|
913
|
+
abelG, R, I, images = G.abelianization_to_algebra(ZZ)
|
|
914
|
+
CC = self.twisted_chain_complex()
|
|
915
|
+
M1 = CC.differential(n).T
|
|
916
|
+
M2 = CC.differential(n + 1).T
|
|
917
|
+
|
|
918
|
+
def convert_to_polynomial(p):
|
|
919
|
+
if hasattr(p, "lift"):
|
|
920
|
+
return p.lift()._as_extended_polynomial()
|
|
921
|
+
else:
|
|
922
|
+
return p._as_extended_polynomial()
|
|
923
|
+
M1 = M1.apply_map(convert_to_polynomial)
|
|
924
|
+
M2 = M2.apply_map(convert_to_polynomial)
|
|
925
|
+
RP = R._extended_ring
|
|
926
|
+
IP = RP.ideal([convert_to_polynomial(g) for g in I])
|
|
927
|
+
JP = R._extended_ring_ideal
|
|
928
|
+
GB = (IP+JP).groebner_basis()
|
|
929
|
+
GBI = RP.ideal(GB)
|
|
930
|
+
|
|
931
|
+
def reduce_laurent(a):
|
|
932
|
+
return singred(a, GBI, ring=RP)
|
|
933
|
+
|
|
934
|
+
def group_to_polynomial(el, RP):
|
|
935
|
+
res = RP.one()
|
|
936
|
+
for a in el.Tietze():
|
|
937
|
+
if a > 0:
|
|
938
|
+
res *= RP.gen(2*a-2)
|
|
939
|
+
else:
|
|
940
|
+
res *= RP.gen(-2*a-1)
|
|
941
|
+
return res
|
|
942
|
+
|
|
943
|
+
def mkernel(M):
|
|
944
|
+
if M.nrows() == 0:
|
|
945
|
+
return matrix(M.base_ring(), 0, 0)
|
|
946
|
+
if M.ncols() == 0:
|
|
947
|
+
return M.T
|
|
948
|
+
res = M
|
|
949
|
+
n = res.ncols()
|
|
950
|
+
for g in (IP+JP).gens():
|
|
951
|
+
res = res.stack(g*identity_matrix(n))
|
|
952
|
+
syz = matrix(singsyz(res.T, ring=res.base_ring())).T
|
|
953
|
+
trimmed = syz.T.submatrix(0, 0, syz.ncols(), M.nrows())
|
|
954
|
+
trimmed = trimmed.apply_map(reduce_laurent)
|
|
955
|
+
to_delete = [i for (i, r) in enumerate(trimmed.rows()) if not r]
|
|
956
|
+
return trimmed.delete_rows(to_delete)
|
|
957
|
+
|
|
958
|
+
def lift_to_submodule(S, M):
|
|
959
|
+
if S.nrows() == 0 or S.ncols() == 0:
|
|
960
|
+
return S
|
|
961
|
+
res = M
|
|
962
|
+
for g in GB:
|
|
963
|
+
res = res.stack(g*identity_matrix(M.ncols()))
|
|
964
|
+
singres = matrix(singlift(res.T, S.T, ring=res.base_ring()))
|
|
965
|
+
return singres.submatrix(0, 0, M.nrows(), S.nrows())
|
|
966
|
+
|
|
967
|
+
def mgb(M):
|
|
968
|
+
if M.nrows() == 0 or M.ncols() == 0:
|
|
969
|
+
return M
|
|
970
|
+
res = M
|
|
971
|
+
for g in GB:
|
|
972
|
+
res = res.stack(g*identity_matrix(M.ncols()))
|
|
973
|
+
sres = matrix(singstd(res.T, ring=RP))
|
|
974
|
+
to_delete = [i for i, r in enumerate(sres.apply_map(reduce_laurent)) if not r]
|
|
975
|
+
return sres.delete_rows(to_delete)
|
|
976
|
+
|
|
977
|
+
if M1.nrows() == 0:
|
|
978
|
+
opt_verb.reset_default()
|
|
979
|
+
return (RP**0).quotient_module([])
|
|
980
|
+
K = mkernel(M1)
|
|
981
|
+
DK = mkernel(K)
|
|
982
|
+
if M2.nrows() > 0:
|
|
983
|
+
S = lift_to_submodule(M2, K)
|
|
984
|
+
if S.nrows() > 0 and S.ncols() > 0:
|
|
985
|
+
res = mgb(DK.stack(S.T))
|
|
986
|
+
else:
|
|
987
|
+
res = DK
|
|
988
|
+
else:
|
|
989
|
+
res = mgb(DK)
|
|
990
|
+
resmat = mgb(res.apply_map(reduce_laurent))
|
|
991
|
+
AM = RP ** K.nrows()
|
|
992
|
+
if resmat.ncols() == 0:
|
|
993
|
+
SM = AM.submodule([])
|
|
994
|
+
opt_verb.reset_default()
|
|
995
|
+
return AM.quotient_module(SM)
|
|
996
|
+
for g in (IP+JP).gens():
|
|
997
|
+
resmat = resmat.stack(g * identity_matrix(resmat.ncols()))
|
|
998
|
+
if reduced:
|
|
999
|
+
resmat = matrix(singstd(resmat.T, ring=RP))
|
|
1000
|
+
SM = AM.submodule(resmat)
|
|
1001
|
+
opt_verb.reset_default()
|
|
1002
|
+
return AM.quotient_module(SM)
|
|
1003
|
+
|
|
1004
|
+
def is_simply_connected(self):
|
|
1005
|
+
"""
|
|
1006
|
+
Return ``True`` if this pointed simplicial set is simply connected.
|
|
1007
|
+
|
|
1008
|
+
.. WARNING::
|
|
1009
|
+
|
|
1010
|
+
Determining simple connectivity is not always
|
|
1011
|
+
possible, because it requires determining when a
|
|
1012
|
+
group, as given by generators and relations, is
|
|
1013
|
+
trivial. So this conceivably may give a false
|
|
1014
|
+
negative in some cases.
|
|
1015
|
+
|
|
1016
|
+
EXAMPLES::
|
|
1017
|
+
|
|
1018
|
+
sage: # needs sage.graphs sage.groups
|
|
1019
|
+
sage: T = simplicial_sets.Torus()
|
|
1020
|
+
sage: T.is_simply_connected()
|
|
1021
|
+
False
|
|
1022
|
+
sage: T.suspension().is_simply_connected()
|
|
1023
|
+
True
|
|
1024
|
+
sage: simplicial_sets.KleinBottle().is_simply_connected()
|
|
1025
|
+
False
|
|
1026
|
+
|
|
1027
|
+
sage: # needs sage.graphs
|
|
1028
|
+
sage: S2 = simplicial_sets.Sphere(2)
|
|
1029
|
+
sage: S3 = simplicial_sets.Sphere(3)
|
|
1030
|
+
sage: (S2.wedge(S3)).is_simply_connected() # needs sage.groups
|
|
1031
|
+
True
|
|
1032
|
+
sage: X = S2.disjoint_union(S3)
|
|
1033
|
+
sage: X = X.set_base_point(X.n_cells(0)[0])
|
|
1034
|
+
sage: X.is_simply_connected()
|
|
1035
|
+
False
|
|
1036
|
+
|
|
1037
|
+
sage: C3 = groups.misc.MultiplicativeAbelian([3]) # needs sage.graphs sage.groups
|
|
1038
|
+
sage: BC3 = simplicial_sets.ClassifyingSpace(C3) # needs sage.graphs sage.groups
|
|
1039
|
+
sage: BC3.is_simply_connected() # needs sage.graphs sage.groups
|
|
1040
|
+
False
|
|
1041
|
+
"""
|
|
1042
|
+
if not self.is_connected():
|
|
1043
|
+
return False
|
|
1044
|
+
try:
|
|
1045
|
+
if not self.is_pointed():
|
|
1046
|
+
space = self.set_base_point(self.n_cells(0)[0])
|
|
1047
|
+
else:
|
|
1048
|
+
space = self
|
|
1049
|
+
return bool(space.fundamental_group().IsTrivial())
|
|
1050
|
+
except AttributeError:
|
|
1051
|
+
try:
|
|
1052
|
+
return space.fundamental_group().order() == 1
|
|
1053
|
+
except (NotImplementedError, RuntimeError):
|
|
1054
|
+
# I don't know of any simplicial sets for which the
|
|
1055
|
+
# code reaches this point, but there are certainly
|
|
1056
|
+
# groups for which these errors are raised. 'IsTrivial'
|
|
1057
|
+
# works for all of the examples I've seen, though.
|
|
1058
|
+
raise ValueError('unable to determine if the fundamental '
|
|
1059
|
+
'group is trivial')
|
|
1060
|
+
|
|
1061
|
+
def connectivity(self, max_dim=None):
|
|
1062
|
+
"""
|
|
1063
|
+
Return the connectivity of this pointed simplicial set.
|
|
1064
|
+
|
|
1065
|
+
INPUT:
|
|
1066
|
+
|
|
1067
|
+
- ``max_dim`` -- specify a maximum dimension through
|
|
1068
|
+
which to check. This is required if this simplicial
|
|
1069
|
+
set is simply connected and not finite.
|
|
1070
|
+
|
|
1071
|
+
The dimension of the first nonzero homotopy group. If
|
|
1072
|
+
simply connected, this is the same as the dimension of
|
|
1073
|
+
the first nonzero homology group.
|
|
1074
|
+
|
|
1075
|
+
.. WARNING::
|
|
1076
|
+
|
|
1077
|
+
See the warning for the :meth:`is_simply_connected` method.
|
|
1078
|
+
|
|
1079
|
+
The connectivity of a contractible space is ``+Infinity``.
|
|
1080
|
+
|
|
1081
|
+
EXAMPLES::
|
|
1082
|
+
|
|
1083
|
+
sage: # needs sage.graphs sage.groups
|
|
1084
|
+
sage: simplicial_sets.Sphere(3).connectivity()
|
|
1085
|
+
2
|
|
1086
|
+
sage: simplicial_sets.Sphere(0).connectivity()
|
|
1087
|
+
-1
|
|
1088
|
+
sage: K = simplicial_sets.Simplex(4)
|
|
1089
|
+
sage: K = K.set_base_point(K.n_cells(0)[0])
|
|
1090
|
+
sage: K.connectivity()
|
|
1091
|
+
+Infinity
|
|
1092
|
+
sage: X = simplicial_sets.Torus().suspension(2)
|
|
1093
|
+
sage: X.connectivity()
|
|
1094
|
+
2
|
|
1095
|
+
|
|
1096
|
+
sage: C2 = groups.misc.MultiplicativeAbelian([2]) # needs sage.graphs sage.groups
|
|
1097
|
+
sage: BC2 = simplicial_sets.ClassifyingSpace(C2) # needs sage.graphs sage.groups
|
|
1098
|
+
sage: BC2.connectivity() # needs sage.graphs sage.groups
|
|
1099
|
+
0
|
|
1100
|
+
"""
|
|
1101
|
+
if not self.is_connected():
|
|
1102
|
+
return Integer(-1)
|
|
1103
|
+
if not self.is_simply_connected():
|
|
1104
|
+
return Integer(0)
|
|
1105
|
+
if max_dim is None:
|
|
1106
|
+
if self.is_finite():
|
|
1107
|
+
max_dim = self.dimension()
|
|
1108
|
+
else:
|
|
1109
|
+
# Note: at the moment, this will never be reached,
|
|
1110
|
+
# because our only examples (so far) of infinite
|
|
1111
|
+
# simplicial sets are not simply connected.
|
|
1112
|
+
raise ValueError('this simplicial set may be infinite, '
|
|
1113
|
+
'so specify a maximum dimension through '
|
|
1114
|
+
'which to check')
|
|
1115
|
+
|
|
1116
|
+
H = self.homology(range(2, max_dim + 1))
|
|
1117
|
+
for i in range(2, max_dim + 1):
|
|
1118
|
+
if i in H and H[i].order() != 1:
|
|
1119
|
+
return i-1
|
|
1120
|
+
return Infinity
|
|
1121
|
+
|
|
1122
|
+
class Finite(CategoryWithAxiom):
|
|
1123
|
+
class ParentMethods:
|
|
1124
|
+
|
|
1125
|
+
def unset_base_point(self):
|
|
1126
|
+
"""
|
|
1127
|
+
Return a copy of this simplicial set in which the base point has
|
|
1128
|
+
been forgotten.
|
|
1129
|
+
|
|
1130
|
+
EXAMPLES::
|
|
1131
|
+
|
|
1132
|
+
sage: # needs sage.graphs
|
|
1133
|
+
sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
|
|
1134
|
+
sage: v = AbstractSimplex(0, name='v_0')
|
|
1135
|
+
sage: w = AbstractSimplex(0, name='w_0')
|
|
1136
|
+
sage: e = AbstractSimplex(1)
|
|
1137
|
+
sage: Y = SimplicialSet({e: (v, w)}, base_point=w)
|
|
1138
|
+
sage: Y.is_pointed()
|
|
1139
|
+
True
|
|
1140
|
+
sage: Y.base_point()
|
|
1141
|
+
w_0
|
|
1142
|
+
sage: Z = Y.unset_base_point()
|
|
1143
|
+
sage: Z.is_pointed()
|
|
1144
|
+
False
|
|
1145
|
+
"""
|
|
1146
|
+
from sage.topology.simplicial_set import SimplicialSet
|
|
1147
|
+
return SimplicialSet(self.face_data())
|
|
1148
|
+
|
|
1149
|
+
def fat_wedge(self, n):
|
|
1150
|
+
"""
|
|
1151
|
+
Return the `n`-th fat wedge of this pointed simplicial set.
|
|
1152
|
+
|
|
1153
|
+
This is the subcomplex of the `n`-fold product `X^n`
|
|
1154
|
+
consisting of those points in which at least one
|
|
1155
|
+
factor is the base point. Thus when `n=2`, this is the
|
|
1156
|
+
wedge of the simplicial set with itself, but when `n`
|
|
1157
|
+
is larger, the fat wedge is larger than the `n`-fold
|
|
1158
|
+
wedge.
|
|
1159
|
+
|
|
1160
|
+
EXAMPLES::
|
|
1161
|
+
|
|
1162
|
+
sage: # needs sage.graphs
|
|
1163
|
+
sage: S1 = simplicial_sets.Sphere(1)
|
|
1164
|
+
sage: S1.fat_wedge(0)
|
|
1165
|
+
Point
|
|
1166
|
+
sage: S1.fat_wedge(1)
|
|
1167
|
+
S^1
|
|
1168
|
+
sage: S1.fat_wedge(2).fundamental_group() # needs sage.groups
|
|
1169
|
+
Finitely presented group < e0, e1 | >
|
|
1170
|
+
sage: S1.fat_wedge(4).homology() # needs sage.modules
|
|
1171
|
+
{0: 0, 1: Z x Z x Z x Z, 2: Z^6, 3: Z x Z x Z x Z}
|
|
1172
|
+
"""
|
|
1173
|
+
from sage.topology.simplicial_set_examples import Point
|
|
1174
|
+
if n == 0:
|
|
1175
|
+
return Point()
|
|
1176
|
+
if n == 1:
|
|
1177
|
+
return self
|
|
1178
|
+
return self.product(*[self]*(n-1)).fat_wedge_as_subset()
|
|
1179
|
+
|
|
1180
|
+
def smash_product(self, *others):
|
|
1181
|
+
"""
|
|
1182
|
+
Return the smash product of this simplicial set with ``others``.
|
|
1183
|
+
|
|
1184
|
+
INPUT:
|
|
1185
|
+
|
|
1186
|
+
- ``others`` -- one or several simplicial sets
|
|
1187
|
+
|
|
1188
|
+
EXAMPLES::
|
|
1189
|
+
|
|
1190
|
+
sage: # needs sage.graphs sage.groups
|
|
1191
|
+
sage: S1 = simplicial_sets.Sphere(1)
|
|
1192
|
+
sage: RP2 = simplicial_sets.RealProjectiveSpace(2)
|
|
1193
|
+
sage: X = S1.smash_product(RP2)
|
|
1194
|
+
sage: X.homology(base_ring=GF(2)) # needs sage.modules
|
|
1195
|
+
{0: Vector space of dimension 0 over Finite Field of size 2,
|
|
1196
|
+
1: Vector space of dimension 0 over Finite Field of size 2,
|
|
1197
|
+
2: Vector space of dimension 1 over Finite Field of size 2,
|
|
1198
|
+
3: Vector space of dimension 1 over Finite Field of size 2}
|
|
1199
|
+
|
|
1200
|
+
sage: T = S1.product(S1) # needs sage.graphs sage.groups
|
|
1201
|
+
sage: X = T.smash_product(S1) # needs sage.graphs sage.groups
|
|
1202
|
+
sage: X.homology(reduced=False) # needs sage.graphs sage.groups sage.modules
|
|
1203
|
+
{0: Z, 1: 0, 2: Z x Z, 3: Z}
|
|
1204
|
+
"""
|
|
1205
|
+
from sage.topology.simplicial_set_constructions import SmashProductOfSimplicialSets_finite
|
|
1206
|
+
return SmashProductOfSimplicialSets_finite((self,) + others)
|