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,1468 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Function Fields
|
|
4
|
+
|
|
5
|
+
A function field (of one variable) is a finitely generated field extension of
|
|
6
|
+
transcendence degree one. In Sage, a function field can be a rational function
|
|
7
|
+
field or a finite extension of a function field.
|
|
8
|
+
|
|
9
|
+
EXAMPLES:
|
|
10
|
+
|
|
11
|
+
We create a rational function field::
|
|
12
|
+
|
|
13
|
+
sage: # needs sage.rings.finite_rings
|
|
14
|
+
sage: K.<x> = FunctionField(GF(5^2,'a')); K
|
|
15
|
+
Rational function field in x over Finite Field in a of size 5^2
|
|
16
|
+
sage: K.genus()
|
|
17
|
+
0
|
|
18
|
+
sage: f = (x^2 + x + 1) / (x^3 + 1)
|
|
19
|
+
sage: f
|
|
20
|
+
(x^2 + x + 1)/(x^3 + 1)
|
|
21
|
+
sage: f^3
|
|
22
|
+
(x^6 + 3*x^5 + x^4 + 2*x^3 + x^2 + 3*x + 1)/(x^9 + 3*x^6 + 3*x^3 + 1)
|
|
23
|
+
|
|
24
|
+
Then we create an extension of the rational function field, and do some
|
|
25
|
+
simple arithmetic in it::
|
|
26
|
+
|
|
27
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
28
|
+
sage: R.<y> = K[]
|
|
29
|
+
sage: L.<y> = K.extension(y^3 - (x^3 + 2*x*y + 1/x)); L
|
|
30
|
+
Function field in y defined by y^3 + 3*x*y + (4*x^4 + 4)/x
|
|
31
|
+
sage: y^2
|
|
32
|
+
y^2
|
|
33
|
+
sage: y^3
|
|
34
|
+
2*x*y + (x^4 + 1)/x
|
|
35
|
+
sage: a = 1/y; a
|
|
36
|
+
(x/(x^4 + 1))*y^2 + 3*x^2/(x^4 + 1)
|
|
37
|
+
sage: a * y
|
|
38
|
+
1
|
|
39
|
+
|
|
40
|
+
We next make an extension of the above function field, illustrating
|
|
41
|
+
that arithmetic with a tower of three fields is fully supported::
|
|
42
|
+
|
|
43
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
44
|
+
sage: S.<t> = L[]
|
|
45
|
+
sage: M.<t> = L.extension(t^2 - x*y)
|
|
46
|
+
sage: M
|
|
47
|
+
Function field in t defined by t^2 + 4*x*y
|
|
48
|
+
sage: t^2
|
|
49
|
+
x*y
|
|
50
|
+
sage: 1/t
|
|
51
|
+
((1/(x^4 + 1))*y^2 + 3*x/(x^4 + 1))*t
|
|
52
|
+
sage: M.base_field()
|
|
53
|
+
Function field in y defined by y^3 + 3*x*y + (4*x^4 + 4)/x
|
|
54
|
+
sage: M.base_field().base_field()
|
|
55
|
+
Rational function field in x over Finite Field in a of size 5^2
|
|
56
|
+
|
|
57
|
+
It is also possible to construct function fields over an imperfect base field::
|
|
58
|
+
|
|
59
|
+
sage: N.<u> = FunctionField(K) # needs sage.rings.finite_rings
|
|
60
|
+
|
|
61
|
+
and inseparable extension function fields::
|
|
62
|
+
|
|
63
|
+
sage: J.<x> = FunctionField(GF(5)); J
|
|
64
|
+
Rational function field in x over Finite Field of size 5
|
|
65
|
+
sage: T.<v> = J[]
|
|
66
|
+
sage: O.<v> = J.extension(v^5 - x); O # needs sage.rings.function_field
|
|
67
|
+
Function field in v defined by v^5 + 4*x
|
|
68
|
+
|
|
69
|
+
Function fields over the rational field are supported::
|
|
70
|
+
|
|
71
|
+
sage: # needs sage.rings.function_field
|
|
72
|
+
sage: F.<x> = FunctionField(QQ)
|
|
73
|
+
sage: R.<Y> = F[]
|
|
74
|
+
sage: L.<y> = F.extension(Y^2 - x^8 - 1)
|
|
75
|
+
sage: O = L.maximal_order()
|
|
76
|
+
sage: I = O.ideal(x, y - 1)
|
|
77
|
+
sage: P = I.place()
|
|
78
|
+
sage: D = P.divisor()
|
|
79
|
+
sage: D.basis_function_space()
|
|
80
|
+
[1]
|
|
81
|
+
sage: (2*D).basis_function_space()
|
|
82
|
+
[1]
|
|
83
|
+
sage: (3*D).basis_function_space()
|
|
84
|
+
[1]
|
|
85
|
+
sage: (4*D).basis_function_space()
|
|
86
|
+
[1, 1/x^4*y + 1/x^4]
|
|
87
|
+
|
|
88
|
+
sage: # needs sage.rings.function_field
|
|
89
|
+
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
|
|
90
|
+
sage: F.<y> = K.extension(Y^3 - x^2*(x^2 + x + 1)^2)
|
|
91
|
+
sage: O = F.maximal_order()
|
|
92
|
+
sage: I = O.ideal(y)
|
|
93
|
+
sage: I.divisor()
|
|
94
|
+
2*Place (x, y, (1/(x^3 + x^2 + x))*y^2)
|
|
95
|
+
+ 2*Place (x^2 + x + 1, y, (1/(x^3 + x^2 + x))*y^2)
|
|
96
|
+
|
|
97
|
+
sage: # needs sage.rings.function_field
|
|
98
|
+
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
|
|
99
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
100
|
+
sage: O = L.maximal_order()
|
|
101
|
+
sage: I = O.ideal(y)
|
|
102
|
+
sage: I.divisor()
|
|
103
|
+
- Place (x, x*y)
|
|
104
|
+
+ Place (x^2 + 1, x*y)
|
|
105
|
+
|
|
106
|
+
Function fields over the algebraic field are supported::
|
|
107
|
+
|
|
108
|
+
sage: # needs sage.rings.function_field sage.rings.number_field
|
|
109
|
+
sage: K.<x> = FunctionField(QQbar); _.<Y> = K[]
|
|
110
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
111
|
+
sage: O = L.maximal_order()
|
|
112
|
+
sage: I = O.ideal(y)
|
|
113
|
+
sage: I.divisor()
|
|
114
|
+
Place (x - I, x*y)
|
|
115
|
+
- Place (x, x*y)
|
|
116
|
+
+ Place (x + I, x*y)
|
|
117
|
+
sage: pl = I.divisor().support()[0]
|
|
118
|
+
sage: m = L.completion(pl, prec=5)
|
|
119
|
+
sage: m(x)
|
|
120
|
+
I + s + O(s^5)
|
|
121
|
+
sage: m(y) # long time (4s)
|
|
122
|
+
-2*s + (-4 - I)*s^2 + (-15 - 4*I)*s^3 + (-75 - 23*I)*s^4 + (-413 - 154*I)*s^5 + O(s^6)
|
|
123
|
+
sage: m(y)^2 + m(y) + m(x) + 1/m(x) # long time (8s)
|
|
124
|
+
O(s^5)
|
|
125
|
+
|
|
126
|
+
TESTS::
|
|
127
|
+
|
|
128
|
+
sage: TestSuite(J).run()
|
|
129
|
+
sage: TestSuite(K).run(max_runs=256) # long time (10s) # needs sage.rings.function_field sage.rings.number_field
|
|
130
|
+
sage: TestSuite(L).run(max_runs=8) # long time (25s) # needs sage.rings.function_field sage.rings.number_field
|
|
131
|
+
|
|
132
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
133
|
+
sage: TestSuite(M).run(max_runs=8) # long time (35s)
|
|
134
|
+
sage: TestSuite(N).run(max_runs=8, skip='_test_derivation') # long time (15s)
|
|
135
|
+
sage: TestSuite(O).run()
|
|
136
|
+
sage: TestSuite(R).run()
|
|
137
|
+
sage: TestSuite(S).run() # long time (4s)
|
|
138
|
+
|
|
139
|
+
Global function fields
|
|
140
|
+
----------------------
|
|
141
|
+
|
|
142
|
+
A global function field in Sage is an extension field of a rational function field
|
|
143
|
+
over a *finite* constant field by an irreducible separable polynomial over the
|
|
144
|
+
rational function field.
|
|
145
|
+
|
|
146
|
+
EXAMPLES:
|
|
147
|
+
|
|
148
|
+
A fundamental computation for a global or any function field is to get a basis
|
|
149
|
+
of its maximal order and maximal infinite order, and then do arithmetic with
|
|
150
|
+
ideals of those maximal orders::
|
|
151
|
+
|
|
152
|
+
sage: # needs sage.rings.function_field
|
|
153
|
+
sage: K.<x> = FunctionField(GF(3)); _.<t> = K[]
|
|
154
|
+
sage: L.<y> = K.extension(t^4 + t - x^5)
|
|
155
|
+
sage: O = L.maximal_order()
|
|
156
|
+
sage: O.basis()
|
|
157
|
+
(1, y, 1/x*y^2 + 1/x*y, 1/x^3*y^3 + 2/x^3*y^2 + 1/x^3*y)
|
|
158
|
+
sage: I = O.ideal(x,y); I
|
|
159
|
+
Ideal (x, y) of Maximal order of Function field in y defined by y^4 + y + 2*x^5
|
|
160
|
+
sage: J = I^-1
|
|
161
|
+
sage: J.basis_matrix()
|
|
162
|
+
[ 1 0 0 0]
|
|
163
|
+
[1/x 1/x 0 0]
|
|
164
|
+
[ 0 0 1 0]
|
|
165
|
+
[ 0 0 0 1]
|
|
166
|
+
sage: L.maximal_order_infinite().basis()
|
|
167
|
+
(1, 1/x^2*y, 1/x^3*y^2, 1/x^4*y^3)
|
|
168
|
+
|
|
169
|
+
As an example of the most sophisticated computations that Sage can do with a
|
|
170
|
+
global function field, we compute all the Weierstrass places of the Klein
|
|
171
|
+
quartic over `\GF{2}` and gap numbers for ordinary places::
|
|
172
|
+
|
|
173
|
+
sage: # needs sage.rings.function_field
|
|
174
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
175
|
+
sage: L.<y> = K.extension(Y^3 + x^3*Y + x)
|
|
176
|
+
sage: L.genus()
|
|
177
|
+
3
|
|
178
|
+
sage: L.weierstrass_places() # needs sage.modules
|
|
179
|
+
[Place (1/x, 1/x^3*y^2 + 1/x),
|
|
180
|
+
Place (1/x, 1/x^3*y^2 + 1/x^2*y + 1),
|
|
181
|
+
Place (x, y),
|
|
182
|
+
Place (x + 1, (x^3 + 1)*y + x + 1),
|
|
183
|
+
Place (x^3 + x + 1, y + 1),
|
|
184
|
+
Place (x^3 + x + 1, y + x^2),
|
|
185
|
+
Place (x^3 + x + 1, y + x^2 + 1),
|
|
186
|
+
Place (x^3 + x^2 + 1, y + x),
|
|
187
|
+
Place (x^3 + x^2 + 1, y + x^2 + 1),
|
|
188
|
+
Place (x^3 + x^2 + 1, y + x^2 + x + 1)]
|
|
189
|
+
sage: L.gaps() # needs sage.modules
|
|
190
|
+
[1, 2, 3]
|
|
191
|
+
|
|
192
|
+
The gap numbers for Weierstrass places are of course not ordinary::
|
|
193
|
+
|
|
194
|
+
sage: # needs sage.rings.function_field
|
|
195
|
+
sage: p1,p2,p3 = L.weierstrass_places()[:3]
|
|
196
|
+
sage: p1.gaps()
|
|
197
|
+
[1, 2, 4]
|
|
198
|
+
sage: p2.gaps()
|
|
199
|
+
[1, 2, 4]
|
|
200
|
+
sage: p3.gaps()
|
|
201
|
+
[1, 2, 4]
|
|
202
|
+
|
|
203
|
+
AUTHORS:
|
|
204
|
+
|
|
205
|
+
- William Stein (2010): initial version
|
|
206
|
+
|
|
207
|
+
- Robert Bradshaw (2010-05-30): added is_finite()
|
|
208
|
+
|
|
209
|
+
- Julian Rüth (2011-06-08, 2011-09-14, 2014-06-23, 2014-06-24, 2016-11-13):
|
|
210
|
+
fixed hom(), extension(); use @cached_method; added derivation(); added
|
|
211
|
+
support for relative vector spaces; fixed conversion to base fields
|
|
212
|
+
|
|
213
|
+
- Maarten Derickx (2011-09-11): added doctests
|
|
214
|
+
|
|
215
|
+
- Syed Ahmad Lavasani (2011-12-16): added genus(), is_RationalFunctionField()
|
|
216
|
+
|
|
217
|
+
- Simon King (2014-10-29): Use the same generator names for a function field
|
|
218
|
+
extension and the underlying polynomial ring.
|
|
219
|
+
|
|
220
|
+
- Kwankyu Lee (2017-04-30): added global function fields
|
|
221
|
+
|
|
222
|
+
- Brent Baccala (2019-12-20): added function fields over number fields and QQbar
|
|
223
|
+
|
|
224
|
+
- Sebastian A. Spindler (2024-03-06): implemented Hilbert symbols for global
|
|
225
|
+
function fields
|
|
226
|
+
"""
|
|
227
|
+
|
|
228
|
+
# *****************************************************************************
|
|
229
|
+
# Copyright (C) 2010 William Stein <wstein@gmail.com>
|
|
230
|
+
# 2010 Robert Bradshaw <robertwb@math.washington.edu>
|
|
231
|
+
# 2011-2018 Julian Rüth <julian.rueth@gmail.com>
|
|
232
|
+
# 2011 Maarten Derickx <m.derickx.student@gmail.com>
|
|
233
|
+
# 2011 Syed Ahmad Lavasani
|
|
234
|
+
# 2013-2014 Simon King
|
|
235
|
+
# 2017 Dean Bisogno
|
|
236
|
+
# 2017 Alyson Deines
|
|
237
|
+
# 2017-2019 David Roe
|
|
238
|
+
# 2017-2022 Kwankyu Lee
|
|
239
|
+
# 2018 Marc Mezzarobba
|
|
240
|
+
# 2018 Wilfried Luebbe
|
|
241
|
+
# 2019 Brent Baccala
|
|
242
|
+
# 2022 Frédéric Chapoton
|
|
243
|
+
# 2022 Gonzalo Tornaría
|
|
244
|
+
#
|
|
245
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
246
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
247
|
+
# the License, or (at your option) any later version.
|
|
248
|
+
# https://www.gnu.org/licenses/
|
|
249
|
+
# *****************************************************************************
|
|
250
|
+
|
|
251
|
+
from sage.misc.cachefunc import cached_method
|
|
252
|
+
from sage.misc.lazy_import import LazyImport
|
|
253
|
+
from sage.rings.ring import Field
|
|
254
|
+
from sage.categories.homset import Hom
|
|
255
|
+
from sage.categories.function_fields import FunctionFields
|
|
256
|
+
from sage.structure.category_object import CategoryObject
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def is_FunctionField(x):
|
|
260
|
+
"""
|
|
261
|
+
Return ``True`` if ``x`` is a function field.
|
|
262
|
+
|
|
263
|
+
EXAMPLES::
|
|
264
|
+
|
|
265
|
+
sage: from sage.rings.function_field.function_field import is_FunctionField
|
|
266
|
+
sage: is_FunctionField(QQ)
|
|
267
|
+
doctest:warning...
|
|
268
|
+
DeprecationWarning: The function is_FunctionField is deprecated; use '... in FunctionFields()' instead.
|
|
269
|
+
See https://github.com/sagemath/sage/issues/38289 for details.
|
|
270
|
+
False
|
|
271
|
+
sage: is_FunctionField(FunctionField(QQ, 't'))
|
|
272
|
+
True
|
|
273
|
+
"""
|
|
274
|
+
from sage.misc.superseded import deprecation
|
|
275
|
+
deprecation(38289,
|
|
276
|
+
"The function is_FunctionField is deprecated; "
|
|
277
|
+
"use '... in FunctionFields()' instead.")
|
|
278
|
+
if isinstance(x, FunctionField):
|
|
279
|
+
return True
|
|
280
|
+
return x in FunctionFields()
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
class FunctionField(Field):
|
|
284
|
+
"""
|
|
285
|
+
Abstract base class for all function fields.
|
|
286
|
+
|
|
287
|
+
INPUT:
|
|
288
|
+
|
|
289
|
+
- ``base_field`` -- field; the base of this function field
|
|
290
|
+
|
|
291
|
+
- ``names`` -- string that gives the name of the generator
|
|
292
|
+
|
|
293
|
+
EXAMPLES::
|
|
294
|
+
|
|
295
|
+
sage: K.<x> = FunctionField(QQ)
|
|
296
|
+
sage: K
|
|
297
|
+
Rational function field in x over Rational Field
|
|
298
|
+
"""
|
|
299
|
+
_differentials_space = LazyImport('sage.rings.function_field.differential', 'DifferentialsSpace')
|
|
300
|
+
|
|
301
|
+
def __init__(self, base_field, names, category=FunctionFields()):
|
|
302
|
+
"""
|
|
303
|
+
Initialize.
|
|
304
|
+
|
|
305
|
+
TESTS::
|
|
306
|
+
|
|
307
|
+
sage: K.<x> = FunctionField(QQ)
|
|
308
|
+
sage: TestSuite(K).run() # long time (3s)
|
|
309
|
+
"""
|
|
310
|
+
Field.__init__(self, base_field, names=names, category=category)
|
|
311
|
+
|
|
312
|
+
# allow conversion into the constant base field
|
|
313
|
+
from .maps import FunctionFieldConversionToConstantBaseField
|
|
314
|
+
to_constant_base_field = FunctionFieldConversionToConstantBaseField(Hom(self, self.constant_base_field()))
|
|
315
|
+
# the conversion map must not keep the field alive if that is the only reference to it
|
|
316
|
+
to_constant_base_field._make_weak_references()
|
|
317
|
+
self.constant_base_field().register_conversion(to_constant_base_field)
|
|
318
|
+
|
|
319
|
+
def is_perfect(self):
|
|
320
|
+
r"""
|
|
321
|
+
Return whether the field is perfect, i.e., its characteristic `p` is zero
|
|
322
|
+
or every element has a `p`-th root.
|
|
323
|
+
|
|
324
|
+
EXAMPLES::
|
|
325
|
+
|
|
326
|
+
sage: FunctionField(QQ, 'x').is_perfect()
|
|
327
|
+
True
|
|
328
|
+
sage: FunctionField(GF(2), 'x').is_perfect()
|
|
329
|
+
False
|
|
330
|
+
"""
|
|
331
|
+
return self.characteristic() == 0
|
|
332
|
+
|
|
333
|
+
def some_elements(self):
|
|
334
|
+
"""
|
|
335
|
+
Return some elements in this function field.
|
|
336
|
+
|
|
337
|
+
EXAMPLES::
|
|
338
|
+
|
|
339
|
+
sage: K.<x> = FunctionField(QQ)
|
|
340
|
+
sage: K.some_elements()
|
|
341
|
+
[1,
|
|
342
|
+
x,
|
|
343
|
+
2*x,
|
|
344
|
+
x/(x^2 + 2*x + 1),
|
|
345
|
+
1/x^2,
|
|
346
|
+
x/(x^2 - 1),
|
|
347
|
+
x/(x^2 + 1),
|
|
348
|
+
1/2*x/(x^2 + 1),
|
|
349
|
+
0,
|
|
350
|
+
1/x,
|
|
351
|
+
...]
|
|
352
|
+
|
|
353
|
+
::
|
|
354
|
+
|
|
355
|
+
sage: R.<y> = K[]
|
|
356
|
+
sage: L.<y> = K.extension(y^2 - x) # needs sage.rings.function_field
|
|
357
|
+
sage: L.some_elements() # needs sage.rings.function_field
|
|
358
|
+
[1,
|
|
359
|
+
y,
|
|
360
|
+
1/x*y,
|
|
361
|
+
((x + 1)/(x^2 - 2*x + 1))*y - 2*x/(x^2 - 2*x + 1),
|
|
362
|
+
1/x,
|
|
363
|
+
(1/(x - 1))*y,
|
|
364
|
+
(1/(x + 1))*y,
|
|
365
|
+
(1/2/(x + 1))*y,
|
|
366
|
+
0,
|
|
367
|
+
...]
|
|
368
|
+
"""
|
|
369
|
+
elements = []
|
|
370
|
+
|
|
371
|
+
polynomials = [self(f) for f in self._ring.some_elements()]
|
|
372
|
+
|
|
373
|
+
for numerator in polynomials:
|
|
374
|
+
for denominator in polynomials:
|
|
375
|
+
if denominator:
|
|
376
|
+
some_element = numerator/denominator
|
|
377
|
+
if some_element not in elements:
|
|
378
|
+
elements.append(some_element)
|
|
379
|
+
|
|
380
|
+
return elements
|
|
381
|
+
|
|
382
|
+
def characteristic(self):
|
|
383
|
+
"""
|
|
384
|
+
Return the characteristic of the function field.
|
|
385
|
+
|
|
386
|
+
EXAMPLES::
|
|
387
|
+
|
|
388
|
+
sage: K.<x> = FunctionField(QQ)
|
|
389
|
+
sage: K.characteristic()
|
|
390
|
+
0
|
|
391
|
+
sage: K.<x> = FunctionField(QQbar) # needs sage.rings.number_field
|
|
392
|
+
sage: K.characteristic()
|
|
393
|
+
0
|
|
394
|
+
sage: K.<x> = FunctionField(GF(7))
|
|
395
|
+
sage: K.characteristic()
|
|
396
|
+
7
|
|
397
|
+
sage: R.<y> = K[]
|
|
398
|
+
sage: L.<y> = K.extension(y^2 - x) # needs sage.rings.function_field
|
|
399
|
+
sage: L.characteristic() # needs sage.rings.function_field
|
|
400
|
+
7
|
|
401
|
+
"""
|
|
402
|
+
return self.constant_base_field().characteristic()
|
|
403
|
+
|
|
404
|
+
def is_finite(self):
|
|
405
|
+
"""
|
|
406
|
+
Return whether the function field is finite, which is false.
|
|
407
|
+
|
|
408
|
+
EXAMPLES::
|
|
409
|
+
|
|
410
|
+
sage: R.<t> = FunctionField(QQ)
|
|
411
|
+
sage: R.is_finite()
|
|
412
|
+
False
|
|
413
|
+
sage: R.<t> = FunctionField(GF(7))
|
|
414
|
+
sage: R.is_finite()
|
|
415
|
+
False
|
|
416
|
+
"""
|
|
417
|
+
return False
|
|
418
|
+
|
|
419
|
+
def is_global(self):
|
|
420
|
+
"""
|
|
421
|
+
Return whether the function field is global, that is, whether
|
|
422
|
+
the constant field is finite.
|
|
423
|
+
|
|
424
|
+
EXAMPLES::
|
|
425
|
+
|
|
426
|
+
sage: R.<t> = FunctionField(QQ)
|
|
427
|
+
sage: R.is_global()
|
|
428
|
+
False
|
|
429
|
+
sage: R.<t> = FunctionField(QQbar) # needs sage.rings.number_field
|
|
430
|
+
sage: R.is_global()
|
|
431
|
+
False
|
|
432
|
+
sage: R.<t> = FunctionField(GF(7))
|
|
433
|
+
sage: R.is_global()
|
|
434
|
+
True
|
|
435
|
+
"""
|
|
436
|
+
return self.constant_base_field().is_finite()
|
|
437
|
+
|
|
438
|
+
def extension(self, f, names=None):
|
|
439
|
+
"""
|
|
440
|
+
Create an extension `K(y)` of this function field `K` extended with
|
|
441
|
+
a root `y` of the univariate polynomial `f` over `K`.
|
|
442
|
+
|
|
443
|
+
INPUT:
|
|
444
|
+
|
|
445
|
+
- ``f`` -- univariate polynomial over `K`
|
|
446
|
+
|
|
447
|
+
- ``names`` -- string or tuple of length 1 that names the variable `y`
|
|
448
|
+
|
|
449
|
+
OUTPUT: a function field
|
|
450
|
+
|
|
451
|
+
EXAMPLES::
|
|
452
|
+
|
|
453
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
454
|
+
sage: K.extension(y^5 - x^3 - 3*x + x*y) # needs sage.rings.function_field
|
|
455
|
+
Function field in y defined by y^5 + x*y - x^3 - 3*x
|
|
456
|
+
|
|
457
|
+
A nonintegral defining polynomial::
|
|
458
|
+
|
|
459
|
+
sage: K.<t> = FunctionField(QQ); R.<y> = K[]
|
|
460
|
+
sage: K.extension(y^3 + (1/t)*y + t^3/(t+1), 'z') # needs sage.rings.function_field
|
|
461
|
+
Function field in z defined by z^3 + 1/t*z + t^3/(t + 1)
|
|
462
|
+
|
|
463
|
+
The defining polynomial need not be monic or integral::
|
|
464
|
+
|
|
465
|
+
sage: K.extension(t*y^3 + (1/t)*y + t^3/(t+1)) # needs sage.rings.function_field
|
|
466
|
+
Function field in y defined by t*y^3 + 1/t*y + t^3/(t + 1)
|
|
467
|
+
"""
|
|
468
|
+
from . import constructor
|
|
469
|
+
return constructor.FunctionFieldExtension(f, names)
|
|
470
|
+
|
|
471
|
+
def order_with_basis(self, basis, check=True):
|
|
472
|
+
"""
|
|
473
|
+
Return the order with given basis over the maximal order of
|
|
474
|
+
the base field.
|
|
475
|
+
|
|
476
|
+
INPUT:
|
|
477
|
+
|
|
478
|
+
- ``basis`` -- list of elements of this function field
|
|
479
|
+
|
|
480
|
+
- ``check`` -- boolean (default: ``True``); if ``True``, check that the
|
|
481
|
+
basis is really linearly independent and that the module it spans is
|
|
482
|
+
closed under multiplication, and contains the identity element.
|
|
483
|
+
|
|
484
|
+
OUTPUT: an order in the function field
|
|
485
|
+
|
|
486
|
+
EXAMPLES::
|
|
487
|
+
|
|
488
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
489
|
+
sage: L.<y> = K.extension(y^3 + x^3 + 4*x + 1) # needs sage.rings.function_field
|
|
490
|
+
sage: O = L.order_with_basis([1, y, y^2]); O # needs sage.rings.function_field
|
|
491
|
+
Order in Function field in y defined by y^3 + x^3 + 4*x + 1
|
|
492
|
+
sage: O.basis() # needs sage.rings.function_field
|
|
493
|
+
(1, y, y^2)
|
|
494
|
+
|
|
495
|
+
Note that 1 does not need to be an element of the basis, as long it is in the module spanned by it::
|
|
496
|
+
|
|
497
|
+
sage: O = L.order_with_basis([1+y, y, y^2]); O # needs sage.rings.function_field
|
|
498
|
+
Order in Function field in y defined by y^3 + x^3 + 4*x + 1
|
|
499
|
+
sage: O.basis() # needs sage.rings.function_field
|
|
500
|
+
(y + 1, y, y^2)
|
|
501
|
+
|
|
502
|
+
The following error is raised when the module spanned by the basis is not closed under multiplication::
|
|
503
|
+
|
|
504
|
+
sage: O = L.order_with_basis([1, x^2 + x*y, (2/3)*y^2]); O # needs sage.rings.function_field
|
|
505
|
+
Traceback (most recent call last):
|
|
506
|
+
...
|
|
507
|
+
ValueError: the module generated by basis (1, x*y + x^2, 2/3*y^2) must be closed under multiplication
|
|
508
|
+
|
|
509
|
+
and this happens when the identity is not in the module spanned by the basis::
|
|
510
|
+
|
|
511
|
+
sage: O = L.order_with_basis([x, x^2 + x*y, (2/3)*y^2]) # needs sage.rings.function_field
|
|
512
|
+
Traceback (most recent call last):
|
|
513
|
+
...
|
|
514
|
+
ValueError: the identity element must be in the module spanned by basis (x, x*y + x^2, 2/3*y^2)
|
|
515
|
+
"""
|
|
516
|
+
from .order_basis import FunctionFieldOrder_basis
|
|
517
|
+
return FunctionFieldOrder_basis(tuple([self(a) for a in basis]), check=check)
|
|
518
|
+
|
|
519
|
+
def order(self, x, check=True):
|
|
520
|
+
"""
|
|
521
|
+
Return the order generated by ``x`` over the base maximal order.
|
|
522
|
+
|
|
523
|
+
INPUT:
|
|
524
|
+
|
|
525
|
+
- ``x`` -- element or list of elements of the function field
|
|
526
|
+
|
|
527
|
+
- ``check`` -- boolean; if ``True``, check that ``x`` really generates an order
|
|
528
|
+
|
|
529
|
+
EXAMPLES::
|
|
530
|
+
|
|
531
|
+
sage: # needs sage.rings.function_field
|
|
532
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
533
|
+
sage: L.<y> = K.extension(y^3 + x^3 + 4*x + 1)
|
|
534
|
+
sage: O = L.order(y); O # needs sage.modules
|
|
535
|
+
Order in Function field in y defined by y^3 + x^3 + 4*x + 1
|
|
536
|
+
sage: O.basis() # needs sage.modules
|
|
537
|
+
(1, y, y^2)
|
|
538
|
+
|
|
539
|
+
sage: Z = K.order(x); Z # needs sage.rings.function_field
|
|
540
|
+
Order in Rational function field in x over Rational Field
|
|
541
|
+
sage: Z.basis() # needs sage.rings.function_field
|
|
542
|
+
(1,)
|
|
543
|
+
|
|
544
|
+
Orders with multiple generators are not yet supported::
|
|
545
|
+
|
|
546
|
+
sage: Z = K.order([x, x^2]); Z # needs sage.rings.function_field
|
|
547
|
+
Traceback (most recent call last):
|
|
548
|
+
...
|
|
549
|
+
NotImplementedError
|
|
550
|
+
"""
|
|
551
|
+
if not isinstance(x, (list, tuple)):
|
|
552
|
+
x = [x]
|
|
553
|
+
if len(x) == 1:
|
|
554
|
+
g = x[0]
|
|
555
|
+
basis = [self(1)]
|
|
556
|
+
for i in range(self.degree()-1):
|
|
557
|
+
basis.append(basis[-1]*g)
|
|
558
|
+
else:
|
|
559
|
+
raise NotImplementedError
|
|
560
|
+
return self.order_with_basis(basis, check=check)
|
|
561
|
+
|
|
562
|
+
def order_infinite_with_basis(self, basis, check=True):
|
|
563
|
+
"""
|
|
564
|
+
Return the order with given basis over the maximal infinite order of
|
|
565
|
+
the base field.
|
|
566
|
+
|
|
567
|
+
INPUT:
|
|
568
|
+
|
|
569
|
+
- ``basis`` -- list of elements of the function field
|
|
570
|
+
|
|
571
|
+
- ``check`` -- boolean (default: ``True``); if ``True``, check that the basis
|
|
572
|
+
is really linearly independent and that the module it spans is closed
|
|
573
|
+
under multiplication, and contains the identity element.
|
|
574
|
+
|
|
575
|
+
EXAMPLES::
|
|
576
|
+
|
|
577
|
+
sage: # needs sage.rings.function_field
|
|
578
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
579
|
+
sage: L.<y> = K.extension(y^3 + x^3 + 4*x + 1)
|
|
580
|
+
sage: O = L.order_infinite_with_basis([1, 1/x*y, 1/x^2*y^2]); O
|
|
581
|
+
Infinite order in Function field in y defined by y^3 + x^3 + 4*x + 1
|
|
582
|
+
sage: O.basis()
|
|
583
|
+
(1, 1/x*y, 1/x^2*y^2)
|
|
584
|
+
|
|
585
|
+
Note that 1 does not need to be an element of the basis, as long it is
|
|
586
|
+
in the module spanned by it::
|
|
587
|
+
|
|
588
|
+
sage: O = L.order_infinite_with_basis([1+1/x*y,1/x*y, 1/x^2*y^2]); O # needs sage.rings.function_field
|
|
589
|
+
Infinite order in Function field in y defined by y^3 + x^3 + 4*x + 1
|
|
590
|
+
sage: O.basis() # needs sage.rings.function_field
|
|
591
|
+
(1/x*y + 1, 1/x*y, 1/x^2*y^2)
|
|
592
|
+
|
|
593
|
+
The following error is raised when the module spanned by the basis is
|
|
594
|
+
not closed under multiplication::
|
|
595
|
+
|
|
596
|
+
sage: O = L.order_infinite_with_basis([1,y, 1/x^2*y^2]); O # needs sage.rings.function_field
|
|
597
|
+
Traceback (most recent call last):
|
|
598
|
+
...
|
|
599
|
+
ValueError: the module generated by basis (1, y, 1/x^2*y^2) must be closed under multiplication
|
|
600
|
+
|
|
601
|
+
and this happens when the identity is not in the module spanned by the
|
|
602
|
+
basis::
|
|
603
|
+
|
|
604
|
+
sage: O = L.order_infinite_with_basis([1/x,1/x*y, 1/x^2*y^2]) # needs sage.rings.function_field
|
|
605
|
+
Traceback (most recent call last):
|
|
606
|
+
...
|
|
607
|
+
ValueError: the identity element must be in the module spanned by basis (1/x, 1/x*y, 1/x^2*y^2)
|
|
608
|
+
"""
|
|
609
|
+
from .order_basis import FunctionFieldOrderInfinite_basis
|
|
610
|
+
return FunctionFieldOrderInfinite_basis(tuple([self(g) for g in basis]), check=check)
|
|
611
|
+
|
|
612
|
+
def order_infinite(self, x, check=True):
|
|
613
|
+
"""
|
|
614
|
+
Return the order generated by ``x`` over the maximal infinite order.
|
|
615
|
+
|
|
616
|
+
INPUT:
|
|
617
|
+
|
|
618
|
+
- ``x`` -- element or a list of elements of the function field
|
|
619
|
+
|
|
620
|
+
- ``check`` -- boolean; if ``True``, check that ``x`` really generates an order
|
|
621
|
+
|
|
622
|
+
EXAMPLES::
|
|
623
|
+
|
|
624
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
625
|
+
sage: L.<y> = K.extension(y^3 + x^3 + 4*x + 1) # needs sage.rings.function_field
|
|
626
|
+
sage: L.order_infinite(y) # not implemented # needs sage.rings.function_field
|
|
627
|
+
|
|
628
|
+
sage: Z = K.order(x); Z # needs sage.modules
|
|
629
|
+
Order in Rational function field in x over Rational Field
|
|
630
|
+
sage: Z.basis() # needs sage.modules
|
|
631
|
+
(1,)
|
|
632
|
+
|
|
633
|
+
Orders with multiple generators, not yet supported::
|
|
634
|
+
|
|
635
|
+
sage: Z = K.order_infinite([x, x^2]); Z
|
|
636
|
+
Traceback (most recent call last):
|
|
637
|
+
...
|
|
638
|
+
NotImplementedError
|
|
639
|
+
"""
|
|
640
|
+
if not isinstance(x, (list, tuple)):
|
|
641
|
+
x = [x]
|
|
642
|
+
if len(x) == 1:
|
|
643
|
+
g = x[0]
|
|
644
|
+
basis = [self(1)]
|
|
645
|
+
for i in range(self.degree()-1):
|
|
646
|
+
basis.append(basis[-1]*g)
|
|
647
|
+
else:
|
|
648
|
+
raise NotImplementedError
|
|
649
|
+
return self.order_infinite_with_basis(tuple(basis), check=check)
|
|
650
|
+
|
|
651
|
+
def _coerce_map_from_(self, source):
|
|
652
|
+
"""
|
|
653
|
+
Return ``True`` if there is a coerce map from ``R`` to the function field.
|
|
654
|
+
|
|
655
|
+
INPUT:
|
|
656
|
+
|
|
657
|
+
- ``source`` -- ring
|
|
658
|
+
|
|
659
|
+
EXAMPLES::
|
|
660
|
+
|
|
661
|
+
sage: # needs sage.rings.function_field
|
|
662
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
663
|
+
sage: L.<y> = K.extension(y^3 + x^3 + 4*x + 1)
|
|
664
|
+
sage: L.equation_order()
|
|
665
|
+
Order in Function field in y defined by y^3 + x^3 + 4*x + 1
|
|
666
|
+
sage: L._coerce_map_from_(L.equation_order())
|
|
667
|
+
Conversion map:
|
|
668
|
+
From: Order in Function field in y defined by y^3 + x^3 + 4*x + 1
|
|
669
|
+
To: Function field in y defined by y^3 + x^3 + 4*x + 1
|
|
670
|
+
sage: L._coerce_map_from_(GF(7))
|
|
671
|
+
|
|
672
|
+
sage: K.<x> = FunctionField(QQ)
|
|
673
|
+
sage: L.<x> = FunctionField(GaussianIntegers().fraction_field()) # needs sage.rings.number_field
|
|
674
|
+
sage: L.has_coerce_map_from(K) # needs sage.rings.number_field
|
|
675
|
+
True
|
|
676
|
+
|
|
677
|
+
sage: K.<x> = FunctionField(QQ)
|
|
678
|
+
sage: R.<y> = K[]
|
|
679
|
+
sage: L.<y> = K.extension(y^3 + 1) # needs sage.rings.function_field
|
|
680
|
+
sage: K.<x> = FunctionField(GaussianIntegers().fraction_field()) # needs sage.rings.number_field
|
|
681
|
+
sage: R.<y> = K[]
|
|
682
|
+
sage: M.<y> = K.extension(y^3 + 1) # needs sage.rings.function_field
|
|
683
|
+
sage: M.has_coerce_map_from(L) # not tested (the constant field including into a function field is not yet known to be injective), needs sage.rings.function_field
|
|
684
|
+
True
|
|
685
|
+
|
|
686
|
+
sage: K.<x> = FunctionField(QQ)
|
|
687
|
+
sage: R.<I> = K[]
|
|
688
|
+
sage: L.<I> = K.extension(I^2 + 1) # needs sage.rings.function_field
|
|
689
|
+
sage: M.<x> = FunctionField(GaussianIntegers().fraction_field()) # needs sage.rings.number_field
|
|
690
|
+
sage: M.has_coerce_map_from(L) # needs sage.rings.function_field sage.rings.number_field
|
|
691
|
+
True
|
|
692
|
+
|
|
693
|
+
Check that :issue:`31072` is fixed::
|
|
694
|
+
|
|
695
|
+
sage: L.<t> = FunctionField(QQ)
|
|
696
|
+
sage: L(Sequence([1, 2]))
|
|
697
|
+
2*t + 1
|
|
698
|
+
"""
|
|
699
|
+
from .order import FunctionFieldOrder_base
|
|
700
|
+
if isinstance(source, FunctionFieldOrder_base):
|
|
701
|
+
K = source.fraction_field()
|
|
702
|
+
if K is self:
|
|
703
|
+
return self._generic_coerce_map(source)
|
|
704
|
+
source_to_K = K.coerce_map_from(source)
|
|
705
|
+
K_to_self = self.coerce_map_from(K)
|
|
706
|
+
if source_to_K and K_to_self:
|
|
707
|
+
return K_to_self * source_to_K
|
|
708
|
+
if isinstance(source, CategoryObject) and source in FunctionFields():
|
|
709
|
+
if source.base_field() is source:
|
|
710
|
+
if self.base_field() is self:
|
|
711
|
+
# source and self are rational function fields
|
|
712
|
+
if source.variable_name() == self.variable_name():
|
|
713
|
+
# ... in the same variable
|
|
714
|
+
base_coercion = self.constant_field().coerce_map_from(source.constant_field())
|
|
715
|
+
if base_coercion is not None:
|
|
716
|
+
return source.hom([self.gen()], base_morphism=base_coercion)
|
|
717
|
+
else:
|
|
718
|
+
# source is an extensions of rational function fields
|
|
719
|
+
base_coercion = self.coerce_map_from(source.base_field())
|
|
720
|
+
if base_coercion is not None and base_coercion.is_injective():
|
|
721
|
+
# the base field of source coerces into the base field of self
|
|
722
|
+
self_polynomial = source.polynomial().map_coefficients(base_coercion)
|
|
723
|
+
# try to find a root of the defining polynomial in self
|
|
724
|
+
if self_polynomial(self.gen()) == 0:
|
|
725
|
+
# The defining polynomial of source has a root in self,
|
|
726
|
+
# therefore there is a map. To be sure that it is
|
|
727
|
+
# canonical, we require a root of the defining polynomial
|
|
728
|
+
# of self to be a root of the defining polynomial of
|
|
729
|
+
# source (and that the variables are named equally):
|
|
730
|
+
if source.variable_name() == self.variable_name():
|
|
731
|
+
return source.hom([self.gen()], base_morphism=base_coercion)
|
|
732
|
+
|
|
733
|
+
try:
|
|
734
|
+
sourcegen_in_self = self(source.variable_name())
|
|
735
|
+
except TypeError:
|
|
736
|
+
pass
|
|
737
|
+
else:
|
|
738
|
+
if self_polynomial(sourcegen_in_self) == 0:
|
|
739
|
+
# The defining polynomial of source has a root in self,
|
|
740
|
+
# therefore there is a map. To be sure that it is
|
|
741
|
+
# canonical, we require the names of the roots to match
|
|
742
|
+
return source.hom([sourcegen_in_self], base_morphism=base_coercion)
|
|
743
|
+
|
|
744
|
+
def _test_derivation(self, **options):
|
|
745
|
+
"""
|
|
746
|
+
Test the correctness of the derivations of the function field.
|
|
747
|
+
|
|
748
|
+
EXAMPLES::
|
|
749
|
+
|
|
750
|
+
sage: K.<x> = FunctionField(QQ)
|
|
751
|
+
sage: TestSuite(K).run() # indirect doctest, long time (3s)
|
|
752
|
+
"""
|
|
753
|
+
tester = self._tester(**options)
|
|
754
|
+
S = tester.some_elements()
|
|
755
|
+
K = self.constant_base_field().some_elements()
|
|
756
|
+
try:
|
|
757
|
+
d = self.derivation()
|
|
758
|
+
except ImportError:
|
|
759
|
+
return
|
|
760
|
+
from itertools import product
|
|
761
|
+
# Non-zero
|
|
762
|
+
tester.assertFalse(d.is_zero())
|
|
763
|
+
# Well-defined
|
|
764
|
+
if hasattr(self, "polynomial"):
|
|
765
|
+
f = self.polynomial()
|
|
766
|
+
tester.assertEqual(0, d(f))
|
|
767
|
+
# Leibniz's law
|
|
768
|
+
for x,y in tester.some_elements(product(S, S)):
|
|
769
|
+
tester.assertEqual(d(x*y), x*d(y) + d(x)*y)
|
|
770
|
+
# Linearity
|
|
771
|
+
for x,y in tester.some_elements(product(S, S)):
|
|
772
|
+
tester.assertEqual(d(x+y), d(x) + d(y))
|
|
773
|
+
for c,x in tester.some_elements(product(K, S)):
|
|
774
|
+
tester.assertEqual(d(c*x), c*d(x))
|
|
775
|
+
# Constants map to zero
|
|
776
|
+
for c in tester.some_elements(K):
|
|
777
|
+
tester.assertEqual(d(c), 0)
|
|
778
|
+
|
|
779
|
+
def _convert_map_from_(self, R):
|
|
780
|
+
"""
|
|
781
|
+
Return a conversion from ``R`` to this function field if one exists.
|
|
782
|
+
|
|
783
|
+
INPUT:
|
|
784
|
+
|
|
785
|
+
- ``R`` -- ring
|
|
786
|
+
|
|
787
|
+
EXAMPLES::
|
|
788
|
+
|
|
789
|
+
sage: K.<x> = FunctionField(QQ)
|
|
790
|
+
sage: R.<y> = K[]
|
|
791
|
+
sage: L.<y> = K.extension(y^3 + x^3 + 4*x + 1) # needs sage.rings.function_field
|
|
792
|
+
sage: K(L(x)) # indirect doctest # needs sage.rings.function_field
|
|
793
|
+
x
|
|
794
|
+
"""
|
|
795
|
+
try:
|
|
796
|
+
from .function_field_polymod import FunctionField_polymod
|
|
797
|
+
except ImportError:
|
|
798
|
+
FunctionField_polymod = ()
|
|
799
|
+
if isinstance(R, FunctionField_polymod):
|
|
800
|
+
base_conversion = self.convert_map_from(R.base_field())
|
|
801
|
+
if base_conversion is not None:
|
|
802
|
+
from sage.categories.morphism import SetMorphism
|
|
803
|
+
return base_conversion * SetMorphism(R.Hom(R.base_field()), R._to_base_field)
|
|
804
|
+
|
|
805
|
+
def _intermediate_fields(self, base):
|
|
806
|
+
"""
|
|
807
|
+
Return the fields which lie in between base and the function field in
|
|
808
|
+
the tower of function fields.
|
|
809
|
+
|
|
810
|
+
INPUT:
|
|
811
|
+
|
|
812
|
+
- ``base`` -- function field, either this field or a field from which
|
|
813
|
+
this field has been created as an extension
|
|
814
|
+
|
|
815
|
+
OUTPUT: list of fields; the first entry is this field, the last entry is ``base``
|
|
816
|
+
|
|
817
|
+
EXAMPLES::
|
|
818
|
+
|
|
819
|
+
sage: K.<x> = FunctionField(QQ)
|
|
820
|
+
sage: K._intermediate_fields(K)
|
|
821
|
+
[Rational function field in x over Rational Field]
|
|
822
|
+
|
|
823
|
+
sage: R.<y> = K[]
|
|
824
|
+
sage: L.<y> = K.extension(y^2 - x) # needs sage.rings.function_field
|
|
825
|
+
sage: L._intermediate_fields(K) # needs sage.rings.function_field
|
|
826
|
+
[Function field in y defined by y^2 - x,
|
|
827
|
+
Rational function field in x over Rational Field]
|
|
828
|
+
|
|
829
|
+
sage: # needs sage.rings.function_field
|
|
830
|
+
sage: R.<z> = L[]
|
|
831
|
+
sage: M.<z> = L.extension(z^2 - y)
|
|
832
|
+
sage: M._intermediate_fields(L)
|
|
833
|
+
[Function field in z defined by z^2 - y,
|
|
834
|
+
Function field in y defined by y^2 - x]
|
|
835
|
+
sage: M._intermediate_fields(K)
|
|
836
|
+
[Function field in z defined by z^2 - y,
|
|
837
|
+
Function field in y defined by y^2 - x,
|
|
838
|
+
Rational function field in x over Rational Field]
|
|
839
|
+
|
|
840
|
+
TESTS::
|
|
841
|
+
|
|
842
|
+
sage: K._intermediate_fields(M) # needs sage.rings.function_field
|
|
843
|
+
Traceback (most recent call last):
|
|
844
|
+
...
|
|
845
|
+
ValueError: field has not been constructed as a finite extension of base
|
|
846
|
+
sage: K._intermediate_fields(QQ)
|
|
847
|
+
Traceback (most recent call last):
|
|
848
|
+
...
|
|
849
|
+
TypeError: base must be a function field
|
|
850
|
+
"""
|
|
851
|
+
if base not in FunctionFields():
|
|
852
|
+
raise TypeError("base must be a function field")
|
|
853
|
+
|
|
854
|
+
ret = [self]
|
|
855
|
+
while ret[-1] is not base:
|
|
856
|
+
ret.append(ret[-1].base_field())
|
|
857
|
+
if ret[-1] is ret[-2]:
|
|
858
|
+
raise ValueError("field has not been constructed as a finite extension of base")
|
|
859
|
+
return ret
|
|
860
|
+
|
|
861
|
+
def rational_function_field(self):
|
|
862
|
+
r"""
|
|
863
|
+
Return the rational function field from which this field has been
|
|
864
|
+
created as an extension.
|
|
865
|
+
|
|
866
|
+
EXAMPLES::
|
|
867
|
+
|
|
868
|
+
sage: K.<x> = FunctionField(QQ)
|
|
869
|
+
sage: K.rational_function_field()
|
|
870
|
+
Rational function field in x over Rational Field
|
|
871
|
+
|
|
872
|
+
sage: R.<y> = K[]
|
|
873
|
+
sage: L.<y> = K.extension(y^2 - x) # needs sage.rings.function_field
|
|
874
|
+
sage: L.rational_function_field() # needs sage.rings.function_field
|
|
875
|
+
Rational function field in x over Rational Field
|
|
876
|
+
|
|
877
|
+
sage: R.<z> = L[] # needs sage.rings.function_field
|
|
878
|
+
sage: M.<z> = L.extension(z^2 - y) # needs sage.rings.function_field
|
|
879
|
+
sage: M.rational_function_field() # needs sage.rings.function_field
|
|
880
|
+
Rational function field in x over Rational Field
|
|
881
|
+
"""
|
|
882
|
+
from .function_field_rational import RationalFunctionField
|
|
883
|
+
|
|
884
|
+
return self if isinstance(self, RationalFunctionField) else self.base_field().rational_function_field()
|
|
885
|
+
|
|
886
|
+
def valuation(self, prime):
|
|
887
|
+
r"""
|
|
888
|
+
Return the discrete valuation on this function field defined by
|
|
889
|
+
``prime``.
|
|
890
|
+
|
|
891
|
+
INPUT:
|
|
892
|
+
|
|
893
|
+
- ``prime`` -- a place of the function field, a valuation on a subring,
|
|
894
|
+
or a valuation on another function field together with information
|
|
895
|
+
for isomorphisms to and from that function field
|
|
896
|
+
|
|
897
|
+
EXAMPLES:
|
|
898
|
+
|
|
899
|
+
We create valuations that correspond to finite rational places of a
|
|
900
|
+
function field::
|
|
901
|
+
|
|
902
|
+
sage: K.<x> = FunctionField(QQ)
|
|
903
|
+
sage: v = K.valuation(1); v # needs sage.rings.function_field
|
|
904
|
+
(x - 1)-adic valuation
|
|
905
|
+
sage: v(x) # needs sage.rings.function_field
|
|
906
|
+
0
|
|
907
|
+
sage: v(x - 1) # needs sage.rings.function_field
|
|
908
|
+
1
|
|
909
|
+
|
|
910
|
+
A place can also be specified with an irreducible polynomial::
|
|
911
|
+
|
|
912
|
+
sage: v = K.valuation(x - 1); v # needs sage.rings.function_field
|
|
913
|
+
(x - 1)-adic valuation
|
|
914
|
+
|
|
915
|
+
Similarly, for a finite non-rational place::
|
|
916
|
+
|
|
917
|
+
sage: v = K.valuation(x^2 + 1); v # needs sage.rings.function_field
|
|
918
|
+
(x^2 + 1)-adic valuation
|
|
919
|
+
sage: v(x^2 + 1) # needs sage.rings.function_field
|
|
920
|
+
1
|
|
921
|
+
sage: v(x) # needs sage.rings.function_field
|
|
922
|
+
0
|
|
923
|
+
|
|
924
|
+
Or for the infinite place::
|
|
925
|
+
|
|
926
|
+
sage: v = K.valuation(1/x); v # needs sage.rings.function_field
|
|
927
|
+
Valuation at the infinite place
|
|
928
|
+
sage: v(x) # needs sage.rings.function_field
|
|
929
|
+
-1
|
|
930
|
+
|
|
931
|
+
Instead of specifying a generator of a place, we can define a valuation on a
|
|
932
|
+
rational function field by giving a discrete valuation on the underlying
|
|
933
|
+
polynomial ring::
|
|
934
|
+
|
|
935
|
+
sage: # needs sage.rings.function_field
|
|
936
|
+
sage: R.<x> = QQ[]
|
|
937
|
+
sage: u = valuations.GaussValuation(R, valuations.TrivialValuation(QQ))
|
|
938
|
+
sage: w = u.augmentation(x - 1, 1)
|
|
939
|
+
sage: v = K.valuation(w); v
|
|
940
|
+
(x - 1)-adic valuation
|
|
941
|
+
|
|
942
|
+
Note that this allows us to specify valuations which do not correspond to a
|
|
943
|
+
place of the function field::
|
|
944
|
+
|
|
945
|
+
sage: w = valuations.GaussValuation(R, QQ.valuation(2)) # needs sage.rings.function_field
|
|
946
|
+
sage: v = K.valuation(w); v # needs sage.rings.function_field
|
|
947
|
+
2-adic valuation
|
|
948
|
+
|
|
949
|
+
The same is possible for valuations with `v(1/x) > 0` by passing in an
|
|
950
|
+
extra pair of parameters, an isomorphism between this function field and an
|
|
951
|
+
isomorphic function field. That way you can, for example, indicate that the
|
|
952
|
+
valuation is to be understood as a valuation on `K[1/x]`, i.e., after
|
|
953
|
+
applying the substitution `x \mapsto 1/x` (here, the inverse map is also `x
|
|
954
|
+
\mapsto 1/x`)::
|
|
955
|
+
|
|
956
|
+
sage: # needs sage.rings.function_field
|
|
957
|
+
sage: w = valuations.GaussValuation(R, QQ.valuation(2)).augmentation(x, 1)
|
|
958
|
+
sage: w = K.valuation(w)
|
|
959
|
+
sage: v = K.valuation((w, K.hom([~K.gen()]), K.hom([~K.gen()]))); v
|
|
960
|
+
Valuation on rational function field
|
|
961
|
+
induced by [ Gauss valuation induced by 2-adic valuation, v(x) = 1 ]
|
|
962
|
+
(in Rational function field in x over Rational Field after x |--> 1/x)
|
|
963
|
+
|
|
964
|
+
Note that classical valuations at finite places or the infinite place are
|
|
965
|
+
always normalized such that the uniformizing element has valuation 1::
|
|
966
|
+
|
|
967
|
+
sage: # needs sage.rings.function_field
|
|
968
|
+
sage: K.<t> = FunctionField(GF(3))
|
|
969
|
+
sage: M.<x> = FunctionField(K)
|
|
970
|
+
sage: v = M.valuation(x^3 - t)
|
|
971
|
+
sage: v(x^3 - t)
|
|
972
|
+
1
|
|
973
|
+
|
|
974
|
+
However, if such a valuation comes out of a base change of the ground
|
|
975
|
+
field, this is not the case anymore. In the example below, the unique
|
|
976
|
+
extension of ``v`` to ``L`` still has valuation 1 on `x^3 - t` but it has
|
|
977
|
+
valuation ``1/3`` on its uniformizing element `x - w`::
|
|
978
|
+
|
|
979
|
+
sage: # needs sage.rings.function_field
|
|
980
|
+
sage: R.<w> = K[]
|
|
981
|
+
sage: L.<w> = K.extension(w^3 - t)
|
|
982
|
+
sage: N.<x> = FunctionField(L)
|
|
983
|
+
sage: w = v.extension(N) # missing factorization, :issue:`16572`
|
|
984
|
+
Traceback (most recent call last):
|
|
985
|
+
...
|
|
986
|
+
NotImplementedError
|
|
987
|
+
sage: w(x^3 - t) # not tested
|
|
988
|
+
1
|
|
989
|
+
sage: w(x - w) # not tested
|
|
990
|
+
1/3
|
|
991
|
+
|
|
992
|
+
There are several ways to create valuations on extensions of rational
|
|
993
|
+
function fields::
|
|
994
|
+
|
|
995
|
+
sage: K.<x> = FunctionField(QQ)
|
|
996
|
+
sage: R.<y> = K[]
|
|
997
|
+
sage: L.<y> = K.extension(y^2 - x); L # needs sage.rings.function_field
|
|
998
|
+
Function field in y defined by y^2 - x
|
|
999
|
+
|
|
1000
|
+
A place that has a unique extension can just be defined downstairs::
|
|
1001
|
+
|
|
1002
|
+
sage: v = L.valuation(x); v # needs sage.geometry.polyhedron sage.rings.function_field
|
|
1003
|
+
(x)-adic valuation
|
|
1004
|
+
"""
|
|
1005
|
+
from sage.rings.function_field.valuation import FunctionFieldValuation
|
|
1006
|
+
return FunctionFieldValuation(self, prime)
|
|
1007
|
+
|
|
1008
|
+
def space_of_differentials(self):
|
|
1009
|
+
"""
|
|
1010
|
+
Return the space of differentials attached to the function field.
|
|
1011
|
+
|
|
1012
|
+
EXAMPLES::
|
|
1013
|
+
|
|
1014
|
+
sage: K.<t> = FunctionField(QQ)
|
|
1015
|
+
sage: K.space_of_differentials() # needs sage.modules
|
|
1016
|
+
Space of differentials of Rational function field in t over Rational Field
|
|
1017
|
+
|
|
1018
|
+
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
|
|
1019
|
+
sage: L.<y> = K.extension(Y^3 - (x^3 - 1)/(x^3 - 2)) # needs sage.rings.function_field
|
|
1020
|
+
sage: L.space_of_differentials() # needs sage.rings.function_field
|
|
1021
|
+
Space of differentials of Function field in y
|
|
1022
|
+
defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
|
|
1023
|
+
"""
|
|
1024
|
+
return self._differentials_space(self)
|
|
1025
|
+
|
|
1026
|
+
def space_of_holomorphic_differentials(self):
|
|
1027
|
+
"""
|
|
1028
|
+
Return the space of holomorphic differentials of this function field.
|
|
1029
|
+
|
|
1030
|
+
EXAMPLES::
|
|
1031
|
+
|
|
1032
|
+
sage: K.<t> = FunctionField(QQ)
|
|
1033
|
+
sage: K.space_of_holomorphic_differentials() # needs sage.libs.pari sage.modules
|
|
1034
|
+
(Vector space of dimension 0 over Rational Field,
|
|
1035
|
+
Linear map:
|
|
1036
|
+
From: Vector space of dimension 0 over Rational Field
|
|
1037
|
+
To: Space of differentials of Rational function field in t over Rational Field,
|
|
1038
|
+
Section of linear map:
|
|
1039
|
+
From: Space of differentials of Rational function field in t over Rational Field
|
|
1040
|
+
To: Vector space of dimension 0 over Rational Field)
|
|
1041
|
+
|
|
1042
|
+
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
|
|
1043
|
+
sage: L.<y> = K.extension(Y^3 - (x^3 - 1)/(x^3 - 2)) # needs sage.rings.function_field
|
|
1044
|
+
sage: L.space_of_holomorphic_differentials() # needs sage.rings.function_field
|
|
1045
|
+
(Vector space of dimension 4 over Finite Field of size 5,
|
|
1046
|
+
Linear map:
|
|
1047
|
+
From: Vector space of dimension 4 over Finite Field of size 5
|
|
1048
|
+
To: Space of differentials of Function field in y
|
|
1049
|
+
defined by y^3 + (4*x^3 + 1)/(x^3 + 3),
|
|
1050
|
+
Section of linear map:
|
|
1051
|
+
From: Space of differentials of Function field in y
|
|
1052
|
+
defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
|
|
1053
|
+
To: Vector space of dimension 4 over Finite Field of size 5)
|
|
1054
|
+
"""
|
|
1055
|
+
return self.divisor_group().zero().differential_space()
|
|
1056
|
+
|
|
1057
|
+
space_of_differentials_of_first_kind = space_of_holomorphic_differentials
|
|
1058
|
+
|
|
1059
|
+
def basis_of_holomorphic_differentials(self):
|
|
1060
|
+
"""
|
|
1061
|
+
Return a basis of the space of holomorphic differentials of this function field.
|
|
1062
|
+
|
|
1063
|
+
EXAMPLES::
|
|
1064
|
+
|
|
1065
|
+
sage: K.<t> = FunctionField(QQ)
|
|
1066
|
+
sage: K.basis_of_holomorphic_differentials() # needs sage.libs.pari sage.modules
|
|
1067
|
+
[]
|
|
1068
|
+
|
|
1069
|
+
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
|
|
1070
|
+
sage: L.<y> = K.extension(Y^3 - (x^3 - 1)/(x^3 - 2)) # needs sage.rings.function_field
|
|
1071
|
+
sage: L.basis_of_holomorphic_differentials() # needs sage.rings.function_field
|
|
1072
|
+
[((x/(x^3 + 4))*y) d(x),
|
|
1073
|
+
((1/(x^3 + 4))*y) d(x),
|
|
1074
|
+
((x/(x^3 + 4))*y^2) d(x),
|
|
1075
|
+
((1/(x^3 + 4))*y^2) d(x)]
|
|
1076
|
+
"""
|
|
1077
|
+
return self.divisor_group().zero().basis_differential_space()
|
|
1078
|
+
|
|
1079
|
+
basis_of_differentials_of_first_kind = basis_of_holomorphic_differentials
|
|
1080
|
+
|
|
1081
|
+
def divisor_group(self):
|
|
1082
|
+
"""
|
|
1083
|
+
Return the group of divisors attached to the function field.
|
|
1084
|
+
|
|
1085
|
+
EXAMPLES::
|
|
1086
|
+
|
|
1087
|
+
sage: K.<t> = FunctionField(QQ)
|
|
1088
|
+
sage: K.divisor_group() # needs sage.modules
|
|
1089
|
+
Divisor group of Rational function field in t over Rational Field
|
|
1090
|
+
|
|
1091
|
+
sage: _.<Y> = K[]
|
|
1092
|
+
sage: L.<y> = K.extension(Y^3 - (t^3 - 1)/(t^3 - 2)) # needs sage.rings.function_field
|
|
1093
|
+
sage: L.divisor_group() # needs sage.rings.function_field
|
|
1094
|
+
Divisor group of Function field in y defined by y^3 + (-t^3 + 1)/(t^3 - 2)
|
|
1095
|
+
|
|
1096
|
+
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
|
|
1097
|
+
sage: L.<y> = K.extension(Y^3 - (x^3 - 1)/(x^3 - 2)) # needs sage.rings.function_field
|
|
1098
|
+
sage: L.divisor_group() # needs sage.rings.function_field
|
|
1099
|
+
Divisor group of Function field in y defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
|
|
1100
|
+
"""
|
|
1101
|
+
from .divisor import DivisorGroup
|
|
1102
|
+
return DivisorGroup(self)
|
|
1103
|
+
|
|
1104
|
+
def place_set(self):
|
|
1105
|
+
"""
|
|
1106
|
+
Return the set of all places of the function field.
|
|
1107
|
+
|
|
1108
|
+
EXAMPLES::
|
|
1109
|
+
|
|
1110
|
+
sage: K.<t> = FunctionField(GF(7))
|
|
1111
|
+
sage: K.place_set()
|
|
1112
|
+
Set of places of Rational function field in t over Finite Field of size 7
|
|
1113
|
+
|
|
1114
|
+
sage: K.<t> = FunctionField(QQ)
|
|
1115
|
+
sage: K.place_set()
|
|
1116
|
+
Set of places of Rational function field in t over Rational Field
|
|
1117
|
+
|
|
1118
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
1119
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.function_field
|
|
1120
|
+
sage: L.place_set() # needs sage.rings.function_field
|
|
1121
|
+
Set of places of Function field in y defined by y^2 + y + (x^2 + 1)/x
|
|
1122
|
+
"""
|
|
1123
|
+
from .place import PlaceSet
|
|
1124
|
+
return PlaceSet(self)
|
|
1125
|
+
|
|
1126
|
+
@cached_method
|
|
1127
|
+
def completion(self, place, name=None, prec=None, gen_name=None):
|
|
1128
|
+
"""
|
|
1129
|
+
Return the completion of the function field at the place.
|
|
1130
|
+
|
|
1131
|
+
INPUT:
|
|
1132
|
+
|
|
1133
|
+
- ``place`` -- place
|
|
1134
|
+
|
|
1135
|
+
- ``name`` -- string; name of the series variable
|
|
1136
|
+
|
|
1137
|
+
- ``prec`` -- positive integer; default precision
|
|
1138
|
+
|
|
1139
|
+
- ``gen_name`` -- string; name of the generator of the residue field;
|
|
1140
|
+
used only when the place is non-rational
|
|
1141
|
+
|
|
1142
|
+
EXAMPLES::
|
|
1143
|
+
|
|
1144
|
+
sage: # needs sage.rings.function_field
|
|
1145
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
1146
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
1147
|
+
sage: p = L.places_finite()[0]
|
|
1148
|
+
sage: m = L.completion(p); m
|
|
1149
|
+
Completion map:
|
|
1150
|
+
From: Function field in y defined by y^2 + y + (x^2 + 1)/x
|
|
1151
|
+
To: Laurent Series Ring in s over Finite Field of size 2
|
|
1152
|
+
sage: m(x, 10)
|
|
1153
|
+
s^2 + s^3 + s^4 + s^5 + s^7 + s^8 + s^9 + s^10 + O(s^12)
|
|
1154
|
+
sage: m(y, 10)
|
|
1155
|
+
s^-1 + 1 + s^3 + s^5 + s^7 + O(s^9)
|
|
1156
|
+
|
|
1157
|
+
sage: # needs sage.rings.function_field
|
|
1158
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
1159
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
1160
|
+
sage: p = L.places_finite()[0]
|
|
1161
|
+
sage: m = L.completion(p); m
|
|
1162
|
+
Completion map:
|
|
1163
|
+
From: Function field in y defined by y^2 + y + (x^2 + 1)/x
|
|
1164
|
+
To: Laurent Series Ring in s over Finite Field of size 2
|
|
1165
|
+
sage: m(x, 10)
|
|
1166
|
+
s^2 + s^3 + s^4 + s^5 + s^7 + s^8 + s^9 + s^10 + O(s^12)
|
|
1167
|
+
sage: m(y, 10)
|
|
1168
|
+
s^-1 + 1 + s^3 + s^5 + s^7 + O(s^9)
|
|
1169
|
+
|
|
1170
|
+
sage: K.<x> = FunctionField(GF(2))
|
|
1171
|
+
sage: p = K.places_finite()[0]; p # needs sage.libs.pari
|
|
1172
|
+
Place (x)
|
|
1173
|
+
sage: m = K.completion(p); m # needs sage.rings.function_field
|
|
1174
|
+
Completion map:
|
|
1175
|
+
From: Rational function field in x over Finite Field of size 2
|
|
1176
|
+
To: Laurent Series Ring in s over Finite Field of size 2
|
|
1177
|
+
sage: m(1/(x+1)) # needs sage.rings.function_field
|
|
1178
|
+
1 + s + s^2 + s^3 + s^4 + s^5 + s^6 + s^7 + s^8 + s^9 + s^10 + s^11 + s^12
|
|
1179
|
+
+ s^13 + s^14 + s^15 + s^16 + s^17 + s^18 + s^19 + O(s^20)
|
|
1180
|
+
|
|
1181
|
+
sage: p = K.place_infinite(); p
|
|
1182
|
+
Place (1/x)
|
|
1183
|
+
sage: m = K.completion(p); m # needs sage.rings.function_field
|
|
1184
|
+
Completion map:
|
|
1185
|
+
From: Rational function field in x over Finite Field of size 2
|
|
1186
|
+
To: Laurent Series Ring in s over Finite Field of size 2
|
|
1187
|
+
sage: m(x) # needs sage.rings.function_field
|
|
1188
|
+
s^-1 + O(s^19)
|
|
1189
|
+
|
|
1190
|
+
sage: m = K.completion(p, prec=infinity); m # needs sage.combinat sage.rings.function_field
|
|
1191
|
+
Completion map:
|
|
1192
|
+
From: Rational function field in x over Finite Field of size 2
|
|
1193
|
+
To: Lazy Laurent Series Ring in s over Finite Field of size 2
|
|
1194
|
+
sage: f = m(x); f # needs sage.combinat sage.rings.function_field
|
|
1195
|
+
s^-1 + ...
|
|
1196
|
+
sage: f.coefficient(100) # needs sage.combinat sage.rings.function_field
|
|
1197
|
+
0
|
|
1198
|
+
|
|
1199
|
+
sage: # needs sage.rings.function_field
|
|
1200
|
+
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
|
|
1201
|
+
sage: L.<y> = K.extension(Y^2 - x)
|
|
1202
|
+
sage: O = L.maximal_order()
|
|
1203
|
+
sage: decomp = O.decomposition(K.maximal_order().ideal(x - 1))
|
|
1204
|
+
sage: pls = (decomp[0][0].place(), decomp[1][0].place())
|
|
1205
|
+
sage: m = L.completion(pls[0]); m
|
|
1206
|
+
Completion map:
|
|
1207
|
+
From: Function field in y defined by y^2 - x
|
|
1208
|
+
To: Laurent Series Ring in s over Rational Field
|
|
1209
|
+
sage: xe = m(x)
|
|
1210
|
+
sage: ye = m(y)
|
|
1211
|
+
sage: ye^2 - xe == 0
|
|
1212
|
+
True
|
|
1213
|
+
|
|
1214
|
+
sage: # needs sage.rings.function_field
|
|
1215
|
+
sage: decomp2 = O.decomposition(K.maximal_order().ideal(x^2 + 1))
|
|
1216
|
+
sage: pls2 = decomp2[0][0].place()
|
|
1217
|
+
sage: m = L.completion(pls2); m
|
|
1218
|
+
Completion map:
|
|
1219
|
+
From: Function field in y defined by y^2 - x
|
|
1220
|
+
To: Laurent Series Ring in s over
|
|
1221
|
+
Number Field in a with defining polynomial x^4 + 2*x^2 + 4*x + 2
|
|
1222
|
+
sage: xe = m(x)
|
|
1223
|
+
sage: ye = m(y)
|
|
1224
|
+
sage: ye^2 - xe == 0
|
|
1225
|
+
True
|
|
1226
|
+
"""
|
|
1227
|
+
from .maps import FunctionFieldCompletion
|
|
1228
|
+
return FunctionFieldCompletion(self, place, name=name, prec=prec, gen_name=gen_name)
|
|
1229
|
+
|
|
1230
|
+
def hilbert_symbol(self, a, b, P):
|
|
1231
|
+
r"""
|
|
1232
|
+
Return the Hilbert symbol `(a,b)_{F_P}` for the local field `F_P`.
|
|
1233
|
+
|
|
1234
|
+
The local field `F_P` is the completion of this function field `F`
|
|
1235
|
+
at the place `P`.
|
|
1236
|
+
|
|
1237
|
+
INPUT:
|
|
1238
|
+
|
|
1239
|
+
- ``a``, ``b`` -- elements of this function field
|
|
1240
|
+
|
|
1241
|
+
- ``P`` -- a place of this function field
|
|
1242
|
+
|
|
1243
|
+
The Hilbert symbol `(a,b)_{F_P}` is `0` if `a` or `b` is zero.
|
|
1244
|
+
Otherwise it takes the value `1` if the quaternion algebra
|
|
1245
|
+
defined by `(a,b)` over `F_P` is split, and `-1` if said
|
|
1246
|
+
algebra is a division ring.
|
|
1247
|
+
|
|
1248
|
+
ALGORITHM:
|
|
1249
|
+
|
|
1250
|
+
For the valuation `\nu = \nu_P` of `F`, we compute the valuations
|
|
1251
|
+
`\nu(a)` and `\nu(b)` as well as elements `a_0` and `b_0` of the
|
|
1252
|
+
residue field such that for a uniformizer `\pi` at `P`,
|
|
1253
|
+
`a\pi^{-\nu(a))}` respectively `b\pi^{-\nu(b)}` has the residue class
|
|
1254
|
+
`a_0` respectively `b_0` modulo `\pi`. Then the Hilbert symbol is
|
|
1255
|
+
computed by formula 12.4.10 in [Voi2021]_.
|
|
1256
|
+
|
|
1257
|
+
Currently only implemented for global function fields.
|
|
1258
|
+
|
|
1259
|
+
EXAMPLES::
|
|
1260
|
+
|
|
1261
|
+
sage: # needs sage.libs.pari
|
|
1262
|
+
sage: K.<x> = FunctionField(GF(17))
|
|
1263
|
+
sage: P = K.places()[0]; P
|
|
1264
|
+
Place (1/x)
|
|
1265
|
+
sage: a = (5*x + 6)/(x + 15)
|
|
1266
|
+
sage: b = 7/x
|
|
1267
|
+
sage: K.hilbert_symbol(a, b, P) # needs sage.libs.singular
|
|
1268
|
+
-1
|
|
1269
|
+
sage: Q = K.places()[7]; Q
|
|
1270
|
+
Place (x + 6)
|
|
1271
|
+
sage: c = 15*x + 12
|
|
1272
|
+
sage: d = 16/(x + 13)
|
|
1273
|
+
sage: K.hilbert_symbol(c, d, Q) # needs sage.libs.singular
|
|
1274
|
+
1
|
|
1275
|
+
|
|
1276
|
+
Check that the Hilbert symbol is symmetric and bimultiplicative::
|
|
1277
|
+
|
|
1278
|
+
sage: # needs sage.libs.pari sage.libs.singular
|
|
1279
|
+
sage: K.<x> = FunctionField(GF(5)); R.<T> = PolynomialRing(K)
|
|
1280
|
+
sage: f = ((x^2 + 2*x + 2)*T^5 + (4*x^2 + 2*x + 3)*T^4 + 3*T^3 + 4*T^2
|
|
1281
|
+
....: + (2/(x^2 + 4*x + 1))*T + 3*x^2 + 2*x + 4)
|
|
1282
|
+
sage: L.<y> = K.extension(f)
|
|
1283
|
+
sage: a = L.random_element()
|
|
1284
|
+
sage: b = L.random_element()
|
|
1285
|
+
sage: c = L.random_element()
|
|
1286
|
+
sage: P = L.places_above(K.places()[0])[1]
|
|
1287
|
+
sage: Q = L.places_above(K.places()[1])[0]
|
|
1288
|
+
sage: hP_a_c = L.hilbert_symbol(a, c, P)
|
|
1289
|
+
sage: hP_a_c == L.hilbert_symbol(c, a, P)
|
|
1290
|
+
True
|
|
1291
|
+
sage: L.hilbert_symbol(a, b, P) * hP_a_c == L.hilbert_symbol(a, b*c, P)
|
|
1292
|
+
True
|
|
1293
|
+
sage: hP_a_c * L.hilbert_symbol(b, c, P) == L.hilbert_symbol(a*b, c, P)
|
|
1294
|
+
True
|
|
1295
|
+
sage: hQ_a_c = L.hilbert_symbol(a, c, Q)
|
|
1296
|
+
sage: hQ_a_c == L.hilbert_symbol(c, a, Q)
|
|
1297
|
+
True
|
|
1298
|
+
sage: L.hilbert_symbol(a, b, Q) * hQ_a_c == L.hilbert_symbol(a, b*c, Q)
|
|
1299
|
+
True
|
|
1300
|
+
sage: hQ_a_c * L.hilbert_symbol(b, c, Q) == L.hilbert_symbol(a*b, c, Q)
|
|
1301
|
+
True
|
|
1302
|
+
"""
|
|
1303
|
+
if not self.is_global():
|
|
1304
|
+
raise NotImplementedError('only supported for global function fields')
|
|
1305
|
+
|
|
1306
|
+
if self.characteristic() == 2:
|
|
1307
|
+
raise ValueError('Hilbert symbol is only defined for'
|
|
1308
|
+
' odd characteristic function fields')
|
|
1309
|
+
|
|
1310
|
+
if not (a in self and b in self):
|
|
1311
|
+
raise ValueError('a and b must be elements of the function field')
|
|
1312
|
+
|
|
1313
|
+
if a.is_zero() or b.is_zero():
|
|
1314
|
+
return 0
|
|
1315
|
+
|
|
1316
|
+
# Compute the completion map to precision 1 for computation of the
|
|
1317
|
+
# valuations v(a), v(b) as well as the elements a0, b0
|
|
1318
|
+
try:
|
|
1319
|
+
sigma = self.completion(P, prec=1, gen_name='i')
|
|
1320
|
+
except AttributeError:
|
|
1321
|
+
raise ValueError('P must be a place of the function field F')
|
|
1322
|
+
|
|
1323
|
+
# Apply the completion map to a to get v(a) and a0
|
|
1324
|
+
ser_a = sigma(a)
|
|
1325
|
+
v_a = ser_a.valuation()
|
|
1326
|
+
a0 = ser_a.coefficients()[0]
|
|
1327
|
+
|
|
1328
|
+
# Apply the completion map to b to get v(b) and b0
|
|
1329
|
+
ser_b = sigma(b)
|
|
1330
|
+
v_b = ser_b.valuation()
|
|
1331
|
+
b0 = ser_b.coefficients()[0]
|
|
1332
|
+
|
|
1333
|
+
# Get the residue field of the completion together with the necessary exponent
|
|
1334
|
+
k = sigma.codomain().base_ring()
|
|
1335
|
+
e = (k.order() - 1) // 2
|
|
1336
|
+
|
|
1337
|
+
# Use Euler's criterion to compute the powers of Legendre symbols
|
|
1338
|
+
a_rd_pw = a0**(v_b * e)
|
|
1339
|
+
b_rd_pw = b0**(v_a * e)
|
|
1340
|
+
|
|
1341
|
+
# Finally, put the result together and transform it into the correct output
|
|
1342
|
+
res = k(-1)**(v_a * v_b * e) * a_rd_pw * b_rd_pw
|
|
1343
|
+
|
|
1344
|
+
from sage.rings.integer import Integer
|
|
1345
|
+
return Integer(1) if res.is_one() else Integer(-1)
|
|
1346
|
+
|
|
1347
|
+
def extension_constant_field(self, k):
|
|
1348
|
+
"""
|
|
1349
|
+
Return the constant field extension with constant field `k`.
|
|
1350
|
+
|
|
1351
|
+
INPUT:
|
|
1352
|
+
|
|
1353
|
+
- ``k`` -- an extension field of the constant field of this function field
|
|
1354
|
+
|
|
1355
|
+
EXAMPLES::
|
|
1356
|
+
|
|
1357
|
+
sage: # needs sage.rings.function_field
|
|
1358
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
1359
|
+
sage: F.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
1360
|
+
sage: E = F.extension_constant_field(GF(2^4))
|
|
1361
|
+
sage: E
|
|
1362
|
+
Function field in y defined by y^2 + y + (x^2 + 1)/x over its base
|
|
1363
|
+
sage: E.constant_base_field()
|
|
1364
|
+
Finite Field in z4 of size 2^4
|
|
1365
|
+
"""
|
|
1366
|
+
from .extensions import ConstantFieldExtension
|
|
1367
|
+
return ConstantFieldExtension(self, k)
|
|
1368
|
+
|
|
1369
|
+
@cached_method
|
|
1370
|
+
def jacobian(self, model=None, base_div=None, **kwds):
|
|
1371
|
+
"""
|
|
1372
|
+
Return the Jacobian of the function field.
|
|
1373
|
+
|
|
1374
|
+
INPUT:
|
|
1375
|
+
|
|
1376
|
+
- ``model`` -- (default: ``'hess'``) model to use for arithmetic
|
|
1377
|
+
|
|
1378
|
+
- ``base_div`` -- an effective divisor
|
|
1379
|
+
|
|
1380
|
+
The degree of the base divisor should satisfy certain degree condition
|
|
1381
|
+
corresponding to the model used. The following table lists these
|
|
1382
|
+
conditions. Let `g` be the genus of the function field.
|
|
1383
|
+
|
|
1384
|
+
- ``hess``: ideal-based arithmetic; requires base divisor of degree `g`
|
|
1385
|
+
|
|
1386
|
+
- ``km_large``: Khuri-Makdisi's large model; requires base divisor of
|
|
1387
|
+
degree at least `2g + 1`
|
|
1388
|
+
|
|
1389
|
+
- ``km_medium``: Khuri-Makdisi's medium model; requires base divisor of
|
|
1390
|
+
degree at least `2g + 1`
|
|
1391
|
+
|
|
1392
|
+
- ``km_small``: Khuri-Makdisi's small model requires base divisor of
|
|
1393
|
+
degree at least `g + 1`
|
|
1394
|
+
|
|
1395
|
+
We assume the function field has a rational place. If a base divisor is
|
|
1396
|
+
not given, one is constructed using an arbitrary rational place.
|
|
1397
|
+
|
|
1398
|
+
EXAMPLES::
|
|
1399
|
+
|
|
1400
|
+
sage: # needs sage.schemes
|
|
1401
|
+
sage: A.<x,y> = AffineSpace(GF(5), 2)
|
|
1402
|
+
sage: C = Curve(y^2*(x^3 - 1) - (x^3 - 2))
|
|
1403
|
+
sage: F = C.function_field()
|
|
1404
|
+
sage: F.jacobian()
|
|
1405
|
+
Jacobian of Function field in y defined by (x^3 + 4)*y^2 + 4*x^3 + 2 (Hess model)
|
|
1406
|
+
|
|
1407
|
+
TESTS:
|
|
1408
|
+
|
|
1409
|
+
sage: # needs sage.schemes
|
|
1410
|
+
sage: A.<x,y> = AffineSpace(QQ, 2)
|
|
1411
|
+
sage: C = Curve(y^2 - x^3 - 1, A).projective_closure()
|
|
1412
|
+
sage: C.jacobian(model='hess')
|
|
1413
|
+
Traceback (most recent call last):
|
|
1414
|
+
...
|
|
1415
|
+
ValueError: failed to obtain a rational place; provide a base divisor
|
|
1416
|
+
"""
|
|
1417
|
+
from .place import FunctionFieldPlace
|
|
1418
|
+
|
|
1419
|
+
if model is None:
|
|
1420
|
+
model = 'hess'
|
|
1421
|
+
|
|
1422
|
+
if base_div is None:
|
|
1423
|
+
try:
|
|
1424
|
+
base_place = self.get_place(1)
|
|
1425
|
+
except AttributeError:
|
|
1426
|
+
raise ValueError('failed to obtain a rational place; provide a base divisor')
|
|
1427
|
+
if base_place is None:
|
|
1428
|
+
raise ValueError('the function field has no rational place')
|
|
1429
|
+
# appropriate base divisor is constructed below.
|
|
1430
|
+
else:
|
|
1431
|
+
if isinstance(base_div, FunctionFieldPlace):
|
|
1432
|
+
base_div = base_div.divisor()
|
|
1433
|
+
|
|
1434
|
+
g = self.genus()
|
|
1435
|
+
curve = kwds.get('curve')
|
|
1436
|
+
|
|
1437
|
+
if model.startswith('km'):
|
|
1438
|
+
from .jacobian_khuri_makdisi import Jacobian
|
|
1439
|
+
if model == 'km' or model.endswith('large'):
|
|
1440
|
+
if base_div is None:
|
|
1441
|
+
base_div = (2*g + 1) * base_place
|
|
1442
|
+
if not base_div.degree() >= 2*g + 1:
|
|
1443
|
+
raise ValueError("Khuri-Makdisi large model requires base divisor of degree "
|
|
1444
|
+
"at least 2*g + 1 for genus g")
|
|
1445
|
+
return Jacobian(self, base_div, model='large', curve=curve)
|
|
1446
|
+
elif model.endswith('medium'):
|
|
1447
|
+
if base_div is None:
|
|
1448
|
+
base_div = (2*g + 1) * base_place
|
|
1449
|
+
if not base_div.degree() >= 2*g + 1:
|
|
1450
|
+
raise ValueError("Khuri-Makdisi medium model requires base divisor of degree "
|
|
1451
|
+
"at least 2*g + 1 for genus g")
|
|
1452
|
+
return Jacobian(self, base_div, model='medium', curve=curve)
|
|
1453
|
+
elif model.endswith('small'):
|
|
1454
|
+
if base_div is None:
|
|
1455
|
+
base_div = (g + 1) * base_place
|
|
1456
|
+
if not base_div.degree() >= g + 1:
|
|
1457
|
+
raise ValueError("Khuri-Makdisi small model requires base divisor of degree "
|
|
1458
|
+
"at least g + 1 for genus g")
|
|
1459
|
+
return Jacobian(self, base_div, model='small', curve=curve)
|
|
1460
|
+
elif model == 'hess':
|
|
1461
|
+
from .jacobian_hess import Jacobian
|
|
1462
|
+
if base_div is None:
|
|
1463
|
+
base_div = g * base_place
|
|
1464
|
+
if base_div.degree() != g:
|
|
1465
|
+
raise ValueError("Hess model requires base divisor of degree g for genus g")
|
|
1466
|
+
return Jacobian(self, base_div, curve=curve)
|
|
1467
|
+
|
|
1468
|
+
raise ValueError("unknown model")
|