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.
Files changed (719) hide show
  1. passagemath_categories-10.6.32.dist-info/METADATA +156 -0
  2. passagemath_categories-10.6.32.dist-info/RECORD +719 -0
  3. passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
  4. passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
  5. passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
  6. passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  7. passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
  8. sage/all__sagemath_categories.py +28 -0
  9. sage/arith/all.py +38 -0
  10. sage/arith/constants.pxd +27 -0
  11. sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
  12. sage/arith/functions.pxd +4 -0
  13. sage/arith/functions.pyx +221 -0
  14. sage/arith/misc.py +6552 -0
  15. sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
  16. sage/arith/multi_modular.pxd +39 -0
  17. sage/arith/multi_modular.pyx +994 -0
  18. sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
  19. sage/arith/rational_reconstruction.pxd +4 -0
  20. sage/arith/rational_reconstruction.pyx +115 -0
  21. sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
  22. sage/arith/srange.pyx +571 -0
  23. sage/calculus/all__sagemath_categories.py +2 -0
  24. sage/calculus/functional.py +481 -0
  25. sage/calculus/functions.py +151 -0
  26. sage/categories/additive_groups.py +73 -0
  27. sage/categories/additive_magmas.py +1044 -0
  28. sage/categories/additive_monoids.py +114 -0
  29. sage/categories/additive_semigroups.py +184 -0
  30. sage/categories/affine_weyl_groups.py +238 -0
  31. sage/categories/algebra_ideals.py +95 -0
  32. sage/categories/algebra_modules.py +96 -0
  33. sage/categories/algebras.py +349 -0
  34. sage/categories/algebras_with_basis.py +377 -0
  35. sage/categories/all.py +160 -0
  36. sage/categories/aperiodic_semigroups.py +29 -0
  37. sage/categories/associative_algebras.py +47 -0
  38. sage/categories/bialgebras.py +101 -0
  39. sage/categories/bialgebras_with_basis.py +414 -0
  40. sage/categories/bimodules.py +206 -0
  41. sage/categories/chain_complexes.py +268 -0
  42. sage/categories/classical_crystals.py +480 -0
  43. sage/categories/coalgebras.py +405 -0
  44. sage/categories/coalgebras_with_basis.py +232 -0
  45. sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
  46. sage/categories/coercion_methods.pyx +52 -0
  47. sage/categories/commutative_additive_groups.py +104 -0
  48. sage/categories/commutative_additive_monoids.py +45 -0
  49. sage/categories/commutative_additive_semigroups.py +48 -0
  50. sage/categories/commutative_algebra_ideals.py +87 -0
  51. sage/categories/commutative_algebras.py +94 -0
  52. sage/categories/commutative_ring_ideals.py +58 -0
  53. sage/categories/commutative_rings.py +736 -0
  54. sage/categories/complete_discrete_valuation.py +293 -0
  55. sage/categories/complex_reflection_groups.py +145 -0
  56. sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
  57. sage/categories/coxeter_group_algebras.py +186 -0
  58. sage/categories/coxeter_groups.py +3402 -0
  59. sage/categories/crystals.py +2628 -0
  60. sage/categories/cw_complexes.py +216 -0
  61. sage/categories/dedekind_domains.py +137 -0
  62. sage/categories/discrete_valuation.py +325 -0
  63. sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
  64. sage/categories/division_rings.py +114 -0
  65. sage/categories/domains.py +95 -0
  66. sage/categories/drinfeld_modules.py +789 -0
  67. sage/categories/dual.py +42 -0
  68. sage/categories/enumerated_sets.py +1146 -0
  69. sage/categories/euclidean_domains.py +271 -0
  70. sage/categories/examples/algebras_with_basis.py +102 -0
  71. sage/categories/examples/all.py +1 -0
  72. sage/categories/examples/commutative_additive_monoids.py +130 -0
  73. sage/categories/examples/commutative_additive_semigroups.py +199 -0
  74. sage/categories/examples/coxeter_groups.py +8 -0
  75. sage/categories/examples/crystals.py +236 -0
  76. sage/categories/examples/cw_complexes.py +163 -0
  77. sage/categories/examples/facade_sets.py +187 -0
  78. sage/categories/examples/filtered_algebras_with_basis.py +204 -0
  79. sage/categories/examples/filtered_modules_with_basis.py +154 -0
  80. sage/categories/examples/finite_coxeter_groups.py +252 -0
  81. sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
  82. sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
  83. sage/categories/examples/finite_enumerated_sets.py +208 -0
  84. sage/categories/examples/finite_monoids.py +150 -0
  85. sage/categories/examples/finite_semigroups.py +190 -0
  86. sage/categories/examples/finite_weyl_groups.py +191 -0
  87. sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
  88. sage/categories/examples/graded_modules_with_basis.py +168 -0
  89. sage/categories/examples/graphs.py +122 -0
  90. sage/categories/examples/hopf_algebras_with_basis.py +145 -0
  91. sage/categories/examples/infinite_enumerated_sets.py +190 -0
  92. sage/categories/examples/lie_algebras.py +352 -0
  93. sage/categories/examples/lie_algebras_with_basis.py +196 -0
  94. sage/categories/examples/magmas.py +162 -0
  95. sage/categories/examples/manifolds.py +94 -0
  96. sage/categories/examples/monoids.py +144 -0
  97. sage/categories/examples/posets.py +178 -0
  98. sage/categories/examples/semigroups.py +580 -0
  99. sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  100. sage/categories/examples/semigroups_cython.pyx +221 -0
  101. sage/categories/examples/semirings.py +249 -0
  102. sage/categories/examples/sets_cat.py +706 -0
  103. sage/categories/examples/sets_with_grading.py +101 -0
  104. sage/categories/examples/with_realizations.py +542 -0
  105. sage/categories/fields.py +991 -0
  106. sage/categories/filtered_algebras.py +63 -0
  107. sage/categories/filtered_algebras_with_basis.py +548 -0
  108. sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
  109. sage/categories/filtered_modules.py +210 -0
  110. sage/categories/filtered_modules_with_basis.py +1209 -0
  111. sage/categories/finite_complex_reflection_groups.py +1506 -0
  112. sage/categories/finite_coxeter_groups.py +1138 -0
  113. sage/categories/finite_crystals.py +103 -0
  114. sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
  115. sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
  116. sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
  117. sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
  118. sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
  119. sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
  120. sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
  121. sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
  122. sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
  123. sage/categories/finite_enumerated_sets.py +769 -0
  124. sage/categories/finite_fields.py +252 -0
  125. sage/categories/finite_groups.py +256 -0
  126. sage/categories/finite_lattice_posets.py +242 -0
  127. sage/categories/finite_monoids.py +316 -0
  128. sage/categories/finite_permutation_groups.py +339 -0
  129. sage/categories/finite_posets.py +1994 -0
  130. sage/categories/finite_semigroups.py +136 -0
  131. sage/categories/finite_sets.py +93 -0
  132. sage/categories/finite_weyl_groups.py +39 -0
  133. sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
  134. sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
  135. sage/categories/finitely_generated_magmas.py +57 -0
  136. sage/categories/finitely_generated_semigroups.py +214 -0
  137. sage/categories/function_fields.py +76 -0
  138. sage/categories/g_sets.py +77 -0
  139. sage/categories/gcd_domains.py +65 -0
  140. sage/categories/generalized_coxeter_groups.py +94 -0
  141. sage/categories/graded_algebras.py +85 -0
  142. sage/categories/graded_algebras_with_basis.py +258 -0
  143. sage/categories/graded_bialgebras.py +32 -0
  144. sage/categories/graded_bialgebras_with_basis.py +32 -0
  145. sage/categories/graded_coalgebras.py +65 -0
  146. sage/categories/graded_coalgebras_with_basis.py +51 -0
  147. sage/categories/graded_hopf_algebras.py +41 -0
  148. sage/categories/graded_hopf_algebras_with_basis.py +169 -0
  149. sage/categories/graded_lie_algebras.py +91 -0
  150. sage/categories/graded_lie_algebras_with_basis.py +44 -0
  151. sage/categories/graded_lie_conformal_algebras.py +74 -0
  152. sage/categories/graded_modules.py +133 -0
  153. sage/categories/graded_modules_with_basis.py +329 -0
  154. sage/categories/graphs.py +138 -0
  155. sage/categories/group_algebras.py +430 -0
  156. sage/categories/groupoid.py +94 -0
  157. sage/categories/groups.py +667 -0
  158. sage/categories/h_trivial_semigroups.py +64 -0
  159. sage/categories/hecke_modules.py +185 -0
  160. sage/categories/highest_weight_crystals.py +980 -0
  161. sage/categories/hopf_algebras.py +219 -0
  162. sage/categories/hopf_algebras_with_basis.py +309 -0
  163. sage/categories/infinite_enumerated_sets.py +115 -0
  164. sage/categories/integral_domains.py +203 -0
  165. sage/categories/j_trivial_semigroups.py +29 -0
  166. sage/categories/kac_moody_algebras.py +82 -0
  167. sage/categories/kahler_algebras.py +203 -0
  168. sage/categories/l_trivial_semigroups.py +63 -0
  169. sage/categories/lambda_bracket_algebras.py +280 -0
  170. sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
  171. sage/categories/lattice_posets.py +89 -0
  172. sage/categories/left_modules.py +49 -0
  173. sage/categories/lie_algebras.py +1070 -0
  174. sage/categories/lie_algebras_with_basis.py +261 -0
  175. sage/categories/lie_conformal_algebras.py +350 -0
  176. sage/categories/lie_conformal_algebras_with_basis.py +147 -0
  177. sage/categories/lie_groups.py +73 -0
  178. sage/categories/loop_crystals.py +1290 -0
  179. sage/categories/magmas.py +1189 -0
  180. sage/categories/magmas_and_additive_magmas.py +149 -0
  181. sage/categories/magmatic_algebras.py +365 -0
  182. sage/categories/manifolds.py +352 -0
  183. sage/categories/matrix_algebras.py +40 -0
  184. sage/categories/metric_spaces.py +387 -0
  185. sage/categories/modular_abelian_varieties.py +78 -0
  186. sage/categories/modules.py +989 -0
  187. sage/categories/modules_with_basis.py +2794 -0
  188. sage/categories/monoid_algebras.py +38 -0
  189. sage/categories/monoids.py +739 -0
  190. sage/categories/noetherian_rings.py +87 -0
  191. sage/categories/number_fields.py +242 -0
  192. sage/categories/ore_modules.py +189 -0
  193. sage/categories/partially_ordered_monoids.py +49 -0
  194. sage/categories/permutation_groups.py +63 -0
  195. sage/categories/pointed_sets.py +42 -0
  196. sage/categories/polyhedra.py +74 -0
  197. sage/categories/poor_man_map.py +270 -0
  198. sage/categories/posets.py +722 -0
  199. sage/categories/principal_ideal_domains.py +270 -0
  200. sage/categories/quantum_group_representations.py +543 -0
  201. sage/categories/quotient_fields.py +728 -0
  202. sage/categories/r_trivial_semigroups.py +45 -0
  203. sage/categories/regular_crystals.py +898 -0
  204. sage/categories/regular_supercrystals.py +170 -0
  205. sage/categories/right_modules.py +49 -0
  206. sage/categories/ring_ideals.py +74 -0
  207. sage/categories/rings.py +1904 -0
  208. sage/categories/rngs.py +175 -0
  209. sage/categories/schemes.py +393 -0
  210. sage/categories/semigroups.py +1060 -0
  211. sage/categories/semirings.py +71 -0
  212. sage/categories/semisimple_algebras.py +114 -0
  213. sage/categories/sets_with_grading.py +235 -0
  214. sage/categories/shephard_groups.py +43 -0
  215. sage/categories/signed_tensor.py +120 -0
  216. sage/categories/simplicial_complexes.py +134 -0
  217. sage/categories/simplicial_sets.py +1206 -0
  218. sage/categories/super_algebras.py +149 -0
  219. sage/categories/super_algebras_with_basis.py +144 -0
  220. sage/categories/super_hopf_algebras_with_basis.py +126 -0
  221. sage/categories/super_lie_conformal_algebras.py +193 -0
  222. sage/categories/super_modules.py +229 -0
  223. sage/categories/super_modules_with_basis.py +193 -0
  224. sage/categories/supercommutative_algebras.py +99 -0
  225. sage/categories/supercrystals.py +406 -0
  226. sage/categories/tensor.py +110 -0
  227. sage/categories/topological_spaces.py +170 -0
  228. sage/categories/triangular_kac_moody_algebras.py +439 -0
  229. sage/categories/tutorial.py +58 -0
  230. sage/categories/unique_factorization_domains.py +318 -0
  231. sage/categories/unital_algebras.py +426 -0
  232. sage/categories/vector_bundles.py +159 -0
  233. sage/categories/vector_spaces.py +357 -0
  234. sage/categories/weyl_groups.py +853 -0
  235. sage/combinat/all__sagemath_categories.py +34 -0
  236. sage/combinat/backtrack.py +180 -0
  237. sage/combinat/combinat.py +2269 -0
  238. sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  239. sage/combinat/combinat_cython.pxd +6 -0
  240. sage/combinat/combinat_cython.pyx +390 -0
  241. sage/combinat/combination.py +796 -0
  242. sage/combinat/combinatorial_map.py +416 -0
  243. sage/combinat/composition.py +2192 -0
  244. sage/combinat/dlx.py +510 -0
  245. sage/combinat/integer_lists/__init__.py +7 -0
  246. sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
  247. sage/combinat/integer_lists/base.pxd +16 -0
  248. sage/combinat/integer_lists/base.pyx +713 -0
  249. sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
  250. sage/combinat/integer_lists/invlex.pxd +4 -0
  251. sage/combinat/integer_lists/invlex.pyx +1650 -0
  252. sage/combinat/integer_lists/lists.py +328 -0
  253. sage/combinat/integer_lists/nn.py +48 -0
  254. sage/combinat/integer_vector.py +1818 -0
  255. sage/combinat/integer_vector_weighted.py +413 -0
  256. sage/combinat/matrices/all__sagemath_categories.py +5 -0
  257. sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
  258. sage/combinat/matrices/dancing_links.pyx +1159 -0
  259. sage/combinat/matrices/dancing_links_c.h +380 -0
  260. sage/combinat/matrices/dlxcpp.py +136 -0
  261. sage/combinat/partition.py +10070 -0
  262. sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
  263. sage/combinat/partitions.pyx +743 -0
  264. sage/combinat/permutation.py +10168 -0
  265. sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  266. sage/combinat/permutation_cython.pxd +11 -0
  267. sage/combinat/permutation_cython.pyx +407 -0
  268. sage/combinat/q_analogues.py +1090 -0
  269. sage/combinat/ranker.py +268 -0
  270. sage/combinat/subset.py +1561 -0
  271. sage/combinat/subsets_hereditary.py +202 -0
  272. sage/combinat/subsets_pairwise.py +184 -0
  273. sage/combinat/tools.py +63 -0
  274. sage/combinat/tuple.py +348 -0
  275. sage/data_structures/all.py +2 -0
  276. sage/data_structures/all__sagemath_categories.py +2 -0
  277. sage/data_structures/binary_matrix.pxd +138 -0
  278. sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
  279. sage/data_structures/binary_search.pxd +3 -0
  280. sage/data_structures/binary_search.pyx +66 -0
  281. sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
  282. sage/data_structures/bitset.pxd +40 -0
  283. sage/data_structures/bitset.pyx +2385 -0
  284. sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
  285. sage/data_structures/bitset_base.pxd +926 -0
  286. sage/data_structures/bitset_base.pyx +117 -0
  287. sage/data_structures/bitset_intrinsics.h +487 -0
  288. sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  289. sage/data_structures/blas_dict.pxd +12 -0
  290. sage/data_structures/blas_dict.pyx +469 -0
  291. sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
  292. sage/data_structures/list_of_pairs.pxd +16 -0
  293. sage/data_structures/list_of_pairs.pyx +122 -0
  294. sage/data_structures/mutable_poset.py +3312 -0
  295. sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
  296. sage/data_structures/pairing_heap.h +346 -0
  297. sage/data_structures/pairing_heap.pxd +88 -0
  298. sage/data_structures/pairing_heap.pyx +1464 -0
  299. sage/data_structures/sparse_bitset.pxd +62 -0
  300. sage/data_structures/stream.py +5070 -0
  301. sage/databases/all__sagemath_categories.py +7 -0
  302. sage/databases/sql_db.py +2236 -0
  303. sage/ext/all__sagemath_categories.py +3 -0
  304. sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
  305. sage/ext/fast_callable.pxd +4 -0
  306. sage/ext/fast_callable.pyx +2746 -0
  307. sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
  308. sage/ext/fast_eval.pxd +1 -0
  309. sage/ext/fast_eval.pyx +102 -0
  310. sage/ext/interpreters/__init__.py +1 -0
  311. sage/ext/interpreters/all__sagemath_categories.py +2 -0
  312. sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
  313. sage/ext/interpreters/wrapper_el.pxd +18 -0
  314. sage/ext/interpreters/wrapper_el.pyx +148 -0
  315. sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
  316. sage/ext/interpreters/wrapper_py.pxd +17 -0
  317. sage/ext/interpreters/wrapper_py.pyx +133 -0
  318. sage/functions/airy.py +937 -0
  319. sage/functions/all.py +97 -0
  320. sage/functions/bessel.py +2102 -0
  321. sage/functions/error.py +784 -0
  322. sage/functions/exp_integral.py +1529 -0
  323. sage/functions/gamma.py +1087 -0
  324. sage/functions/generalized.py +672 -0
  325. sage/functions/hyperbolic.py +747 -0
  326. sage/functions/hypergeometric.py +1156 -0
  327. sage/functions/jacobi.py +1705 -0
  328. sage/functions/log.py +1402 -0
  329. sage/functions/min_max.py +338 -0
  330. sage/functions/orthogonal_polys.py +3106 -0
  331. sage/functions/other.py +2303 -0
  332. sage/functions/piecewise.py +1505 -0
  333. sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
  334. sage/functions/prime_pi.pyx +262 -0
  335. sage/functions/special.py +1212 -0
  336. sage/functions/spike_function.py +278 -0
  337. sage/functions/transcendental.py +690 -0
  338. sage/functions/trig.py +1062 -0
  339. sage/functions/wigner.py +726 -0
  340. sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  341. sage/geometry/abc.pyx +82 -0
  342. sage/geometry/all__sagemath_categories.py +1 -0
  343. sage/groups/all__sagemath_categories.py +11 -0
  344. sage/groups/generic.py +1733 -0
  345. sage/groups/groups_catalog.py +113 -0
  346. sage/groups/perm_gps/all__sagemath_categories.py +1 -0
  347. sage/groups/perm_gps/partn_ref/all.py +1 -0
  348. sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
  349. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
  350. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
  351. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
  352. sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
  353. sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
  354. sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
  355. sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
  356. sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
  357. sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
  358. sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
  359. sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
  360. sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
  361. sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
  362. sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
  363. sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
  364. sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
  365. sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
  366. sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
  367. sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
  368. sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
  369. sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
  370. sage/interfaces/abc.py +140 -0
  371. sage/interfaces/all.py +58 -0
  372. sage/interfaces/all__sagemath_categories.py +1 -0
  373. sage/interfaces/expect.py +1643 -0
  374. sage/interfaces/interface.py +1682 -0
  375. sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
  376. sage/interfaces/process.pxd +5 -0
  377. sage/interfaces/process.pyx +288 -0
  378. sage/interfaces/quit.py +167 -0
  379. sage/interfaces/sage0.py +604 -0
  380. sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
  381. sage/interfaces/sagespawn.pyx +308 -0
  382. sage/interfaces/tab_completion.py +101 -0
  383. sage/misc/all__sagemath_categories.py +78 -0
  384. sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
  385. sage/misc/allocator.pxd +6 -0
  386. sage/misc/allocator.pyx +47 -0
  387. sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
  388. sage/misc/binary_tree.pxd +29 -0
  389. sage/misc/binary_tree.pyx +537 -0
  390. sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  391. sage/misc/callable_dict.pyx +89 -0
  392. sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
  393. sage/misc/citation.pyx +159 -0
  394. sage/misc/converting_dict.py +293 -0
  395. sage/misc/defaults.py +129 -0
  396. sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
  397. sage/misc/derivative.pyx +223 -0
  398. sage/misc/functional.py +2005 -0
  399. sage/misc/html.py +589 -0
  400. sage/misc/latex.py +2673 -0
  401. sage/misc/latex_macros.py +236 -0
  402. sage/misc/latex_standalone.py +1833 -0
  403. sage/misc/map_threaded.py +38 -0
  404. sage/misc/mathml.py +76 -0
  405. sage/misc/method_decorator.py +88 -0
  406. sage/misc/mrange.py +755 -0
  407. sage/misc/multireplace.py +41 -0
  408. sage/misc/object_multiplexer.py +92 -0
  409. sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
  410. sage/misc/parser.pyx +1107 -0
  411. sage/misc/random_testing.py +264 -0
  412. sage/misc/rest_index_of_methods.py +377 -0
  413. sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
  414. sage/misc/search.pxd +2 -0
  415. sage/misc/search.pyx +68 -0
  416. sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
  417. sage/misc/stopgap.pyx +95 -0
  418. sage/misc/table.py +853 -0
  419. sage/monoids/all__sagemath_categories.py +1 -0
  420. sage/monoids/indexed_free_monoid.py +1071 -0
  421. sage/monoids/monoid.py +82 -0
  422. sage/numerical/all__sagemath_categories.py +1 -0
  423. sage/numerical/backends/all__sagemath_categories.py +1 -0
  424. sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  425. sage/numerical/backends/generic_backend.pxd +61 -0
  426. sage/numerical/backends/generic_backend.pyx +1893 -0
  427. sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  428. sage/numerical/backends/generic_sdp_backend.pxd +38 -0
  429. sage/numerical/backends/generic_sdp_backend.pyx +755 -0
  430. sage/parallel/all.py +6 -0
  431. sage/parallel/decorate.py +575 -0
  432. sage/parallel/map_reduce.py +1997 -0
  433. sage/parallel/multiprocessing_sage.py +76 -0
  434. sage/parallel/ncpus.py +35 -0
  435. sage/parallel/parallelism.py +364 -0
  436. sage/parallel/reference.py +47 -0
  437. sage/parallel/use_fork.py +333 -0
  438. sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  439. sage/rings/abc.pxd +31 -0
  440. sage/rings/abc.pyx +526 -0
  441. sage/rings/algebraic_closure_finite_field.py +1154 -0
  442. sage/rings/all__sagemath_categories.py +91 -0
  443. sage/rings/big_oh.py +227 -0
  444. sage/rings/continued_fraction.py +2754 -0
  445. sage/rings/continued_fraction_gosper.py +220 -0
  446. sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
  447. sage/rings/factorint.pyx +295 -0
  448. sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
  449. sage/rings/fast_arith.pxd +21 -0
  450. sage/rings/fast_arith.pyx +535 -0
  451. sage/rings/finite_rings/all__sagemath_categories.py +9 -0
  452. sage/rings/finite_rings/conway_polynomials.py +542 -0
  453. sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  454. sage/rings/finite_rings/element_base.pxd +12 -0
  455. sage/rings/finite_rings/element_base.pyx +1176 -0
  456. sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  457. sage/rings/finite_rings/finite_field_base.pxd +7 -0
  458. sage/rings/finite_rings/finite_field_base.pyx +2171 -0
  459. sage/rings/finite_rings/finite_field_constructor.py +827 -0
  460. sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
  461. sage/rings/finite_rings/galois_group.py +154 -0
  462. sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  463. sage/rings/finite_rings/hom_finite_field.pxd +23 -0
  464. sage/rings/finite_rings/hom_finite_field.pyx +856 -0
  465. sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  466. sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
  467. sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
  468. sage/rings/finite_rings/homset.py +357 -0
  469. sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
  470. sage/rings/finite_rings/integer_mod.pxd +56 -0
  471. sage/rings/finite_rings/integer_mod.pyx +4586 -0
  472. sage/rings/finite_rings/integer_mod_limits.h +11 -0
  473. sage/rings/finite_rings/integer_mod_ring.py +2044 -0
  474. sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
  475. sage/rings/finite_rings/residue_field.pxd +30 -0
  476. sage/rings/finite_rings/residue_field.pyx +1811 -0
  477. sage/rings/finite_rings/stdint.pxd +19 -0
  478. sage/rings/fraction_field.py +1452 -0
  479. sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
  480. sage/rings/fraction_field_element.pyx +1357 -0
  481. sage/rings/function_field/all.py +7 -0
  482. sage/rings/function_field/all__sagemath_categories.py +2 -0
  483. sage/rings/function_field/constructor.py +218 -0
  484. sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
  485. sage/rings/function_field/element.pxd +11 -0
  486. sage/rings/function_field/element.pyx +1008 -0
  487. sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
  488. sage/rings/function_field/element_rational.pyx +513 -0
  489. sage/rings/function_field/extensions.py +230 -0
  490. sage/rings/function_field/function_field.py +1468 -0
  491. sage/rings/function_field/function_field_rational.py +1005 -0
  492. sage/rings/function_field/ideal.py +1155 -0
  493. sage/rings/function_field/ideal_rational.py +629 -0
  494. sage/rings/function_field/jacobian_base.py +826 -0
  495. sage/rings/function_field/jacobian_hess.py +1053 -0
  496. sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
  497. sage/rings/function_field/maps.py +1039 -0
  498. sage/rings/function_field/order.py +281 -0
  499. sage/rings/function_field/order_basis.py +586 -0
  500. sage/rings/function_field/order_rational.py +576 -0
  501. sage/rings/function_field/place.py +426 -0
  502. sage/rings/function_field/place_rational.py +181 -0
  503. sage/rings/generic.py +320 -0
  504. sage/rings/homset.py +332 -0
  505. sage/rings/ideal.py +1885 -0
  506. sage/rings/ideal_monoid.py +215 -0
  507. sage/rings/infinity.py +1890 -0
  508. sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
  509. sage/rings/integer.pxd +45 -0
  510. sage/rings/integer.pyx +7874 -0
  511. sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
  512. sage/rings/integer_ring.pxd +8 -0
  513. sage/rings/integer_ring.pyx +1693 -0
  514. sage/rings/laurent_series_ring.py +931 -0
  515. sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  516. sage/rings/laurent_series_ring_element.pxd +11 -0
  517. sage/rings/laurent_series_ring_element.pyx +1927 -0
  518. sage/rings/lazy_series.py +7815 -0
  519. sage/rings/lazy_series_ring.py +4356 -0
  520. sage/rings/localization.py +1043 -0
  521. sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
  522. sage/rings/morphism.pxd +39 -0
  523. sage/rings/morphism.pyx +3299 -0
  524. sage/rings/multi_power_series_ring.py +1145 -0
  525. sage/rings/multi_power_series_ring_element.py +2184 -0
  526. sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
  527. sage/rings/noncommutative_ideals.pyx +423 -0
  528. sage/rings/number_field/all__sagemath_categories.py +1 -0
  529. sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  530. sage/rings/number_field/number_field_base.pxd +8 -0
  531. sage/rings/number_field/number_field_base.pyx +507 -0
  532. sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  533. sage/rings/number_field/number_field_element_base.pxd +6 -0
  534. sage/rings/number_field/number_field_element_base.pyx +36 -0
  535. sage/rings/number_field/number_field_ideal.py +3550 -0
  536. sage/rings/padics/all__sagemath_categories.py +4 -0
  537. sage/rings/padics/local_generic.py +1670 -0
  538. sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
  539. sage/rings/padics/local_generic_element.pxd +5 -0
  540. sage/rings/padics/local_generic_element.pyx +1017 -0
  541. sage/rings/padics/misc.py +256 -0
  542. sage/rings/padics/padic_generic.py +1911 -0
  543. sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
  544. sage/rings/padics/pow_computer.pxd +38 -0
  545. sage/rings/padics/pow_computer.pyx +671 -0
  546. sage/rings/padics/precision_error.py +24 -0
  547. sage/rings/polynomial/all__sagemath_categories.py +25 -0
  548. sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  549. sage/rings/polynomial/commutative_polynomial.pxd +6 -0
  550. sage/rings/polynomial/commutative_polynomial.pyx +24 -0
  551. sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
  552. sage/rings/polynomial/cyclotomic.pyx +404 -0
  553. sage/rings/polynomial/flatten.py +711 -0
  554. sage/rings/polynomial/ideal.py +102 -0
  555. sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
  556. sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
  557. sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  558. sage/rings/polynomial/laurent_polynomial.pxd +18 -0
  559. sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
  560. sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
  561. sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
  562. sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
  563. sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  564. sage/rings/polynomial/multi_polynomial.pxd +12 -0
  565. sage/rings/polynomial/multi_polynomial.pyx +3082 -0
  566. sage/rings/polynomial/multi_polynomial_element.py +2570 -0
  567. sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
  568. sage/rings/polynomial/multi_polynomial_ring.py +947 -0
  569. sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
  570. sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
  571. sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
  572. sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
  573. sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
  574. sage/rings/polynomial/polydict.pxd +45 -0
  575. sage/rings/polynomial/polydict.pyx +2701 -0
  576. sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
  577. sage/rings/polynomial/polynomial_compiled.pxd +59 -0
  578. sage/rings/polynomial/polynomial_compiled.pyx +509 -0
  579. sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
  580. sage/rings/polynomial/polynomial_element.pxd +64 -0
  581. sage/rings/polynomial/polynomial_element.pyx +13255 -0
  582. sage/rings/polynomial/polynomial_element_generic.py +1637 -0
  583. sage/rings/polynomial/polynomial_fateman.py +97 -0
  584. sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
  585. sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
  586. sage/rings/polynomial/polynomial_ring.py +3784 -0
  587. sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
  588. sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
  589. sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
  590. sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
  591. sage/rings/polynomial/polynomial_singular_interface.py +549 -0
  592. sage/rings/polynomial/symmetric_ideal.py +989 -0
  593. sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
  594. sage/rings/polynomial/symmetric_reduction.pxd +8 -0
  595. sage/rings/polynomial/symmetric_reduction.pyx +669 -0
  596. sage/rings/polynomial/term_order.py +2279 -0
  597. sage/rings/polynomial/toy_buchberger.py +449 -0
  598. sage/rings/polynomial/toy_d_basis.py +387 -0
  599. sage/rings/polynomial/toy_variety.py +362 -0
  600. sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
  601. sage/rings/power_series_mpoly.pxd +9 -0
  602. sage/rings/power_series_mpoly.pyx +161 -0
  603. sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
  604. sage/rings/power_series_poly.pxd +10 -0
  605. sage/rings/power_series_poly.pyx +1317 -0
  606. sage/rings/power_series_ring.py +1441 -0
  607. sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  608. sage/rings/power_series_ring_element.pxd +12 -0
  609. sage/rings/power_series_ring_element.pyx +3028 -0
  610. sage/rings/puiseux_series_ring.py +487 -0
  611. sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  612. sage/rings/puiseux_series_ring_element.pxd +7 -0
  613. sage/rings/puiseux_series_ring_element.pyx +1055 -0
  614. sage/rings/qqbar_decorators.py +167 -0
  615. sage/rings/quotient_ring.py +1598 -0
  616. sage/rings/quotient_ring_element.py +979 -0
  617. sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
  618. sage/rings/rational.pxd +20 -0
  619. sage/rings/rational.pyx +4284 -0
  620. sage/rings/rational_field.py +1730 -0
  621. sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
  622. sage/rings/real_double.pxd +16 -0
  623. sage/rings/real_double.pyx +2218 -0
  624. sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
  625. sage/rings/real_lazy.pxd +30 -0
  626. sage/rings/real_lazy.pyx +1773 -0
  627. sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
  628. sage/rings/ring.pxd +30 -0
  629. sage/rings/ring.pyx +850 -0
  630. sage/rings/semirings/all.py +3 -0
  631. sage/rings/semirings/non_negative_integer_semiring.py +107 -0
  632. sage/rings/semirings/tropical_mpolynomial.py +972 -0
  633. sage/rings/semirings/tropical_polynomial.py +997 -0
  634. sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
  635. sage/rings/semirings/tropical_semiring.pyx +676 -0
  636. sage/rings/semirings/tropical_variety.py +1701 -0
  637. sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
  638. sage/rings/sum_of_squares.pxd +3 -0
  639. sage/rings/sum_of_squares.pyx +336 -0
  640. sage/rings/tests.py +504 -0
  641. sage/schemes/affine/affine_homset.py +508 -0
  642. sage/schemes/affine/affine_morphism.py +1574 -0
  643. sage/schemes/affine/affine_point.py +460 -0
  644. sage/schemes/affine/affine_rational_point.py +308 -0
  645. sage/schemes/affine/affine_space.py +1264 -0
  646. sage/schemes/affine/affine_subscheme.py +592 -0
  647. sage/schemes/affine/all.py +25 -0
  648. sage/schemes/all__sagemath_categories.py +5 -0
  649. sage/schemes/generic/algebraic_scheme.py +2092 -0
  650. sage/schemes/generic/all.py +5 -0
  651. sage/schemes/generic/ambient_space.py +400 -0
  652. sage/schemes/generic/divisor.py +465 -0
  653. sage/schemes/generic/divisor_group.py +313 -0
  654. sage/schemes/generic/glue.py +84 -0
  655. sage/schemes/generic/homset.py +820 -0
  656. sage/schemes/generic/hypersurface.py +234 -0
  657. sage/schemes/generic/morphism.py +2107 -0
  658. sage/schemes/generic/point.py +237 -0
  659. sage/schemes/generic/scheme.py +1190 -0
  660. sage/schemes/generic/spec.py +199 -0
  661. sage/schemes/product_projective/all.py +6 -0
  662. sage/schemes/product_projective/homset.py +236 -0
  663. sage/schemes/product_projective/morphism.py +517 -0
  664. sage/schemes/product_projective/point.py +568 -0
  665. sage/schemes/product_projective/rational_point.py +550 -0
  666. sage/schemes/product_projective/space.py +1301 -0
  667. sage/schemes/product_projective/subscheme.py +466 -0
  668. sage/schemes/projective/all.py +24 -0
  669. sage/schemes/projective/proj_bdd_height.py +453 -0
  670. sage/schemes/projective/projective_homset.py +718 -0
  671. sage/schemes/projective/projective_morphism.py +2792 -0
  672. sage/schemes/projective/projective_point.py +1484 -0
  673. sage/schemes/projective/projective_rational_point.py +569 -0
  674. sage/schemes/projective/projective_space.py +2571 -0
  675. sage/schemes/projective/projective_subscheme.py +1574 -0
  676. sage/sets/all.py +17 -0
  677. sage/sets/cartesian_product.py +376 -0
  678. sage/sets/condition_set.py +525 -0
  679. sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
  680. sage/sets/disjoint_set.pxd +36 -0
  681. sage/sets/disjoint_set.pyx +998 -0
  682. sage/sets/disjoint_union_enumerated_sets.py +625 -0
  683. sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
  684. sage/sets/family.pxd +12 -0
  685. sage/sets/family.pyx +1556 -0
  686. sage/sets/finite_enumerated_set.py +406 -0
  687. sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
  688. sage/sets/finite_set_map_cy.pxd +34 -0
  689. sage/sets/finite_set_map_cy.pyx +708 -0
  690. sage/sets/finite_set_maps.py +591 -0
  691. sage/sets/image_set.py +448 -0
  692. sage/sets/integer_range.py +829 -0
  693. sage/sets/non_negative_integers.py +241 -0
  694. sage/sets/positive_integers.py +93 -0
  695. sage/sets/primes.py +188 -0
  696. sage/sets/real_set.py +2760 -0
  697. sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
  698. sage/sets/recursively_enumerated_set.pxd +31 -0
  699. sage/sets/recursively_enumerated_set.pyx +2082 -0
  700. sage/sets/set.py +2083 -0
  701. sage/sets/set_from_iterator.py +1021 -0
  702. sage/sets/totally_ordered_finite_set.py +329 -0
  703. sage/symbolic/all__sagemath_categories.py +1 -0
  704. sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
  705. sage/symbolic/function.pxd +29 -0
  706. sage/symbolic/function.pyx +1488 -0
  707. sage/symbolic/symbols.py +56 -0
  708. sage/tests/all__sagemath_categories.py +1 -0
  709. sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
  710. sage/tests/cython.pyx +37 -0
  711. sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
  712. sage/tests/stl_vector.pyx +171 -0
  713. sage/typeset/all.py +6 -0
  714. sage/typeset/ascii_art.py +295 -0
  715. sage/typeset/character_art.py +789 -0
  716. sage/typeset/character_art_factory.py +572 -0
  717. sage/typeset/symbols.py +334 -0
  718. sage/typeset/unicode_art.py +183 -0
  719. 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)