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,1039 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Morphisms of function fields
|
|
4
|
+
|
|
5
|
+
Maps and morphisms useful for computations with function fields.
|
|
6
|
+
|
|
7
|
+
EXAMPLES::
|
|
8
|
+
|
|
9
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
10
|
+
sage: K.hom(1/x)
|
|
11
|
+
Function Field endomorphism of Rational function field in x over Rational Field
|
|
12
|
+
Defn: x |--> 1/x
|
|
13
|
+
|
|
14
|
+
sage: # needs sage.rings.function_field
|
|
15
|
+
sage: L.<y> = K.extension(y^2 - x)
|
|
16
|
+
sage: K.hom(y)
|
|
17
|
+
Function Field morphism:
|
|
18
|
+
From: Rational function field in x over Rational Field
|
|
19
|
+
To: Function field in y defined by y^2 - x
|
|
20
|
+
Defn: x |--> y
|
|
21
|
+
sage: L.hom([y,x])
|
|
22
|
+
Function Field endomorphism of Function field in y defined by y^2 - x
|
|
23
|
+
Defn: y |--> y
|
|
24
|
+
x |--> x
|
|
25
|
+
sage: L.hom([x,y])
|
|
26
|
+
Traceback (most recent call last):
|
|
27
|
+
...
|
|
28
|
+
ValueError: invalid morphism
|
|
29
|
+
|
|
30
|
+
AUTHORS:
|
|
31
|
+
|
|
32
|
+
- William Stein (2010): initial version
|
|
33
|
+
|
|
34
|
+
- Julian Rüth (2011-09-14, 2014-06-23, 2017-08-21): refactored class hierarchy; added
|
|
35
|
+
derivation classes; morphisms to/from fraction fields
|
|
36
|
+
|
|
37
|
+
- Kwankyu Lee (2017-04-30): added higher derivations and completions
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
# ****************************************************************************
|
|
41
|
+
# Copyright (C) 2010 William Stein <wstein@gmail.com>
|
|
42
|
+
# 2011-2017 Julian Rüth <julian.rueth@gmail.com>
|
|
43
|
+
# 2017 Alyson Deines
|
|
44
|
+
# 2017-2019 Kwankyu Lee
|
|
45
|
+
# 2018-2019 Travis Scrimshaw
|
|
46
|
+
# 2019 Brent Baccala
|
|
47
|
+
# 2022 Xavier Caruso
|
|
48
|
+
# 2022 Frédéric Chapoton
|
|
49
|
+
#
|
|
50
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
51
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
52
|
+
# the License, or (at your option) any later version.
|
|
53
|
+
# https://www.gnu.org/licenses/
|
|
54
|
+
# ****************************************************************************
|
|
55
|
+
|
|
56
|
+
from sage.categories.homset import Hom
|
|
57
|
+
from sage.categories.map import Map
|
|
58
|
+
from sage.categories.morphism import Morphism, SetMorphism
|
|
59
|
+
from sage.misc.lazy_import import lazy_import
|
|
60
|
+
from sage.rings.infinity import infinity
|
|
61
|
+
from sage.rings.morphism import RingHomomorphism
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
lazy_import("sage.rings.function_field.derivations", (
|
|
65
|
+
"FunctionFieldDerivation",
|
|
66
|
+
"FunctionFieldHigherDerivation",
|
|
67
|
+
), deprecation=35230)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class FunctionFieldVectorSpaceIsomorphism(Morphism):
|
|
71
|
+
r"""
|
|
72
|
+
Base class for isomorphisms between function fields and vector spaces.
|
|
73
|
+
|
|
74
|
+
EXAMPLES::
|
|
75
|
+
|
|
76
|
+
sage: # needs sage.rings.function_field
|
|
77
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
78
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3)
|
|
79
|
+
sage: V, f, t = L.vector_space()
|
|
80
|
+
sage: isinstance(f, sage.rings.function_field.maps.FunctionFieldVectorSpaceIsomorphism)
|
|
81
|
+
True
|
|
82
|
+
"""
|
|
83
|
+
def _repr_(self) -> str:
|
|
84
|
+
"""
|
|
85
|
+
Return the string representation of this isomorphism.
|
|
86
|
+
|
|
87
|
+
EXAMPLES::
|
|
88
|
+
|
|
89
|
+
sage: # needs sage.rings.function_field
|
|
90
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
91
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3)
|
|
92
|
+
sage: V, f, t = L.vector_space()
|
|
93
|
+
sage: f
|
|
94
|
+
Isomorphism:
|
|
95
|
+
From: Vector space of dimension 2 over Rational function field in x over Rational Field
|
|
96
|
+
To: Function field in y defined by y^2 - x*y + 4*x^3
|
|
97
|
+
sage: t
|
|
98
|
+
Isomorphism:
|
|
99
|
+
From: Function field in y defined by y^2 - x*y + 4*x^3
|
|
100
|
+
To: Vector space of dimension 2 over Rational function field in x over Rational Field
|
|
101
|
+
"""
|
|
102
|
+
s = "Isomorphism:"
|
|
103
|
+
s += "\n From: {}".format(self.domain())
|
|
104
|
+
s += "\n To: {}".format(self.codomain())
|
|
105
|
+
return s
|
|
106
|
+
|
|
107
|
+
def is_injective(self) -> bool:
|
|
108
|
+
"""
|
|
109
|
+
Return ``True``, since the isomorphism is injective.
|
|
110
|
+
|
|
111
|
+
EXAMPLES::
|
|
112
|
+
|
|
113
|
+
sage: # needs sage.rings.function_field
|
|
114
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
115
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3)
|
|
116
|
+
sage: V, f, t = L.vector_space()
|
|
117
|
+
sage: f.is_injective()
|
|
118
|
+
True
|
|
119
|
+
"""
|
|
120
|
+
return True
|
|
121
|
+
|
|
122
|
+
def is_surjective(self) -> bool:
|
|
123
|
+
"""
|
|
124
|
+
Return ``True``, since the isomorphism is surjective.
|
|
125
|
+
|
|
126
|
+
EXAMPLES::
|
|
127
|
+
|
|
128
|
+
sage: # needs sage.rings.function_field
|
|
129
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
130
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3)
|
|
131
|
+
sage: V, f, t = L.vector_space()
|
|
132
|
+
sage: f.is_surjective()
|
|
133
|
+
True
|
|
134
|
+
"""
|
|
135
|
+
return True
|
|
136
|
+
|
|
137
|
+
def _richcmp_(self, other, op):
|
|
138
|
+
r"""
|
|
139
|
+
Compare this map to ``other``.
|
|
140
|
+
|
|
141
|
+
.. NOTE::
|
|
142
|
+
|
|
143
|
+
This implementation assumes that this isomorphism is defined by its
|
|
144
|
+
domain and codomain. Isomorphisms for which this is not true must
|
|
145
|
+
override this implementation.
|
|
146
|
+
|
|
147
|
+
EXAMPLES::
|
|
148
|
+
|
|
149
|
+
sage: K = QQ['x'].fraction_field()
|
|
150
|
+
sage: L = K.function_field()
|
|
151
|
+
sage: f = K.coerce_map_from(L)
|
|
152
|
+
sage: f == f
|
|
153
|
+
True
|
|
154
|
+
|
|
155
|
+
sage: # needs sage.rings.number_field
|
|
156
|
+
sage: K = QQbar['x'].fraction_field()
|
|
157
|
+
sage: L = K.function_field()
|
|
158
|
+
sage: g = K.coerce_map_from(L)
|
|
159
|
+
sage: f == g
|
|
160
|
+
False
|
|
161
|
+
"""
|
|
162
|
+
if type(self) is not type(other):
|
|
163
|
+
return NotImplemented
|
|
164
|
+
|
|
165
|
+
from sage.structure.richcmp import richcmp
|
|
166
|
+
return richcmp((self.domain(), self.codomain()),
|
|
167
|
+
(other.domain(), other.codomain()), op)
|
|
168
|
+
|
|
169
|
+
def __hash__(self):
|
|
170
|
+
r"""
|
|
171
|
+
Return a hash value of this map.
|
|
172
|
+
|
|
173
|
+
This implementation assumes that this isomorphism is defined by its
|
|
174
|
+
domain and codomain. Isomorphisms for which this is not true should
|
|
175
|
+
override this implementation.
|
|
176
|
+
|
|
177
|
+
EXAMPLES::
|
|
178
|
+
|
|
179
|
+
sage: K = QQ['x'].fraction_field()
|
|
180
|
+
sage: L = K.function_field()
|
|
181
|
+
sage: f = K.coerce_map_from(L)
|
|
182
|
+
sage: hash(f) == hash(f)
|
|
183
|
+
True
|
|
184
|
+
"""
|
|
185
|
+
return hash((self.domain(), self.codomain()))
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
class MapVectorSpaceToFunctionField(FunctionFieldVectorSpaceIsomorphism):
|
|
189
|
+
"""
|
|
190
|
+
Isomorphism from a vector space to a function field.
|
|
191
|
+
|
|
192
|
+
EXAMPLES::
|
|
193
|
+
|
|
194
|
+
sage: # needs sage.rings.function_field
|
|
195
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
196
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3)
|
|
197
|
+
sage: V, f, t = L.vector_space(); f
|
|
198
|
+
Isomorphism:
|
|
199
|
+
From: Vector space of dimension 2 over Rational function field in x over Rational Field
|
|
200
|
+
To: Function field in y defined by y^2 - x*y + 4*x^3
|
|
201
|
+
"""
|
|
202
|
+
def __init__(self, V, K):
|
|
203
|
+
"""
|
|
204
|
+
EXAMPLES::
|
|
205
|
+
|
|
206
|
+
sage: # needs sage.rings.function_field
|
|
207
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
208
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3)
|
|
209
|
+
sage: V, f, t = L.vector_space(); type(f)
|
|
210
|
+
<class 'sage.rings.function_field.maps.MapVectorSpaceToFunctionField'>
|
|
211
|
+
"""
|
|
212
|
+
self._V = V
|
|
213
|
+
self._K = K
|
|
214
|
+
self._R = K.polynomial_ring()
|
|
215
|
+
FunctionFieldVectorSpaceIsomorphism.__init__(self, Hom(V, K))
|
|
216
|
+
|
|
217
|
+
def _call_(self, v):
|
|
218
|
+
"""
|
|
219
|
+
Map ``v`` to the function field.
|
|
220
|
+
|
|
221
|
+
INPUT:
|
|
222
|
+
|
|
223
|
+
- ``v`` -- element of the vector space
|
|
224
|
+
|
|
225
|
+
EXAMPLES::
|
|
226
|
+
|
|
227
|
+
sage: # needs sage.rings.function_field
|
|
228
|
+
sage: K.<x> = FunctionField(QQ)
|
|
229
|
+
sage: R.<y> = K[]
|
|
230
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3)
|
|
231
|
+
sage: V, f, t = L.vector_space()
|
|
232
|
+
sage: f(x*V.0 + (1/x^3)*V.1) # indirect doctest
|
|
233
|
+
1/x^3*y + x
|
|
234
|
+
|
|
235
|
+
TESTS:
|
|
236
|
+
|
|
237
|
+
Test that this map is a bijection for some random inputs::
|
|
238
|
+
|
|
239
|
+
sage: # needs sage.rings.function_field
|
|
240
|
+
sage: R.<z> = L[]
|
|
241
|
+
sage: M.<z> = L.extension(z^3 - y - x)
|
|
242
|
+
sage: for F in [K, L, M]:
|
|
243
|
+
....: for base in F._intermediate_fields(K):
|
|
244
|
+
....: V, f, t = F.vector_space(base)
|
|
245
|
+
....: for i in range(100):
|
|
246
|
+
....: a = F.random_element()
|
|
247
|
+
....: assert(f(t(a)) == a)
|
|
248
|
+
"""
|
|
249
|
+
fields = self._K._intermediate_fields(self._V.base_field())
|
|
250
|
+
fields.pop()
|
|
251
|
+
degrees = [k.degree() for k in fields]
|
|
252
|
+
gens = [k.gen() for k in fields]
|
|
253
|
+
|
|
254
|
+
# construct the basis composed of powers of the generators of all the
|
|
255
|
+
# intermediate fields, i.e., 1, x, y, x*y, ...
|
|
256
|
+
from sage.misc.misc_c import prod
|
|
257
|
+
from itertools import product
|
|
258
|
+
exponents = product(*[range(d) for d in degrees])
|
|
259
|
+
basis = [prod(g**e for g, e in zip(gens, es)) for es in exponents]
|
|
260
|
+
|
|
261
|
+
# multiply the entries of v with the values in basis
|
|
262
|
+
coefficients = self._V(v).list()
|
|
263
|
+
ret = sum([c * b for (c, b) in zip(coefficients, basis)])
|
|
264
|
+
return self._K(ret)
|
|
265
|
+
|
|
266
|
+
def domain(self):
|
|
267
|
+
"""
|
|
268
|
+
Return the vector space which is the domain of the isomorphism.
|
|
269
|
+
|
|
270
|
+
EXAMPLES::
|
|
271
|
+
|
|
272
|
+
sage: # needs sage.rings.function_field
|
|
273
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
274
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3)
|
|
275
|
+
sage: V, f, t = L.vector_space()
|
|
276
|
+
sage: f.domain()
|
|
277
|
+
Vector space of dimension 2 over Rational function field in x over Rational Field
|
|
278
|
+
"""
|
|
279
|
+
return self._V
|
|
280
|
+
|
|
281
|
+
def codomain(self):
|
|
282
|
+
"""
|
|
283
|
+
Return the function field which is the codomain of the isomorphism.
|
|
284
|
+
|
|
285
|
+
EXAMPLES::
|
|
286
|
+
|
|
287
|
+
sage: # needs sage.rings.function_field
|
|
288
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
289
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3)
|
|
290
|
+
sage: V, f, t = L.vector_space()
|
|
291
|
+
sage: f.codomain()
|
|
292
|
+
Function field in y defined by y^2 - x*y + 4*x^3
|
|
293
|
+
"""
|
|
294
|
+
return self._K
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
class MapFunctionFieldToVectorSpace(FunctionFieldVectorSpaceIsomorphism):
|
|
298
|
+
"""
|
|
299
|
+
Isomorphism from a function field to a vector space.
|
|
300
|
+
|
|
301
|
+
EXAMPLES::
|
|
302
|
+
|
|
303
|
+
sage: # needs sage.rings.function_field
|
|
304
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
305
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3)
|
|
306
|
+
sage: V, f, t = L.vector_space(); t
|
|
307
|
+
Isomorphism:
|
|
308
|
+
From: Function field in y defined by y^2 - x*y + 4*x^3
|
|
309
|
+
To: Vector space of dimension 2 over Rational function field in x over Rational Field
|
|
310
|
+
"""
|
|
311
|
+
def __init__(self, K, V):
|
|
312
|
+
"""
|
|
313
|
+
Initialize.
|
|
314
|
+
|
|
315
|
+
INPUT:
|
|
316
|
+
|
|
317
|
+
- ``K`` -- function field
|
|
318
|
+
|
|
319
|
+
- ``V`` -- vector space isomorphic to the function field
|
|
320
|
+
|
|
321
|
+
EXAMPLES::
|
|
322
|
+
|
|
323
|
+
sage: # needs sage.rings.function_field
|
|
324
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
325
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3)
|
|
326
|
+
sage: V, f, t = L.vector_space()
|
|
327
|
+
sage: TestSuite(t).run(skip='_test_category')
|
|
328
|
+
"""
|
|
329
|
+
self._V = V
|
|
330
|
+
self._K = K
|
|
331
|
+
self._zero = K.base_ring()(0)
|
|
332
|
+
self._n = K.degree()
|
|
333
|
+
FunctionFieldVectorSpaceIsomorphism.__init__(self, Hom(K, V))
|
|
334
|
+
|
|
335
|
+
def _call_(self, x):
|
|
336
|
+
"""
|
|
337
|
+
Map ``x`` to the vector space.
|
|
338
|
+
|
|
339
|
+
EXAMPLES::
|
|
340
|
+
|
|
341
|
+
sage: # needs sage.rings.function_field
|
|
342
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
343
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3)
|
|
344
|
+
sage: V, f, t = L.vector_space()
|
|
345
|
+
sage: t(x + (1/x^3)*y) # indirect doctest
|
|
346
|
+
(x, 1/x^3)
|
|
347
|
+
|
|
348
|
+
TESTS:
|
|
349
|
+
|
|
350
|
+
Test that this map is a bijection for some random inputs::
|
|
351
|
+
|
|
352
|
+
sage: # needs sage.rings.function_field
|
|
353
|
+
sage: R.<z> = L[]
|
|
354
|
+
sage: M.<z> = L.extension(z^3 - y - x)
|
|
355
|
+
sage: for F in [K, L, M]:
|
|
356
|
+
....: for base in F._intermediate_fields(K):
|
|
357
|
+
....: V, f, t = F.vector_space(base)
|
|
358
|
+
....: for i in range(100):
|
|
359
|
+
....: a = V.random_element()
|
|
360
|
+
....: assert(t(f(a)) == a)
|
|
361
|
+
"""
|
|
362
|
+
ret = [x]
|
|
363
|
+
fields = self._K._intermediate_fields(self._V.base_field())
|
|
364
|
+
fields.pop()
|
|
365
|
+
from itertools import chain
|
|
366
|
+
for k in fields:
|
|
367
|
+
ret = chain.from_iterable([y.list() for y in ret])
|
|
368
|
+
ret = list(ret)
|
|
369
|
+
assert all(t.parent() is self._V.base_field() for t in ret)
|
|
370
|
+
return self._V(ret)
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
class FunctionFieldMorphism(RingHomomorphism):
|
|
374
|
+
"""
|
|
375
|
+
Base class for morphisms between function fields.
|
|
376
|
+
|
|
377
|
+
EXAMPLES::
|
|
378
|
+
|
|
379
|
+
sage: K.<x> = FunctionField(QQ)
|
|
380
|
+
sage: f = K.hom(1/x); f
|
|
381
|
+
Function Field endomorphism of Rational function field in x over Rational Field
|
|
382
|
+
Defn: x |--> 1/x
|
|
383
|
+
"""
|
|
384
|
+
def __init__(self, parent, im_gen, base_morphism):
|
|
385
|
+
"""
|
|
386
|
+
Initialize.
|
|
387
|
+
|
|
388
|
+
EXAMPLES::
|
|
389
|
+
|
|
390
|
+
sage: K.<x> = FunctionField(QQ)
|
|
391
|
+
sage: f = K.hom(1/x); f
|
|
392
|
+
Function Field endomorphism of Rational function field in x over Rational Field
|
|
393
|
+
Defn: x |--> 1/x
|
|
394
|
+
sage: TestSuite(f).run(skip='_test_category')
|
|
395
|
+
"""
|
|
396
|
+
RingHomomorphism.__init__(self, parent)
|
|
397
|
+
|
|
398
|
+
self._im_gen = im_gen
|
|
399
|
+
self._base_morphism = base_morphism
|
|
400
|
+
|
|
401
|
+
def _repr_type(self) -> str:
|
|
402
|
+
r"""
|
|
403
|
+
Return the type of the morphism for the purpose of printing.
|
|
404
|
+
|
|
405
|
+
EXAMPLES::
|
|
406
|
+
|
|
407
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
408
|
+
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
|
|
409
|
+
sage: L.<y> = K.extension(y^3 + 6*x^3 + x)
|
|
410
|
+
sage: f = L.hom(y*2)
|
|
411
|
+
sage: f._repr_type()
|
|
412
|
+
'Function Field'
|
|
413
|
+
"""
|
|
414
|
+
return "Function Field"
|
|
415
|
+
|
|
416
|
+
def _repr_defn(self) -> str:
|
|
417
|
+
"""
|
|
418
|
+
Return the string containing the definition of the morphism.
|
|
419
|
+
|
|
420
|
+
EXAMPLES::
|
|
421
|
+
|
|
422
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
423
|
+
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
|
|
424
|
+
sage: L.<y> = K.extension(y^3 + 6*x^3 + x)
|
|
425
|
+
sage: f = L.hom(y*2)
|
|
426
|
+
sage: f._repr_defn()
|
|
427
|
+
'y |--> 2*y'
|
|
428
|
+
"""
|
|
429
|
+
a = '%s |--> %s' % (self.domain().variable_name(), self._im_gen)
|
|
430
|
+
if self._base_morphism is not None:
|
|
431
|
+
a += '\n' + self._base_morphism._repr_defn()
|
|
432
|
+
return a
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
class FunctionFieldMorphism_polymod(FunctionFieldMorphism):
|
|
436
|
+
"""
|
|
437
|
+
Morphism from a finite extension of a function field to a function field.
|
|
438
|
+
|
|
439
|
+
EXAMPLES::
|
|
440
|
+
|
|
441
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
442
|
+
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
|
|
443
|
+
sage: L.<y> = K.extension(y^3 + 6*x^3 + x)
|
|
444
|
+
sage: f = L.hom(y*2); f
|
|
445
|
+
Function Field endomorphism of Function field in y defined by y^3 + 6*x^3 + x
|
|
446
|
+
Defn: y |--> 2*y
|
|
447
|
+
sage: factor(L.polynomial())
|
|
448
|
+
y^3 + 6*x^3 + x
|
|
449
|
+
sage: f(y).charpoly('y')
|
|
450
|
+
y^3 + 6*x^3 + x
|
|
451
|
+
"""
|
|
452
|
+
def __init__(self, parent, im_gen, base_morphism):
|
|
453
|
+
"""
|
|
454
|
+
Initialize.
|
|
455
|
+
|
|
456
|
+
EXAMPLES::
|
|
457
|
+
|
|
458
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
459
|
+
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
|
|
460
|
+
sage: L.<y> = K.extension(y^3 + 6*x^3 + x)
|
|
461
|
+
sage: f = L.hom(y*2)
|
|
462
|
+
sage: TestSuite(f).run(skip='_test_category')
|
|
463
|
+
"""
|
|
464
|
+
FunctionFieldMorphism.__init__(self, parent, im_gen, base_morphism)
|
|
465
|
+
# Verify that the morphism is valid:
|
|
466
|
+
R = self.codomain()['X']
|
|
467
|
+
v = parent.domain().polynomial().list()
|
|
468
|
+
if base_morphism is not None:
|
|
469
|
+
v = [base_morphism(a) for a in v]
|
|
470
|
+
f = R(v)
|
|
471
|
+
if f(im_gen):
|
|
472
|
+
raise ValueError("invalid morphism")
|
|
473
|
+
|
|
474
|
+
def _call_(self, x):
|
|
475
|
+
"""
|
|
476
|
+
EXAMPLES::
|
|
477
|
+
|
|
478
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
479
|
+
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
|
|
480
|
+
sage: L.<y> = K.extension(y^3 + 6*x^3 + x); f = L.hom(y*2)
|
|
481
|
+
sage: f(y/x + x^2/(x+1)) # indirect doctest
|
|
482
|
+
2/x*y + x^2/(x + 1)
|
|
483
|
+
sage: f(y)
|
|
484
|
+
2*y
|
|
485
|
+
"""
|
|
486
|
+
v = x.list()
|
|
487
|
+
if self._base_morphism is not None:
|
|
488
|
+
v = [self._base_morphism(a) for a in v]
|
|
489
|
+
f = v[0].parent()['X'](v)
|
|
490
|
+
return f(self._im_gen)
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
class FunctionFieldMorphism_rational(FunctionFieldMorphism):
|
|
494
|
+
"""
|
|
495
|
+
Morphism from a rational function field to a function field.
|
|
496
|
+
"""
|
|
497
|
+
def __init__(self, parent, im_gen, base_morphism):
|
|
498
|
+
"""
|
|
499
|
+
Initialize.
|
|
500
|
+
|
|
501
|
+
EXAMPLES::
|
|
502
|
+
|
|
503
|
+
sage: K.<x> = FunctionField(GF(7))
|
|
504
|
+
sage: f = K.hom(1/x); f
|
|
505
|
+
Function Field endomorphism of Rational function field in x over Finite Field of size 7
|
|
506
|
+
Defn: x |--> 1/x
|
|
507
|
+
"""
|
|
508
|
+
FunctionFieldMorphism.__init__(self, parent, im_gen, base_morphism)
|
|
509
|
+
|
|
510
|
+
def _call_(self, x):
|
|
511
|
+
"""
|
|
512
|
+
EXAMPLES::
|
|
513
|
+
|
|
514
|
+
sage: # needs sage.rings.finite_rings
|
|
515
|
+
sage: K.<x> = FunctionField(GF(7))
|
|
516
|
+
sage: f = K.hom(1/x); f
|
|
517
|
+
Function Field endomorphism of Rational function field in x over Finite Field of size 7
|
|
518
|
+
Defn: x |--> 1/x
|
|
519
|
+
sage: f(x + 1) # indirect doctest
|
|
520
|
+
(x + 1)/x
|
|
521
|
+
sage: 1/x + 1
|
|
522
|
+
(x + 1)/x
|
|
523
|
+
|
|
524
|
+
You can specify a morphism on the base ring::
|
|
525
|
+
|
|
526
|
+
sage: # needs sage.rings.number_field
|
|
527
|
+
sage: Qi = GaussianIntegers().fraction_field()
|
|
528
|
+
sage: i = Qi.gen()
|
|
529
|
+
sage: K.<x> = FunctionField(Qi)
|
|
530
|
+
sage: phi1 = Qi.hom([CC.gen()])
|
|
531
|
+
sage: phi2 = Qi.hom([-CC.gen()])
|
|
532
|
+
sage: f = K.hom(CC.pi(), phi1)
|
|
533
|
+
sage: f(1 + i + x)
|
|
534
|
+
4.14159265358979 + 1.00000000000000*I
|
|
535
|
+
sage: g = K.hom(CC.pi(), phi2)
|
|
536
|
+
sage: g(1 + i + x)
|
|
537
|
+
4.14159265358979 - 1.00000000000000*I
|
|
538
|
+
"""
|
|
539
|
+
a = x.element()
|
|
540
|
+
if self._base_morphism is None:
|
|
541
|
+
return a.subs({a.parent().gen(): self._im_gen})
|
|
542
|
+
|
|
543
|
+
f = self._base_morphism
|
|
544
|
+
num = a.numerator()
|
|
545
|
+
den = a.denominator()
|
|
546
|
+
R = self._im_gen.parent()['X']
|
|
547
|
+
num = R([f(c) for c in num.list()])
|
|
548
|
+
den = R([f(c) for c in den.list()])
|
|
549
|
+
return num.subs(self._im_gen) / den.subs(self._im_gen)
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
class FunctionFieldConversionToConstantBaseField(Map):
|
|
553
|
+
r"""
|
|
554
|
+
Conversion map from the function field to its constant base field.
|
|
555
|
+
|
|
556
|
+
EXAMPLES::
|
|
557
|
+
|
|
558
|
+
sage: K.<x> = FunctionField(QQ)
|
|
559
|
+
sage: QQ.convert_map_from(K)
|
|
560
|
+
Conversion map:
|
|
561
|
+
From: Rational function field in x over Rational Field
|
|
562
|
+
To: Rational Field
|
|
563
|
+
"""
|
|
564
|
+
def __init__(self, parent):
|
|
565
|
+
"""
|
|
566
|
+
Initialize.
|
|
567
|
+
|
|
568
|
+
TESTS::
|
|
569
|
+
|
|
570
|
+
sage: K.<x> = FunctionField(QQ)
|
|
571
|
+
sage: f = QQ.convert_map_from(K)
|
|
572
|
+
sage: from sage.rings.function_field.maps import FunctionFieldConversionToConstantBaseField
|
|
573
|
+
sage: isinstance(f, FunctionFieldConversionToConstantBaseField)
|
|
574
|
+
True
|
|
575
|
+
"""
|
|
576
|
+
Map.__init__(self, parent)
|
|
577
|
+
|
|
578
|
+
def _repr_type(self) -> str:
|
|
579
|
+
r"""
|
|
580
|
+
Return the type of this map (a conversion), for the purposes of
|
|
581
|
+
printing out ``self``.
|
|
582
|
+
|
|
583
|
+
EXAMPLES::
|
|
584
|
+
|
|
585
|
+
sage: K.<x> = FunctionField(QQ)
|
|
586
|
+
sage: QQ.convert_map_from(K) # indirect doctest
|
|
587
|
+
Conversion map:
|
|
588
|
+
From: Rational function field in x over Rational Field
|
|
589
|
+
To: Rational Field
|
|
590
|
+
"""
|
|
591
|
+
return "Conversion"
|
|
592
|
+
|
|
593
|
+
def _call_(self, x):
|
|
594
|
+
"""
|
|
595
|
+
EXAMPLES::
|
|
596
|
+
|
|
597
|
+
sage: K.<x> = FunctionField(QQ)
|
|
598
|
+
sage: QQ(K(1)) # indirect doctest
|
|
599
|
+
1
|
|
600
|
+
"""
|
|
601
|
+
return x.parent()._to_constant_base_field(x)
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
class FunctionFieldToFractionField(FunctionFieldVectorSpaceIsomorphism):
|
|
605
|
+
r"""
|
|
606
|
+
Isomorphism from rational function field to the isomorphic fraction
|
|
607
|
+
field of a polynomial ring.
|
|
608
|
+
|
|
609
|
+
EXAMPLES::
|
|
610
|
+
|
|
611
|
+
sage: K = QQ['x'].fraction_field()
|
|
612
|
+
sage: L = K.function_field()
|
|
613
|
+
sage: f = K.coerce_map_from(L); f
|
|
614
|
+
Isomorphism:
|
|
615
|
+
From: Rational function field in x over Rational Field
|
|
616
|
+
To: Fraction Field of Univariate Polynomial Ring in x over Rational Field
|
|
617
|
+
|
|
618
|
+
.. SEEALSO::
|
|
619
|
+
|
|
620
|
+
:class:`FractionFieldToFunctionField`
|
|
621
|
+
|
|
622
|
+
TESTS::
|
|
623
|
+
|
|
624
|
+
sage: from sage.rings.function_field.maps import FunctionFieldToFractionField
|
|
625
|
+
sage: isinstance(f, FunctionFieldToFractionField)
|
|
626
|
+
True
|
|
627
|
+
sage: TestSuite(f).run()
|
|
628
|
+
"""
|
|
629
|
+
def _call_(self, f):
|
|
630
|
+
r"""
|
|
631
|
+
Return the value of this map at ``f``.
|
|
632
|
+
|
|
633
|
+
EXAMPLES::
|
|
634
|
+
|
|
635
|
+
sage: K = QQ['x'].fraction_field()
|
|
636
|
+
sage: L = K.function_field()
|
|
637
|
+
sage: f = K.coerce_map_from(L)
|
|
638
|
+
sage: f(~L.gen())
|
|
639
|
+
1/x
|
|
640
|
+
"""
|
|
641
|
+
return self.codomain()(f.numerator(), f.denominator())
|
|
642
|
+
|
|
643
|
+
def section(self):
|
|
644
|
+
r"""
|
|
645
|
+
Return the inverse map of this isomorphism.
|
|
646
|
+
|
|
647
|
+
EXAMPLES::
|
|
648
|
+
|
|
649
|
+
sage: K = QQ['x'].fraction_field()
|
|
650
|
+
sage: L = K.function_field()
|
|
651
|
+
sage: f = K.coerce_map_from(L)
|
|
652
|
+
sage: f.section()
|
|
653
|
+
Isomorphism:
|
|
654
|
+
From: Fraction Field of Univariate Polynomial Ring in x over Rational Field
|
|
655
|
+
To: Rational function field in x over Rational Field
|
|
656
|
+
"""
|
|
657
|
+
parent = Hom(self.codomain(), self.domain())
|
|
658
|
+
return parent.__make_element_class__(FractionFieldToFunctionField)(parent.domain(), parent.codomain())
|
|
659
|
+
|
|
660
|
+
|
|
661
|
+
class FractionFieldToFunctionField(FunctionFieldVectorSpaceIsomorphism):
|
|
662
|
+
r"""
|
|
663
|
+
Isomorphism from a fraction field of a polynomial ring to the isomorphic
|
|
664
|
+
function field.
|
|
665
|
+
|
|
666
|
+
EXAMPLES::
|
|
667
|
+
|
|
668
|
+
sage: K = QQ['x'].fraction_field()
|
|
669
|
+
sage: L = K.function_field()
|
|
670
|
+
sage: f = L.coerce_map_from(K); f
|
|
671
|
+
Isomorphism:
|
|
672
|
+
From: Fraction Field of Univariate Polynomial Ring in x over Rational Field
|
|
673
|
+
To: Rational function field in x over Rational Field
|
|
674
|
+
|
|
675
|
+
.. SEEALSO::
|
|
676
|
+
|
|
677
|
+
:class:`FunctionFieldToFractionField`
|
|
678
|
+
|
|
679
|
+
TESTS::
|
|
680
|
+
|
|
681
|
+
sage: from sage.rings.function_field.maps import FractionFieldToFunctionField
|
|
682
|
+
sage: isinstance(f, FractionFieldToFunctionField)
|
|
683
|
+
True
|
|
684
|
+
sage: TestSuite(f).run()
|
|
685
|
+
"""
|
|
686
|
+
def _call_(self, f):
|
|
687
|
+
r"""
|
|
688
|
+
Return the value of this morphism at ``f``.
|
|
689
|
+
|
|
690
|
+
EXAMPLES::
|
|
691
|
+
|
|
692
|
+
sage: K = QQ['x'].fraction_field()
|
|
693
|
+
sage: L = K.function_field()
|
|
694
|
+
sage: f = L.coerce_map_from(K)
|
|
695
|
+
sage: f(~K.gen())
|
|
696
|
+
1/x
|
|
697
|
+
"""
|
|
698
|
+
return self.codomain()._element_constructor_(f)
|
|
699
|
+
|
|
700
|
+
def section(self):
|
|
701
|
+
r"""
|
|
702
|
+
Return the inverse map of this isomorphism.
|
|
703
|
+
|
|
704
|
+
EXAMPLES::
|
|
705
|
+
|
|
706
|
+
sage: K = QQ['x'].fraction_field()
|
|
707
|
+
sage: L = K.function_field()
|
|
708
|
+
sage: f = L.coerce_map_from(K)
|
|
709
|
+
sage: f.section()
|
|
710
|
+
Isomorphism:
|
|
711
|
+
From: Rational function field in x over Rational Field
|
|
712
|
+
To: Fraction Field of Univariate Polynomial Ring in x over Rational Field
|
|
713
|
+
"""
|
|
714
|
+
parent = Hom(self.codomain(), self.domain())
|
|
715
|
+
return parent.__make_element_class__(FunctionFieldToFractionField)(parent)
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
class FunctionFieldCompletion(Map):
|
|
719
|
+
"""
|
|
720
|
+
Completions on function fields.
|
|
721
|
+
|
|
722
|
+
INPUT:
|
|
723
|
+
|
|
724
|
+
- ``field`` -- function field
|
|
725
|
+
|
|
726
|
+
- ``place`` -- place of the function field
|
|
727
|
+
|
|
728
|
+
- ``name`` -- string for the name of the series variable
|
|
729
|
+
|
|
730
|
+
- ``prec`` -- positive integer; default precision
|
|
731
|
+
|
|
732
|
+
- ``gen_name`` -- string; name of the generator of the residue
|
|
733
|
+
field; used only when place is non-rational
|
|
734
|
+
|
|
735
|
+
EXAMPLES::
|
|
736
|
+
|
|
737
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
738
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
739
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
740
|
+
sage: p = L.places_finite()[0]
|
|
741
|
+
sage: m = L.completion(p)
|
|
742
|
+
sage: m
|
|
743
|
+
Completion map:
|
|
744
|
+
From: Function field in y defined by y^2 + y + (x^2 + 1)/x
|
|
745
|
+
To: Laurent Series Ring in s over Finite Field of size 2
|
|
746
|
+
sage: m(x)
|
|
747
|
+
s^2 + s^3 + s^4 + s^5 + s^7 + s^8 + s^9 + s^10 + s^12 + s^13
|
|
748
|
+
+ s^15 + s^16 + s^17 + s^19 + O(s^22)
|
|
749
|
+
sage: m(y)
|
|
750
|
+
s^-1 + 1 + s^3 + s^5 + s^7 + s^9 + s^13 + s^15 + s^17 + O(s^19)
|
|
751
|
+
sage: m(x*y) == m(x) * m(y)
|
|
752
|
+
True
|
|
753
|
+
sage: m(x+y) == m(x) + m(y)
|
|
754
|
+
True
|
|
755
|
+
|
|
756
|
+
The variable name of the series can be supplied. If the place is not
|
|
757
|
+
rational such that the residue field is a proper extension of the constant
|
|
758
|
+
field, you can also specify the generator name of the extension::
|
|
759
|
+
|
|
760
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
761
|
+
sage: p2 = L.places_finite(2)[0]
|
|
762
|
+
sage: p2
|
|
763
|
+
Place (x^2 + x + 1, x*y + 1)
|
|
764
|
+
sage: m2 = L.completion(p2, 't', gen_name='b')
|
|
765
|
+
sage: m2(x)
|
|
766
|
+
(b + 1) + t + t^2 + t^4 + t^8 + t^16 + O(t^20)
|
|
767
|
+
sage: m2(y)
|
|
768
|
+
b + b*t + b*t^3 + b*t^4 + (b + 1)*t^5 + (b + 1)*t^7 + b*t^9 + b*t^11
|
|
769
|
+
+ b*t^12 + b*t^13 + b*t^15 + b*t^16 + (b + 1)*t^17 + (b + 1)*t^19 + O(t^20)
|
|
770
|
+
"""
|
|
771
|
+
def __init__(self, field, place, name=None, prec=None, gen_name=None):
|
|
772
|
+
"""
|
|
773
|
+
Initialize.
|
|
774
|
+
|
|
775
|
+
EXAMPLES::
|
|
776
|
+
|
|
777
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
778
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
779
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
780
|
+
sage: p = L.places_finite()[0]
|
|
781
|
+
sage: m = L.completion(p)
|
|
782
|
+
sage: m
|
|
783
|
+
Completion map:
|
|
784
|
+
From: Function field in y defined by y^2 + y + (x^2 + 1)/x
|
|
785
|
+
To: Laurent Series Ring in s over Finite Field of size 2
|
|
786
|
+
"""
|
|
787
|
+
if name is None:
|
|
788
|
+
name = 's' # default
|
|
789
|
+
|
|
790
|
+
if gen_name is None:
|
|
791
|
+
gen_name = 'a' # default
|
|
792
|
+
|
|
793
|
+
k, from_k, to_k = place.residue_field(name=gen_name)
|
|
794
|
+
|
|
795
|
+
self._place = place
|
|
796
|
+
self._gen_name = gen_name
|
|
797
|
+
|
|
798
|
+
if prec == infinity:
|
|
799
|
+
from sage.rings.lazy_series_ring import LazyLaurentSeriesRing
|
|
800
|
+
codomain = LazyLaurentSeriesRing(k, name)
|
|
801
|
+
self._precision = infinity
|
|
802
|
+
else: # prec < infinity:
|
|
803
|
+
# if prec is None, the Laurent series ring provides default precision
|
|
804
|
+
from sage.rings.laurent_series_ring import LaurentSeriesRing
|
|
805
|
+
codomain = LaurentSeriesRing(k, name=name, default_prec=prec)
|
|
806
|
+
self._precision = codomain.default_prec()
|
|
807
|
+
|
|
808
|
+
Map.__init__(self, field, codomain)
|
|
809
|
+
|
|
810
|
+
def _repr_type(self) -> str:
|
|
811
|
+
"""
|
|
812
|
+
Return a string containing the type of the map.
|
|
813
|
+
|
|
814
|
+
EXAMPLES::
|
|
815
|
+
|
|
816
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
817
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
818
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
819
|
+
sage: p = L.places_finite()[0]
|
|
820
|
+
sage: m = L.completion(p)
|
|
821
|
+
sage: m # indirect doctest
|
|
822
|
+
Completion map:
|
|
823
|
+
From: Function field in y defined by y^2 + y + (x^2 + 1)/x
|
|
824
|
+
To: Laurent Series Ring in s over Finite Field of size 2
|
|
825
|
+
"""
|
|
826
|
+
return 'Completion'
|
|
827
|
+
|
|
828
|
+
def _call_(self, f):
|
|
829
|
+
"""
|
|
830
|
+
Call the completion for f.
|
|
831
|
+
|
|
832
|
+
EXAMPLES::
|
|
833
|
+
|
|
834
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
835
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
836
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
837
|
+
sage: p = L.places_finite()[0]
|
|
838
|
+
sage: m = L.completion(p)
|
|
839
|
+
sage: m(y)
|
|
840
|
+
s^-1 + 1 + s^3 + s^5 + s^7 + s^9 + s^13 + s^15 + s^17 + O(s^19)
|
|
841
|
+
"""
|
|
842
|
+
if self._precision == infinity:
|
|
843
|
+
return self._expand_lazy(f)
|
|
844
|
+
else:
|
|
845
|
+
return self._expand(f, prec=None)
|
|
846
|
+
|
|
847
|
+
def _call_with_args(self, f, args, kwds):
|
|
848
|
+
"""
|
|
849
|
+
Call the completion with ``args`` and ``kwds``.
|
|
850
|
+
|
|
851
|
+
EXAMPLES::
|
|
852
|
+
|
|
853
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
854
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
855
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
856
|
+
sage: p = L.places_finite()[0]
|
|
857
|
+
sage: m = L.completion(p)
|
|
858
|
+
sage: m(x+y, 10) # indirect doctest
|
|
859
|
+
s^-1 + 1 + s^2 + s^4 + s^8 + O(s^9)
|
|
860
|
+
"""
|
|
861
|
+
if self._precision == infinity:
|
|
862
|
+
return self._expand_lazy(f, *args, **kwds)
|
|
863
|
+
else:
|
|
864
|
+
return self._expand(f, *args, **kwds)
|
|
865
|
+
|
|
866
|
+
def _expand(self, f, prec=None):
|
|
867
|
+
"""
|
|
868
|
+
Return the Laurent series expansion of f with precision ``prec``.
|
|
869
|
+
|
|
870
|
+
INPUT:
|
|
871
|
+
|
|
872
|
+
- ``f`` -- element of the function field
|
|
873
|
+
|
|
874
|
+
- ``prec`` -- positive integer; relative precision of the series
|
|
875
|
+
|
|
876
|
+
EXAMPLES::
|
|
877
|
+
|
|
878
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
879
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
880
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
881
|
+
sage: p = L.places_finite()[0]
|
|
882
|
+
sage: m = L.completion(p)
|
|
883
|
+
sage: m(x, prec=20) # indirect doctest
|
|
884
|
+
s^2 + s^3 + s^4 + s^5 + s^7 + s^8 + s^9 + s^10 + s^12 + s^13 + s^15
|
|
885
|
+
+ s^16 + s^17 + s^19 + O(s^22)
|
|
886
|
+
"""
|
|
887
|
+
if prec is None:
|
|
888
|
+
prec = self._precision
|
|
889
|
+
|
|
890
|
+
place = self._place
|
|
891
|
+
F = place.function_field()
|
|
892
|
+
der = F.higher_derivation()
|
|
893
|
+
|
|
894
|
+
k, from_k, to_k = place.residue_field(name=self._gen_name)
|
|
895
|
+
sep = place.local_uniformizer()
|
|
896
|
+
|
|
897
|
+
val = f.valuation(place)
|
|
898
|
+
e = f * sep**(-val)
|
|
899
|
+
|
|
900
|
+
coeffs = [to_k(der._derive(e, i, sep)) for i in range(prec)]
|
|
901
|
+
return self.codomain()(coeffs, val).add_bigoh(prec + val)
|
|
902
|
+
|
|
903
|
+
def _expand_lazy(self, f):
|
|
904
|
+
"""
|
|
905
|
+
Return the lazy Laurent series expansion of ``f``.
|
|
906
|
+
|
|
907
|
+
INPUT:
|
|
908
|
+
|
|
909
|
+
- ``f`` -- element of the function field
|
|
910
|
+
|
|
911
|
+
EXAMPLES::
|
|
912
|
+
|
|
913
|
+
sage: # needs sage.combinat sage.rings.finite_rings sage.rings.function_field
|
|
914
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
915
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
916
|
+
sage: p = L.places_finite()[0]
|
|
917
|
+
sage: m = L.completion(p, prec=infinity)
|
|
918
|
+
sage: e = m(x); e
|
|
919
|
+
s^2 + s^3 + s^4 + s^5 + s^7 + s^8 + ...
|
|
920
|
+
sage: e.coefficient(99) # indirect doctest
|
|
921
|
+
0
|
|
922
|
+
sage: e.coefficient(100)
|
|
923
|
+
1
|
|
924
|
+
"""
|
|
925
|
+
place = self._place
|
|
926
|
+
F = place.function_field()
|
|
927
|
+
der = F.higher_derivation()
|
|
928
|
+
|
|
929
|
+
k, from_k, to_k = place.residue_field(name=self._gen_name)
|
|
930
|
+
sep = place.local_uniformizer()
|
|
931
|
+
|
|
932
|
+
val = f.valuation(place)
|
|
933
|
+
e = f * sep**(-val)
|
|
934
|
+
|
|
935
|
+
def coeff(s, n):
|
|
936
|
+
return to_k(der._derive(e, n - val, sep))
|
|
937
|
+
|
|
938
|
+
return self.codomain().series(coeff, valuation=val)
|
|
939
|
+
|
|
940
|
+
def default_precision(self):
|
|
941
|
+
"""
|
|
942
|
+
Return the default precision.
|
|
943
|
+
|
|
944
|
+
EXAMPLES::
|
|
945
|
+
|
|
946
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
947
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
948
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
949
|
+
sage: p = L.places_finite()[0]
|
|
950
|
+
sage: m = L.completion(p)
|
|
951
|
+
sage: m.default_precision()
|
|
952
|
+
20
|
|
953
|
+
"""
|
|
954
|
+
return self._precision
|
|
955
|
+
|
|
956
|
+
|
|
957
|
+
class FunctionFieldRingMorphism(SetMorphism):
|
|
958
|
+
"""
|
|
959
|
+
Ring homomorphism.
|
|
960
|
+
"""
|
|
961
|
+
def _repr_(self) -> str:
|
|
962
|
+
"""
|
|
963
|
+
Return the string representation of the map.
|
|
964
|
+
|
|
965
|
+
EXAMPLES::
|
|
966
|
+
|
|
967
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
968
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
969
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
970
|
+
sage: p = L.places_finite()[0]
|
|
971
|
+
sage: R = p.valuation_ring()
|
|
972
|
+
sage: k, fr_k, to_k = R.residue_field()
|
|
973
|
+
sage: k
|
|
974
|
+
Finite Field of size 2
|
|
975
|
+
sage: fr_k
|
|
976
|
+
Ring morphism:
|
|
977
|
+
From: Finite Field of size 2
|
|
978
|
+
To: Valuation ring at Place (x, x*y)
|
|
979
|
+
"""
|
|
980
|
+
s = "Ring morphism:"
|
|
981
|
+
s += "\n From: {}".format(self.domain())
|
|
982
|
+
s += "\n To: {}".format(self.codomain())
|
|
983
|
+
return s
|
|
984
|
+
|
|
985
|
+
|
|
986
|
+
class FunctionFieldLinearMap(SetMorphism):
|
|
987
|
+
"""
|
|
988
|
+
Linear map to function fields.
|
|
989
|
+
"""
|
|
990
|
+
def _repr_(self) -> str:
|
|
991
|
+
"""
|
|
992
|
+
Return the string representation of the map.
|
|
993
|
+
|
|
994
|
+
EXAMPLES::
|
|
995
|
+
|
|
996
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
997
|
+
sage: K.<x> = FunctionField(GF(5)); R.<t> = PolynomialRing(K)
|
|
998
|
+
sage: F.<y> = K.extension(t^2-x^3-1)
|
|
999
|
+
sage: O = F.maximal_order()
|
|
1000
|
+
sage: I = O.ideal(x - 2)
|
|
1001
|
+
sage: D = I.divisor()
|
|
1002
|
+
sage: V, from_V, to_V = D.function_space()
|
|
1003
|
+
sage: from_V
|
|
1004
|
+
Linear map:
|
|
1005
|
+
From: Vector space of dimension 2 over Finite Field of size 5
|
|
1006
|
+
To: Function field in y defined by y^2 + 4*x^3 + 4
|
|
1007
|
+
"""
|
|
1008
|
+
s = "Linear map:"
|
|
1009
|
+
s += "\n From: {}".format(self.domain())
|
|
1010
|
+
s += "\n To: {}".format(self.codomain())
|
|
1011
|
+
return s
|
|
1012
|
+
|
|
1013
|
+
|
|
1014
|
+
class FunctionFieldLinearMapSection(SetMorphism):
|
|
1015
|
+
"""
|
|
1016
|
+
Section of linear map from function fields.
|
|
1017
|
+
"""
|
|
1018
|
+
def _repr_(self) -> str:
|
|
1019
|
+
"""
|
|
1020
|
+
Return the string representation of the map.
|
|
1021
|
+
|
|
1022
|
+
EXAMPLES::
|
|
1023
|
+
|
|
1024
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
1025
|
+
sage: K.<x> = FunctionField(GF(5)); R.<t> = PolynomialRing(K)
|
|
1026
|
+
sage: F.<y> = K.extension(t^2 - x^3 - 1)
|
|
1027
|
+
sage: O = F.maximal_order()
|
|
1028
|
+
sage: I = O.ideal(x - 2)
|
|
1029
|
+
sage: D = I.divisor()
|
|
1030
|
+
sage: V, from_V, to_V = D.function_space()
|
|
1031
|
+
sage: to_V
|
|
1032
|
+
Section of linear map:
|
|
1033
|
+
From: Function field in y defined by y^2 + 4*x^3 + 4
|
|
1034
|
+
To: Vector space of dimension 2 over Finite Field of size 5
|
|
1035
|
+
"""
|
|
1036
|
+
s = "Section of linear map:"
|
|
1037
|
+
s += "\n From: {}".format(self.domain())
|
|
1038
|
+
s += "\n To: {}".format(self.codomain())
|
|
1039
|
+
return s
|