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,1190 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Schemes
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- William Stein, David Kohel, Kiran Kedlaya (2008): added zeta_series
|
|
8
|
+
|
|
9
|
+
- Volker Braun (2011-08-11): documenting, improving, refactoring.
|
|
10
|
+
"""
|
|
11
|
+
# ****************************************************************************
|
|
12
|
+
# Copyright (C) 2011 Volker Braun <vbraun.name@gmail.com>
|
|
13
|
+
# Copyright (C) 2008 Kiran Kedlaya <kedlaya@mit.edu>
|
|
14
|
+
# Copyright (C) 2005 David Kohel <kohel@maths.usyd.edu.au>
|
|
15
|
+
# Copyright (C) 2005 William Stein
|
|
16
|
+
#
|
|
17
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
18
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
19
|
+
# the License, or (at your option) any later version.
|
|
20
|
+
# https://www.gnu.org/licenses/
|
|
21
|
+
# ****************************************************************************
|
|
22
|
+
|
|
23
|
+
from sage.categories.commutative_rings import CommutativeRings
|
|
24
|
+
from sage.misc.cachefunc import cached_method
|
|
25
|
+
from sage.misc.lazy_import import lazy_import
|
|
26
|
+
from sage.rings.ideal import Ideal_generic
|
|
27
|
+
from sage.rings.integer_ring import ZZ
|
|
28
|
+
from sage.schemes.generic.point import SchemeTopologicalPoint_prime_ideal
|
|
29
|
+
from sage.structure.parent import Parent
|
|
30
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
31
|
+
|
|
32
|
+
lazy_import('sage.schemes.generic.morphism', 'SchemeMorphism')
|
|
33
|
+
lazy_import('sage.schemes.elliptic_curves.ell_generic', 'EllipticCurve_generic', as_='EllipticCurve')
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def is_Scheme(x):
|
|
37
|
+
"""
|
|
38
|
+
Test whether ``x`` is a scheme.
|
|
39
|
+
|
|
40
|
+
INPUT:
|
|
41
|
+
|
|
42
|
+
- ``x`` -- anything
|
|
43
|
+
|
|
44
|
+
OUTPUT: boolean; whether ``x`` derives from :class:`Scheme`
|
|
45
|
+
|
|
46
|
+
EXAMPLES::
|
|
47
|
+
|
|
48
|
+
sage: from sage.schemes.generic.scheme import is_Scheme
|
|
49
|
+
sage: is_Scheme(5)
|
|
50
|
+
doctest:warning...
|
|
51
|
+
DeprecationWarning: The function is_Scheme is deprecated; use 'isinstance(..., Scheme)' or categories instead.
|
|
52
|
+
See https://github.com/sagemath/sage/issues/38022 for details.
|
|
53
|
+
False
|
|
54
|
+
sage: X = Spec(QQ)
|
|
55
|
+
sage: is_Scheme(X)
|
|
56
|
+
True
|
|
57
|
+
"""
|
|
58
|
+
from sage.misc.superseded import deprecation
|
|
59
|
+
deprecation(38022, "The function is_Scheme is deprecated; use 'isinstance(..., Scheme)' or categories instead.")
|
|
60
|
+
return isinstance(x, Scheme)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class Scheme(Parent):
|
|
64
|
+
r"""
|
|
65
|
+
The base class for all schemes.
|
|
66
|
+
|
|
67
|
+
INPUT:
|
|
68
|
+
|
|
69
|
+
- ``X`` -- a scheme, scheme morphism, commutative ring,
|
|
70
|
+
commutative ring morphism, or ``None`` (optional). Determines
|
|
71
|
+
the base scheme. If a commutative ring is passed, the spectrum
|
|
72
|
+
of the ring will be used as base.
|
|
73
|
+
|
|
74
|
+
- ``category`` -- the category (optional); will be automatically
|
|
75
|
+
constructed by default
|
|
76
|
+
|
|
77
|
+
EXAMPLES::
|
|
78
|
+
|
|
79
|
+
sage: from sage.schemes.generic.scheme import Scheme
|
|
80
|
+
sage: Scheme(ZZ)
|
|
81
|
+
<sage.schemes.generic.scheme.Scheme_with_category object at ...>
|
|
82
|
+
|
|
83
|
+
A scheme is in the category of all schemes over its base::
|
|
84
|
+
|
|
85
|
+
sage: ProjectiveSpace(4, QQ).category()
|
|
86
|
+
Category of schemes over Rational Field
|
|
87
|
+
|
|
88
|
+
There is a special and unique `\mathrm{Spec}(\ZZ)` that is the default base
|
|
89
|
+
scheme::
|
|
90
|
+
|
|
91
|
+
sage: Spec(ZZ).base_scheme() is Spec(QQ).base_scheme()
|
|
92
|
+
True
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
def __init__(self, X=None, category=None):
|
|
96
|
+
"""
|
|
97
|
+
Construct a scheme.
|
|
98
|
+
|
|
99
|
+
TESTS:
|
|
100
|
+
|
|
101
|
+
The full test suite works since :issue:`7946`::
|
|
102
|
+
|
|
103
|
+
sage: R.<x, y> = QQ[]
|
|
104
|
+
sage: I = (x^2 - y^2)*R
|
|
105
|
+
sage: RmodI = R.quotient(I)
|
|
106
|
+
sage: X = Spec(RmodI)
|
|
107
|
+
sage: TestSuite(X).run() # needs sage.libs.singular
|
|
108
|
+
"""
|
|
109
|
+
from sage.categories.map import Map
|
|
110
|
+
from sage.categories.rings import Rings
|
|
111
|
+
|
|
112
|
+
if X is None:
|
|
113
|
+
self._base_ring = ZZ
|
|
114
|
+
elif isinstance(X, Scheme):
|
|
115
|
+
self._base_scheme = X
|
|
116
|
+
elif isinstance(X, SchemeMorphism):
|
|
117
|
+
self._base_morphism = X
|
|
118
|
+
elif X in CommutativeRings():
|
|
119
|
+
self._base_ring = X
|
|
120
|
+
elif isinstance(X, Map) and X.category_for().is_subcategory(Rings()):
|
|
121
|
+
# X is a morphism of Rings
|
|
122
|
+
self._base_ring = X.codomain()
|
|
123
|
+
else:
|
|
124
|
+
raise ValueError('The base must be define by a scheme, '
|
|
125
|
+
'scheme morphism, or commutative ring.')
|
|
126
|
+
|
|
127
|
+
from sage.categories.schemes import Schemes
|
|
128
|
+
if X is None:
|
|
129
|
+
default_category = Schemes()
|
|
130
|
+
else:
|
|
131
|
+
default_category = Schemes(self.base_scheme())
|
|
132
|
+
if category is None:
|
|
133
|
+
category = default_category
|
|
134
|
+
else:
|
|
135
|
+
assert category.is_subcategory(default_category), \
|
|
136
|
+
"%s is not a subcategory of %s" % (category, default_category)
|
|
137
|
+
|
|
138
|
+
Parent.__init__(self, self.base_ring(), category=category)
|
|
139
|
+
|
|
140
|
+
def union(self, X):
|
|
141
|
+
"""
|
|
142
|
+
Return the disjoint union of the schemes ``self`` and ``X``.
|
|
143
|
+
|
|
144
|
+
EXAMPLES::
|
|
145
|
+
|
|
146
|
+
sage: S = Spec(QQ)
|
|
147
|
+
sage: X = AffineSpace(1, QQ)
|
|
148
|
+
sage: S.union(X)
|
|
149
|
+
Traceback (most recent call last):
|
|
150
|
+
...
|
|
151
|
+
NotImplementedError
|
|
152
|
+
"""
|
|
153
|
+
raise NotImplementedError
|
|
154
|
+
|
|
155
|
+
__add__ = union
|
|
156
|
+
|
|
157
|
+
def _morphism(self, *args, **kwds):
|
|
158
|
+
"""
|
|
159
|
+
Construct a morphism determined by action on points of ``self``.
|
|
160
|
+
|
|
161
|
+
EXAMPLES::
|
|
162
|
+
|
|
163
|
+
sage: X = Spec(QQ)
|
|
164
|
+
sage: X._morphism()
|
|
165
|
+
Traceback (most recent call last):
|
|
166
|
+
...
|
|
167
|
+
NotImplementedError
|
|
168
|
+
|
|
169
|
+
TESTS:
|
|
170
|
+
|
|
171
|
+
This shows that issue at :issue:`7389` is solved::
|
|
172
|
+
|
|
173
|
+
sage: S = Spec(ZZ)
|
|
174
|
+
sage: f = S.identity_morphism()
|
|
175
|
+
sage: from sage.schemes.generic.glue import GluedScheme
|
|
176
|
+
sage: T = GluedScheme(f, f)
|
|
177
|
+
sage: S.hom([1],T)
|
|
178
|
+
Traceback (most recent call last):
|
|
179
|
+
...
|
|
180
|
+
NotImplementedError
|
|
181
|
+
"""
|
|
182
|
+
raise NotImplementedError
|
|
183
|
+
|
|
184
|
+
def base_extend(self, Y):
|
|
185
|
+
"""
|
|
186
|
+
Extend the base of the scheme.
|
|
187
|
+
|
|
188
|
+
Derived classes must override this method.
|
|
189
|
+
|
|
190
|
+
EXAMPLES::
|
|
191
|
+
|
|
192
|
+
sage: from sage.schemes.generic.scheme import Scheme
|
|
193
|
+
sage: X = Scheme(ZZ)
|
|
194
|
+
sage: X.base_scheme()
|
|
195
|
+
Spectrum of Integer Ring
|
|
196
|
+
sage: X.base_extend(QQ)
|
|
197
|
+
Traceback (most recent call last):
|
|
198
|
+
...
|
|
199
|
+
NotImplementedError
|
|
200
|
+
"""
|
|
201
|
+
raise NotImplementedError
|
|
202
|
+
|
|
203
|
+
def __call__(self, *args):
|
|
204
|
+
"""
|
|
205
|
+
Call syntax for schemes.
|
|
206
|
+
|
|
207
|
+
INPUT/OUTPUT: the arguments must be one of the following:
|
|
208
|
+
|
|
209
|
+
- a ring or a scheme `S`. Output will be the set `X(S)` of
|
|
210
|
+
`S`-valued points on `X`.
|
|
211
|
+
|
|
212
|
+
- If `S` is a list or tuple or just the coordinates, return a
|
|
213
|
+
point in `X(T)`, where `T` is the base scheme of ``self``.
|
|
214
|
+
|
|
215
|
+
EXAMPLES::
|
|
216
|
+
|
|
217
|
+
sage: A = AffineSpace(2, QQ)
|
|
218
|
+
|
|
219
|
+
We create some point sets::
|
|
220
|
+
|
|
221
|
+
sage: A(QQ)
|
|
222
|
+
Set of rational points of Affine Space of dimension 2 over Rational Field
|
|
223
|
+
sage: A(RR) # needs sage.rings.real_mpfr
|
|
224
|
+
Set of rational points of Affine Space of dimension 2
|
|
225
|
+
over Real Field with 53 bits of precision
|
|
226
|
+
|
|
227
|
+
Space of dimension 2 over Rational Field::
|
|
228
|
+
|
|
229
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
230
|
+
sage: A(NumberField(x^2 + 1, 'a')) # needs sage.rings.number_field
|
|
231
|
+
Set of rational points of Affine Space of dimension 2
|
|
232
|
+
over Number Field in a with defining polynomial x^2 + 1
|
|
233
|
+
sage: A(GF(7))
|
|
234
|
+
Traceback (most recent call last):
|
|
235
|
+
...
|
|
236
|
+
ValueError: There must be a natural map S --> R, but
|
|
237
|
+
S = Rational Field and R = Finite Field of size 7
|
|
238
|
+
|
|
239
|
+
We create some points::
|
|
240
|
+
|
|
241
|
+
sage: A(QQ)([1, 0])
|
|
242
|
+
(1, 0)
|
|
243
|
+
|
|
244
|
+
We create the same point by giving the coordinates of the point
|
|
245
|
+
directly::
|
|
246
|
+
|
|
247
|
+
sage: A(1, 0)
|
|
248
|
+
(1, 0)
|
|
249
|
+
|
|
250
|
+
Check that :issue:`16832` is fixed::
|
|
251
|
+
|
|
252
|
+
sage: P.<x,y,z> = ProjectiveSpace(ZZ, 2)
|
|
253
|
+
sage: X = P.subscheme(x^2 - y^2)
|
|
254
|
+
sage: X(P([4, 4, 1]))
|
|
255
|
+
(4 : 4 : 1)
|
|
256
|
+
"""
|
|
257
|
+
if len(args) == 1:
|
|
258
|
+
from sage.schemes.generic.morphism import SchemeMorphism_point
|
|
259
|
+
S = args[0]
|
|
260
|
+
if S in CommutativeRings():
|
|
261
|
+
return self.point_homset(S)
|
|
262
|
+
elif isinstance(S, Scheme):
|
|
263
|
+
return S.Hom(self)
|
|
264
|
+
elif isinstance(S, (list, tuple)):
|
|
265
|
+
args = S
|
|
266
|
+
elif isinstance(S, SchemeMorphism_point):
|
|
267
|
+
if S.codomain() is self:
|
|
268
|
+
return S
|
|
269
|
+
args = S
|
|
270
|
+
return self.point(args)
|
|
271
|
+
|
|
272
|
+
@cached_method
|
|
273
|
+
def point_homset(self, S=None):
|
|
274
|
+
r"""
|
|
275
|
+
Return the set of S-valued points of this scheme.
|
|
276
|
+
|
|
277
|
+
INPUT:
|
|
278
|
+
|
|
279
|
+
- ``S`` -- a commutative ring
|
|
280
|
+
|
|
281
|
+
OUTPUT: the set of morphisms `\mathrm{Spec}(S) \to X`
|
|
282
|
+
|
|
283
|
+
EXAMPLES::
|
|
284
|
+
|
|
285
|
+
sage: P = ProjectiveSpace(ZZ, 3)
|
|
286
|
+
sage: P.point_homset(ZZ)
|
|
287
|
+
Set of rational points of Projective Space of dimension 3 over Integer Ring
|
|
288
|
+
sage: P.point_homset(QQ)
|
|
289
|
+
Set of rational points of Projective Space of dimension 3 over Rational Field
|
|
290
|
+
sage: P.point_homset(GF(11))
|
|
291
|
+
Set of rational points of Projective Space of dimension 3 over
|
|
292
|
+
Finite Field of size 11
|
|
293
|
+
|
|
294
|
+
TESTS::
|
|
295
|
+
|
|
296
|
+
sage: P = ProjectiveSpace(QQ, 3)
|
|
297
|
+
sage: P.point_homset(GF(11))
|
|
298
|
+
Traceback (most recent call last):
|
|
299
|
+
...
|
|
300
|
+
ValueError: There must be a natural map S --> R, but
|
|
301
|
+
S = Rational Field and R = Finite Field of size 11
|
|
302
|
+
"""
|
|
303
|
+
if S is None:
|
|
304
|
+
S = self.base_ring()
|
|
305
|
+
SpecS = AffineScheme(S, self.base_ring())
|
|
306
|
+
from sage.schemes.generic.homset import SchemeHomset
|
|
307
|
+
return SchemeHomset(SpecS, self, as_point_homset=True)
|
|
308
|
+
|
|
309
|
+
def point(self, v, check=True):
|
|
310
|
+
"""
|
|
311
|
+
Create a point.
|
|
312
|
+
|
|
313
|
+
INPUT:
|
|
314
|
+
|
|
315
|
+
- ``v`` -- anything that defines a point
|
|
316
|
+
|
|
317
|
+
- ``check`` -- boolean (default: ``True``); whether
|
|
318
|
+
to check the defining data for consistency
|
|
319
|
+
|
|
320
|
+
OUTPUT: a point of the scheme
|
|
321
|
+
|
|
322
|
+
EXAMPLES::
|
|
323
|
+
|
|
324
|
+
sage: A2 = AffineSpace(QQ, 2)
|
|
325
|
+
sage: A2.point([4, 5])
|
|
326
|
+
(4, 5)
|
|
327
|
+
|
|
328
|
+
sage: R.<t> = PolynomialRing(QQ)
|
|
329
|
+
sage: E = EllipticCurve([t + 1, t, t, 0, 0]) # needs sage.schemes
|
|
330
|
+
sage: E.point([0, 0]) # needs sage.schemes
|
|
331
|
+
(0 : 0 : 1)
|
|
332
|
+
"""
|
|
333
|
+
# todo: update elliptic curve stuff to take point_homset as argument
|
|
334
|
+
if isinstance(self, EllipticCurve):
|
|
335
|
+
try:
|
|
336
|
+
return self._point(self.point_homset(), v, check=check)
|
|
337
|
+
except AttributeError: # legacy code without point_homset
|
|
338
|
+
return self._point(self, v, check=check)
|
|
339
|
+
|
|
340
|
+
return self.point_homset()(v, check=check)
|
|
341
|
+
|
|
342
|
+
def _point(self):
|
|
343
|
+
"""
|
|
344
|
+
Return the Hom-set from some affine scheme to ``self``.
|
|
345
|
+
|
|
346
|
+
OUTPUT:
|
|
347
|
+
|
|
348
|
+
A scheme Hom-set, see :mod:`~sage.schemes.generic.homset`.
|
|
349
|
+
|
|
350
|
+
EXAMPLES::
|
|
351
|
+
|
|
352
|
+
sage: X = Spec(QQ)
|
|
353
|
+
sage: X._point()
|
|
354
|
+
Traceback (most recent call last):
|
|
355
|
+
...
|
|
356
|
+
NotImplementedError
|
|
357
|
+
"""
|
|
358
|
+
raise NotImplementedError
|
|
359
|
+
|
|
360
|
+
def _point_homset(self, *args, **kwds):
|
|
361
|
+
"""
|
|
362
|
+
Return the Hom-set from ``self`` to another scheme.
|
|
363
|
+
|
|
364
|
+
EXAMPLES::
|
|
365
|
+
|
|
366
|
+
sage: from sage.schemes.generic.scheme import Scheme
|
|
367
|
+
sage: X = Scheme(QQ)
|
|
368
|
+
sage: X._point_homset()
|
|
369
|
+
Traceback (most recent call last):
|
|
370
|
+
...
|
|
371
|
+
NotImplementedError
|
|
372
|
+
"""
|
|
373
|
+
raise NotImplementedError
|
|
374
|
+
|
|
375
|
+
def __truediv__(self, Y):
|
|
376
|
+
"""
|
|
377
|
+
Return the base extension of ``self`` to Y.
|
|
378
|
+
|
|
379
|
+
See :meth:`base_extend` for details.
|
|
380
|
+
|
|
381
|
+
EXAMPLES::
|
|
382
|
+
|
|
383
|
+
sage: A = AffineSpace(3, ZZ)
|
|
384
|
+
sage: A
|
|
385
|
+
Affine Space of dimension 3 over Integer Ring
|
|
386
|
+
sage: A/QQ
|
|
387
|
+
Affine Space of dimension 3 over Rational Field
|
|
388
|
+
sage: A/GF(7)
|
|
389
|
+
Affine Space of dimension 3 over Finite Field of size 7
|
|
390
|
+
"""
|
|
391
|
+
return self.base_extend(Y)
|
|
392
|
+
|
|
393
|
+
def base_ring(self):
|
|
394
|
+
"""
|
|
395
|
+
Return the base ring of the scheme ``self``.
|
|
396
|
+
|
|
397
|
+
OUTPUT: a commutative ring
|
|
398
|
+
|
|
399
|
+
EXAMPLES::
|
|
400
|
+
|
|
401
|
+
sage: A = AffineSpace(4, QQ)
|
|
402
|
+
sage: A.base_ring()
|
|
403
|
+
Rational Field
|
|
404
|
+
|
|
405
|
+
sage: X = Spec(QQ)
|
|
406
|
+
sage: X.base_ring()
|
|
407
|
+
Integer Ring
|
|
408
|
+
"""
|
|
409
|
+
try:
|
|
410
|
+
return self._base_ring
|
|
411
|
+
except AttributeError:
|
|
412
|
+
if hasattr(self, '_base_morphism'):
|
|
413
|
+
self._base_ring = self._base_morphism.codomain().coordinate_ring()
|
|
414
|
+
elif hasattr(self, '_base_scheme'):
|
|
415
|
+
self._base_ring = self._base_scheme.coordinate_ring()
|
|
416
|
+
else:
|
|
417
|
+
self._base_ring = ZZ
|
|
418
|
+
return self._base_ring
|
|
419
|
+
|
|
420
|
+
def base_scheme(self):
|
|
421
|
+
"""
|
|
422
|
+
Return the base scheme.
|
|
423
|
+
|
|
424
|
+
OUTPUT: a scheme
|
|
425
|
+
|
|
426
|
+
EXAMPLES::
|
|
427
|
+
|
|
428
|
+
sage: A = AffineSpace(4, QQ)
|
|
429
|
+
sage: A.base_scheme()
|
|
430
|
+
Spectrum of Rational Field
|
|
431
|
+
|
|
432
|
+
sage: X = Spec(QQ)
|
|
433
|
+
sage: X.base_scheme()
|
|
434
|
+
Spectrum of Integer Ring
|
|
435
|
+
"""
|
|
436
|
+
try:
|
|
437
|
+
return self._base_scheme
|
|
438
|
+
except AttributeError:
|
|
439
|
+
if hasattr(self, '_base_morphism'):
|
|
440
|
+
self._base_scheme = self._base_morphism.codomain()
|
|
441
|
+
elif hasattr(self, '_base_ring'):
|
|
442
|
+
self._base_scheme = AffineScheme(self._base_ring)
|
|
443
|
+
else:
|
|
444
|
+
from sage.schemes.generic.spec import SpecZ
|
|
445
|
+
self._base_scheme = SpecZ
|
|
446
|
+
return self._base_scheme
|
|
447
|
+
|
|
448
|
+
def base_morphism(self):
|
|
449
|
+
"""
|
|
450
|
+
Return the structure morphism from ``self`` to its base
|
|
451
|
+
scheme.
|
|
452
|
+
|
|
453
|
+
OUTPUT: a scheme morphism
|
|
454
|
+
|
|
455
|
+
EXAMPLES::
|
|
456
|
+
|
|
457
|
+
sage: A = AffineSpace(4, QQ)
|
|
458
|
+
sage: A.base_morphism()
|
|
459
|
+
Scheme morphism:
|
|
460
|
+
From: Affine Space of dimension 4 over Rational Field
|
|
461
|
+
To: Spectrum of Rational Field
|
|
462
|
+
Defn: Structure map
|
|
463
|
+
|
|
464
|
+
sage: X = Spec(QQ)
|
|
465
|
+
sage: X.base_morphism()
|
|
466
|
+
Scheme morphism:
|
|
467
|
+
From: Spectrum of Rational Field
|
|
468
|
+
To: Spectrum of Integer Ring
|
|
469
|
+
Defn: Structure map
|
|
470
|
+
"""
|
|
471
|
+
try:
|
|
472
|
+
return self._base_morphism
|
|
473
|
+
except AttributeError:
|
|
474
|
+
from sage.categories.schemes import Schemes
|
|
475
|
+
from sage.schemes.generic.spec import SpecZ
|
|
476
|
+
SCH = Schemes()
|
|
477
|
+
if hasattr(self, '_base_scheme'):
|
|
478
|
+
self._base_morphism = self.Hom(self._base_scheme, category=SCH).natural_map()
|
|
479
|
+
elif hasattr(self, '_base_ring'):
|
|
480
|
+
self._base_morphism = self.Hom(AffineScheme(self._base_ring), category=SCH).natural_map()
|
|
481
|
+
else:
|
|
482
|
+
self._base_morphism = self.Hom(SpecZ, category=SCH).natural_map()
|
|
483
|
+
return self._base_morphism
|
|
484
|
+
|
|
485
|
+
structure_morphism = base_morphism
|
|
486
|
+
|
|
487
|
+
def coordinate_ring(self):
|
|
488
|
+
"""
|
|
489
|
+
Return the coordinate ring.
|
|
490
|
+
|
|
491
|
+
OUTPUT:
|
|
492
|
+
|
|
493
|
+
The global coordinate ring of this scheme, if
|
|
494
|
+
defined. Otherwise this raises a :exc:`ValueError`.
|
|
495
|
+
|
|
496
|
+
EXAMPLES::
|
|
497
|
+
|
|
498
|
+
sage: R.<x, y> = QQ[]
|
|
499
|
+
sage: I = (x^2 - y^2)*R
|
|
500
|
+
sage: X = Spec(R.quotient(I))
|
|
501
|
+
sage: X.coordinate_ring()
|
|
502
|
+
Quotient of Multivariate Polynomial Ring in x, y over Rational Field
|
|
503
|
+
by the ideal (x^2 - y^2)
|
|
504
|
+
"""
|
|
505
|
+
try:
|
|
506
|
+
return self._coordinate_ring
|
|
507
|
+
except AttributeError:
|
|
508
|
+
raise ValueError("This scheme has no associated coordinated ring (defined).")
|
|
509
|
+
|
|
510
|
+
def dimension_absolute(self):
|
|
511
|
+
"""
|
|
512
|
+
Return the absolute dimension of this scheme.
|
|
513
|
+
|
|
514
|
+
OUTPUT: integer
|
|
515
|
+
|
|
516
|
+
EXAMPLES::
|
|
517
|
+
|
|
518
|
+
sage: R.<x, y> = QQ[]
|
|
519
|
+
sage: I = (x^2 - y^2)*R
|
|
520
|
+
sage: X = Spec(R.quotient(I))
|
|
521
|
+
sage: X.dimension_absolute()
|
|
522
|
+
Traceback (most recent call last):
|
|
523
|
+
...
|
|
524
|
+
NotImplementedError
|
|
525
|
+
sage: X.dimension()
|
|
526
|
+
Traceback (most recent call last):
|
|
527
|
+
...
|
|
528
|
+
NotImplementedError
|
|
529
|
+
"""
|
|
530
|
+
raise NotImplementedError # override in derived class
|
|
531
|
+
|
|
532
|
+
dimension = dimension_absolute
|
|
533
|
+
|
|
534
|
+
def dimension_relative(self):
|
|
535
|
+
"""
|
|
536
|
+
Return the relative dimension of this scheme over its base.
|
|
537
|
+
|
|
538
|
+
OUTPUT: integer
|
|
539
|
+
|
|
540
|
+
EXAMPLES::
|
|
541
|
+
|
|
542
|
+
sage: R.<x, y> = QQ[]
|
|
543
|
+
sage: I = (x^2 - y^2)*R
|
|
544
|
+
sage: X = Spec(R.quotient(I))
|
|
545
|
+
sage: X.dimension_relative()
|
|
546
|
+
Traceback (most recent call last):
|
|
547
|
+
...
|
|
548
|
+
NotImplementedError
|
|
549
|
+
"""
|
|
550
|
+
raise NotImplementedError # override in derived class
|
|
551
|
+
|
|
552
|
+
def identity_morphism(self):
|
|
553
|
+
"""
|
|
554
|
+
Return the identity morphism.
|
|
555
|
+
|
|
556
|
+
OUTPUT: the identity morphism of the scheme ``self``
|
|
557
|
+
|
|
558
|
+
EXAMPLES::
|
|
559
|
+
|
|
560
|
+
sage: X = Spec(QQ)
|
|
561
|
+
sage: X.identity_morphism()
|
|
562
|
+
Scheme endomorphism of Spectrum of Rational Field
|
|
563
|
+
Defn: Identity map
|
|
564
|
+
"""
|
|
565
|
+
from sage.schemes.generic.morphism import SchemeMorphism_id
|
|
566
|
+
return SchemeMorphism_id(self)
|
|
567
|
+
|
|
568
|
+
def hom(self, x, Y=None, check=True):
|
|
569
|
+
"""
|
|
570
|
+
Return the scheme morphism from ``self`` to ``Y`` defined by ``x``.
|
|
571
|
+
|
|
572
|
+
INPUT:
|
|
573
|
+
|
|
574
|
+
- ``x`` -- anything that determines a scheme morphism; if
|
|
575
|
+
``x`` is a scheme, try to determine a natural map to ``x``
|
|
576
|
+
|
|
577
|
+
- ``Y`` -- the codomain scheme (optional); if ``Y`` is not
|
|
578
|
+
given, try to determine ``Y`` from context
|
|
579
|
+
|
|
580
|
+
- ``check`` -- boolean (default: ``True``); whether
|
|
581
|
+
to check the defining data for consistency
|
|
582
|
+
|
|
583
|
+
OUTPUT: the scheme morphism from ``self`` to ``Y`` defined by ``x``
|
|
584
|
+
|
|
585
|
+
EXAMPLES::
|
|
586
|
+
|
|
587
|
+
sage: P = ProjectiveSpace(ZZ, 3)
|
|
588
|
+
sage: P.hom(Spec(ZZ))
|
|
589
|
+
Scheme morphism:
|
|
590
|
+
From: Projective Space of dimension 3 over Integer Ring
|
|
591
|
+
To: Spectrum of Integer Ring
|
|
592
|
+
Defn: Structure map
|
|
593
|
+
"""
|
|
594
|
+
if Y is None:
|
|
595
|
+
if isinstance(x, Scheme):
|
|
596
|
+
return self.Hom(x).natural_map()
|
|
597
|
+
else:
|
|
598
|
+
raise TypeError("unable to determine codomain")
|
|
599
|
+
return self.Hom(Y)(x, check=check)
|
|
600
|
+
|
|
601
|
+
def _Hom_(self, Y, category=None, check=True):
|
|
602
|
+
"""
|
|
603
|
+
Return the set of scheme morphisms from ``self`` to ``Y``.
|
|
604
|
+
|
|
605
|
+
INPUT:
|
|
606
|
+
|
|
607
|
+
- ``Y`` -- a scheme; the codomain of the Hom-set
|
|
608
|
+
|
|
609
|
+
- ``category`` -- a category (optional); the category of the
|
|
610
|
+
Hom-set
|
|
611
|
+
|
|
612
|
+
- ``check`` -- boolean (default: ``True``); whether
|
|
613
|
+
to check the defining data for consistency
|
|
614
|
+
|
|
615
|
+
OUTPUT: the set of morphisms from ``self`` to ``Y``
|
|
616
|
+
|
|
617
|
+
EXAMPLES::
|
|
618
|
+
|
|
619
|
+
sage: P = ProjectiveSpace(ZZ, 3)
|
|
620
|
+
sage: S = Spec(ZZ)
|
|
621
|
+
sage: S._Hom_(P)
|
|
622
|
+
Set of morphisms
|
|
623
|
+
From: Spectrum of Integer Ring
|
|
624
|
+
To: Projective Space of dimension 3 over Integer Ring
|
|
625
|
+
|
|
626
|
+
TESTS::
|
|
627
|
+
|
|
628
|
+
sage: S._Hom_(P).__class__
|
|
629
|
+
<class 'sage.schemes.generic.homset.SchemeHomset_generic_with_category'>
|
|
630
|
+
|
|
631
|
+
sage: Hom(Spec(ZZ), Spec(ZZ)).__class__
|
|
632
|
+
<class 'sage.schemes.generic.homset.SchemeHomset_generic_with_category_with_equality_by_id'>
|
|
633
|
+
"""
|
|
634
|
+
from sage.schemes.generic.homset import SchemeHomset
|
|
635
|
+
return SchemeHomset(self, Y, category=category, check=check)
|
|
636
|
+
|
|
637
|
+
point_set = point_homset
|
|
638
|
+
|
|
639
|
+
def count_points(self, n):
|
|
640
|
+
r"""
|
|
641
|
+
Count points over finite fields.
|
|
642
|
+
|
|
643
|
+
INPUT:
|
|
644
|
+
|
|
645
|
+
- ``n`` -- integer
|
|
646
|
+
|
|
647
|
+
OUTPUT:
|
|
648
|
+
|
|
649
|
+
An integer. The number of points over `\GF{q}, \ldots,
|
|
650
|
+
\GF{q^n}` on a scheme over a finite field `\GF{q}`.
|
|
651
|
+
|
|
652
|
+
EXAMPLES::
|
|
653
|
+
|
|
654
|
+
sage: # needs sage.schemes
|
|
655
|
+
sage: P.<x> = PolynomialRing(GF(3))
|
|
656
|
+
sage: C = HyperellipticCurve(x^3 + x^2 + 1)
|
|
657
|
+
sage: C.count_points(4)
|
|
658
|
+
[6, 12, 18, 96]
|
|
659
|
+
sage: C.base_extend(GF(9,'a')).count_points(2) # needs sage.rings.finite_rings
|
|
660
|
+
[12, 96]
|
|
661
|
+
|
|
662
|
+
::
|
|
663
|
+
|
|
664
|
+
sage: P.<x,y,z> = ProjectiveSpace(GF(4, 't'), 2) # needs sage.rings.finite_rings
|
|
665
|
+
sage: X = P.subscheme([y^2*z - x^3 - z^3]) # needs sage.rings.finite_rings
|
|
666
|
+
sage: X.count_points(2) # needs sage.libs.singular sage.rings.finite_rings
|
|
667
|
+
[5, 17]
|
|
668
|
+
"""
|
|
669
|
+
F = self.base_ring()
|
|
670
|
+
if not F.is_finite():
|
|
671
|
+
raise TypeError("Point counting only defined for schemes over finite fields")
|
|
672
|
+
a = [len(self.rational_points())]
|
|
673
|
+
for i in range(2, n+1):
|
|
674
|
+
F1, psi = F.extension(i, map=True)
|
|
675
|
+
S1 = self.change_ring(psi)
|
|
676
|
+
a.append(len(S1.rational_points()))
|
|
677
|
+
return a
|
|
678
|
+
|
|
679
|
+
def zeta_function(self):
|
|
680
|
+
r"""
|
|
681
|
+
Compute the zeta function of a generic scheme.
|
|
682
|
+
|
|
683
|
+
Derived classes should override this method.
|
|
684
|
+
|
|
685
|
+
OUTPUT: rational function in one variable
|
|
686
|
+
|
|
687
|
+
EXAMPLES::
|
|
688
|
+
|
|
689
|
+
sage: P.<x,y,z> = ProjectiveSpace(GF(4, 't'), 2) # needs sage.rings.finite_rings
|
|
690
|
+
sage: X = P.subscheme([y^2*z - x^3 - z^3]) # needs sage.rings.finite_rings
|
|
691
|
+
sage: X.zeta_function() # needs sage.rings.finite_rings
|
|
692
|
+
Traceback (most recent call last):
|
|
693
|
+
...
|
|
694
|
+
NotImplementedError
|
|
695
|
+
"""
|
|
696
|
+
raise NotImplementedError
|
|
697
|
+
|
|
698
|
+
def zeta_series(self, n, t):
|
|
699
|
+
"""
|
|
700
|
+
Return the zeta series.
|
|
701
|
+
|
|
702
|
+
Compute a power series approximation to the zeta function of a
|
|
703
|
+
scheme over a finite field.
|
|
704
|
+
|
|
705
|
+
INPUT:
|
|
706
|
+
|
|
707
|
+
- ``n`` -- the number of terms of the power series to compute
|
|
708
|
+
|
|
709
|
+
- ``t`` -- the variable which the series should be returned
|
|
710
|
+
|
|
711
|
+
OUTPUT: a power series approximating the zeta function of ``self``
|
|
712
|
+
|
|
713
|
+
EXAMPLES::
|
|
714
|
+
|
|
715
|
+
sage: P.<x> = PolynomialRing(GF(3))
|
|
716
|
+
sage: C = HyperellipticCurve(x^3 + x^2 + 1) # needs sage.schemes
|
|
717
|
+
sage: R.<t> = PowerSeriesRing(Integers())
|
|
718
|
+
sage: C.zeta_series(4, t) # needs sage.schemes
|
|
719
|
+
1 + 6*t + 24*t^2 + 78*t^3 + 240*t^4 + O(t^5)
|
|
720
|
+
sage: (1+2*t+3*t^2)/(1-t)/(1-3*t) + O(t^5)
|
|
721
|
+
1 + 6*t + 24*t^2 + 78*t^3 + 240*t^4 + O(t^5)
|
|
722
|
+
|
|
723
|
+
If the scheme has a method ``zeta_function``, this is used to
|
|
724
|
+
provide the required approximation.
|
|
725
|
+
Otherwise this function depends on ``count_points``, which is only
|
|
726
|
+
defined for prime order fields for general schemes.
|
|
727
|
+
Nonetheless, since :issue:`15108` and :issue:`15148`, it supports
|
|
728
|
+
hyperelliptic curves over non-prime fields::
|
|
729
|
+
|
|
730
|
+
sage: C.base_extend(GF(9, 'a')).zeta_series(4, t) # needs sage.rings.finite_rings sage.schemes
|
|
731
|
+
1 + 12*t + 120*t^2 + 1092*t^3 + 9840*t^4 + O(t^5)
|
|
732
|
+
|
|
733
|
+
::
|
|
734
|
+
|
|
735
|
+
sage: P.<x,y,z> = ProjectiveSpace(GF(4, 't'), 2) # needs sage.rings.finite_rings
|
|
736
|
+
sage: X = P.subscheme([y^2*z - x^3 - z^3]) # needs sage.rings.finite_rings
|
|
737
|
+
|
|
738
|
+
sage: R.<t> = PowerSeriesRing(Integers())
|
|
739
|
+
sage: X.zeta_series(2, t) # needs sage.libs.singular sage.rings.finite_rings
|
|
740
|
+
1 + 5*t + 21*t^2 + O(t^3)
|
|
741
|
+
|
|
742
|
+
TESTS::
|
|
743
|
+
|
|
744
|
+
sage: P.<x> = PolynomialRing(ZZ)
|
|
745
|
+
sage: C = HyperellipticCurve(x^3 + x + 1) # needs sage.schemes
|
|
746
|
+
sage: R.<t> = PowerSeriesRing(Integers())
|
|
747
|
+
sage: C.zeta_series(4, t) # needs sage.schemes
|
|
748
|
+
Traceback (most recent call last):
|
|
749
|
+
...
|
|
750
|
+
TypeError: zeta functions only defined for schemes
|
|
751
|
+
over finite fields
|
|
752
|
+
"""
|
|
753
|
+
F = self.base_ring()
|
|
754
|
+
if not F.is_finite():
|
|
755
|
+
raise TypeError('zeta functions only defined for schemes over finite fields')
|
|
756
|
+
R = t.parent()
|
|
757
|
+
u = t.O(n + 1)
|
|
758
|
+
try:
|
|
759
|
+
return self.zeta_function()(u)
|
|
760
|
+
except (AttributeError, NotImplementedError):
|
|
761
|
+
pass
|
|
762
|
+
try:
|
|
763
|
+
a = self.count_points(n)
|
|
764
|
+
except AttributeError:
|
|
765
|
+
raise NotImplementedError('count_points() required but not implemented')
|
|
766
|
+
temp = R.sum(a[i - 1] * u**i / i for i in range(1, n + 1))
|
|
767
|
+
return temp.exp()
|
|
768
|
+
|
|
769
|
+
|
|
770
|
+
def is_AffineScheme(x):
|
|
771
|
+
"""
|
|
772
|
+
Return ``True`` if `x` is an affine scheme.
|
|
773
|
+
|
|
774
|
+
EXAMPLES::
|
|
775
|
+
|
|
776
|
+
sage: from sage.schemes.generic.scheme import is_AffineScheme
|
|
777
|
+
sage: is_AffineScheme(5)
|
|
778
|
+
doctest:warning...
|
|
779
|
+
DeprecationWarning: The function is_AffineScheme is deprecated; use 'isinstance(..., AffineScheme)' instead.
|
|
780
|
+
See https://github.com/sagemath/sage/issues/38022 for details.
|
|
781
|
+
False
|
|
782
|
+
sage: E = Spec(QQ)
|
|
783
|
+
sage: is_AffineScheme(E)
|
|
784
|
+
True
|
|
785
|
+
"""
|
|
786
|
+
from sage.misc.superseded import deprecation
|
|
787
|
+
deprecation(38022, "The function is_AffineScheme is deprecated; use 'isinstance(..., AffineScheme)' instead.")
|
|
788
|
+
return isinstance(x, AffineScheme)
|
|
789
|
+
|
|
790
|
+
|
|
791
|
+
class AffineScheme(UniqueRepresentation, Scheme):
|
|
792
|
+
"""
|
|
793
|
+
Class for general affine schemes.
|
|
794
|
+
|
|
795
|
+
TESTS::
|
|
796
|
+
|
|
797
|
+
sage: from sage.schemes.generic.scheme import AffineScheme
|
|
798
|
+
sage: A = QQ['t']
|
|
799
|
+
sage: X_abs = AffineScheme(A); X_abs
|
|
800
|
+
Spectrum of Univariate Polynomial Ring in t over Rational Field
|
|
801
|
+
sage: X_rel = AffineScheme(A, QQ); X_rel
|
|
802
|
+
Spectrum of Univariate Polynomial Ring in t over Rational Field
|
|
803
|
+
|
|
804
|
+
sage: X_abs == X_rel
|
|
805
|
+
False
|
|
806
|
+
sage: X_abs.base_ring()
|
|
807
|
+
Integer Ring
|
|
808
|
+
sage: X_rel.base_ring()
|
|
809
|
+
Rational Field
|
|
810
|
+
|
|
811
|
+
.. SEEALSO::
|
|
812
|
+
|
|
813
|
+
For affine spaces over a base ring and subschemes thereof, see
|
|
814
|
+
:class:`sage.schemes.generic.algebraic_scheme.AffineSpace`.
|
|
815
|
+
"""
|
|
816
|
+
def __init__(self, R, S=None, category=None):
|
|
817
|
+
"""
|
|
818
|
+
Construct the affine scheme with coordinate ring `R`.
|
|
819
|
+
|
|
820
|
+
INPUT:
|
|
821
|
+
|
|
822
|
+
- ``R`` -- commutative ring
|
|
823
|
+
|
|
824
|
+
- ``S`` -- (optional) commutative ring admitting a natural map
|
|
825
|
+
to ``R``
|
|
826
|
+
|
|
827
|
+
OUTPUT:
|
|
828
|
+
|
|
829
|
+
The spectrum of `R`, i.e. the unique affine scheme with
|
|
830
|
+
coordinate ring `R` as a scheme over the base ring `S`.
|
|
831
|
+
|
|
832
|
+
EXAMPLES::
|
|
833
|
+
|
|
834
|
+
sage: from sage.schemes.generic.scheme import AffineScheme
|
|
835
|
+
sage: A.<x, y> = PolynomialRing(QQ)
|
|
836
|
+
sage: X = AffineScheme(A, QQ)
|
|
837
|
+
sage: X
|
|
838
|
+
Spectrum of Multivariate Polynomial Ring in x, y over Rational Field
|
|
839
|
+
sage: X.category()
|
|
840
|
+
Category of schemes over Rational Field
|
|
841
|
+
|
|
842
|
+
The standard way to construct an affine scheme is to use the
|
|
843
|
+
:func:`~sage.schemes.generic.spec.Spec` functor::
|
|
844
|
+
|
|
845
|
+
sage: S = Spec(ZZ)
|
|
846
|
+
sage: S
|
|
847
|
+
Spectrum of Integer Ring
|
|
848
|
+
sage: S.category()
|
|
849
|
+
Category of schemes
|
|
850
|
+
sage: type(S)
|
|
851
|
+
<class 'sage.schemes.generic.scheme.AffineScheme_with_category'>
|
|
852
|
+
"""
|
|
853
|
+
if R not in CommutativeRings():
|
|
854
|
+
raise TypeError("R (={}) must be a commutative ring".format(R))
|
|
855
|
+
self.__R = R
|
|
856
|
+
if S is not None:
|
|
857
|
+
if S not in CommutativeRings():
|
|
858
|
+
raise TypeError("S (={}) must be a commutative ring".format(S))
|
|
859
|
+
if not R.has_coerce_map_from(S):
|
|
860
|
+
raise ValueError("There must be a natural map S --> R, but S = {} and R = {}".format(S, R))
|
|
861
|
+
Scheme.__init__(self, S, category=category)
|
|
862
|
+
|
|
863
|
+
def __setstate__(self, state):
|
|
864
|
+
"""
|
|
865
|
+
Needed to unpickle old Spec objects.
|
|
866
|
+
|
|
867
|
+
The name-mangled attribute ``__R`` used to be in a class
|
|
868
|
+
called ``Spec``; we have to translate this mangled name.
|
|
869
|
+
|
|
870
|
+
TESTS::
|
|
871
|
+
|
|
872
|
+
sage: S = Spec(QQ)
|
|
873
|
+
sage: loads(dumps(S))
|
|
874
|
+
Spectrum of Rational Field
|
|
875
|
+
"""
|
|
876
|
+
if '_Spec__R' in state:
|
|
877
|
+
state['_AffineScheme__R'] = state.pop('_Spec__R')
|
|
878
|
+
super().__setstate__(state)
|
|
879
|
+
|
|
880
|
+
def _repr_(self):
|
|
881
|
+
"""
|
|
882
|
+
Return a string representation of ``self``.
|
|
883
|
+
|
|
884
|
+
OUTPUT: string
|
|
885
|
+
|
|
886
|
+
EXAMPLES::
|
|
887
|
+
|
|
888
|
+
sage: Spec(PolynomialRing(QQ, 3, 'x'))
|
|
889
|
+
Spectrum of Multivariate Polynomial Ring in x0, x1, x2 over Rational Field
|
|
890
|
+
|
|
891
|
+
TESTS::
|
|
892
|
+
|
|
893
|
+
sage: Spec(PolynomialRing(QQ, 3, 'x'))._repr_()
|
|
894
|
+
'Spectrum of Multivariate Polynomial Ring in x0, x1, x2 over Rational Field'
|
|
895
|
+
"""
|
|
896
|
+
return "Spectrum of {}".format(self.__R)
|
|
897
|
+
|
|
898
|
+
def _latex_(self):
|
|
899
|
+
r"""
|
|
900
|
+
Return a LaTeX representation of ``self``.
|
|
901
|
+
|
|
902
|
+
OUTPUT: string
|
|
903
|
+
|
|
904
|
+
EXAMPLES::
|
|
905
|
+
|
|
906
|
+
sage: S = Spec(PolynomialRing(ZZ, 2, 'x'))
|
|
907
|
+
sage: S
|
|
908
|
+
Spectrum of Multivariate Polynomial Ring in x0, x1 over Integer Ring
|
|
909
|
+
sage: S._latex_()
|
|
910
|
+
'\\mathrm{Spec}(\\Bold{Z}[x_{0}, x_{1}])'
|
|
911
|
+
"""
|
|
912
|
+
return "\\mathrm{{Spec}}({})".format(self.__R._latex_())
|
|
913
|
+
|
|
914
|
+
def __call__(self, *args):
|
|
915
|
+
"""
|
|
916
|
+
Construct a scheme-valued or topological point of ``self``.
|
|
917
|
+
|
|
918
|
+
INPUT/OUTPUT: the argument ``x`` must be one of the following:
|
|
919
|
+
|
|
920
|
+
- a prime ideal of the coordinate ring; the output will
|
|
921
|
+
be the corresponding point of `X`
|
|
922
|
+
|
|
923
|
+
- a ring or a scheme `S`; the output will be the set `X(S)` of
|
|
924
|
+
`S`-valued points on `X`
|
|
925
|
+
|
|
926
|
+
EXAMPLES::
|
|
927
|
+
|
|
928
|
+
sage: S = Spec(ZZ)
|
|
929
|
+
sage: P = S(ZZ.ideal(3)); P
|
|
930
|
+
Point on Spectrum of Integer Ring defined by the Principal ideal (3) of Integer Ring
|
|
931
|
+
sage: type(P)
|
|
932
|
+
<class 'sage.schemes.generic.scheme.AffineScheme_with_category.element_class'>
|
|
933
|
+
sage: S(ZZ.ideal(next_prime(1000000))) # needs sage.libs.pari
|
|
934
|
+
Point on Spectrum of Integer Ring
|
|
935
|
+
defined by the Principal ideal (1000003) of Integer Ring
|
|
936
|
+
|
|
937
|
+
sage: R.<x, y, z> = QQ[]
|
|
938
|
+
sage: S = Spec(R)
|
|
939
|
+
sage: P = S(R.ideal(x, y, z)); P
|
|
940
|
+
Point on Spectrum of Multivariate Polynomial Ring
|
|
941
|
+
in x, y, z over Rational Field defined by the Ideal (x, y, z)
|
|
942
|
+
of Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
943
|
+
|
|
944
|
+
This indicates the fix of :issue:`12734`::
|
|
945
|
+
|
|
946
|
+
sage: S = Spec(ZZ)
|
|
947
|
+
sage: S(ZZ)
|
|
948
|
+
Set of rational points of Spectrum of Integer Ring
|
|
949
|
+
|
|
950
|
+
Note the difference between the previous example and the
|
|
951
|
+
following one::
|
|
952
|
+
|
|
953
|
+
sage: S(S)
|
|
954
|
+
Set of morphisms
|
|
955
|
+
From: Spectrum of Integer Ring
|
|
956
|
+
To: Spectrum of Integer Ring
|
|
957
|
+
|
|
958
|
+
For affine or projective varieties, passing the correct number
|
|
959
|
+
of elements of the base ring constructs the rational point
|
|
960
|
+
with these elements as coordinates::
|
|
961
|
+
|
|
962
|
+
sage: S = AffineSpace(ZZ, 1)
|
|
963
|
+
sage: S(0)
|
|
964
|
+
(0)
|
|
965
|
+
|
|
966
|
+
To prevent confusion with this usage, topological points must
|
|
967
|
+
be constructed by explicitly specifying a prime ideal, not
|
|
968
|
+
just generators::
|
|
969
|
+
|
|
970
|
+
sage: R = S.coordinate_ring()
|
|
971
|
+
sage: S(R.ideal(0))
|
|
972
|
+
Point on Affine Space of dimension 1 over Integer Ring
|
|
973
|
+
defined by the Ideal (0) of Multivariate Polynomial Ring in x over Integer Ring
|
|
974
|
+
|
|
975
|
+
This explains why the following example raises an error rather
|
|
976
|
+
than constructing the topological point defined by the prime
|
|
977
|
+
ideal `(0)` as one might expect::
|
|
978
|
+
|
|
979
|
+
sage: S = Spec(ZZ)
|
|
980
|
+
sage: S(0)
|
|
981
|
+
Traceback (most recent call last):
|
|
982
|
+
...
|
|
983
|
+
TypeError: cannot call Spectrum of Integer Ring with arguments (0,)
|
|
984
|
+
"""
|
|
985
|
+
if len(args) == 1:
|
|
986
|
+
x = args[0]
|
|
987
|
+
if ((isinstance(x, self.element_class) and (x.parent() is self or x.parent() == self))
|
|
988
|
+
or (isinstance(x, Ideal_generic) and x.ring() is self.coordinate_ring())):
|
|
989
|
+
# Construct a topological point from x.
|
|
990
|
+
return self._element_constructor_(x)
|
|
991
|
+
try:
|
|
992
|
+
# Construct a scheme homset or a scheme-valued point from
|
|
993
|
+
# args using the generic Scheme.__call__() method.
|
|
994
|
+
return super().__call__(*args)
|
|
995
|
+
except NotImplementedError:
|
|
996
|
+
# This arises from self._morphism() not being implemented.
|
|
997
|
+
# We must convert it into a TypeError to keep the coercion
|
|
998
|
+
# system working.
|
|
999
|
+
raise TypeError('cannot call %s with arguments %s' % (self, args))
|
|
1000
|
+
|
|
1001
|
+
Element = SchemeTopologicalPoint_prime_ideal
|
|
1002
|
+
|
|
1003
|
+
def _element_constructor_(self, x):
|
|
1004
|
+
"""
|
|
1005
|
+
Construct a topological point from `x`.
|
|
1006
|
+
|
|
1007
|
+
TESTS::
|
|
1008
|
+
|
|
1009
|
+
sage: S = Spec(ZZ)
|
|
1010
|
+
sage: S(ZZ.ideal(0))
|
|
1011
|
+
Point on Spectrum of Integer Ring defined by the Principal ideal (0) of Integer Ring
|
|
1012
|
+
"""
|
|
1013
|
+
if isinstance(x, self.element_class):
|
|
1014
|
+
if x.parent() is self:
|
|
1015
|
+
return x
|
|
1016
|
+
elif x.parent() == self:
|
|
1017
|
+
return self.element_class(self, x.prime_ideal())
|
|
1018
|
+
elif isinstance(x, Ideal_generic) and x.ring() is self.coordinate_ring():
|
|
1019
|
+
return self.element_class(self, x)
|
|
1020
|
+
raise TypeError('cannot convert %s to a topological point of %s' % (x, self))
|
|
1021
|
+
|
|
1022
|
+
def _an_element_(self):
|
|
1023
|
+
r"""
|
|
1024
|
+
Return an element of the spectrum of the ring.
|
|
1025
|
+
|
|
1026
|
+
OUTPUT: a point of the affine scheme ``self``
|
|
1027
|
+
|
|
1028
|
+
EXAMPLES::
|
|
1029
|
+
|
|
1030
|
+
sage: Spec(QQ).an_element()
|
|
1031
|
+
Point on Spectrum of Rational Field defined by the Principal ideal (0) of Rational Field
|
|
1032
|
+
sage: Spec(ZZ).an_element() # random output
|
|
1033
|
+
Point on Spectrum of Integer Ring defined by the Principal ideal (811) of Integer Ring
|
|
1034
|
+
"""
|
|
1035
|
+
if self.coordinate_ring() is ZZ:
|
|
1036
|
+
from sage.arith.misc import random_prime
|
|
1037
|
+
return self(ZZ.ideal(random_prime(1000)))
|
|
1038
|
+
return self(self.coordinate_ring().zero_ideal())
|
|
1039
|
+
|
|
1040
|
+
def coordinate_ring(self):
|
|
1041
|
+
"""
|
|
1042
|
+
Return the underlying ring of this scheme.
|
|
1043
|
+
|
|
1044
|
+
OUTPUT: a commutative ring
|
|
1045
|
+
|
|
1046
|
+
EXAMPLES::
|
|
1047
|
+
|
|
1048
|
+
sage: Spec(QQ).coordinate_ring()
|
|
1049
|
+
Rational Field
|
|
1050
|
+
sage: Spec(PolynomialRing(QQ, 3, 'x')).coordinate_ring()
|
|
1051
|
+
Multivariate Polynomial Ring in x0, x1, x2 over Rational Field
|
|
1052
|
+
"""
|
|
1053
|
+
return self.__R
|
|
1054
|
+
|
|
1055
|
+
def is_noetherian(self):
|
|
1056
|
+
"""
|
|
1057
|
+
Return ``True`` if ``self`` is Noetherian, ``False`` otherwise.
|
|
1058
|
+
|
|
1059
|
+
EXAMPLES::
|
|
1060
|
+
|
|
1061
|
+
sage: Spec(ZZ).is_noetherian()
|
|
1062
|
+
True
|
|
1063
|
+
"""
|
|
1064
|
+
return self.__R.is_noetherian()
|
|
1065
|
+
|
|
1066
|
+
def dimension_absolute(self):
|
|
1067
|
+
"""
|
|
1068
|
+
Return the absolute dimension of this scheme.
|
|
1069
|
+
|
|
1070
|
+
OUTPUT: integer
|
|
1071
|
+
|
|
1072
|
+
EXAMPLES::
|
|
1073
|
+
|
|
1074
|
+
sage: S = Spec(ZZ)
|
|
1075
|
+
sage: S.dimension_absolute()
|
|
1076
|
+
1
|
|
1077
|
+
sage: S.dimension()
|
|
1078
|
+
1
|
|
1079
|
+
"""
|
|
1080
|
+
return self.__R.krull_dimension()
|
|
1081
|
+
|
|
1082
|
+
dimension = dimension_absolute
|
|
1083
|
+
|
|
1084
|
+
def dimension_relative(self):
|
|
1085
|
+
"""
|
|
1086
|
+
Return the relative dimension of this scheme over its base.
|
|
1087
|
+
|
|
1088
|
+
OUTPUT: integer
|
|
1089
|
+
|
|
1090
|
+
EXAMPLES::
|
|
1091
|
+
|
|
1092
|
+
sage: S = Spec(ZZ)
|
|
1093
|
+
sage: S.dimension_relative()
|
|
1094
|
+
0
|
|
1095
|
+
"""
|
|
1096
|
+
return self.__R.krull_dimension() - self.base_ring().krull_dimension()
|
|
1097
|
+
|
|
1098
|
+
def base_extend(self, R):
|
|
1099
|
+
"""
|
|
1100
|
+
Extend the base ring/scheme.
|
|
1101
|
+
|
|
1102
|
+
INPUT:
|
|
1103
|
+
|
|
1104
|
+
- ``R`` -- an affine scheme or a commutative ring
|
|
1105
|
+
|
|
1106
|
+
EXAMPLES::
|
|
1107
|
+
|
|
1108
|
+
sage: Spec_ZZ = Spec(ZZ); Spec_ZZ
|
|
1109
|
+
Spectrum of Integer Ring
|
|
1110
|
+
sage: Spec_ZZ.base_extend(QQ)
|
|
1111
|
+
Spectrum of Rational Field
|
|
1112
|
+
|
|
1113
|
+
sage: Spec(ZZ['x']).base_extend(Spec(QQ))
|
|
1114
|
+
Spectrum of Univariate Polynomial Ring in x over Rational Field
|
|
1115
|
+
"""
|
|
1116
|
+
if R in CommutativeRings():
|
|
1117
|
+
return AffineScheme(self.coordinate_ring().base_extend(R), self.base_ring())
|
|
1118
|
+
if not self.base_scheme() == R.base_scheme():
|
|
1119
|
+
raise ValueError('the new base scheme must be a scheme over the old base scheme')
|
|
1120
|
+
return AffineScheme(self.coordinate_ring().base_extend(R.coordinate_ring()),
|
|
1121
|
+
self.base_ring())
|
|
1122
|
+
|
|
1123
|
+
def _point_homset(self, *args, **kwds):
|
|
1124
|
+
"""
|
|
1125
|
+
Construct a point Hom-set.
|
|
1126
|
+
|
|
1127
|
+
For internal use only. See :mod:`morphism` for more details.
|
|
1128
|
+
|
|
1129
|
+
EXAMPLES::
|
|
1130
|
+
|
|
1131
|
+
sage: Spec(QQ)._point_homset(Spec(QQ), Spec(ZZ))
|
|
1132
|
+
Set of rational points of Spectrum of Integer Ring
|
|
1133
|
+
"""
|
|
1134
|
+
from sage.schemes.affine.affine_homset import SchemeHomset_points_spec
|
|
1135
|
+
return SchemeHomset_points_spec(*args, **kwds)
|
|
1136
|
+
|
|
1137
|
+
def hom(self, x, Y=None):
|
|
1138
|
+
r"""
|
|
1139
|
+
Return the scheme morphism from ``self`` to ``Y`` defined by ``x``.
|
|
1140
|
+
|
|
1141
|
+
INPUT:
|
|
1142
|
+
|
|
1143
|
+
- ``x`` -- anything that determines a scheme morphism; if
|
|
1144
|
+
``x`` is a scheme, try to determine a natural map to ``x``
|
|
1145
|
+
|
|
1146
|
+
- ``Y`` -- the codomain scheme (optional); if ``Y`` is not
|
|
1147
|
+
given, try to determine ``Y`` from context
|
|
1148
|
+
|
|
1149
|
+
- ``check`` -- boolean (default: ``True``); whether
|
|
1150
|
+
to check the defining data for consistency
|
|
1151
|
+
|
|
1152
|
+
OUTPUT: the scheme morphism from ``self`` to ``Y`` defined by ``x``
|
|
1153
|
+
|
|
1154
|
+
EXAMPLES:
|
|
1155
|
+
|
|
1156
|
+
We construct the inclusion from `\mathrm{Spec}(\QQ)` into
|
|
1157
|
+
`\mathrm{Spec}(\ZZ)` induced by the inclusion from `\ZZ` into
|
|
1158
|
+
`\QQ`::
|
|
1159
|
+
|
|
1160
|
+
sage: X = Spec(QQ)
|
|
1161
|
+
sage: X.hom(ZZ.hom(QQ))
|
|
1162
|
+
Affine Scheme morphism:
|
|
1163
|
+
From: Spectrum of Rational Field
|
|
1164
|
+
To: Spectrum of Integer Ring
|
|
1165
|
+
Defn: Natural morphism:
|
|
1166
|
+
From: Integer Ring
|
|
1167
|
+
To: Rational Field
|
|
1168
|
+
|
|
1169
|
+
TESTS:
|
|
1170
|
+
|
|
1171
|
+
We can construct a morphism to an affine curve (:issue:`7956`)::
|
|
1172
|
+
|
|
1173
|
+
sage: S.<p,q> = QQ[]
|
|
1174
|
+
sage: A1.<r> = AffineSpace(QQ, 1)
|
|
1175
|
+
sage: A1_emb = Curve(p - 2) # needs sage.schemes
|
|
1176
|
+
sage: A1.hom([2, r], A1_emb) # needs sage.schemes
|
|
1177
|
+
Scheme morphism:
|
|
1178
|
+
From: Affine Space of dimension 1 over Rational Field
|
|
1179
|
+
To: Affine Plane Curve over Rational Field defined by p - 2
|
|
1180
|
+
Defn: Defined on coordinates by sending (r) to (2, r)
|
|
1181
|
+
"""
|
|
1182
|
+
from sage.categories.map import Map
|
|
1183
|
+
from sage.categories.rings import Rings
|
|
1184
|
+
|
|
1185
|
+
if isinstance(x, Scheme):
|
|
1186
|
+
return self.Hom(x).natural_map()
|
|
1187
|
+
if Y is None and isinstance(x, Map) and x.category_for().is_subcategory(Rings()):
|
|
1188
|
+
# x is a morphism of Rings
|
|
1189
|
+
Y = AffineScheme(x.domain())
|
|
1190
|
+
return Scheme.hom(self, x, Y)
|