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,1027 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ # sage.doctest: needs sage.schemes
3
+ r"""
4
+ Jacobians in Khuri-Makdisi model
5
+
6
+ This module implements Jacobian arithmetic by Khuri-Makdisi's algorithms
7
+ [Khu2004]_ based on divisor representation by linear spaces.
8
+
9
+ Jacobian
10
+ --------
11
+
12
+ There are three models for Jacobian arithmetic by Khuri-Makdisi's algorithms.
13
+ For each of the models, one should provide a base divisor satisfying certain
14
+ degree condition. The following lists the names of the three models and the
15
+ corresponding conditions on base divisors. Let `g` be the genus of the function
16
+ field.
17
+
18
+ - ``km_large``: large model; requires an effective divisor of degree at least `2g + 1`
19
+
20
+ - ``km_medium``: medium model; requires an effective divisor of degree at least `2g + 1`
21
+
22
+ - ``km_small``: small model; requires an effective divisor of degree at least `g + 1`
23
+
24
+ To create a Jacobian in this model, specify ``'km_[large|medium|small]'`` as ``model`` and
25
+ provide a base divisor satisfying the degree condition.
26
+
27
+ EXAMPLES:
28
+
29
+ We construct a function field (of a projective curve) over a finite field::
30
+
31
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(29), 2)
32
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
33
+ sage: C.geometric_genus()
34
+ 1
35
+ sage: H = C.function(y/x).divisor_of_poles()
36
+ sage: H.degree()
37
+ 3
38
+
39
+ Now we use `H` as base divisor for the large and medium models::
40
+
41
+ sage: J_large = C.jacobian(model='km_large', base_div=H)
42
+ sage: J_large
43
+ Jacobian of Projective Plane Curve over Finite Field of size 29
44
+ defined by x^3 - y^2*z + 5*z^3 (Khuri-Makdisi large model)
45
+ sage: J_medium = C.jacobian(model='km_medium', base_div=H)
46
+ sage: J_medium
47
+ Jacobian of Projective Plane Curve over Finite Field of size 29
48
+ defined by x^3 - y^2*z + 5*z^3 (Khuri-Makdisi medium model)
49
+
50
+ and for the small model, we construct an effective divisor of degree 2::
51
+
52
+ sage: B = sum(H.support()[:2])
53
+ sage: B.degree()
54
+ 2
55
+ sage: J_small = C.jacobian(model='km_small', base_div=B)
56
+ sage: J_small
57
+ Jacobian of Projective Plane Curve over Finite Field of size 29
58
+ defined by x^3 - y^2*z + 5*z^3 (Khuri-Makdisi small model)
59
+
60
+ Group of rational points
61
+ ------------------------
62
+
63
+ The group of rational points of a Jacobian is created from the Jacobian. A
64
+ point of the Jacobian group is represented by a divisor `D - B` where `D` is
65
+ an effective divisor of the same degree with the base divisor `B`. The
66
+ divisor `D` in turn is determined by a linear subspace of the Riemann-Roch
67
+ space associated with certain multiple of `B` (depending on the model). This
68
+ allows representing points of Jacobian as matrices once we fix a basis of the
69
+ Riemann-Roch space.
70
+
71
+ EXAMPLES::
72
+
73
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(17), 2)
74
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
75
+ sage: F = C.function_field()
76
+ sage: H = C.function(y/x).divisor_of_poles()
77
+ sage: J = C.jacobian(model='km_large', base_div=H)
78
+ sage: G = J.group()
79
+ sage: D = C([0,1,0]).place()
80
+ sage: P1 = C([-1,2,1]).place()
81
+ sage: P2 = C([3,7,1]).place()
82
+ sage: p1 = G.point(P1 - D)
83
+ sage: p2 = G.point(P2 - D)
84
+ sage: p1
85
+ Point of Jacobian determined by
86
+ [ 1 0 0 0 0 0 0 12 15]
87
+ [ 0 1 0 0 0 0 0 0 13]
88
+ [ 0 0 1 0 0 0 0 0 2]
89
+ [ 0 0 0 1 0 0 0 0 16]
90
+ [ 0 0 0 0 0 1 0 0 15]
91
+ [ 0 0 0 0 0 0 1 0 1]
92
+ sage: p2
93
+ Point of Jacobian determined by
94
+ [ 1 0 0 0 0 0 0 12 5]
95
+ [ 0 1 0 0 0 0 0 0 2]
96
+ [ 0 0 1 0 0 0 0 0 13]
97
+ [ 0 0 0 1 0 0 0 0 8]
98
+ [ 0 0 0 0 0 1 0 0 10]
99
+ [ 0 0 0 0 0 0 1 0 14]
100
+ sage: p1 + p2
101
+ Point of Jacobian determined by
102
+ [ 1 0 0 0 0 16 0 5 3]
103
+ [ 0 1 0 0 0 6 0 8 16]
104
+ [ 0 0 1 0 0 15 0 3 10]
105
+ [ 0 0 0 1 0 3 0 0 0]
106
+ [ 0 0 0 0 1 12 0 16 8]
107
+ [ 0 0 0 0 0 0 1 3 0]
108
+
109
+ AUTHORS:
110
+
111
+ - Kwankyu Lee (2022-01-24): initial version
112
+ """
113
+
114
+ # ****************************************************************************
115
+ # Copyright (C) 2022 Kwankyu Lee <ekwankyu@gmail.com>
116
+ #
117
+ # This program is free software: you can redistribute it and/or modify
118
+ # it under the terms of the GNU General Public License as published by
119
+ # the Free Software Foundation, either version 2 of the License, or
120
+ # (at your option) any later version.
121
+ # https://www.gnu.org/licenses/
122
+ # ****************************************************************************
123
+
124
+ from sage.misc.cachefunc import cached_method
125
+
126
+ from sage.structure.unique_representation import UniqueRepresentation
127
+ from sage.structure.richcmp import op_EQ, richcmp
128
+
129
+ from sage.categories.map import Map
130
+ from sage.categories.commutative_additive_groups import CommutativeAdditiveGroups
131
+ from sage.categories.homset import Hom
132
+
133
+ from sage.matrix.constructor import matrix
134
+
135
+ from sage.combinat.integer_vector_weighted import WeightedIntegerVectors
136
+
137
+ from .place import FunctionFieldPlace
138
+ from .divisor import FunctionFieldDivisor
139
+
140
+ from .jacobian_base import (Jacobian_base,
141
+ JacobianGroup_base,
142
+ JacobianGroup_finite_field_base,
143
+ JacobianPoint_base,
144
+ JacobianPoint_finite_field_base)
145
+
146
+
147
+ class JacobianPoint(JacobianPoint_base):
148
+ """
149
+ Points of a Jacobian group.
150
+
151
+ INPUT:
152
+
153
+ - ``parent`` -- Jacobian group
154
+
155
+ - ``w`` -- matrix
156
+
157
+ EXAMPLES::
158
+
159
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
160
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
161
+ sage: b = C([0,1,0]).place()
162
+ sage: h = C.function(y/x).divisor_of_poles()
163
+ sage: J = C.jacobian(model='km_large', base_div=h)
164
+ sage: G = J.group()
165
+ sage: pl = C([3,2,1]).place()
166
+ sage: G.point(pl - b)
167
+ Point of Jacobian determined by
168
+ [1 0 0 0 0 0 0 2 3]
169
+ [0 1 0 0 0 0 0 0 3]
170
+ [0 0 1 0 0 0 0 0 1]
171
+ [0 0 0 1 0 0 0 0 5]
172
+ [0 0 0 0 0 1 0 0 5]
173
+ [0 0 0 0 0 0 1 0 4]
174
+ """
175
+ def __init__(self, parent, w):
176
+ """
177
+ Initialize.
178
+
179
+ TESTS::
180
+
181
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
182
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
183
+ sage: b = C([0,1,0]).place()
184
+ sage: h = C.function(y/x).divisor_of_poles()
185
+ sage: J = C.jacobian(model='km_large', base_div=h)
186
+ sage: G = J.group()
187
+ sage: pl = C([3,2,1]).place()
188
+ sage: p = G.point(pl - b)
189
+ sage: TestSuite(p).run(skip=['_test_category','_test_pickling'])
190
+ """
191
+ super().__init__(parent)
192
+ w.set_immutable()
193
+ self._w = w
194
+
195
+ def _repr_(self):
196
+ """
197
+ Return the string representation of ``self``.
198
+
199
+ EXAMPLES::
200
+
201
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
202
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
203
+ sage: h = C.function(y/x).divisor_of_poles()
204
+ sage: J = C.jacobian(model='km_large', base_div=h)
205
+ sage: G = J.group()
206
+ sage: G.zero()
207
+ Point of Jacobian determined by
208
+ [1 0 0 0 0 0 0 0 0]
209
+ [0 1 0 0 0 0 0 0 0]
210
+ [0 0 1 0 0 0 0 0 0]
211
+ [0 0 0 0 1 0 0 0 0]
212
+ [0 0 0 0 0 1 0 0 0]
213
+ [0 0 0 0 0 0 0 1 0]
214
+ """
215
+ return f'Point of Jacobian determined by \n{self._w}'
216
+
217
+ def __hash__(self):
218
+ """
219
+ Return the hash of ``self``.
220
+
221
+ EXAMPLES::
222
+
223
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
224
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
225
+ sage: F = C.function_field()
226
+ sage: h = C.function(y/x).divisor_of_poles()
227
+ sage: J = C.jacobian(model='km_large', base_div=h)
228
+ sage: G = J.group()
229
+ sage: zero = G.zero()
230
+ sage: {zero: 1}
231
+ {Point of Jacobian determined by
232
+ [1 0 0 0 0 0 0 0 0]
233
+ [0 1 0 0 0 0 0 0 0]
234
+ [0 0 1 0 0 0 0 0 0]
235
+ [0 0 0 0 1 0 0 0 0]
236
+ [0 0 0 0 0 1 0 0 0]
237
+ [0 0 0 0 0 0 0 1 0]: 1}
238
+ """
239
+ return hash(self._w)
240
+
241
+ def _richcmp_(self, other, op):
242
+ """
243
+ Compare ``self`` with ``other`` with respect to operator ``op``.
244
+
245
+ EXAMPLES::
246
+
247
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
248
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
249
+ sage: h = C.function(y/x).divisor_of_poles()
250
+ sage: b = C([0,1,0]).place()
251
+ sage: pl1 = C([-1,2,1]).place()
252
+ sage: pl2 = C([3,2,1]).place()
253
+ sage: J = C.jacobian(model='km_large', base_div=h)
254
+ sage: G = J.group()
255
+ sage: p1 = G.point(pl1 - b)
256
+ sage: p2 = G.point(pl2 - b)
257
+ sage: p1 == p1
258
+ True
259
+ sage: p1 != p2
260
+ True
261
+ sage: p1 > p1
262
+ False
263
+ sage: p1 > p2
264
+ True
265
+ sage: p1 < p2
266
+ False
267
+ """
268
+ if op is op_EQ:
269
+ km = self.parent()._km
270
+ return km.equal(self._w, other._w)
271
+ else:
272
+ return richcmp(self._w, other._w, op)
273
+
274
+ def _add_(self, other):
275
+ """
276
+ Return the sum of ``self`` and ``other``.
277
+
278
+ EXAMPLES::
279
+
280
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
281
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
282
+ sage: h = C.function(y/x).divisor_of_poles()
283
+ sage: b = C([0,1,0]).place()
284
+ sage: pl1 = C([-1,2,1]).place()
285
+ sage: pl2 = C([3,2,1]).place()
286
+ sage: J = C.jacobian(model='km_large', base_div=h)
287
+ sage: G = J.group()
288
+ sage: p1 = G.point(pl1 - b)
289
+ sage: p2 = G.point(pl2 - b)
290
+ sage: p1 + p2
291
+ Point of Jacobian determined by
292
+ [1 0 0 0 0 0 3 1 1]
293
+ [0 1 0 0 0 0 3 0 2]
294
+ [0 0 1 0 0 0 0 3 0]
295
+ [0 0 0 1 0 0 0 0 3]
296
+ [0 0 0 0 1 0 4 0 3]
297
+ [0 0 0 0 0 1 6 5 2]
298
+ sage: p1 + p2 == p2 + p1
299
+ True
300
+ """
301
+ G = self.parent()
302
+ km = G._km
303
+ return G.element_class(self.parent(), km.add(self._w, other._w))
304
+
305
+ def _neg_(self):
306
+ """
307
+ Return the negative of this point.
308
+
309
+ EXAMPLES::
310
+
311
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
312
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
313
+ sage: F = C.function_field()
314
+ sage: h = C.function(y/x).divisor_of_poles()
315
+ sage: J = C.jacobian(model='km_large', base_div=h)
316
+ sage: G = J.group()
317
+ sage: b = F.get_place(1)
318
+ sage: p = C([-1,2,1]).place()
319
+ sage: pt = G.point(p - b)
320
+ sage: -pt
321
+ Point of Jacobian determined by
322
+ [1 0 0 0 0 0 1 6 0]
323
+ [0 1 0 0 0 0 2 6 3]
324
+ [0 0 1 0 0 0 4 1 1]
325
+ [0 0 0 1 0 0 1 4 1]
326
+ [0 0 0 0 1 0 5 2 6]
327
+ [0 0 0 0 0 1 3 1 3]
328
+ sage: -(-pt) == pt
329
+ True
330
+ """
331
+ G = self.parent()
332
+ km = G._km
333
+ return G.element_class(self.parent(), km.negate(self._w))
334
+
335
+ def _rmul_(self, n):
336
+ """
337
+ Return the ``n``-th multiple of this point.
338
+
339
+ INPUT:
340
+
341
+ - ``n`` -- integer
342
+
343
+ EXAMPLES::
344
+
345
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
346
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
347
+ sage: h = C.function(y/x).divisor_of_poles()
348
+ sage: b = C([0,1,0]).place()
349
+ sage: pl = C([-1,2,1]).place()
350
+ sage: J = C.jacobian(model='km_large', base_div=h)
351
+ sage: G = J.group()
352
+ sage: p = G.point(pl - b)
353
+ sage: 10*(10*p) == 100*p
354
+ True
355
+ """
356
+ return self.multiple(n)
357
+
358
+ def multiple(self, n):
359
+ """
360
+ Return the ``n``-th multiple of this point.
361
+
362
+ INPUT:
363
+
364
+ - ``n`` -- integer
365
+
366
+ EXAMPLES::
367
+
368
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
369
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
370
+ sage: h = C.function(y/x).divisor_of_poles()
371
+ sage: b = C([0,1,0]).place()
372
+ sage: pl = C([-1,2,1]).place()
373
+ sage: J = C.jacobian(model='km_large', base_div=h)
374
+ sage: G = J.group()
375
+ sage: p = G.point(pl - b)
376
+ sage: p.multiple(100)
377
+ Point of Jacobian determined by
378
+ [1 0 0 0 0 2 0 1 1]
379
+ [0 1 0 0 0 5 0 1 6]
380
+ [0 0 1 0 0 2 0 6 3]
381
+ [0 0 0 1 0 1 0 0 0]
382
+ [0 0 0 0 1 5 0 1 4]
383
+ [0 0 0 0 0 0 1 1 0]
384
+ """
385
+ G = self.parent()
386
+ km = G._km
387
+ return G.element_class(self.parent(), km.multiple(self._w, n))
388
+
389
+ def addflip(self, other):
390
+ """
391
+ Return the addflip of this and ``other`` point.
392
+
393
+ The addflip of two points is by definition the negative of the sum of
394
+ the points. This operation is faster than addition in Jacobian
395
+ arithmetic by Khuri-Makdisi algorithms.
396
+
397
+ EXAMPLES::
398
+
399
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
400
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
401
+ sage: h = C.function(y/x).divisor_of_poles()
402
+ sage: b = C([0,1,0]).place()
403
+ sage: pl1 = C([-1,2,1]).place()
404
+ sage: pl2 = C([3,2,1]).place()
405
+ sage: J = C.jacobian(model='km_large', base_div=h)
406
+ sage: G = J.group()
407
+ sage: p1 = G.point(pl1 - b)
408
+ sage: p2 = G.point(pl2 - b)
409
+ sage: p1.addflip(p2)
410
+ Point of Jacobian determined by
411
+ [1 0 0 0 0 0 0 2 6]
412
+ [0 1 0 0 0 0 0 0 3]
413
+ [0 0 1 0 0 0 0 0 4]
414
+ [0 0 0 1 0 0 0 0 3]
415
+ [0 0 0 0 0 1 0 0 5]
416
+ [0 0 0 0 0 0 1 0 2]
417
+ sage: _ == -(p1 + p2)
418
+ True
419
+ """
420
+ G = self.parent()
421
+ km = G._km
422
+ return G.element_class(self.parent(), km.addflip(self._w, other._w))
423
+
424
+ def defining_matrix(self):
425
+ """
426
+ Return the matrix whose row span determines the effective divisor
427
+ representing this point.
428
+
429
+ EXAMPLES::
430
+
431
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
432
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
433
+ sage: h = C.function(y/x).divisor_of_poles()
434
+ sage: J = C.jacobian(model='km_large', base_div=h)
435
+ sage: G = J.group()
436
+ sage: b = C([0,1,0]).place()
437
+ sage: pl = C([-1,2,1]).place()
438
+ sage: p = G.point(pl - b)
439
+ sage: p.defining_matrix()
440
+ [1 0 0 0 0 0 0 2 5]
441
+ [0 1 0 0 0 0 0 0 3]
442
+ [0 0 1 0 0 0 0 0 2]
443
+ [0 0 0 1 0 0 0 0 6]
444
+ [0 0 0 0 0 1 0 0 5]
445
+ [0 0 0 0 0 0 1 0 1]
446
+ """
447
+ return self._w
448
+
449
+ def divisor(self):
450
+ """
451
+ Return the divisor representing this point.
452
+
453
+ EXAMPLES::
454
+
455
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
456
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
457
+ sage: F = C.function_field()
458
+ sage: h = C.function(y/x).divisor_of_poles()
459
+ sage: J = C.jacobian(model='km_large', base_div=h)
460
+ sage: G = J.group()
461
+ sage: b = F.get_place(1)
462
+ sage: p = C([-1,2,1]).place()
463
+ sage: pt = G.point(p - b)
464
+ sage: G.point(pt.divisor()) == pt
465
+ True
466
+
467
+ ALGORITHM: Lemma 2.1 of [Khu2004]_.
468
+ """
469
+ G = self.parent()
470
+ F = G._function_field
471
+ data = [G._from_L(f).divisor() for f in self._w.rows()]
472
+ supp = set()
473
+ for d in data:
474
+ supp.update(d.support())
475
+ supp = list(supp)
476
+ d = F.divisor_group().zero()
477
+ for p in supp:
478
+ d += min(d.valuation(p) for d in data) * p.divisor()
479
+ return d + G._div_L - G._base_div
480
+
481
+
482
+ class JacobianPoint_finite_field(JacobianPoint, JacobianPoint_finite_field_base):
483
+ pass
484
+
485
+
486
+ class JacobianGroupEmbedding(Map):
487
+ """
488
+ Embeddings between Jacobian groups.
489
+
490
+ INPUT:
491
+
492
+ - ``base_group`` -- Jacobian group over a base field
493
+
494
+ - ``extension_group`` -- Jacobian group over an extension field
495
+
496
+ EXAMPLES::
497
+
498
+ sage: k = GF(5)
499
+ sage: P2.<x,y,z> = ProjectiveSpace(k, 2)
500
+ sage: C = Curve(x^3 + z^3 - y^2*z, P2)
501
+ sage: h = C.function(y/x).divisor_of_poles()
502
+ sage: J = C.jacobian(model='km_large', base_div=h)
503
+ sage: G1 = J.group()
504
+ sage: K = k.extension(2)
505
+ sage: G2 = J.group(K)
506
+ sage: G2.coerce_map_from(G1)
507
+ Jacobian group embedding map:
508
+ From: Group of rational points of Jacobian
509
+ over Finite Field of size 5 (Khuri-Makdisi large model)
510
+ To: Group of rational points of Jacobian
511
+ over Finite Field in z2 of size 5^2 (Khuri-Makdisi large model)
512
+ """
513
+ def __init__(self, base_group, extension_group):
514
+ """
515
+ Initialize.
516
+
517
+ TESTS::
518
+
519
+ sage: k = GF(5)
520
+ sage: P2.<x,y,z> = ProjectiveSpace(k, 2)
521
+ sage: C = Curve(x^3 + z^3 - y^2*z, P2)
522
+ sage: h = C.function(y/x).divisor_of_poles()
523
+ sage: J = C.jacobian(model='km_large', base_div=h)
524
+ sage: G1 = J.group()
525
+ sage: K = k.extension(2)
526
+ sage: G2 = J.group(K)
527
+ sage: map = G2.coerce_map_from(G1)
528
+ sage: TestSuite(map).run(skip=['_test_category', '_test_pickling'])
529
+ """
530
+ F_ext = extension_group._function_field
531
+ K_ext = F_ext.constant_base_field()
532
+
533
+ self._K_ext = K_ext
534
+
535
+ Map.__init__(self, Hom(base_group, extension_group, CommutativeAdditiveGroups()))
536
+
537
+ def _repr_type(self):
538
+ """
539
+ Return string representation of ``self``.
540
+
541
+ TESTS::
542
+
543
+ sage: k = GF(5)
544
+ sage: P2.<x,y,z> = ProjectiveSpace(k, 2)
545
+ sage: C = Curve(x^3 + z^3 - y^2*z, P2)
546
+ sage: h = C.function(y/x).divisor_of_poles()
547
+ sage: J = C.jacobian(model='km_large', base_div=h)
548
+ sage: G1 = J.group()
549
+ sage: K = k.extension(2)
550
+ sage: G2 = J.group(K)
551
+ sage: G2.coerce_map_from(G1) # indirect doctest
552
+ Jacobian group embedding map:
553
+ From: Group of rational points of Jacobian
554
+ over Finite Field of size 5 (Khuri-Makdisi large model)
555
+ To: Group of rational points of Jacobian
556
+ over Finite Field in z2 of size 5^2 (Khuri-Makdisi large model)
557
+ """
558
+ return 'Jacobian group embedding'
559
+
560
+ def _call_(self, x):
561
+ """
562
+ Conorm map from F to F_ext.
563
+
564
+ TESTS::
565
+
566
+ sage: k = GF(5)
567
+ sage: P2.<x,y,z> = ProjectiveSpace(k, 2)
568
+ sage: C = Curve(x^3 + z^3 - y^2*z, P2)
569
+ sage: h = C.function(y/x).divisor_of_poles()
570
+ sage: J = C.jacobian(model='km_large', base_div=h)
571
+ sage: G1 = J.group()
572
+ sage: K = k.extension(2)
573
+ sage: G2 = J.group(K)
574
+ sage: m = G2.coerce_map_from(G1)
575
+ sage: m(G1.zero()) == G2.zero()
576
+ True
577
+ """
578
+ w = (x._w).change_ring(self._K_ext)
579
+
580
+ return self.codomain().element_class(self.codomain(), w)
581
+
582
+
583
+ class JacobianGroup(UniqueRepresentation, JacobianGroup_base):
584
+ """
585
+ Groups of rational points of a Jacobian.
586
+
587
+ INPUT:
588
+
589
+ - ``parent`` -- a Jacobian
590
+
591
+ - ``function_field`` -- a function field
592
+
593
+ - ``base_div`` -- an effective divisor of the function field
594
+
595
+ EXAMPLES::
596
+
597
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
598
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
599
+ sage: h = C.function(y/x).divisor_of_poles()
600
+ sage: J = C.jacobian(model='km_large', base_div=h)
601
+ sage: J.group()
602
+ Group of rational points of Jacobian
603
+ over Finite Field of size 7 (Khuri-Makdisi large model)
604
+ """
605
+ Element = JacobianPoint
606
+ _embedding_map_class = JacobianGroupEmbedding
607
+
608
+ def __init__(self, parent, function_field, base_div):
609
+ """
610
+ Initialize.
611
+
612
+ TESTS::
613
+
614
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
615
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
616
+ sage: h = C.function(y/x).divisor_of_poles()
617
+ sage: J = C.jacobian(model='km_large', base_div=h)
618
+ sage: G = J.group()
619
+ """
620
+ super().__init__(parent, function_field, base_div)
621
+
622
+ D0 = base_div
623
+
624
+ self._base_div_degree = base_div.degree()
625
+ self._V_cache = dict()
626
+
627
+ def V(n):
628
+ if n in self._V_cache:
629
+ return self._V_cache[n]
630
+
631
+ self._V_cache[n] = (n * D0).function_space()
632
+ return self._V_cache[n]
633
+
634
+ def mu(n, m, i, j):
635
+ Vn, from_Vn, to_Vn = V(n)
636
+ Vm, from_Vm, to_Vm = V(m)
637
+ Vnm, from_Vnm, to_Vnm = V(n + m)
638
+ return to_Vnm(from_Vn(Vn.gen(i)) * from_Vm(Vm.gen(j)))
639
+
640
+ model = parent._model
641
+
642
+ if model == 'large':
643
+ div_L = 3 * D0
644
+ L, from_L, to_L = V(3)
645
+ from sage.rings.function_field.khuri_makdisi import KhuriMakdisi_large as KM
646
+ elif model == 'medium':
647
+ div_L = 2 * D0
648
+ L, from_L, to_L = V(2)
649
+ from sage.rings.function_field.khuri_makdisi import KhuriMakdisi_medium as KM
650
+ elif model == 'small':
651
+ div_L = 3 * D0
652
+ L, from_L, to_L = V(3)
653
+ from sage.rings.function_field.khuri_makdisi import KhuriMakdisi_small as KM
654
+
655
+ self._div_L = div_L
656
+ self._L = L
657
+ self._from_L = from_L
658
+ self._to_L = to_L
659
+
660
+ w0 = self.point(function_field.divisor_group().zero()).defining_matrix()
661
+ km = KM(lambda n: V(n)[0], mu, w0, D0.degree(), self._genus)
662
+
663
+ self._km = km
664
+ self._w0 = w0
665
+
666
+ self._base_place = None
667
+
668
+ def _repr_(self):
669
+ """
670
+ Return the string representation of ``self``.
671
+
672
+ EXAMPLES::
673
+
674
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
675
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
676
+ sage: h = C.function(y/x).divisor_of_poles()
677
+ sage: J = C.jacobian(model='km_large', base_div=h)
678
+ sage: J.group()
679
+ Group of rational points of Jacobian
680
+ over Finite Field of size 7 (Khuri-Makdisi large model)
681
+ """
682
+ r = super()._repr_()
683
+ return r + f' (Khuri-Makdisi {self._parent._model} model)'
684
+
685
+ def _wd_from_divisor(self, x):
686
+ """
687
+ Return the matrix representing the divisor ``x``.
688
+
689
+ INPUT:
690
+
691
+ - ``x`` -- an effective divisor
692
+
693
+ TESTS:
694
+
695
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
696
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
697
+ sage: h = C.function(y/x).divisor_of_poles()
698
+ sage: J = C.jacobian(model='km_medium', base_div=h)
699
+ sage: G = J.group()
700
+ sage: P = C([-1,2,1]).place()
701
+ sage: G._wd_from_divisor(2*P)
702
+ [1 0 0 0 4 0]
703
+ [0 1 0 0 4 6]
704
+ [0 0 1 0 2 1]
705
+ [0 0 0 1 1 6]
706
+ """
707
+ WD = (self._div_L - x).basis_function_space()
708
+ wd = matrix([self._to_L(f) for f in WD])
709
+ wd.echelonize()
710
+ return wd
711
+
712
+ def _element_constructor_(self, x):
713
+ """
714
+ Construct an element of ``self`` from ``x``.
715
+
716
+ If ``x`` is an effective divisor, then it is assumed to have the same
717
+ degree with the base divisor.
718
+
719
+ TESTS::
720
+
721
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
722
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
723
+ sage: h = C.function(y/x).divisor_of_poles()
724
+ sage: J = C.jacobian(model='km_large', base_div=h)
725
+ sage: G = J.group()
726
+ sage: G(0)
727
+ Point of Jacobian determined by
728
+ [1 0 0 0 0 0 0 0 0]
729
+ [0 1 0 0 0 0 0 0 0]
730
+ [0 0 1 0 0 0 0 0 0]
731
+ [0 0 0 0 1 0 0 0 0]
732
+ [0 0 0 0 0 1 0 0 0]
733
+ [0 0 0 0 0 0 0 1 0]
734
+ sage: b = C([0,1,0]).place()
735
+ sage: J.set_base_place(b)
736
+ sage: p = C([-1,2,1]).place()
737
+ sage: G(p)
738
+ Point of Jacobian determined by
739
+ [1 0 0 0 0 0 0 2 5]
740
+ [0 1 0 0 0 0 0 0 3]
741
+ [0 0 1 0 0 0 0 0 2]
742
+ [0 0 0 1 0 0 0 0 6]
743
+ [0 0 0 0 0 1 0 0 5]
744
+ [0 0 0 0 0 0 1 0 1]
745
+ """
746
+ if x == 0:
747
+ return self.zero()
748
+
749
+ if isinstance(x, FunctionFieldPlace):
750
+ if (self._base_place is not None
751
+ and x in self._function_field.place_set()
752
+ and x.degree() == 1):
753
+ x = x - self._base_place
754
+ else:
755
+ x = x.divisor()
756
+
757
+ if (isinstance(x, FunctionFieldDivisor)
758
+ and x in self._function_field.divisor_group()):
759
+ if x.degree() == 0:
760
+ return self.point(x)
761
+ if x.is_effective():
762
+ if x.degree() != self._base_div_degree:
763
+ raise ValueError(f"effective divisor is not of degree {self._base_div_degree}")
764
+ wd = self._wd_from_divisor(x)
765
+ return self.element_class(self, wd)
766
+
767
+ raise ValueError(f"cannot construct a point from {x}")
768
+
769
+ def point(self, divisor):
770
+ """
771
+ Return the point represented by the divisor.
772
+
773
+ INPUT:
774
+
775
+ - ``divisor`` -- a divisor of degree zero
776
+
777
+ EXAMPLES::
778
+
779
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
780
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
781
+ sage: h = C.function(y/x).divisor_of_poles()
782
+ sage: J = C.jacobian(model='km_large', base_div=h)
783
+ sage: G = J.group()
784
+ sage: b = C([0,1,0]).place()
785
+ sage: p = C([-1,2,1]).place()
786
+ sage: G.point(p - b)
787
+ Point of Jacobian determined by
788
+ [1 0 0 0 0 0 0 2 5]
789
+ [0 1 0 0 0 0 0 0 3]
790
+ [0 0 1 0 0 0 0 0 2]
791
+ [0 0 0 1 0 0 0 0 6]
792
+ [0 0 0 0 0 1 0 0 5]
793
+ [0 0 0 0 0 0 1 0 1]
794
+ """
795
+ if divisor.degree() != 0:
796
+ raise ValueError('divisor not of degree zero')
797
+
798
+ c = divisor + self._base_div
799
+ f = c.basis_function_space()[0]
800
+ d = f.divisor() + c
801
+
802
+ wd = self._wd_from_divisor(d)
803
+ return self.element_class(self, wd)
804
+
805
+ @cached_method
806
+ def zero(self):
807
+ """
808
+ Return the zero element of this group.
809
+
810
+ EXAMPLES::
811
+
812
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
813
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
814
+ sage: h = C.function(y/x).divisor_of_poles()
815
+ sage: J = C.jacobian(model='km_large', base_div=h)
816
+ sage: G = J.group()
817
+ sage: G.zero()
818
+ Point of Jacobian determined by
819
+ [1 0 0 0 0 0 0 0 0]
820
+ [0 1 0 0 0 0 0 0 0]
821
+ [0 0 1 0 0 0 0 0 0]
822
+ [0 0 0 0 1 0 0 0 0]
823
+ [0 0 0 0 0 1 0 0 0]
824
+ [0 0 0 0 0 0 0 1 0]
825
+ """
826
+ return self.element_class(self, self._w0)
827
+
828
+
829
+ class JacobianGroup_finite_field(JacobianGroup, JacobianGroup_finite_field_base):
830
+ """
831
+ Jacobian groups of function fields over finite fields.
832
+
833
+ INPUT:
834
+
835
+ - ``parent`` -- a Jacobian
836
+
837
+ - ``function_field`` -- a function field
838
+
839
+ - ``base_div`` -- an effective divisor of the function field
840
+
841
+ EXAMPLES::
842
+
843
+ sage: k = GF(7)
844
+ sage: P2.<x,y,z> = ProjectiveSpace(k, 2)
845
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
846
+ sage: h = C.function(y/x).divisor_of_poles()
847
+ sage: J = C.jacobian(model='km_large', base_div=h)
848
+ sage: G1 = J.group()
849
+ sage: K = k.extension(2)
850
+ sage: G2 = J.group(K)
851
+ sage: G2.coerce_map_from(G1)
852
+ Jacobian group embedding map:
853
+ From: Group of rational points of Jacobian
854
+ over Finite Field of size 7 (Khuri-Makdisi large model)
855
+ To: Group of rational points of Jacobian
856
+ over Finite Field in z2 of size 7^2 (Khuri-Makdisi large model)
857
+ """
858
+ Element = JacobianPoint_finite_field
859
+
860
+ def __init__(self, parent, function_field, base_div):
861
+ """
862
+ Initialize.
863
+
864
+ TESTS::
865
+
866
+ sage: k = GF(7)
867
+ sage: P2.<x,y,z> = ProjectiveSpace(k, 2)
868
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
869
+ sage: h = C.function(y/x).divisor_of_poles()
870
+ sage: J = C.jacobian(model='km_large', base_div=h)
871
+ sage: G = J.group()
872
+ sage: TestSuite(G).run(skip=['_test_elements', '_test_pickling'])
873
+ """
874
+ super().__init__(parent, function_field, base_div)
875
+
876
+ F = self._function_field
877
+ K = F.constant_base_field()
878
+
879
+ r = self._parent._function_field.constant_base_field().degree()
880
+ frob_K = K.frobenius_endomorphism(r)
881
+
882
+ self._frobenius_of_constant_field = frob_K
883
+
884
+ def __iter__(self):
885
+ """
886
+ Return generator of points of this group.
887
+
888
+ TESTS::
889
+
890
+ sage: k = GF(7)
891
+ sage: A.<x,y> = AffineSpace(k,2)
892
+ sage: C = Curve(y^2 + x^3 + 2*x + 1).projective_closure()
893
+ sage: b = C([0,0,1]).place()
894
+ sage: J = C.jacobian(model='km_large', base_div=3*b)
895
+ sage: G = J.group()
896
+ sage: len([pt for pt in G]) # long time
897
+ 11
898
+ """
899
+ d0 = self._base_div.degree()
900
+ F = self._function_field
901
+
902
+ zero_divisor = self._km.zero_divisor()
903
+ deg = 1
904
+ support = []
905
+ degrees = []
906
+ multiples = []
907
+ lst = []
908
+
909
+ places_infinite = F.places_infinite()
910
+ generators = [iter(places_infinite)]
911
+ while True:
912
+ while True:
913
+ try:
914
+ new_pl = next(generators[-1])
915
+ break
916
+ except StopIteration:
917
+ if deg > d0:
918
+ return
919
+ generators.append(F._places_finite(deg))
920
+ deg += 1
921
+ multiples.append((d0 + 1)*[None])
922
+ wn = self._wd_from_divisor(new_pl.divisor())
923
+ dn = new_pl.degree()
924
+ wr = zero_divisor
925
+ dr = 0
926
+ for r in range(1, d0 // dn + 1):
927
+ wr = self._km.add_divisor(wr, wn, dr, dn)
928
+ multiples[-1][r] = wr
929
+ dr += dn
930
+ for weights in WeightedIntegerVectors(d0 - dr, degrees):
931
+ d = dr
932
+ wD = wr
933
+ for i in range(len(support)):
934
+ w = weights[i]
935
+ if w > 0:
936
+ m = w * degrees[i]
937
+ wD = self._km.add_divisor(wD, multiples[i][w], d, m)
938
+ d += m
939
+ pt = self.element_class(self, wD)
940
+ if pt not in lst:
941
+ lst.append(pt)
942
+ yield pt
943
+ support.append(new_pl)
944
+ degrees.append(new_pl.degree())
945
+
946
+ def _frobenius_on(self, pt):
947
+ """
948
+ Return the image of ``pt`` acted by the Frobenius automorphism.
949
+
950
+ INPUT:
951
+
952
+ - ``pt`` -- a point of ``self``
953
+
954
+ TESTS::
955
+
956
+ sage: k = GF(7)
957
+ sage: A.<x,y> = AffineSpace(k,2)
958
+ sage: C = Curve(y^2 + x^3 + 2*x + 1).projective_closure()
959
+ sage: b = C([0,0,1]).place()
960
+ sage: J = C.jacobian(model='km_large', base_div=3*b)
961
+ sage: G1 = J.group()
962
+ sage: K = k.extension(3)
963
+ sage: G3 = J.group(K)
964
+ sage: pt = G3.get_points(12)[-2] # expected to be a point rational over K # needs sage.combinat
965
+ sage: pt.frobenius().frobenius().frobenius() == pt # indirect doctest # needs sage.combinat
966
+ True
967
+ """
968
+ w = pt._w.apply_morphism(self._frobenius_of_constant_field)
969
+ return self.element_class(self, w)
970
+
971
+
972
+ class Jacobian(UniqueRepresentation, Jacobian_base):
973
+ """
974
+ Jacobians implemented by Khuri-Makdisi's algorithms.
975
+
976
+ EXAMPLES::
977
+
978
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
979
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
980
+ sage: C.jacobian(model='km')
981
+ Jacobian of Projective Plane Curve over Finite Field of size 7
982
+ defined by x^3 - y^2*z - 2*z^3 (Khuri-Makdisi large model)
983
+ """
984
+ def __init__(self, function_field, base_div, model, **kwds):
985
+ """
986
+ Initialize.
987
+
988
+ TESTS::
989
+
990
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
991
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
992
+ sage: J = C.jacobian(model='km_large')
993
+ sage: TestSuite(J).run(skip=['_test_elements', '_test_pickling'])
994
+
995
+ ::
996
+
997
+ sage: J = C.jacobian(model='km_unknown')
998
+ Traceback (most recent call last):
999
+ ...
1000
+ ValueError: unknown model
1001
+ """
1002
+ super().__init__(function_field, base_div, **kwds)
1003
+
1004
+ if model not in ['large', 'medium', 'small']:
1005
+ raise ValueError('unknown model')
1006
+
1007
+ self._model = model
1008
+
1009
+ if function_field.constant_base_field().is_finite():
1010
+ self._group_class = JacobianGroup_finite_field
1011
+ else:
1012
+ self._group_class = JacobianGroup
1013
+
1014
+ def _repr_(self):
1015
+ """
1016
+ Return the string representation of ``self``.
1017
+
1018
+ TESTS::
1019
+
1020
+ sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
1021
+ sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
1022
+ sage: C.jacobian(model='km_large')
1023
+ Jacobian of Projective Plane Curve over Finite Field of size 7
1024
+ defined by x^3 - y^2*z - 2*z^3 (Khuri-Makdisi large model)
1025
+ """
1026
+ r = super()._repr_()
1027
+ return r + f' (Khuri-Makdisi {self._model} model)'