passagemath-categories 10.6.32__cp314-cp314t-musllinux_1_2_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- passagemath_categories-10.6.32.dist-info/METADATA +156 -0
- passagemath_categories-10.6.32.dist-info/RECORD +719 -0
- passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
- passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
- passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
- sage/all__sagemath_categories.py +28 -0
- sage/arith/all.py +38 -0
- sage/arith/constants.pxd +27 -0
- sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/functions.pxd +4 -0
- sage/arith/functions.pyx +221 -0
- sage/arith/misc.py +6552 -0
- sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/multi_modular.pxd +39 -0
- sage/arith/multi_modular.pyx +994 -0
- sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/rational_reconstruction.pxd +4 -0
- sage/arith/rational_reconstruction.pyx +115 -0
- sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/srange.pyx +571 -0
- sage/calculus/all__sagemath_categories.py +2 -0
- sage/calculus/functional.py +481 -0
- sage/calculus/functions.py +151 -0
- sage/categories/additive_groups.py +73 -0
- sage/categories/additive_magmas.py +1044 -0
- sage/categories/additive_monoids.py +114 -0
- sage/categories/additive_semigroups.py +184 -0
- sage/categories/affine_weyl_groups.py +238 -0
- sage/categories/algebra_ideals.py +95 -0
- sage/categories/algebra_modules.py +96 -0
- sage/categories/algebras.py +349 -0
- sage/categories/algebras_with_basis.py +377 -0
- sage/categories/all.py +160 -0
- sage/categories/aperiodic_semigroups.py +29 -0
- sage/categories/associative_algebras.py +47 -0
- sage/categories/bialgebras.py +101 -0
- sage/categories/bialgebras_with_basis.py +414 -0
- sage/categories/bimodules.py +206 -0
- sage/categories/chain_complexes.py +268 -0
- sage/categories/classical_crystals.py +480 -0
- sage/categories/coalgebras.py +405 -0
- sage/categories/coalgebras_with_basis.py +232 -0
- sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/coercion_methods.pyx +52 -0
- sage/categories/commutative_additive_groups.py +104 -0
- sage/categories/commutative_additive_monoids.py +45 -0
- sage/categories/commutative_additive_semigroups.py +48 -0
- sage/categories/commutative_algebra_ideals.py +87 -0
- sage/categories/commutative_algebras.py +94 -0
- sage/categories/commutative_ring_ideals.py +58 -0
- sage/categories/commutative_rings.py +736 -0
- sage/categories/complete_discrete_valuation.py +293 -0
- sage/categories/complex_reflection_groups.py +145 -0
- sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
- sage/categories/coxeter_group_algebras.py +186 -0
- sage/categories/coxeter_groups.py +3402 -0
- sage/categories/crystals.py +2628 -0
- sage/categories/cw_complexes.py +216 -0
- sage/categories/dedekind_domains.py +137 -0
- sage/categories/discrete_valuation.py +325 -0
- sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
- sage/categories/division_rings.py +114 -0
- sage/categories/domains.py +95 -0
- sage/categories/drinfeld_modules.py +789 -0
- sage/categories/dual.py +42 -0
- sage/categories/enumerated_sets.py +1146 -0
- sage/categories/euclidean_domains.py +271 -0
- sage/categories/examples/algebras_with_basis.py +102 -0
- sage/categories/examples/all.py +1 -0
- sage/categories/examples/commutative_additive_monoids.py +130 -0
- sage/categories/examples/commutative_additive_semigroups.py +199 -0
- sage/categories/examples/coxeter_groups.py +8 -0
- sage/categories/examples/crystals.py +236 -0
- sage/categories/examples/cw_complexes.py +163 -0
- sage/categories/examples/facade_sets.py +187 -0
- sage/categories/examples/filtered_algebras_with_basis.py +204 -0
- sage/categories/examples/filtered_modules_with_basis.py +154 -0
- sage/categories/examples/finite_coxeter_groups.py +252 -0
- sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
- sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
- sage/categories/examples/finite_enumerated_sets.py +208 -0
- sage/categories/examples/finite_monoids.py +150 -0
- sage/categories/examples/finite_semigroups.py +190 -0
- sage/categories/examples/finite_weyl_groups.py +191 -0
- sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
- sage/categories/examples/graded_modules_with_basis.py +168 -0
- sage/categories/examples/graphs.py +122 -0
- sage/categories/examples/hopf_algebras_with_basis.py +145 -0
- sage/categories/examples/infinite_enumerated_sets.py +190 -0
- sage/categories/examples/lie_algebras.py +352 -0
- sage/categories/examples/lie_algebras_with_basis.py +196 -0
- sage/categories/examples/magmas.py +162 -0
- sage/categories/examples/manifolds.py +94 -0
- sage/categories/examples/monoids.py +144 -0
- sage/categories/examples/posets.py +178 -0
- sage/categories/examples/semigroups.py +580 -0
- sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/examples/semigroups_cython.pyx +221 -0
- sage/categories/examples/semirings.py +249 -0
- sage/categories/examples/sets_cat.py +706 -0
- sage/categories/examples/sets_with_grading.py +101 -0
- sage/categories/examples/with_realizations.py +542 -0
- sage/categories/fields.py +991 -0
- sage/categories/filtered_algebras.py +63 -0
- sage/categories/filtered_algebras_with_basis.py +548 -0
- sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
- sage/categories/filtered_modules.py +210 -0
- sage/categories/filtered_modules_with_basis.py +1209 -0
- sage/categories/finite_complex_reflection_groups.py +1506 -0
- sage/categories/finite_coxeter_groups.py +1138 -0
- sage/categories/finite_crystals.py +103 -0
- sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
- sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
- sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
- sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
- sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
- sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
- sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
- sage/categories/finite_enumerated_sets.py +769 -0
- sage/categories/finite_fields.py +252 -0
- sage/categories/finite_groups.py +256 -0
- sage/categories/finite_lattice_posets.py +242 -0
- sage/categories/finite_monoids.py +316 -0
- sage/categories/finite_permutation_groups.py +339 -0
- sage/categories/finite_posets.py +1994 -0
- sage/categories/finite_semigroups.py +136 -0
- sage/categories/finite_sets.py +93 -0
- sage/categories/finite_weyl_groups.py +39 -0
- sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
- sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
- sage/categories/finitely_generated_magmas.py +57 -0
- sage/categories/finitely_generated_semigroups.py +214 -0
- sage/categories/function_fields.py +76 -0
- sage/categories/g_sets.py +77 -0
- sage/categories/gcd_domains.py +65 -0
- sage/categories/generalized_coxeter_groups.py +94 -0
- sage/categories/graded_algebras.py +85 -0
- sage/categories/graded_algebras_with_basis.py +258 -0
- sage/categories/graded_bialgebras.py +32 -0
- sage/categories/graded_bialgebras_with_basis.py +32 -0
- sage/categories/graded_coalgebras.py +65 -0
- sage/categories/graded_coalgebras_with_basis.py +51 -0
- sage/categories/graded_hopf_algebras.py +41 -0
- sage/categories/graded_hopf_algebras_with_basis.py +169 -0
- sage/categories/graded_lie_algebras.py +91 -0
- sage/categories/graded_lie_algebras_with_basis.py +44 -0
- sage/categories/graded_lie_conformal_algebras.py +74 -0
- sage/categories/graded_modules.py +133 -0
- sage/categories/graded_modules_with_basis.py +329 -0
- sage/categories/graphs.py +138 -0
- sage/categories/group_algebras.py +430 -0
- sage/categories/groupoid.py +94 -0
- sage/categories/groups.py +667 -0
- sage/categories/h_trivial_semigroups.py +64 -0
- sage/categories/hecke_modules.py +185 -0
- sage/categories/highest_weight_crystals.py +980 -0
- sage/categories/hopf_algebras.py +219 -0
- sage/categories/hopf_algebras_with_basis.py +309 -0
- sage/categories/infinite_enumerated_sets.py +115 -0
- sage/categories/integral_domains.py +203 -0
- sage/categories/j_trivial_semigroups.py +29 -0
- sage/categories/kac_moody_algebras.py +82 -0
- sage/categories/kahler_algebras.py +203 -0
- sage/categories/l_trivial_semigroups.py +63 -0
- sage/categories/lambda_bracket_algebras.py +280 -0
- sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
- sage/categories/lattice_posets.py +89 -0
- sage/categories/left_modules.py +49 -0
- sage/categories/lie_algebras.py +1070 -0
- sage/categories/lie_algebras_with_basis.py +261 -0
- sage/categories/lie_conformal_algebras.py +350 -0
- sage/categories/lie_conformal_algebras_with_basis.py +147 -0
- sage/categories/lie_groups.py +73 -0
- sage/categories/loop_crystals.py +1290 -0
- sage/categories/magmas.py +1189 -0
- sage/categories/magmas_and_additive_magmas.py +149 -0
- sage/categories/magmatic_algebras.py +365 -0
- sage/categories/manifolds.py +352 -0
- sage/categories/matrix_algebras.py +40 -0
- sage/categories/metric_spaces.py +387 -0
- sage/categories/modular_abelian_varieties.py +78 -0
- sage/categories/modules.py +989 -0
- sage/categories/modules_with_basis.py +2794 -0
- sage/categories/monoid_algebras.py +38 -0
- sage/categories/monoids.py +739 -0
- sage/categories/noetherian_rings.py +87 -0
- sage/categories/number_fields.py +242 -0
- sage/categories/ore_modules.py +189 -0
- sage/categories/partially_ordered_monoids.py +49 -0
- sage/categories/permutation_groups.py +63 -0
- sage/categories/pointed_sets.py +42 -0
- sage/categories/polyhedra.py +74 -0
- sage/categories/poor_man_map.py +270 -0
- sage/categories/posets.py +722 -0
- sage/categories/principal_ideal_domains.py +270 -0
- sage/categories/quantum_group_representations.py +543 -0
- sage/categories/quotient_fields.py +728 -0
- sage/categories/r_trivial_semigroups.py +45 -0
- sage/categories/regular_crystals.py +898 -0
- sage/categories/regular_supercrystals.py +170 -0
- sage/categories/right_modules.py +49 -0
- sage/categories/ring_ideals.py +74 -0
- sage/categories/rings.py +1904 -0
- sage/categories/rngs.py +175 -0
- sage/categories/schemes.py +393 -0
- sage/categories/semigroups.py +1060 -0
- sage/categories/semirings.py +71 -0
- sage/categories/semisimple_algebras.py +114 -0
- sage/categories/sets_with_grading.py +235 -0
- sage/categories/shephard_groups.py +43 -0
- sage/categories/signed_tensor.py +120 -0
- sage/categories/simplicial_complexes.py +134 -0
- sage/categories/simplicial_sets.py +1206 -0
- sage/categories/super_algebras.py +149 -0
- sage/categories/super_algebras_with_basis.py +144 -0
- sage/categories/super_hopf_algebras_with_basis.py +126 -0
- sage/categories/super_lie_conformal_algebras.py +193 -0
- sage/categories/super_modules.py +229 -0
- sage/categories/super_modules_with_basis.py +193 -0
- sage/categories/supercommutative_algebras.py +99 -0
- sage/categories/supercrystals.py +406 -0
- sage/categories/tensor.py +110 -0
- sage/categories/topological_spaces.py +170 -0
- sage/categories/triangular_kac_moody_algebras.py +439 -0
- sage/categories/tutorial.py +58 -0
- sage/categories/unique_factorization_domains.py +318 -0
- sage/categories/unital_algebras.py +426 -0
- sage/categories/vector_bundles.py +159 -0
- sage/categories/vector_spaces.py +357 -0
- sage/categories/weyl_groups.py +853 -0
- sage/combinat/all__sagemath_categories.py +34 -0
- sage/combinat/backtrack.py +180 -0
- sage/combinat/combinat.py +2269 -0
- sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/combinat_cython.pxd +6 -0
- sage/combinat/combinat_cython.pyx +390 -0
- sage/combinat/combination.py +796 -0
- sage/combinat/combinatorial_map.py +416 -0
- sage/combinat/composition.py +2192 -0
- sage/combinat/dlx.py +510 -0
- sage/combinat/integer_lists/__init__.py +7 -0
- sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/base.pxd +16 -0
- sage/combinat/integer_lists/base.pyx +713 -0
- sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/invlex.pxd +4 -0
- sage/combinat/integer_lists/invlex.pyx +1650 -0
- sage/combinat/integer_lists/lists.py +328 -0
- sage/combinat/integer_lists/nn.py +48 -0
- sage/combinat/integer_vector.py +1818 -0
- sage/combinat/integer_vector_weighted.py +413 -0
- sage/combinat/matrices/all__sagemath_categories.py +5 -0
- sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/matrices/dancing_links.pyx +1159 -0
- sage/combinat/matrices/dancing_links_c.h +380 -0
- sage/combinat/matrices/dlxcpp.py +136 -0
- sage/combinat/partition.py +10070 -0
- sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/partitions.pyx +743 -0
- sage/combinat/permutation.py +10168 -0
- sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/permutation_cython.pxd +11 -0
- sage/combinat/permutation_cython.pyx +407 -0
- sage/combinat/q_analogues.py +1090 -0
- sage/combinat/ranker.py +268 -0
- sage/combinat/subset.py +1561 -0
- sage/combinat/subsets_hereditary.py +202 -0
- sage/combinat/subsets_pairwise.py +184 -0
- sage/combinat/tools.py +63 -0
- sage/combinat/tuple.py +348 -0
- sage/data_structures/all.py +2 -0
- sage/data_structures/all__sagemath_categories.py +2 -0
- sage/data_structures/binary_matrix.pxd +138 -0
- sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/binary_search.pxd +3 -0
- sage/data_structures/binary_search.pyx +66 -0
- sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset.pxd +40 -0
- sage/data_structures/bitset.pyx +2385 -0
- sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset_base.pxd +926 -0
- sage/data_structures/bitset_base.pyx +117 -0
- sage/data_structures/bitset_intrinsics.h +487 -0
- sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/blas_dict.pxd +12 -0
- sage/data_structures/blas_dict.pyx +469 -0
- sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/list_of_pairs.pxd +16 -0
- sage/data_structures/list_of_pairs.pyx +122 -0
- sage/data_structures/mutable_poset.py +3312 -0
- sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/pairing_heap.h +346 -0
- sage/data_structures/pairing_heap.pxd +88 -0
- sage/data_structures/pairing_heap.pyx +1464 -0
- sage/data_structures/sparse_bitset.pxd +62 -0
- sage/data_structures/stream.py +5070 -0
- sage/databases/all__sagemath_categories.py +7 -0
- sage/databases/sql_db.py +2236 -0
- sage/ext/all__sagemath_categories.py +3 -0
- sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_callable.pxd +4 -0
- sage/ext/fast_callable.pyx +2746 -0
- sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_eval.pxd +1 -0
- sage/ext/fast_eval.pyx +102 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_categories.py +2 -0
- sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_el.pxd +18 -0
- sage/ext/interpreters/wrapper_el.pyx +148 -0
- sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_py.pxd +17 -0
- sage/ext/interpreters/wrapper_py.pyx +133 -0
- sage/functions/airy.py +937 -0
- sage/functions/all.py +97 -0
- sage/functions/bessel.py +2102 -0
- sage/functions/error.py +784 -0
- sage/functions/exp_integral.py +1529 -0
- sage/functions/gamma.py +1087 -0
- sage/functions/generalized.py +672 -0
- sage/functions/hyperbolic.py +747 -0
- sage/functions/hypergeometric.py +1156 -0
- sage/functions/jacobi.py +1705 -0
- sage/functions/log.py +1402 -0
- sage/functions/min_max.py +338 -0
- sage/functions/orthogonal_polys.py +3106 -0
- sage/functions/other.py +2303 -0
- sage/functions/piecewise.py +1505 -0
- sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/functions/prime_pi.pyx +262 -0
- sage/functions/special.py +1212 -0
- sage/functions/spike_function.py +278 -0
- sage/functions/transcendental.py +690 -0
- sage/functions/trig.py +1062 -0
- sage/functions/wigner.py +726 -0
- sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/geometry/abc.pyx +82 -0
- sage/geometry/all__sagemath_categories.py +1 -0
- sage/groups/all__sagemath_categories.py +11 -0
- sage/groups/generic.py +1733 -0
- sage/groups/groups_catalog.py +113 -0
- sage/groups/perm_gps/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/all.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
- sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
- sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
- sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
- sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
- sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
- sage/interfaces/abc.py +140 -0
- sage/interfaces/all.py +58 -0
- sage/interfaces/all__sagemath_categories.py +1 -0
- sage/interfaces/expect.py +1643 -0
- sage/interfaces/interface.py +1682 -0
- sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/process.pxd +5 -0
- sage/interfaces/process.pyx +288 -0
- sage/interfaces/quit.py +167 -0
- sage/interfaces/sage0.py +604 -0
- sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/sagespawn.pyx +308 -0
- sage/interfaces/tab_completion.py +101 -0
- sage/misc/all__sagemath_categories.py +78 -0
- sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/allocator.pxd +6 -0
- sage/misc/allocator.pyx +47 -0
- sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/binary_tree.pxd +29 -0
- sage/misc/binary_tree.pyx +537 -0
- sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/callable_dict.pyx +89 -0
- sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/citation.pyx +159 -0
- sage/misc/converting_dict.py +293 -0
- sage/misc/defaults.py +129 -0
- sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/derivative.pyx +223 -0
- sage/misc/functional.py +2005 -0
- sage/misc/html.py +589 -0
- sage/misc/latex.py +2673 -0
- sage/misc/latex_macros.py +236 -0
- sage/misc/latex_standalone.py +1833 -0
- sage/misc/map_threaded.py +38 -0
- sage/misc/mathml.py +76 -0
- sage/misc/method_decorator.py +88 -0
- sage/misc/mrange.py +755 -0
- sage/misc/multireplace.py +41 -0
- sage/misc/object_multiplexer.py +92 -0
- sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/parser.pyx +1107 -0
- sage/misc/random_testing.py +264 -0
- sage/misc/rest_index_of_methods.py +377 -0
- sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/search.pxd +2 -0
- sage/misc/search.pyx +68 -0
- sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/stopgap.pyx +95 -0
- sage/misc/table.py +853 -0
- sage/monoids/all__sagemath_categories.py +1 -0
- sage/monoids/indexed_free_monoid.py +1071 -0
- sage/monoids/monoid.py +82 -0
- sage/numerical/all__sagemath_categories.py +1 -0
- sage/numerical/backends/all__sagemath_categories.py +1 -0
- sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_backend.pxd +61 -0
- sage/numerical/backends/generic_backend.pyx +1893 -0
- sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_sdp_backend.pxd +38 -0
- sage/numerical/backends/generic_sdp_backend.pyx +755 -0
- sage/parallel/all.py +6 -0
- sage/parallel/decorate.py +575 -0
- sage/parallel/map_reduce.py +1997 -0
- sage/parallel/multiprocessing_sage.py +76 -0
- sage/parallel/ncpus.py +35 -0
- sage/parallel/parallelism.py +364 -0
- sage/parallel/reference.py +47 -0
- sage/parallel/use_fork.py +333 -0
- sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/abc.pxd +31 -0
- sage/rings/abc.pyx +526 -0
- sage/rings/algebraic_closure_finite_field.py +1154 -0
- sage/rings/all__sagemath_categories.py +91 -0
- sage/rings/big_oh.py +227 -0
- sage/rings/continued_fraction.py +2754 -0
- sage/rings/continued_fraction_gosper.py +220 -0
- sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/factorint.pyx +295 -0
- sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fast_arith.pxd +21 -0
- sage/rings/fast_arith.pyx +535 -0
- sage/rings/finite_rings/all__sagemath_categories.py +9 -0
- sage/rings/finite_rings/conway_polynomials.py +542 -0
- sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_base.pxd +12 -0
- sage/rings/finite_rings/element_base.pyx +1176 -0
- sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/finite_field_base.pxd +7 -0
- sage/rings/finite_rings/finite_field_base.pyx +2171 -0
- sage/rings/finite_rings/finite_field_constructor.py +827 -0
- sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
- sage/rings/finite_rings/galois_group.py +154 -0
- sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_finite_field.pxd +23 -0
- sage/rings/finite_rings/hom_finite_field.pyx +856 -0
- sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
- sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
- sage/rings/finite_rings/homset.py +357 -0
- sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/integer_mod.pxd +56 -0
- sage/rings/finite_rings/integer_mod.pyx +4586 -0
- sage/rings/finite_rings/integer_mod_limits.h +11 -0
- sage/rings/finite_rings/integer_mod_ring.py +2044 -0
- sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/residue_field.pxd +30 -0
- sage/rings/finite_rings/residue_field.pyx +1811 -0
- sage/rings/finite_rings/stdint.pxd +19 -0
- sage/rings/fraction_field.py +1452 -0
- sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fraction_field_element.pyx +1357 -0
- sage/rings/function_field/all.py +7 -0
- sage/rings/function_field/all__sagemath_categories.py +2 -0
- sage/rings/function_field/constructor.py +218 -0
- sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element.pxd +11 -0
- sage/rings/function_field/element.pyx +1008 -0
- sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element_rational.pyx +513 -0
- sage/rings/function_field/extensions.py +230 -0
- sage/rings/function_field/function_field.py +1468 -0
- sage/rings/function_field/function_field_rational.py +1005 -0
- sage/rings/function_field/ideal.py +1155 -0
- sage/rings/function_field/ideal_rational.py +629 -0
- sage/rings/function_field/jacobian_base.py +826 -0
- sage/rings/function_field/jacobian_hess.py +1053 -0
- sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
- sage/rings/function_field/maps.py +1039 -0
- sage/rings/function_field/order.py +281 -0
- sage/rings/function_field/order_basis.py +586 -0
- sage/rings/function_field/order_rational.py +576 -0
- sage/rings/function_field/place.py +426 -0
- sage/rings/function_field/place_rational.py +181 -0
- sage/rings/generic.py +320 -0
- sage/rings/homset.py +332 -0
- sage/rings/ideal.py +1885 -0
- sage/rings/ideal_monoid.py +215 -0
- sage/rings/infinity.py +1890 -0
- sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer.pxd +45 -0
- sage/rings/integer.pyx +7874 -0
- sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer_ring.pxd +8 -0
- sage/rings/integer_ring.pyx +1693 -0
- sage/rings/laurent_series_ring.py +931 -0
- sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/laurent_series_ring_element.pxd +11 -0
- sage/rings/laurent_series_ring_element.pyx +1927 -0
- sage/rings/lazy_series.py +7815 -0
- sage/rings/lazy_series_ring.py +4356 -0
- sage/rings/localization.py +1043 -0
- sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/morphism.pxd +39 -0
- sage/rings/morphism.pyx +3299 -0
- sage/rings/multi_power_series_ring.py +1145 -0
- sage/rings/multi_power_series_ring_element.py +2184 -0
- sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/noncommutative_ideals.pyx +423 -0
- sage/rings/number_field/all__sagemath_categories.py +1 -0
- sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_base.pxd +8 -0
- sage/rings/number_field/number_field_base.pyx +507 -0
- sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_element_base.pxd +6 -0
- sage/rings/number_field/number_field_element_base.pyx +36 -0
- sage/rings/number_field/number_field_ideal.py +3550 -0
- sage/rings/padics/all__sagemath_categories.py +4 -0
- sage/rings/padics/local_generic.py +1670 -0
- sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/local_generic_element.pxd +5 -0
- sage/rings/padics/local_generic_element.pyx +1017 -0
- sage/rings/padics/misc.py +256 -0
- sage/rings/padics/padic_generic.py +1911 -0
- sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/pow_computer.pxd +38 -0
- sage/rings/padics/pow_computer.pyx +671 -0
- sage/rings/padics/precision_error.py +24 -0
- sage/rings/polynomial/all__sagemath_categories.py +25 -0
- sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/commutative_polynomial.pxd +6 -0
- sage/rings/polynomial/commutative_polynomial.pyx +24 -0
- sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/cyclotomic.pyx +404 -0
- sage/rings/polynomial/flatten.py +711 -0
- sage/rings/polynomial/ideal.py +102 -0
- sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
- sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
- sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial.pxd +18 -0
- sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
- sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
- sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
- sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
- sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial.pxd +12 -0
- sage/rings/polynomial/multi_polynomial.pyx +3082 -0
- sage/rings/polynomial/multi_polynomial_element.py +2570 -0
- sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
- sage/rings/polynomial/multi_polynomial_ring.py +947 -0
- sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
- sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
- sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polydict.pxd +45 -0
- sage/rings/polynomial/polydict.pyx +2701 -0
- sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_compiled.pxd +59 -0
- sage/rings/polynomial/polynomial_compiled.pyx +509 -0
- sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_element.pxd +64 -0
- sage/rings/polynomial/polynomial_element.pyx +13255 -0
- sage/rings/polynomial/polynomial_element_generic.py +1637 -0
- sage/rings/polynomial/polynomial_fateman.py +97 -0
- sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
- sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
- sage/rings/polynomial/polynomial_ring.py +3784 -0
- sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
- sage/rings/polynomial/polynomial_singular_interface.py +549 -0
- sage/rings/polynomial/symmetric_ideal.py +989 -0
- sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/symmetric_reduction.pxd +8 -0
- sage/rings/polynomial/symmetric_reduction.pyx +669 -0
- sage/rings/polynomial/term_order.py +2279 -0
- sage/rings/polynomial/toy_buchberger.py +449 -0
- sage/rings/polynomial/toy_d_basis.py +387 -0
- sage/rings/polynomial/toy_variety.py +362 -0
- sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_mpoly.pxd +9 -0
- sage/rings/power_series_mpoly.pyx +161 -0
- sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_poly.pxd +10 -0
- sage/rings/power_series_poly.pyx +1317 -0
- sage/rings/power_series_ring.py +1441 -0
- sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_ring_element.pxd +12 -0
- sage/rings/power_series_ring_element.pyx +3028 -0
- sage/rings/puiseux_series_ring.py +487 -0
- sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/puiseux_series_ring_element.pxd +7 -0
- sage/rings/puiseux_series_ring_element.pyx +1055 -0
- sage/rings/qqbar_decorators.py +167 -0
- sage/rings/quotient_ring.py +1598 -0
- sage/rings/quotient_ring_element.py +979 -0
- sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/rational.pxd +20 -0
- sage/rings/rational.pyx +4284 -0
- sage/rings/rational_field.py +1730 -0
- sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_double.pxd +16 -0
- sage/rings/real_double.pyx +2218 -0
- sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_lazy.pxd +30 -0
- sage/rings/real_lazy.pyx +1773 -0
- sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/ring.pxd +30 -0
- sage/rings/ring.pyx +850 -0
- sage/rings/semirings/all.py +3 -0
- sage/rings/semirings/non_negative_integer_semiring.py +107 -0
- sage/rings/semirings/tropical_mpolynomial.py +972 -0
- sage/rings/semirings/tropical_polynomial.py +997 -0
- sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/semirings/tropical_semiring.pyx +676 -0
- sage/rings/semirings/tropical_variety.py +1701 -0
- sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/sum_of_squares.pxd +3 -0
- sage/rings/sum_of_squares.pyx +336 -0
- sage/rings/tests.py +504 -0
- sage/schemes/affine/affine_homset.py +508 -0
- sage/schemes/affine/affine_morphism.py +1574 -0
- sage/schemes/affine/affine_point.py +460 -0
- sage/schemes/affine/affine_rational_point.py +308 -0
- sage/schemes/affine/affine_space.py +1264 -0
- sage/schemes/affine/affine_subscheme.py +592 -0
- sage/schemes/affine/all.py +25 -0
- sage/schemes/all__sagemath_categories.py +5 -0
- sage/schemes/generic/algebraic_scheme.py +2092 -0
- sage/schemes/generic/all.py +5 -0
- sage/schemes/generic/ambient_space.py +400 -0
- sage/schemes/generic/divisor.py +465 -0
- sage/schemes/generic/divisor_group.py +313 -0
- sage/schemes/generic/glue.py +84 -0
- sage/schemes/generic/homset.py +820 -0
- sage/schemes/generic/hypersurface.py +234 -0
- sage/schemes/generic/morphism.py +2107 -0
- sage/schemes/generic/point.py +237 -0
- sage/schemes/generic/scheme.py +1190 -0
- sage/schemes/generic/spec.py +199 -0
- sage/schemes/product_projective/all.py +6 -0
- sage/schemes/product_projective/homset.py +236 -0
- sage/schemes/product_projective/morphism.py +517 -0
- sage/schemes/product_projective/point.py +568 -0
- sage/schemes/product_projective/rational_point.py +550 -0
- sage/schemes/product_projective/space.py +1301 -0
- sage/schemes/product_projective/subscheme.py +466 -0
- sage/schemes/projective/all.py +24 -0
- sage/schemes/projective/proj_bdd_height.py +453 -0
- sage/schemes/projective/projective_homset.py +718 -0
- sage/schemes/projective/projective_morphism.py +2792 -0
- sage/schemes/projective/projective_point.py +1484 -0
- sage/schemes/projective/projective_rational_point.py +569 -0
- sage/schemes/projective/projective_space.py +2571 -0
- sage/schemes/projective/projective_subscheme.py +1574 -0
- sage/sets/all.py +17 -0
- sage/sets/cartesian_product.py +376 -0
- sage/sets/condition_set.py +525 -0
- sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/disjoint_set.pxd +36 -0
- sage/sets/disjoint_set.pyx +998 -0
- sage/sets/disjoint_union_enumerated_sets.py +625 -0
- sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/family.pxd +12 -0
- sage/sets/family.pyx +1556 -0
- sage/sets/finite_enumerated_set.py +406 -0
- sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/finite_set_map_cy.pxd +34 -0
- sage/sets/finite_set_map_cy.pyx +708 -0
- sage/sets/finite_set_maps.py +591 -0
- sage/sets/image_set.py +448 -0
- sage/sets/integer_range.py +829 -0
- sage/sets/non_negative_integers.py +241 -0
- sage/sets/positive_integers.py +93 -0
- sage/sets/primes.py +188 -0
- sage/sets/real_set.py +2760 -0
- sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/recursively_enumerated_set.pxd +31 -0
- sage/sets/recursively_enumerated_set.pyx +2082 -0
- sage/sets/set.py +2083 -0
- sage/sets/set_from_iterator.py +1021 -0
- sage/sets/totally_ordered_finite_set.py +329 -0
- sage/symbolic/all__sagemath_categories.py +1 -0
- sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/symbolic/function.pxd +29 -0
- sage/symbolic/function.pyx +1488 -0
- sage/symbolic/symbols.py +56 -0
- sage/tests/all__sagemath_categories.py +1 -0
- sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/cython.pyx +37 -0
- sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/stl_vector.pyx +171 -0
- sage/typeset/all.py +6 -0
- sage/typeset/ascii_art.py +295 -0
- sage/typeset/character_art.py +789 -0
- sage/typeset/character_art_factory.py +572 -0
- sage/typeset/symbols.py +334 -0
- sage/typeset/unicode_art.py +183 -0
- sage/typeset/unicode_characters.py +101 -0
|
@@ -0,0 +1,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
|