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