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,1484 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Points on projective varieties
4
+
5
+ This module implements scheme morphism for points on projective varieties.
6
+
7
+ AUTHORS:
8
+
9
+ - David Kohel, William Stein (2006): initial version
10
+ - William Stein (2006-02-11): fixed bug where P(0,0,0) was allowed as a
11
+ projective point
12
+ - Volker Braun (2011-08-08): Renamed classes, more documentation, misc cleanups
13
+ - Ben Hutz (2012-06): added support for projective ring
14
+ - Ben Hutz (2013-03): added iteration functionality and new directory structure
15
+ for affine/projective, height functionality
16
+ """
17
+
18
+ # ****************************************************************************
19
+ # Copyright (C) 2006 David Kohel <kohel@maths.usyd.edu.au>
20
+ # Copyright (C) 2006 William Stein <wstein@gmail.com>
21
+ # Copyright (C) 2011 Volker Braun <vbraun.name@gmail.com>
22
+ #
23
+ # This program is free software: you can redistribute it and/or modify
24
+ # it under the terms of the GNU General Public License as published by
25
+ # the Free Software Foundation, either version 2 of the License, or
26
+ # (at your option) any later version.
27
+ # https://www.gnu.org/licenses/
28
+ # ****************************************************************************
29
+
30
+ from copy import copy
31
+
32
+ from sage.arith.functions import lcm
33
+ from sage.arith.misc import gcd
34
+ from sage.categories.integral_domains import IntegralDomains
35
+ from sage.categories.number_fields import NumberFields
36
+ from sage.misc.lazy_import import lazy_import
37
+ from sage.misc.misc_c import prod
38
+ from sage.rings.abc import Order
39
+ from sage.rings.fraction_field import FractionField
40
+ from sage.rings.integer_ring import ZZ
41
+ from sage.rings.quotient_ring import QuotientRing_generic
42
+ from sage.rings.rational_field import QQ
43
+ from sage.rings.ring import CommutativeRing
44
+ from sage.schemes.generic.morphism import (SchemeMorphism,
45
+ SchemeMorphism_point)
46
+ from sage.structure.element import AdditiveGroupElement
47
+ from sage.structure.richcmp import richcmp, op_EQ, op_NE
48
+ from sage.structure.sequence import Sequence
49
+
50
+ lazy_import('sage.rings.qqbar', 'number_field_elements_from_algebraics')
51
+
52
+ _NumberFields = NumberFields()
53
+
54
+
55
+ # --------------------
56
+ # Projective varieties
57
+ # --------------------
58
+
59
+ class SchemeMorphism_point_projective_ring(SchemeMorphism_point):
60
+ """
61
+ A rational point of projective space over a ring.
62
+
63
+ INPUT:
64
+
65
+ - ``X`` -- a homset of a subscheme of an ambient projective space over a ring `K`
66
+
67
+ - ``v`` -- list or tuple of coordinates in `K`
68
+
69
+ - ``check`` -- boolean (default: ``True``); whether to check the input for consistency
70
+
71
+ EXAMPLES::
72
+
73
+ sage: P = ProjectiveSpace(2, ZZ)
74
+ sage: P(2,3,4)
75
+ (2 : 3 : 4)
76
+ """
77
+
78
+ def __init__(self, X, v, check=True):
79
+ """
80
+ The Python constructor.
81
+
82
+ EXAMPLES::
83
+
84
+ sage: P = ProjectiveSpace(2, QQ)
85
+ sage: P(2, 3/5, 4)
86
+ (1/2 : 3/20 : 1)
87
+
88
+ ::
89
+
90
+ sage: P = ProjectiveSpace(1, ZZ)
91
+ sage: P([0, 1])
92
+ (0 : 1)
93
+
94
+ ::
95
+
96
+ sage: P = ProjectiveSpace(1, ZZ)
97
+ sage: P([0, 0, 1])
98
+ Traceback (most recent call last):
99
+ ...
100
+ TypeError: v (=[0, 0, 1]) must have 2 components
101
+
102
+ ::
103
+
104
+ sage: P = ProjectiveSpace(3, ZZ)
105
+ sage: P(0,0,0,0)
106
+ Traceback (most recent call last):
107
+ ...
108
+ ValueError: [0, 0, 0, 0] does not define a valid projective point since all entries are zero
109
+
110
+ ::
111
+
112
+ sage: P = ProjectiveSpace(3, Zmod(15))
113
+ sage: P(3,5,9,10)
114
+ (3 : 5 : 9 : 10)
115
+
116
+ ::
117
+
118
+ sage: P = ProjectiveSpace(3, Zmod(15))
119
+ sage: P(0,5,10,15)
120
+ Traceback (most recent call last):
121
+ ...
122
+ ValueError: [0, 5, 10, 0] does not define a valid projective point since it is a multiple of a zero divisor
123
+
124
+ It is possible to avoid the possibly time-consuming checks, but be careful!! ::
125
+
126
+ sage: P = ProjectiveSpace(3, QQ)
127
+ sage: P.point([0,0,0,0], check=False)
128
+ (0 : 0 : 0 : 0)
129
+
130
+ ::
131
+
132
+ sage: P.<x, y, z> = ProjectiveSpace(2, ZZ)
133
+ sage: X = P.subscheme([x^2 - y*z])
134
+ sage: X([2, 2, 2])
135
+ (2 : 2 : 2)
136
+
137
+ ::
138
+
139
+ sage: R.<t> = PolynomialRing(ZZ)
140
+ sage: P = ProjectiveSpace(1, R.quo(t^2 + 1)) # needs sage.libs.pari
141
+ sage: P([2*t, 1]) # needs sage.libs.pari
142
+ (2*tbar : 1)
143
+
144
+ ::
145
+
146
+ sage: P = ProjectiveSpace(ZZ, 1)
147
+ sage: P.point(Infinity)
148
+ (1 : 0)
149
+ sage: P(infinity)
150
+ (1 : 0)
151
+
152
+ ::
153
+
154
+ sage: P = ProjectiveSpace(ZZ, 2)
155
+ sage: P(Infinity)
156
+ Traceback (most recent call last):
157
+ ...
158
+ ValueError: +Infinity not well defined in dimension > 1
159
+ sage: P.point(infinity)
160
+ Traceback (most recent call last):
161
+ ...
162
+ ValueError: +Infinity not well defined in dimension > 1
163
+ """
164
+ SchemeMorphism.__init__(self, X)
165
+
166
+ if check:
167
+ d = X.codomain().ambient_space().ngens()
168
+ if isinstance(v, SchemeMorphism):
169
+ v = list(v)
170
+ else:
171
+ try:
172
+ if isinstance(v.parent(), CommutativeRing):
173
+ v = [v]
174
+ except AttributeError:
175
+ pass
176
+ if not isinstance(v, (list, tuple)):
177
+ raise TypeError("argument v (= %s) must be a scheme point, list, or tuple" % str(v))
178
+ if len(v) != d and len(v) != d-1:
179
+ raise TypeError("v (=%s) must have %s components" % (v, d))
180
+
181
+ R = X.value_ring()
182
+ v = Sequence(v, R)
183
+ if len(v) == d-1: # very common special case
184
+ v.append(R.one())
185
+
186
+ if R in IntegralDomains():
187
+ # Over integral domains, any tuple with at least one
188
+ # nonzero coordinate is a valid projective point.
189
+ if not any(v):
190
+ raise ValueError(f"{v} does not define a valid projective "
191
+ "point since all entries are zero")
192
+ else:
193
+ # Over rings with zero divisors, a more careful check
194
+ # is required: We test whether the coordinates of the
195
+ # point generate the unit ideal. See #31576.
196
+ if 1 not in R.ideal(v):
197
+ raise ValueError(f"{v} does not define a valid projective point "
198
+ "since it is a multiple of a zero divisor")
199
+
200
+ X.extended_codomain()._check_satisfies_equations(v)
201
+
202
+ self._coords = tuple(v)
203
+ self._normalized = False
204
+
205
+ def _richcmp_(self, right, op):
206
+ """
207
+ Test the projective equality of two points.
208
+
209
+ INPUT:
210
+
211
+ - ``right`` -- a point on projective space
212
+
213
+ OUTPUT: boolean
214
+
215
+ EXAMPLES::
216
+
217
+ sage: PS = ProjectiveSpace(ZZ, 1, 'x')
218
+ sage: P = PS([1, 2])
219
+ sage: Q = PS([2, 4])
220
+ sage: P == Q
221
+ True
222
+
223
+ ::
224
+
225
+ sage: PS = ProjectiveSpace(ZZ, 1, 'x')
226
+ sage: P = PS([1, 2])
227
+ sage: Q = PS([1, 0])
228
+ sage: P == Q
229
+ False
230
+
231
+ ::
232
+
233
+ sage: # needs sage.rings.padics
234
+ sage: PS = ProjectiveSpace(Zp(5), 1, 'x')
235
+ sage: P = PS([0, 1])
236
+ sage: P == PS(0)
237
+ True
238
+
239
+ ::
240
+
241
+ sage: R.<t> = PolynomialRing(QQ)
242
+ sage: PS = ProjectiveSpace(R, 1, 'x')
243
+ sage: P = PS([t, 1 + t^2])
244
+ sage: Q = PS([t^2, t + t^3])
245
+ sage: P == Q
246
+ True
247
+
248
+ ::
249
+
250
+ sage: PS = ProjectiveSpace(ZZ, 2, 'x')
251
+ sage: P = PS([0, 1, 2])
252
+ sage: P == PS([0, 0])
253
+ False
254
+
255
+ ::
256
+
257
+ sage: PS = ProjectiveSpace(ZZ, 1, 'x')
258
+ sage: P = PS([2, 1])
259
+ sage: PS2 = ProjectiveSpace(Zp(7), 1, 'x') # needs sage.rings.padics
260
+ sage: Q = PS2([2, 1]) # needs sage.rings.padics
261
+ sage: P == Q # needs sage.rings.padics
262
+ True
263
+
264
+ ::
265
+
266
+ sage: PS = ProjectiveSpace(ZZ.quo(6), 2, 'x')
267
+ sage: P = PS([2, 4, 1])
268
+ sage: Q = PS([0, 1, 3])
269
+ sage: P == Q
270
+ False
271
+
272
+ Check that :issue:`17433` is fixed::
273
+
274
+ sage: P.<x,y> = ProjectiveSpace(Zmod(10), 1)
275
+ sage: p1 = P(1/3, 1)
276
+ sage: p2 = P.point([1, 3], False)
277
+ sage: p1 == p2
278
+ True
279
+
280
+ ::
281
+
282
+ sage: # needs sage.rings.number_field
283
+ sage: R.<z> = PolynomialRing(QQ)
284
+ sage: K.<t> = NumberField(z^2 + 5)
285
+ sage: OK = K.ring_of_integers()
286
+ sage: t = OK.gen(1)
287
+ sage: PS.<x,y> = ProjectiveSpace(OK, 1)
288
+ sage: P = PS(2, 1 + t)
289
+ sage: Q = PS(1 - t, 3)
290
+ sage: P == Q
291
+ True
292
+
293
+ Check that :issue:`17429` is fixed::
294
+
295
+ sage: # needs sage.libs.pari sage.rings.complex_interval_field
296
+ sage: R.<x> = PolynomialRing(QQ)
297
+ sage: r = (x^2 - x - 3).polynomial(x).roots(ComplexIntervalField(),
298
+ ....: multiplicities=False)
299
+ sage: P.<x,y> = ProjectiveSpace(ComplexIntervalField(), 1)
300
+ sage: P1 = P(r[0], 1)
301
+ sage: H = End(P)
302
+ sage: f = H([x^2 - 3*y^2, y^2])
303
+ sage: Q1 = f(P1)
304
+ sage: Q1 == P1
305
+ False
306
+
307
+ For inequality::
308
+
309
+ sage: PS = ProjectiveSpace(ZZ, 1, 'x')
310
+ sage: P = PS([1, 2])
311
+ sage: Q = PS([2, 4])
312
+ sage: P != Q
313
+ False
314
+
315
+ ::
316
+
317
+ sage: PS = ProjectiveSpace(ZZ, 1, 'x')
318
+ sage: P = PS([1, 2])
319
+ sage: Q = PS([1, 0])
320
+ sage: P != Q
321
+ True
322
+
323
+ ::
324
+
325
+ sage: # needs sage.rings.padics
326
+ sage: PS = ProjectiveSpace(Zp(5), 1, 'x')
327
+ sage: P = PS([0, 1])
328
+ sage: P != PS(0)
329
+ False
330
+
331
+ ::
332
+
333
+ sage: R.<t> = PolynomialRing(QQ)
334
+ sage: PS = ProjectiveSpace(R, 1, 'x')
335
+ sage: P = PS([t, 1 + t^2])
336
+ sage: Q = PS([t^2, t + t^3])
337
+ sage: P != Q
338
+ False
339
+
340
+ ::
341
+
342
+ sage: PS = ProjectiveSpace(ZZ, 2, 'x')
343
+ sage: P = PS([0, 1, 2])
344
+ sage: P != PS([0, 0])
345
+ True
346
+
347
+ ::
348
+
349
+ sage: PS = ProjectiveSpace(ZZ, 1, 'x')
350
+ sage: P = PS([2, 1])
351
+ sage: PS2 = ProjectiveSpace(Zp(7), 1, 'x') # needs sage.rings.padics
352
+ sage: Q = PS2([2, 1]) # needs sage.rings.padics
353
+ sage: P != Q # needs sage.rings.padics
354
+ False
355
+
356
+ ::
357
+
358
+ sage: PS = ProjectiveSpace(ZZ.quo(6), 2, 'x')
359
+ sage: P = PS([2, 4, 1])
360
+ sage: Q = PS([0, 1, 3])
361
+ sage: P != Q
362
+ True
363
+ """
364
+ if not isinstance(right, SchemeMorphism_point):
365
+ try:
366
+ right = self.codomain()(right)
367
+ except TypeError:
368
+ return NotImplemented
369
+ if self.codomain() != right.codomain():
370
+ return op == op_NE
371
+
372
+ n = len(self._coords)
373
+ if op in [op_EQ, op_NE]:
374
+ b = all(self[i] * right[j] == self[j] * right[i]
375
+ for i in range(n) for j in range(i + 1, n))
376
+ return b == (op == op_EQ)
377
+ return richcmp(self._coords, right._coords, op)
378
+
379
+ def __hash__(self):
380
+ """
381
+ Compute the hash value of this point.
382
+
383
+ If the base ring has a fraction field, normalize the point in
384
+ the fraction field and then hash so that equal points have
385
+ equal hash values. If the base ring is not an integral domain,
386
+ return the hash of the parent.
387
+
388
+ OUTPUT: integer
389
+
390
+ EXAMPLES::
391
+
392
+ sage: P.<x,y> = ProjectiveSpace(ZZ, 1)
393
+ sage: hash(P([1, 1])) == hash(P.point([2, 2], False))
394
+ True
395
+
396
+ ::
397
+
398
+ sage: # needs sage.rings.number_field
399
+ sage: R.<x> = PolynomialRing(QQ)
400
+ sage: K.<w> = NumberField(x^2 + 3)
401
+ sage: O = K.maximal_order()
402
+ sage: P.<x,y> = ProjectiveSpace(O, 1)
403
+ sage: hash(P([1 + w, 2])) == hash(P([2, 1 - w]))
404
+ True
405
+
406
+ TESTS::
407
+
408
+ sage: P.<x,y> = ProjectiveSpace(Zmod(10), 1)
409
+ sage: Q.<x,y> = ProjectiveSpace(Zmod(10), 1)
410
+ sage: hash(P([2, 5])) == hash(Q([2, 5]))
411
+ True
412
+ sage: hash(P([2, 5])) == hash(P([2, 5]))
413
+ True
414
+ sage: hash(P([3, 7])) == hash(P([2, 5]))
415
+ True
416
+ """
417
+ R = self.codomain().base_ring()
418
+ #if there is a fraction field normalize the point so that
419
+ #equal points have equal hash values
420
+ if R in IntegralDomains():
421
+ P = self.change_ring(FractionField(R))
422
+ P.normalize_coordinates()
423
+ return hash(tuple(P))
424
+ #if there is no good way to normalize return
425
+ #a constant value
426
+ return hash(self.codomain())
427
+
428
+ def _matrix_times_point_(self, mat, dom):
429
+ r"""
430
+ Multiply the point by a matrix ``mat`` on the left.
431
+
432
+ INPUT:
433
+
434
+ - ``mat`` -- a matrix
435
+
436
+ - ``dom`` -- point set of the resulting point
437
+
438
+ OUTPUT: a scheme point given by ``mat*self``
439
+
440
+ EXAMPLES::
441
+
442
+ sage: P = ProjectiveSpace(QQ, 1)
443
+ sage: Q = P(1,1)
444
+ sage: m = matrix(QQ, 2, 2, [1,1, 0,1]) # needs sage.modules
445
+ sage: m*Q # needs sage.modules
446
+ (2 : 1)
447
+
448
+ ::
449
+
450
+ sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
451
+ sage: X = P.subscheme(x - y)
452
+ sage: Q = X(1,1)
453
+ sage: m = matrix(CC, 3, 3, [1,CC.0,0, CC.0,1,0, 1,1,1]) # needs sage.modules
454
+ sage: m*Q # needs sage.modules
455
+ (0.333333333333333 + 0.333333333333333*I : 0.333333333333333
456
+ + 0.333333333333333*I : 1.00000000000000)
457
+
458
+ ::
459
+
460
+ sage: # needs sage.modules sage.rings.number_field sage.symbolic
461
+ sage: P = ProjectiveSpace(QQbar, 1)
462
+ sage: Q = P(QQbar(sqrt(2)),1)
463
+ sage: m = matrix(ZZ, 2, 2, [1,-1, 0,1])
464
+ sage: m*Q
465
+ (0.4142135623730951? : 1)
466
+
467
+ ::
468
+
469
+ sage: P = ProjectiveSpace(QQ, 1)
470
+ sage: Q = P(1,1)
471
+ sage: m = matrix(QQ, 3, 2, [1,1, 0,1, 1,1]) # needs sage.modules
472
+ sage: m*Q # needs sage.modules
473
+ Traceback (most recent call last):
474
+ ...
475
+ ValueError: matrix must be square
476
+ """
477
+ from sage.modules.free_module_element import vector
478
+ if not mat.is_square():
479
+ raise ValueError("matrix must be square")
480
+ if mat.ncols() != self.codomain().ngens():
481
+ raise ValueError("matrix size is incompatible")
482
+ X = mat * vector(list(self))
483
+ return dom.codomain()(list(X))
484
+
485
+ def scale_by(self, t):
486
+ """
487
+ Scale the coordinates of the point by ``t``.
488
+
489
+ A :exc:`TypeError` occurs if the point is not in the
490
+ base_ring of the codomain after scaling.
491
+
492
+ INPUT:
493
+
494
+ - ``t`` -- a ring element
495
+
496
+ OUTPUT: none
497
+
498
+ EXAMPLES::
499
+
500
+ sage: R.<t> = PolynomialRing(QQ)
501
+ sage: P = ProjectiveSpace(R, 2, 'x')
502
+ sage: p = P([3/5*t^3, 6*t, t])
503
+ sage: p.scale_by(1/t); p
504
+ (3/5*t^2 : 6 : 1)
505
+
506
+ ::
507
+
508
+ sage: # needs sage.libs.pari
509
+ sage: R.<t> = PolynomialRing(QQ)
510
+ sage: S = R.quo(R.ideal(t^3))
511
+ sage: P.<x,y,z> = ProjectiveSpace(S, 2)
512
+ sage: Q = P(t, 1, 1)
513
+ sage: Q.scale_by(t);Q
514
+ (tbar^2 : tbar : tbar)
515
+
516
+ ::
517
+
518
+ sage: P.<x,y,z> = ProjectiveSpace(ZZ,2)
519
+ sage: Q = P(2, 2, 2)
520
+ sage: Q.scale_by(1/2);Q
521
+ (1 : 1 : 1)
522
+ """
523
+ if t.is_zero(): #what if R(t) == 0 ?
524
+ raise ValueError("Cannot scale by 0")
525
+ R = self.codomain().base_ring()
526
+ if isinstance(R, QuotientRing_generic):
527
+ for i in range(self.codomain().ambient_space().dimension_relative()+1):
528
+ new_coords = [R(u.lift()*t) for u in self._coords]
529
+ else:
530
+ for i in range(self.codomain().ambient_space().dimension_relative()+1):
531
+ new_coords = [R(u*t) for u in self._coords]
532
+ self._coords = tuple(new_coords)
533
+ self._normalized = False
534
+
535
+ def normalize_coordinates(self):
536
+ """
537
+ Removes the gcd from the coordinates of this point (including `-1`)
538
+ and rescales everything so that the last nonzero entry is as "simple"
539
+ as possible. The notion of "simple" here depends on the base ring;
540
+ concretely, the last nonzero coordinate will be `1` in a field and
541
+ positive over an ordered ring.
542
+
543
+ .. WARNING:: The gcd will depend on the base ring.
544
+
545
+ OUTPUT: none
546
+
547
+ EXAMPLES::
548
+
549
+ sage: P = ProjectiveSpace(ZZ, 2, 'x')
550
+ sage: p = P([-5, -15, -20])
551
+ sage: p.normalize_coordinates(); p
552
+ (1 : 3 : 4)
553
+
554
+ ::
555
+
556
+ sage: # needs sage.rings.padics
557
+ sage: P = ProjectiveSpace(Zp(7), 2, 'x')
558
+ sage: p = P([-5, -15, -2])
559
+ sage: p.normalize_coordinates(); p
560
+ (6 + 3*7 + 3*7^2 + 3*7^3 + 3*7^4 + 3*7^5 + 3*7^6 + 3*7^7 + 3*7^8 + 3*7^9 + 3*7^10 + 3*7^11 + 3*7^12 + 3*7^13 + 3*7^14 + 3*7^15 + 3*7^16 + 3*7^17 + 3*7^18 + 3*7^19 + O(7^20) : 4 + 4*7 + 3*7^2 + 3*7^3 + 3*7^4 + 3*7^5 + 3*7^6 + 3*7^7 + 3*7^8 + 3*7^9 + 3*7^10 + 3*7^11 + 3*7^12 + 3*7^13 + 3*7^14 + 3*7^15 + 3*7^16 + 3*7^17 + 3*7^18 + 3*7^19 + O(7^20) : 1 + O(7^20))
561
+
562
+ ::
563
+
564
+ sage: R.<t> = PolynomialRing(QQ)
565
+ sage: P = ProjectiveSpace(R, 2, 'x')
566
+ sage: p = P([3/5*t^3, 6*t, t])
567
+ sage: p.normalize_coordinates(); p
568
+ (3/5*t^2 : 6 : 1)
569
+
570
+ ::
571
+
572
+ sage: P.<x,y> = ProjectiveSpace(Zmod(20), 1)
573
+ sage: Q = P(3, 6)
574
+ sage: Q.normalize_coordinates()
575
+ sage: Q
576
+ (1 : 2)
577
+
578
+ Since the base ring is a polynomial ring over a field, only the
579
+ gcd `c` is removed. ::
580
+
581
+ sage: R.<c> = PolynomialRing(QQ)
582
+ sage: P = ProjectiveSpace(R, 1)
583
+ sage: Q = P(2*c, 4*c)
584
+ sage: Q.normalize_coordinates(); Q
585
+ (1/2 : 1)
586
+
587
+ A polynomial ring over a ring gives the more intuitive result. ::
588
+
589
+ sage: R.<c> = PolynomialRing(ZZ)
590
+ sage: P = ProjectiveSpace(R, 1)
591
+ sage: Q = P(2*c, 4*c)
592
+ sage: Q.normalize_coordinates();Q
593
+ (1 : 2)
594
+
595
+ ::
596
+
597
+ sage: # needs sage.libs.singular
598
+ sage: R.<t> = QQ[]
599
+ sage: S = R.quotient_ring(R.ideal(t^3))
600
+ sage: P.<x,y> = ProjectiveSpace(S, 1)
601
+ sage: Q = P(t + 1, t^2 + t)
602
+ sage: Q.normalize_coordinates()
603
+ sage: Q
604
+ (1 : tbar)
605
+ """
606
+ if self._normalized:
607
+ return
608
+ R = self.codomain().base_ring()
609
+ if isinstance(R, QuotientRing_generic):
610
+ index = len(self._coords) - 1
611
+ while not self._coords[index]:
612
+ index -= 1
613
+ last = self._coords[index].lift()
614
+ mod, = R.defining_ideal().gens()
615
+ unit = last
616
+ while not (zdiv := mod.gcd(unit)).is_unit():
617
+ unit //= zdiv
618
+ self.scale_by(unit.inverse_mod(mod))
619
+ else:
620
+ GCD = R(gcd(self._coords[0], self._coords[1]))
621
+ index = 2
622
+ while not GCD.is_unit() and index < len(self._coords):
623
+ GCD = R(gcd(GCD, self._coords[index]))
624
+ index += 1
625
+ if not GCD.is_unit():
626
+ self.scale_by(~GCD)
627
+ index = len(self._coords) - 1
628
+ while not self._coords[index]:
629
+ index -= 1
630
+ if self._coords[index].is_unit():
631
+ if not self._coords[index].is_one():
632
+ self.scale_by(~self._coords[index])
633
+ elif self._coords[index] < 0:
634
+ self.scale_by(-R.one())
635
+ self._normalized = True
636
+
637
+ def dehomogenize(self, n):
638
+ r"""
639
+ Dehomogenizes at the `n`-th coordinate.
640
+
641
+ INPUT:
642
+
643
+ - ``n`` -- nonnegative integer
644
+
645
+ OUTPUT: :class:`SchemeMorphism_point_affine`
646
+
647
+ EXAMPLES::
648
+
649
+ sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
650
+ sage: X = P.subscheme(x^2 - y^2)
651
+ sage: Q = X(23, 23, 46)
652
+ sage: Q.dehomogenize(2) # needs sage.libs.singular
653
+ (1/2, 1/2)
654
+
655
+ ::
656
+
657
+ sage: # needs sage.libs.pari
658
+ sage: R.<t> = PolynomialRing(QQ)
659
+ sage: S = R.quo(R.ideal(t^3))
660
+ sage: P.<x,y,z> = ProjectiveSpace(S, 2)
661
+ sage: Q = P(t, 1, 1)
662
+ sage: Q.dehomogenize(1)
663
+ (tbar, 1)
664
+
665
+ ::
666
+
667
+ sage: P.<x,y,z> = ProjectiveSpace(GF(5), 2)
668
+ sage: Q = P(1, 3, 1)
669
+ sage: Q.dehomogenize(0)
670
+ (3, 1)
671
+
672
+ ::
673
+
674
+ sage: P.<x,y,z> = ProjectiveSpace(GF(5), 2)
675
+ sage: Q = P(1, 3, 0)
676
+ sage: Q.dehomogenize(2)
677
+ Traceback (most recent call last):
678
+ ...
679
+ ValueError: can...t dehomogenize at 0 coordinate
680
+ """
681
+ if self[n].is_zero():
682
+ raise ValueError("can't dehomogenize at 0 coordinate")
683
+ PS = self.codomain()
684
+ A = PS.affine_patch(n)
685
+ Q = []
686
+ for i in range(PS.ambient_space().dimension_relative() + 1):
687
+ if i != n:
688
+ Q.append(self[i] / self[n])
689
+ return A.point(Q)
690
+
691
+ def global_height(self, prec=None):
692
+ r"""
693
+ Return the absolute logarithmic height of the point.
694
+
695
+ INPUT:
696
+
697
+ - ``prec`` -- desired floating point precision (default:
698
+ default RealField precision)
699
+
700
+ OUTPUT: a real number
701
+
702
+ EXAMPLES::
703
+
704
+ sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
705
+ sage: Q = P.point([4, 4, 1/30])
706
+ sage: Q.global_height() # needs sage.symbolic
707
+ 4.78749174278205
708
+
709
+ ::
710
+
711
+ sage: P.<x,y,z> = ProjectiveSpace(ZZ, 2)
712
+ sage: Q = P([4, 1, 30])
713
+ sage: Q.global_height() # needs sage.symbolic
714
+ 3.40119738166216
715
+
716
+ ::
717
+
718
+ sage: R.<x> = PolynomialRing(QQ)
719
+ sage: k.<w> = NumberField(x^2 + 5) # needs sage.rings.number_field
720
+ sage: A = ProjectiveSpace(k, 2, 'z') # needs sage.rings.number_field
721
+ sage: A([3, 5*w + 1, 1]).global_height(prec=100) # needs sage.rings.number_field
722
+ 2.4181409534757389986565376694
723
+
724
+ ::
725
+
726
+ sage: P.<x,y,z> = ProjectiveSpace(QQbar, 2) # needs sage.rings.number_field
727
+ sage: Q = P([QQbar(sqrt(3)), QQbar(sqrt(-2)), 1]) # needs sage.rings.number_field sage.symbolic
728
+ sage: Q.global_height() # needs sage.rings.number_field sage.symbolic
729
+ 0.549306144334055
730
+
731
+ ::
732
+
733
+ sage: # needs sage.libs.gap sage.rings.number_field
734
+ sage: K = UniversalCyclotomicField()
735
+ sage: P.<x,y,z> = ProjectiveSpace(K, 2)
736
+ sage: Q = P.point([K(4/3), K.gen(7), K.gen(5)])
737
+ sage: Q.global_height()
738
+ 1.38629436111989
739
+
740
+ TESTS::
741
+
742
+ sage: P = ProjectiveSpace(QQ, 2)
743
+ sage: P(1/1, 2/3, 5/8).global_height() # needs sage.symbolic
744
+ 3.17805383034795
745
+
746
+ sage: x = polygen(QQ, 'x')
747
+ sage: F.<u> = NumberField(x^3 - 5) # needs sage.rings.number_field
748
+ sage: P = ProjectiveSpace(F, 2) # needs sage.rings.number_field
749
+ sage: P(u, u^2/5, 1).global_height() # needs sage.rings.number_field
750
+ 1.07295860828940
751
+ """
752
+ if prec is None:
753
+ prec = 53
754
+ K = self.codomain().base_ring()
755
+ if K in _NumberFields or K is ZZ or isinstance(K, Order):
756
+ P = self
757
+ else:
758
+ try:
759
+ P = self._number_field_from_algebraics()
760
+ except TypeError:
761
+ raise TypeError("must be defined over an algebraic field")
762
+ else:
763
+ K = P.codomain().base_ring()
764
+ if isinstance(K, Order):
765
+ K = K.number_field()
766
+ # first get rid of the denominators
767
+ denom = lcm([xi.denominator() for xi in P])
768
+ x = [xi * denom for xi in P]
769
+ d = K.degree()
770
+ if d == 1:
771
+ height = max(abs(xi) for xi in x) / gcd(x)
772
+ return height.log().n(prec=prec)
773
+
774
+ finite = ~sum(K.ideal(xi) for xi in x).norm()
775
+ infinite = prod(max(abs(xi.complex_embedding(prec, i))
776
+ for xi in x) for i in range(d))
777
+ height = (finite * infinite)**(~d)
778
+ return height.log()
779
+
780
+ def local_height(self, v, prec=None):
781
+ r"""
782
+ Return the maximum of the local height of the coordinates of this point.
783
+
784
+ INPUT:
785
+
786
+ - ``v`` -- a prime or prime ideal of the base ring
787
+
788
+ - ``prec`` -- desired floating point precision (default:
789
+ default RealField precision)
790
+
791
+ OUTPUT: a real number
792
+
793
+ EXAMPLES::
794
+
795
+ sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
796
+ sage: Q = P.point([4, 4, 1/150], False)
797
+ sage: Q.local_height(5) # needs sage.rings.real_mpfr
798
+ 3.21887582486820
799
+
800
+ ::
801
+
802
+ sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
803
+ sage: Q = P([4, 1, 30])
804
+ sage: Q.local_height(2) # needs sage.rings.real_mpfr
805
+ 0.693147180559945
806
+ """
807
+ K = FractionField(self.domain().base_ring())
808
+ if K not in _NumberFields:
809
+ raise TypeError("must be over a number field or a number field order")
810
+ return max([K(c).local_height(v, prec=prec) for c in self])
811
+
812
+ def local_height_arch(self, i, prec=None):
813
+ r"""
814
+ Return the maximum of the local heights at the ``i``-th infinite place of this point.
815
+
816
+ INPUT:
817
+
818
+ - ``i`` -- integer
819
+
820
+ - ``prec`` -- desired floating point precision (default:
821
+ default RealField precision)
822
+
823
+ OUTPUT: a real number
824
+
825
+ EXAMPLES::
826
+
827
+ sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
828
+ sage: Q = P.point([4, 4, 1/150], False)
829
+ sage: Q.local_height_arch(0) # needs sage.rings.real_mpfr
830
+ 1.38629436111989
831
+
832
+ ::
833
+
834
+ sage: # needs sage.rings.number_field
835
+ sage: P.<x,y,z> = ProjectiveSpace(QuadraticField(5, 'w'), 2)
836
+ sage: Q = P.point([4, 1, 30], False)
837
+ sage: Q.local_height_arch(1)
838
+ 3.401197381662155375413236691607
839
+ """
840
+ K = FractionField(self.domain().base_ring())
841
+ if K not in _NumberFields:
842
+ raise TypeError("must be over a number field or a number field order")
843
+ if K == QQ:
844
+ return max(K(c).local_height_arch(prec=prec) for c in self)
845
+ else:
846
+ return max(K(c).local_height_arch(i, prec=prec) for c in self)
847
+
848
+ def multiplier(self, f, n, check=True):
849
+ r"""
850
+ Return the multiplier of this point of period ``n`` by the function ``f``.
851
+
852
+ ``f`` must be an endomorphism of projective space.
853
+
854
+ INPUT:
855
+
856
+ - ``f`` -- a endomorphism of this point's codomain
857
+
858
+ - ``n`` -- positive integer; the period of this point
859
+
860
+ - ``check`` -- boolean (default: ``True``); check if ``P`` is periodic
861
+ of period ``n``
862
+
863
+ OUTPUT:
864
+
865
+ - a square matrix of size ``self.codomain().dimension_relative()`` in the
866
+ ``base_ring`` of this point.
867
+
868
+ EXAMPLES::
869
+
870
+ sage: P.<x,y,z,w> = ProjectiveSpace(QQ, 3)
871
+ sage: f = DynamicalSystem_projective([x^2, y^2, 4*w^2, 4*z^2], domain=P) # needs sage.schemes
872
+ sage: Q = P.point([4, 4, 1, 1], False)
873
+ sage: Q.multiplier(f, 1) # needs sage.schemes
874
+ [ 2 0 -8]
875
+ [ 0 2 -8]
876
+ [ 0 0 -2]
877
+ """
878
+ try:
879
+ return f.multiplier(self, n, check)
880
+ except AttributeError:
881
+ raise TypeError("map must be a dynamical system")
882
+
883
+ def is_preperiodic(self, f, err=0.1, return_period=False):
884
+ r"""
885
+ Determine if the point is preperiodic with respect to the map ``f``.
886
+
887
+ This is implemented for both projective space and subschemes.
888
+ There are two optional keyword arguments:
889
+ ``error_bound`` sets the error_bound used in the canonical height computation
890
+ and ``return_period`` a boolean which controls if the period is returned if the
891
+ point is preperiodic. If ``return_period`` is ``True`` and this point is not
892
+ preperiodic, then `(0,0)` is returned for the period.
893
+
894
+ ALGORITHM:
895
+
896
+ We know that a point is preperiodic if and only if it has canonical height zero. However,
897
+ we can only compute the canonical height up to numerical precision. This function first computes
898
+ the canonical height of the point to the given error bound. If it is larger than that error bound,
899
+ then it must not be preperiodic. If it is less than the error bound, then we expect preperiodic. In
900
+ this case we begin computing the orbit stopping if either we determine the orbit is finite, or
901
+ the height of the point is large enough that it must be wandering. We can determine the height
902
+ cutoff by computing the height difference constant, i.e., the bound between the height and
903
+ the canonical height of a point (which depends only on the map and not the point itself).
904
+ If the height of the point is larger than the difference bound, then the canonical height
905
+ cannot be zero so the point cannot be preperiodic.
906
+
907
+ INPUT:
908
+
909
+ - ``f`` -- an endomorphism of this point's codomain
910
+
911
+ kwds:
912
+
913
+ - ``err`` -- a positive real number (default: 0.1)
914
+
915
+ - ``return_period`` -- boolean (default: ``False``)
916
+
917
+
918
+ OUTPUT:
919
+
920
+ - boolean; ``True`` if preperiodic.
921
+
922
+ - if ``return_period`` is ``True``, then ``(0,0)`` if wandering, and ``(m,n)``
923
+ if preperiod ``m`` and period ``n``.
924
+
925
+ EXAMPLES::
926
+
927
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
928
+ sage: f = DynamicalSystem_projective([x^3 - 3*x*y^2, y^3], domain=P) # needs sage.schemes
929
+ sage: Q = P(-1, 1)
930
+ sage: Q.is_preperiodic(f) # needs sage.libs.singular sage.schemes sage.symbolic
931
+ True
932
+
933
+ ::
934
+
935
+ sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
936
+ sage: X = P.subscheme(z)
937
+ sage: f = DynamicalSystem([x^2 - y^2, y^2, z^2], domain=X) # needs sage.schemes
938
+ sage: p = X((-1, 1, 0))
939
+ sage: p.is_preperiodic(f, return_period=True) # needs sage.libs.singular sage.schemes
940
+ (0, 2)
941
+
942
+ ::
943
+
944
+ sage: P.<x,y> = ProjectiveSpace(QQ,1)
945
+ sage: f = DynamicalSystem_projective([x^2 - 29/16*y^2, y^2], domain=P) # needs sage.schemes
946
+ sage: Q = P(1, 4)
947
+ sage: Q.is_preperiodic(f, return_period=True) # needs sage.libs.singular sage.schemes
948
+ (1, 3)
949
+ sage: Q = P(1, 1)
950
+ sage: Q.is_preperiodic(f, return_period=True) # needs sage.libs.singular sage.schemes
951
+ (0, 0)
952
+
953
+ ::
954
+
955
+ sage: # needs sage.rings.number_field
956
+ sage: R.<x> = PolynomialRing(QQ)
957
+ sage: K.<a> = NumberField(x^2 + 1)
958
+ sage: P.<x,y> = ProjectiveSpace(K, 1)
959
+ sage: f = DynamicalSystem_projective([x^5 + 5/4*x*y^4, y^5], domain=P) # needs sage.schemes
960
+ sage: Q = P([-1/2*a + 1/2, 1])
961
+ sage: Q.is_preperiodic(f) # needs sage.schemes
962
+ True
963
+ sage: Q = P([a, 1])
964
+ sage: Q.is_preperiodic(f) # needs sage.schemes
965
+ False
966
+
967
+ ::
968
+
969
+ sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
970
+ sage: f = DynamicalSystem_projective([ # needs sage.schemes
971
+ ....: -38/45*x^2 + (2*y - 7/45*z)*x + (-1/2*y^2 - 1/2*y*z + z^2),
972
+ ....: -67/90*x^2 + (2*y + z*157/90)*x - y*z,
973
+ ....: z^2
974
+ ....: ], domain=P)
975
+ sage: Q = P([1, 3, 1])
976
+ sage: Q.is_preperiodic(f, return_period=True) # needs sage.libs.singular sage.schemes
977
+ (0, 9)
978
+
979
+ ::
980
+
981
+ sage: P.<x,y,z,w> = ProjectiveSpace(QQ, 3)
982
+ sage: f = DynamicalSystem_projective([ # needs sage.schemes
983
+ ....: (-y - w)*x + (-13/30*y^2 + 13/30*w*y + w^2),
984
+ ....: -1/2*x^2 + (-y + 3/2*w)*x + (-1/3*y^2 + 4/3*w*y),
985
+ ....: -3/2*z^2 + 5/2*z*w + w^2,
986
+ ....: w^2
987
+ ....: ], domain=P)
988
+ sage: Q = P([3,0,4/3,1])
989
+ sage: Q.is_preperiodic(f, return_period=True) # needs sage.libs.singular sage.schemes
990
+ (2, 24)
991
+
992
+ ::
993
+
994
+ sage: # needs sage.rings.number_field sage.schemes sage.symbolic
995
+ sage: from sage.misc.verbose import set_verbose
996
+ sage: set_verbose(-1)
997
+ sage: P.<x,y,z> = ProjectiveSpace(QQbar, 2)
998
+ sage: f = DynamicalSystem_projective([x^2, QQbar(sqrt(-1))*y^2, z^2],
999
+ ....: domain=P)
1000
+ sage: Q = P([1, 1, 1])
1001
+ sage: Q.is_preperiodic(f)
1002
+ True
1003
+
1004
+ ::
1005
+
1006
+ sage: # needs sage.rings.number_field sage.schemes sage.symbolic
1007
+ sage: set_verbose(-1)
1008
+ sage: P.<x,y,z> = ProjectiveSpace(QQbar, 2)
1009
+ sage: f = DynamicalSystem_projective([x^2, y^2, z^2], domain=P)
1010
+ sage: Q = P([QQbar(sqrt(-1)), 1, 1])
1011
+ sage: Q.is_preperiodic(f)
1012
+ True
1013
+
1014
+ ::
1015
+
1016
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
1017
+ sage: f = DynamicalSystem_projective([16*x^2 - 29*y^2, 16*y^2], domain=P) # needs sage.schemes
1018
+ sage: Q = P(-1,4)
1019
+ sage: Q.is_preperiodic(f) # needs sage.libs.singular sage.schemes
1020
+ True
1021
+
1022
+ ::
1023
+
1024
+ sage: P.<x,y,z> = ProjectiveSpace(GF(3), 2)
1025
+ sage: F = DynamicalSystem([x^2 - 2*y^2, y^2, z^2]) # needs sage.schemes
1026
+ sage: Q = P(1, 1, 1)
1027
+ sage: Q.is_preperiodic(F, return_period=True) # needs sage.schemes
1028
+ (1, 1)
1029
+
1030
+ TESTS::
1031
+
1032
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
1033
+ sage: H = End(P)
1034
+ sage: f = H([16*x^2 - 29*y^2, 16*y^2])
1035
+ sage: Q = P(-1,4)
1036
+ sage: Q.is_preperiodic(f)
1037
+ Traceback (most recent call last):
1038
+ ...
1039
+ TypeError: map must be a dynamical system
1040
+
1041
+ ::
1042
+
1043
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
1044
+ sage: f = DynamicalSystem_projective([16*x^2 - 29*y^2, 16*y^2]) # needs sage.schemes
1045
+ sage: Q = P(11,4)
1046
+ sage: Q.is_preperiodic(f, err=2) # needs sage.libs.singular sage.schemes
1047
+ False
1048
+ """
1049
+ try:
1050
+ return f._is_preperiodic(self, err=err, return_period=return_period)
1051
+ except AttributeError:
1052
+ raise TypeError("map must be a dynamical system")
1053
+
1054
+
1055
+ class SchemeMorphism_point_projective_field(SchemeMorphism_point_projective_ring):
1056
+ """
1057
+ A rational point of projective space over a field.
1058
+
1059
+ INPUT:
1060
+
1061
+ - ``X`` -- a homset of a subscheme of an ambient projective space
1062
+ over a field `K`
1063
+
1064
+ - ``v`` -- list or tuple of coordinates in `K`
1065
+
1066
+ - ``check`` -- boolean (default: ``True``); whether to
1067
+ check the input for consistency
1068
+
1069
+ EXAMPLES::
1070
+
1071
+ sage: # needs sage.rings.real_mpfr
1072
+ sage: P = ProjectiveSpace(3, RR)
1073
+ sage: P(2, 3, 4, 5)
1074
+ (0.400000000000000 : 0.600000000000000 : 0.800000000000000 : 1.00000000000000)
1075
+ """
1076
+
1077
+ def __init__(self, X, v, check=True):
1078
+ """
1079
+ The Python constructor.
1080
+
1081
+ See :class:`SchemeMorphism_point_projective_ring` for details.
1082
+
1083
+ This function still normalizes points so that the rightmost nonzero coordinate is 1.
1084
+ This is to maintain functionality with current
1085
+ implementations of curves in projectives space (plane, conic, elliptic, etc).
1086
+ The :class:`SchemeMorphism_point_projective_ring` is for general use.
1087
+
1088
+ EXAMPLES::
1089
+
1090
+ sage: P = ProjectiveSpace(2, QQ)
1091
+ sage: P(2, 3/5, 4)
1092
+ (1/2 : 3/20 : 1)
1093
+
1094
+ ::
1095
+
1096
+ sage: P = ProjectiveSpace(3, QQ)
1097
+ sage: P(0, 0, 0, 0)
1098
+ Traceback (most recent call last):
1099
+ ...
1100
+ ValueError: [0, 0, 0, 0] does not define a valid projective point since all entries are zero
1101
+
1102
+ ::
1103
+
1104
+ sage: P.<x, y, z> = ProjectiveSpace(2, QQ)
1105
+ sage: X = P.subscheme([x^2 - y*z])
1106
+ sage: X([2, 2, 2])
1107
+ (1 : 1 : 1)
1108
+
1109
+ ::
1110
+
1111
+ sage: P = ProjectiveSpace(1, GF(7))
1112
+ sage: Q = P([2, 1])
1113
+ sage: Q[0].parent()
1114
+ Finite Field of size 7
1115
+
1116
+ ::
1117
+
1118
+ sage: P = ProjectiveSpace(QQ, 1)
1119
+ sage: P.point(Infinity)
1120
+ (1 : 0)
1121
+ sage: P(infinity)
1122
+ (1 : 0)
1123
+
1124
+ ::
1125
+
1126
+ sage: P = ProjectiveSpace(QQ, 2)
1127
+ sage: P(infinity)
1128
+ Traceback (most recent call last):
1129
+ ...
1130
+ ValueError: +Infinity not well defined in dimension > 1
1131
+ sage: P.point(infinity)
1132
+ Traceback (most recent call last):
1133
+ ...
1134
+ ValueError: +Infinity not well defined in dimension > 1
1135
+ """
1136
+ SchemeMorphism.__init__(self, X)
1137
+
1138
+ self._normalized = False
1139
+
1140
+ if check:
1141
+ d = X.codomain().ambient_space().ngens()
1142
+ if isinstance(v, SchemeMorphism):
1143
+ v = list(v)
1144
+ else:
1145
+ try:
1146
+ if isinstance(v.parent(), CommutativeRing):
1147
+ v = [v]
1148
+ except AttributeError:
1149
+ pass
1150
+ if not isinstance(v, (list,tuple)):
1151
+ raise TypeError("argument v (= %s) must be a scheme point, list, or tuple" % str(v))
1152
+ if len(v) != d and len(v) != d-1:
1153
+ raise TypeError("v (=%s) must have %s components" % (v, d))
1154
+
1155
+ R = X.value_ring()
1156
+ v = Sequence(v, R)
1157
+ if len(v) == d-1: # very common special case
1158
+ v.append(R.one())
1159
+
1160
+ for last in reversed(range(len(v))):
1161
+ c = v[last]
1162
+ if c.is_one():
1163
+ break
1164
+ if c:
1165
+ for j in range(last):
1166
+ v[j] /= c
1167
+ v[last] = R.one()
1168
+ break
1169
+ else:
1170
+ raise ValueError(f"{v} does not define a valid projective "
1171
+ "point since all entries are zero")
1172
+ self._normalized = True
1173
+
1174
+ X.extended_codomain()._check_satisfies_equations(v)
1175
+
1176
+ self._coords = tuple(v)
1177
+
1178
+ def __hash__(self):
1179
+ """
1180
+ Compute the hash value of this point.
1181
+
1182
+ OUTPUT: integer
1183
+
1184
+ EXAMPLES::
1185
+
1186
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
1187
+ sage: hash(P([1/2, 1])) == hash(P.point([1, 2], False))
1188
+ True
1189
+ """
1190
+ P = copy(self)
1191
+ P.normalize_coordinates()
1192
+ return hash(tuple(P))
1193
+
1194
+ def normalize_coordinates(self):
1195
+ r"""
1196
+ Normalize the point so that the last nonzero coordinate is `1`.
1197
+
1198
+ OUTPUT: none
1199
+
1200
+ EXAMPLES::
1201
+
1202
+ sage: P.<x,y,z> = ProjectiveSpace(GF(5), 2)
1203
+ sage: Q = P.point([GF(5)(1), GF(5)(3), GF(5)(0)], False); Q
1204
+ (1 : 3 : 0)
1205
+ sage: Q.normalize_coordinates(); Q
1206
+ (2 : 1 : 0)
1207
+
1208
+ ::
1209
+
1210
+ sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
1211
+ sage: X = P.subscheme(x^2 - y^2);
1212
+ sage: Q = X.point([23, 23, 46], False); Q
1213
+ (23 : 23 : 46)
1214
+ sage: Q.normalize_coordinates(); Q
1215
+ (1/2 : 1/2 : 1)
1216
+ """
1217
+ if self._normalized:
1218
+ return
1219
+ for index in reversed(range(len(self._coords))):
1220
+ c = self._coords[index]
1221
+ if c.is_one():
1222
+ break
1223
+ if c:
1224
+ inv = c.inverse()
1225
+ new_coords = [d * inv for d in self._coords[:index]]
1226
+ new_coords.append(self.base_ring().one())
1227
+ new_coords.extend(self._coords[index+1:])
1228
+ self._coords = tuple(new_coords)
1229
+ break
1230
+ else:
1231
+ assert False, 'bug: invalid projective point'
1232
+ self._normalized = True
1233
+
1234
+ def _number_field_from_algebraics(self):
1235
+ r"""
1236
+ Given a projective point defined over ``QQbar``, return the same point, but defined
1237
+ over a number field.
1238
+
1239
+ This is only implemented for points of projective space.
1240
+
1241
+ OUTPUT: scheme point
1242
+
1243
+ EXAMPLES::
1244
+
1245
+ sage: # needs sage.rings.number_field sage.symbolic
1246
+ sage: R.<x> = PolynomialRing(QQ)
1247
+ sage: P.<x,y> = ProjectiveSpace(QQbar, 1)
1248
+ sage: Q = P([-1/2*QQbar(sqrt(2)) + QQbar(I), 1])
1249
+ sage: S = Q._number_field_from_algebraics(); S
1250
+ (-1/2*a^3 + a^2 + 1/2*a : 1)
1251
+ sage: S.codomain()
1252
+ Projective Space of dimension 1 over Number Field in a with defining
1253
+ polynomial y^4 + 1 with a = -0.7071067811865475? - 0.7071067811865475?*I
1254
+
1255
+ The following was fixed in :issue:`23808`::
1256
+
1257
+ sage: # needs sage.rings.number_field sage.symbolic
1258
+ sage: R.<x> = PolynomialRing(QQ)
1259
+ sage: P.<x,y> = ProjectiveSpace(QQbar, 1)
1260
+ sage: Q = P([-1/2*QQbar(sqrt(2)) + QQbar(I), 1]);Q
1261
+ (-0.7071067811865475? + 1*I : 1)
1262
+ sage: S = Q._number_field_from_algebraics(); S
1263
+ (-1/2*a^3 + a^2 + 1/2*a : 1)
1264
+ sage: T = S.change_ring(QQbar) # Used to fail
1265
+ sage: T
1266
+ (-0.7071067811865475? + 1.000000000000000?*I : 1)
1267
+ sage: Q[0] == T[0]
1268
+ True
1269
+ """
1270
+ from sage.schemes.projective.projective_space import ProjectiveSpace_ring
1271
+ if not isinstance(self.codomain(), ProjectiveSpace_ring):
1272
+ raise NotImplementedError("not implemented for subschemes")
1273
+
1274
+ # Issue #23808: Keep the embedding info associated with the number field K
1275
+ # used below, instead of in the separate embedding map phi which is
1276
+ # forgotten.
1277
+ K_pre,P,phi = number_field_elements_from_algebraics(list(self))
1278
+ if K_pre is QQ:
1279
+ K = QQ
1280
+ else:
1281
+ from sage.rings.number_field.number_field import NumberField
1282
+ K = NumberField(K_pre.polynomial(), embedding=phi(K_pre.gen()), name='a')
1283
+ psi = K_pre.hom([K.gen()], K) # Identification of K_pre with K
1284
+ P = [ psi(p) for p in P ] # The elements of P were elements of K_pre
1285
+ from sage.schemes.projective.projective_space import ProjectiveSpace
1286
+ PS = ProjectiveSpace(K,self.codomain().dimension_relative(),'z')
1287
+ return PS(P)
1288
+
1289
+ def clear_denominators(self):
1290
+ r"""
1291
+ Scale by the least common multiple of the denominators.
1292
+
1293
+ OUTPUT: none
1294
+
1295
+ EXAMPLES::
1296
+
1297
+ sage: R.<t> = PolynomialRing(QQ)
1298
+ sage: P.<x,y,z> = ProjectiveSpace(FractionField(R), 2)
1299
+ sage: Q = P([t, 3/t^2, 1])
1300
+ sage: Q.clear_denominators(); Q
1301
+ (t^3 : 3 : t^2)
1302
+
1303
+ ::
1304
+
1305
+ sage: # needs sage.rings.number_field
1306
+ sage: R.<x> = PolynomialRing(QQ)
1307
+ sage: K.<w> = NumberField(x^2 - 3)
1308
+ sage: P.<x,y,z> = ProjectiveSpace(K, 2)
1309
+ sage: Q = P([1/w, 3, 0])
1310
+ sage: Q.clear_denominators(); Q
1311
+ (w : 9 : 0)
1312
+
1313
+ ::
1314
+
1315
+ sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
1316
+ sage: X = P.subscheme(x^2 - y^2)
1317
+ sage: Q = X([1/2, 1/2, 1])
1318
+ sage: Q.clear_denominators(); Q
1319
+ (1 : 1 : 2)
1320
+
1321
+ ::
1322
+
1323
+ sage: PS.<x,y> = ProjectiveSpace(QQ, 1)
1324
+ sage: Q = PS.point([1, 2/3], False); Q
1325
+ (1 : 2/3)
1326
+ sage: Q.clear_denominators(); Q
1327
+ (3 : 2)
1328
+ """
1329
+ self.scale_by(lcm([t.denominator() for t in self]))
1330
+
1331
+ def intersection_multiplicity(self, X):
1332
+ r"""
1333
+ Return the intersection multiplicity of the codomain of this point and ``X`` at this point.
1334
+
1335
+ This uses the intersection_multiplicity implementations for projective/affine subschemes. This
1336
+ point must be a point of a projective subscheme.
1337
+
1338
+ INPUT:
1339
+
1340
+ - ``X`` -- a subscheme in the same ambient space as that of the codomain of this point
1341
+
1342
+ OUTPUT: integer
1343
+
1344
+ EXAMPLES::
1345
+
1346
+ sage: P.<x,y,z,w> = ProjectiveSpace(QQ, 3)
1347
+ sage: X = P.subscheme([x*z - y^2])
1348
+ sage: Y = P.subscheme([x^3 - y*w^2 + z*w^2, x*y - z*w])
1349
+ sage: Q1 = X([1/2, 1/4, 1/8, 1])
1350
+ sage: Q1.intersection_multiplicity(Y) # needs sage.libs.singular
1351
+ 1
1352
+ sage: Q2 = X([0,0,0,1])
1353
+ sage: Q2.intersection_multiplicity(Y) # needs sage.libs.singular
1354
+ 5
1355
+ sage: Q3 = X([0,0,1,0])
1356
+ sage: Q3.intersection_multiplicity(Y) # needs sage.libs.singular
1357
+ 6
1358
+
1359
+ ::
1360
+
1361
+ sage: P.<x,y,z,w> = ProjectiveSpace(QQ, 3)
1362
+ sage: X = P.subscheme([x^2 - y^2])
1363
+ sage: Q = P([1,1,1,0])
1364
+ sage: Q.intersection_multiplicity(X)
1365
+ Traceback (most recent call last):
1366
+ ...
1367
+ TypeError: this point must be a point on a projective subscheme
1368
+ """
1369
+ from sage.schemes.projective.projective_space import ProjectiveSpace_ring
1370
+ if isinstance(self.codomain(), ProjectiveSpace_ring):
1371
+ raise TypeError("this point must be a point on a projective subscheme")
1372
+ return self.codomain().intersection_multiplicity(X, self)
1373
+
1374
+ def multiplicity(self):
1375
+ r"""
1376
+ Return the multiplicity of this point on its codomain.
1377
+
1378
+ Uses the subscheme multiplicity implementation. This point must be a point on
1379
+ a projective subscheme.
1380
+
1381
+ OUTPUT: integer
1382
+
1383
+ EXAMPLES::
1384
+
1385
+ sage: P.<x,y,z,w,t> = ProjectiveSpace(QQ, 4)
1386
+ sage: X = P.subscheme([y^6 - x^3*w^2*t + t^5*w, x^2 - t^2])
1387
+ sage: Q1 = X([1,0,2,1,1])
1388
+ sage: Q1.multiplicity() # needs sage.libs.singular
1389
+ 1
1390
+ sage: Q2 = X([0,0,-2,1,0])
1391
+ sage: Q2.multiplicity() # needs sage.libs.singular
1392
+ 8
1393
+ """
1394
+ from sage.schemes.projective.projective_space import ProjectiveSpace_ring
1395
+ if isinstance(self.codomain(), ProjectiveSpace_ring):
1396
+ raise TypeError("this point must be a point on a projective subscheme")
1397
+ return self.codomain().multiplicity(self)
1398
+
1399
+ def as_subscheme(self):
1400
+ r"""
1401
+ Return the subscheme associated with this rational point.
1402
+
1403
+ EXAMPLES::
1404
+
1405
+ sage: P2.<x,y,z> = ProjectiveSpace(QQ,2)
1406
+ sage: p1 = P2.point([0,0,1]).as_subscheme(); p1
1407
+ Closed subscheme of Projective Space of dimension 2 over Rational Field defined by:
1408
+ x, y
1409
+ sage: p2 = P2.point([1,1,1]).as_subscheme(); p2
1410
+ Closed subscheme of Projective Space of dimension 2 over Rational Field defined by:
1411
+ x - z, y - z
1412
+ sage: p1 + p2 # needs sage.libs.singular
1413
+ Closed subscheme of Projective Space of dimension 2 over Rational Field defined by:
1414
+ x - y, y^2 - y*z
1415
+ """
1416
+ P = self.codomain().ambient_space()
1417
+ g = P.gens()
1418
+ v = self._coords
1419
+ n = len(v)
1420
+ for i in range(n - 1, -1, -1):
1421
+ if v[i]:
1422
+ break
1423
+ a = v[i]
1424
+ x = g[i]
1425
+ return P.subscheme([a*g[j] - v[j]*x for j in range(n) if j != i])
1426
+
1427
+
1428
+ class SchemeMorphism_point_projective_finite_field(SchemeMorphism_point_projective_field):
1429
+
1430
+ def __hash__(self):
1431
+ r"""
1432
+ Return the integer hash of this point.
1433
+
1434
+ OUTPUT: integer
1435
+
1436
+ EXAMPLES::
1437
+
1438
+ sage: P.<x,y,z> = ProjectiveSpace(GF(5), 2)
1439
+ sage: hash(P(2, 1, 2))
1440
+ 41
1441
+
1442
+ ::
1443
+
1444
+ sage: P.<x,y,z> = ProjectiveSpace(GF(7), 2)
1445
+ sage: X = P.subscheme(x^2 - y^2)
1446
+ sage: hash(X(1, 1, 2))
1447
+ 81
1448
+
1449
+ ::
1450
+
1451
+ sage: P.<x,y> = ProjectiveSpace(GF(13), 1)
1452
+ sage: hash(P(3, 4))
1453
+ 17
1454
+
1455
+ ::
1456
+
1457
+ sage: P.<x,y> = ProjectiveSpace(GF(13^3,'t'), 1) # needs sage.rings.finite_rings
1458
+ sage: hash(P(3, 4)) # needs sage.rings.finite_rings
1459
+ 2201
1460
+ """
1461
+ p = self.codomain().base_ring().order()
1462
+ N = self.codomain().ambient_space().dimension_relative()
1463
+ return hash(sum(hash(self[i]) * p**i for i in range(N + 1)))
1464
+
1465
+
1466
+ # -----------------
1467
+ # Abelian varieties
1468
+ # -----------------
1469
+
1470
+ class SchemeMorphism_point_abelian_variety_field(AdditiveGroupElement, SchemeMorphism_point_projective_field):
1471
+ """
1472
+ A rational point of an abelian variety over a field.
1473
+
1474
+ EXAMPLES::
1475
+
1476
+ sage: # needs sage.schemes
1477
+ sage: E = EllipticCurve([0,0,1,-1,0])
1478
+ sage: origin = E(0)
1479
+ sage: origin.domain()
1480
+ Spectrum of Rational Field
1481
+ sage: origin.codomain()
1482
+ Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
1483
+ """
1484
+ pass