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,1008 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Elements of function fields
|
|
4
|
+
|
|
5
|
+
Sage provides arithmetic with elements of function fields.
|
|
6
|
+
|
|
7
|
+
EXAMPLES:
|
|
8
|
+
|
|
9
|
+
Arithmetic with rational functions::
|
|
10
|
+
|
|
11
|
+
sage: K.<t> = FunctionField(QQ)
|
|
12
|
+
sage: f = t - 1
|
|
13
|
+
sage: g = t^2 - 3
|
|
14
|
+
sage: h = f^2/g^3
|
|
15
|
+
sage: h.valuation(t-1)
|
|
16
|
+
2
|
|
17
|
+
sage: h.valuation(t)
|
|
18
|
+
0
|
|
19
|
+
sage: h.valuation(t^2 - 3)
|
|
20
|
+
-3
|
|
21
|
+
|
|
22
|
+
Derivatives of elements in separable extensions::
|
|
23
|
+
|
|
24
|
+
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings
|
|
25
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.finite_rings sage.rings.function_field
|
|
26
|
+
sage: (y^3 + x).derivative() # needs sage.rings.finite_rings sage.rings.function_field
|
|
27
|
+
((x^2 + 1)/x^2)*y + (x^4 + x^3 + 1)/x^3
|
|
28
|
+
|
|
29
|
+
The divisor of an element of a global function field::
|
|
30
|
+
|
|
31
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
32
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.function_field
|
|
33
|
+
sage: y.divisor() # needs sage.rings.function_field
|
|
34
|
+
- Place (1/x, 1/x*y)
|
|
35
|
+
- Place (x, x*y)
|
|
36
|
+
+ 2*Place (x + 1, x*y)
|
|
37
|
+
|
|
38
|
+
AUTHORS:
|
|
39
|
+
|
|
40
|
+
- William Stein: initial version
|
|
41
|
+
|
|
42
|
+
- Robert Bradshaw (2010-05-27): cythonize function field elements
|
|
43
|
+
|
|
44
|
+
- Julian Rueth (2011-06-28, 2020-09-01): treat zero correctly; implement nth_root/is_nth_power
|
|
45
|
+
|
|
46
|
+
- Maarten Derickx (2011-09-11): added doctests, fixed pickling
|
|
47
|
+
|
|
48
|
+
- Kwankyu Lee (2017-04-30): added elements for global function fields
|
|
49
|
+
|
|
50
|
+
- Vincent Macri (2024-09-03): added subs method
|
|
51
|
+
"""
|
|
52
|
+
# *****************************************************************************
|
|
53
|
+
# Copyright (C) 2010 William Stein <wstein@gmail.com>
|
|
54
|
+
# 2010 Robert Bradshaw <robertwb@math.washington.edu>
|
|
55
|
+
# 2011-2020 Julian Rueth <julian.rueth@gmail.com>
|
|
56
|
+
# 2011 Maarten Derickx <m.derickx.student@gmail.com>
|
|
57
|
+
# 2015 Nils Bruin
|
|
58
|
+
# 2016 Frédéric Chapoton
|
|
59
|
+
# 2017-2019 Kwankyu Lee
|
|
60
|
+
# 2018-2020 Travis Scrimshaw
|
|
61
|
+
# 2019 Brent Baccala
|
|
62
|
+
# 2021 Saher Amasha
|
|
63
|
+
# 2024 Vincent Macri
|
|
64
|
+
#
|
|
65
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
66
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
67
|
+
# the License, or (at your option) any later version.
|
|
68
|
+
# https://www.gnu.org/licenses/
|
|
69
|
+
# *****************************************************************************
|
|
70
|
+
|
|
71
|
+
from sage.categories.function_fields import FunctionFields
|
|
72
|
+
from sage.misc.cachefunc import cached_method
|
|
73
|
+
from sage.structure.element cimport FieldElement
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def is_FunctionFieldElement(x):
|
|
77
|
+
"""
|
|
78
|
+
Return ``True`` if ``x`` is any type of function field element.
|
|
79
|
+
|
|
80
|
+
EXAMPLES::
|
|
81
|
+
|
|
82
|
+
sage: t = FunctionField(QQ,'t').gen()
|
|
83
|
+
sage: sage.rings.function_field.element.is_FunctionFieldElement(t)
|
|
84
|
+
doctest:warning...
|
|
85
|
+
DeprecationWarning: The function is_FunctionFieldElement is deprecated;
|
|
86
|
+
use '....parent() in FunctionFields()' instead.
|
|
87
|
+
See https://github.com/sagemath/sage/issues/38289 for details.
|
|
88
|
+
True
|
|
89
|
+
sage: sage.rings.function_field.element.is_FunctionFieldElement(0)
|
|
90
|
+
False
|
|
91
|
+
"""
|
|
92
|
+
from sage.misc.superseded import deprecation_cython
|
|
93
|
+
deprecation_cython(38289,
|
|
94
|
+
"The function is_FunctionFieldElement is deprecated; "
|
|
95
|
+
"use '....parent() in FunctionFields()' instead.")
|
|
96
|
+
if isinstance(x, FunctionFieldElement):
|
|
97
|
+
return True
|
|
98
|
+
from sage.rings.function_field.function_field import FunctionField
|
|
99
|
+
if isinstance(x.parent(), FunctionField):
|
|
100
|
+
return True
|
|
101
|
+
return x.parent() in FunctionFields()
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def make_FunctionFieldElement(parent, element_class, representing_element):
|
|
105
|
+
"""
|
|
106
|
+
Used for unpickling FunctionFieldElement objects (and subclasses).
|
|
107
|
+
|
|
108
|
+
EXAMPLES::
|
|
109
|
+
|
|
110
|
+
sage: from sage.rings.function_field.element import make_FunctionFieldElement
|
|
111
|
+
sage: K.<x> = FunctionField(QQ)
|
|
112
|
+
sage: make_FunctionFieldElement(K, K.element_class, (x+1)/x)
|
|
113
|
+
(x + 1)/x
|
|
114
|
+
"""
|
|
115
|
+
return element_class(parent, representing_element, reduce=False)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
cdef class FunctionFieldElement(FieldElement):
|
|
119
|
+
"""
|
|
120
|
+
Abstract base class for function field elements.
|
|
121
|
+
|
|
122
|
+
EXAMPLES::
|
|
123
|
+
|
|
124
|
+
sage: t = FunctionField(QQ,'t').gen()
|
|
125
|
+
sage: isinstance(t, sage.rings.function_field.element.FunctionFieldElement)
|
|
126
|
+
True
|
|
127
|
+
"""
|
|
128
|
+
def __reduce__(self):
|
|
129
|
+
"""
|
|
130
|
+
EXAMPLES::
|
|
131
|
+
|
|
132
|
+
sage: K = FunctionField(QQ,'x')
|
|
133
|
+
sage: f = K.random_element()
|
|
134
|
+
sage: loads(f.dumps()) == f
|
|
135
|
+
True
|
|
136
|
+
"""
|
|
137
|
+
return (make_FunctionFieldElement,
|
|
138
|
+
(self._parent, type(self), self._x))
|
|
139
|
+
|
|
140
|
+
cdef FunctionFieldElement _new_c(self):
|
|
141
|
+
cdef type t = type(self)
|
|
142
|
+
cdef FunctionFieldElement x = <FunctionFieldElement>t.__new__(t)
|
|
143
|
+
x._parent = self._parent
|
|
144
|
+
return x
|
|
145
|
+
|
|
146
|
+
def __pari__(self):
|
|
147
|
+
r"""
|
|
148
|
+
Coerce the element to PARI.
|
|
149
|
+
|
|
150
|
+
PARI does not know about general function field elements, so this
|
|
151
|
+
raises an Exception.
|
|
152
|
+
|
|
153
|
+
TESTS:
|
|
154
|
+
|
|
155
|
+
Check that :issue:`16369` has been resolved::
|
|
156
|
+
|
|
157
|
+
sage: K.<a> = FunctionField(QQ)
|
|
158
|
+
sage: R.<b> = K[]
|
|
159
|
+
sage: L.<b> = K.extension(b^2 - a) # needs sage.rings.function_field
|
|
160
|
+
sage: b.__pari__() # needs sage.rings.function_field
|
|
161
|
+
Traceback (most recent call last):
|
|
162
|
+
...
|
|
163
|
+
NotImplementedError: PARI does not support general function field elements.
|
|
164
|
+
"""
|
|
165
|
+
raise NotImplementedError("PARI does not support general function field elements.")
|
|
166
|
+
|
|
167
|
+
def _latex_(self):
|
|
168
|
+
r"""
|
|
169
|
+
EXAMPLES::
|
|
170
|
+
|
|
171
|
+
sage: K.<t> = FunctionField(QQ)
|
|
172
|
+
sage: latex((t+1)/t)
|
|
173
|
+
\frac{t + 1}{t}
|
|
174
|
+
sage: latex((t+1)/t^67)
|
|
175
|
+
\frac{t + 1}{t^{67}}
|
|
176
|
+
sage: latex((t+1/2)/t^67)
|
|
177
|
+
\frac{t + \frac{1}{2}}{t^{67}}
|
|
178
|
+
"""
|
|
179
|
+
return self._x._latex_()
|
|
180
|
+
|
|
181
|
+
def subs(self, in_dict=None, **kwds):
|
|
182
|
+
r"""
|
|
183
|
+
Substitute the given generators with given values while not touching
|
|
184
|
+
other generators.
|
|
185
|
+
|
|
186
|
+
INPUT:
|
|
187
|
+
|
|
188
|
+
- ``in_dict`` -- (optional) dictionary of inputs
|
|
189
|
+
|
|
190
|
+
- ``**kwds`` -- named parameters
|
|
191
|
+
|
|
192
|
+
OUTPUT: new object if substitution is possible, otherwise ``self``
|
|
193
|
+
|
|
194
|
+
EXAMPLES:
|
|
195
|
+
|
|
196
|
+
Basic substitution::
|
|
197
|
+
|
|
198
|
+
sage: K = GF(7)
|
|
199
|
+
sage: Kx.<x> = FunctionField(K)
|
|
200
|
+
sage: y = polygen(Kx)
|
|
201
|
+
sage: f = x^6 + 3; f
|
|
202
|
+
x^6 + 3
|
|
203
|
+
|
|
204
|
+
We also substitute the generators in any base fields::
|
|
205
|
+
|
|
206
|
+
sage: # needs sage.rings.function_field
|
|
207
|
+
sage: K.<x> = FunctionField(QQ)
|
|
208
|
+
sage: R.<y> = K[]
|
|
209
|
+
sage: L.<y> = K.extension(y^3 - (x^3 + 2*x*y + 1/x))
|
|
210
|
+
sage: S.<t> = L[]
|
|
211
|
+
sage: M.<t> = L.extension(t^2 - x*y)
|
|
212
|
+
sage: f = 7 * t + 3*x*y
|
|
213
|
+
sage: f.subs(t=9)
|
|
214
|
+
3*x*y + 63
|
|
215
|
+
sage: f.subs(x=2, y=4)
|
|
216
|
+
7*t + 24
|
|
217
|
+
sage: f.subs(t=1, x=2, y=3)
|
|
218
|
+
25
|
|
219
|
+
|
|
220
|
+
Because of the possibility of extension fields, a generator to
|
|
221
|
+
substitute must be specified::
|
|
222
|
+
|
|
223
|
+
sage: K.<x> = FunctionField(QQ)
|
|
224
|
+
sage: f = x
|
|
225
|
+
sage: f.subs(2)
|
|
226
|
+
Traceback (most recent call last):
|
|
227
|
+
...
|
|
228
|
+
TypeError: in_dict must be a dict
|
|
229
|
+
|
|
230
|
+
sage: # needs sage.rings.function_field
|
|
231
|
+
sage: R.<y> = K[]
|
|
232
|
+
sage: L.<y> = K.extension(y^3 - (x^3 + 2*x*y + 1/x))
|
|
233
|
+
sage: f = x + y
|
|
234
|
+
sage: f.subs(0)
|
|
235
|
+
Traceback (most recent call last):
|
|
236
|
+
...
|
|
237
|
+
TypeError: in_dict must be a dict
|
|
238
|
+
|
|
239
|
+
We can also substitute using dictionary syntax::
|
|
240
|
+
|
|
241
|
+
sage: # needs sage.rings.function_field
|
|
242
|
+
sage: K.<x> = FunctionField(QQ)
|
|
243
|
+
sage: R.<y> = K[]
|
|
244
|
+
sage: L.<y> = K.extension(y^3 - (x^3 + 2*x*y + 1/x))
|
|
245
|
+
sage: S.<t> = L[]
|
|
246
|
+
sage: M.<t> = L.extension(t^2 - x*y)
|
|
247
|
+
sage: f = x + y + t
|
|
248
|
+
sage: f.subs({x: 1, y: 3, t: 4})
|
|
249
|
+
8
|
|
250
|
+
sage: f.subs({x: 1, t: 4})
|
|
251
|
+
y + 5
|
|
252
|
+
|
|
253
|
+
TESTS:
|
|
254
|
+
|
|
255
|
+
Check that we correctly handle extension fields::
|
|
256
|
+
|
|
257
|
+
sage: # needs sage.rings.function_field
|
|
258
|
+
sage: K.<x> = FunctionField(QQ)
|
|
259
|
+
sage: R.<y> = K[]
|
|
260
|
+
sage: L.<y> = K.extension(y^3 - (x^3 + 2*x*y + 1/x))
|
|
261
|
+
sage: S.<t> = L[]
|
|
262
|
+
sage: M.<t> = L.extension(t^2 - x*y)
|
|
263
|
+
sage: f = t + x*y
|
|
264
|
+
sage: f.subs(x=1, y=3, t=5)
|
|
265
|
+
8
|
|
266
|
+
sage: f_sub = f.subs(x=1); f_sub
|
|
267
|
+
t + y
|
|
268
|
+
sage: f_sub.parent() == f.parent()
|
|
269
|
+
True
|
|
270
|
+
sage: f.subs(y=2)
|
|
271
|
+
t + 2*x
|
|
272
|
+
sage: f_sub = f.subs(x=1, y=1, t=1); f_sub
|
|
273
|
+
2
|
|
274
|
+
sage: f_sub.parent() == M
|
|
275
|
+
True
|
|
276
|
+
|
|
277
|
+
Test that substitution works for rational functions::
|
|
278
|
+
|
|
279
|
+
sage: # needs sage.rings.function_field
|
|
280
|
+
sage: K.<x> = FunctionField(QQ)
|
|
281
|
+
sage: R.<y> = K[]
|
|
282
|
+
sage: L.<y> = K.extension(y^4 - 3)
|
|
283
|
+
sage: f = x / y
|
|
284
|
+
sage: f.subs(x=2) == 2 / y
|
|
285
|
+
True
|
|
286
|
+
sage: f.subs(y=3)
|
|
287
|
+
9*x
|
|
288
|
+
sage: f.subs(t=-1) is f
|
|
289
|
+
True
|
|
290
|
+
sage: f.subs({x: 2, y: 4})
|
|
291
|
+
128/3
|
|
292
|
+
|
|
293
|
+
Make sure that we return the same object when there is no
|
|
294
|
+
substitution::
|
|
295
|
+
|
|
296
|
+
sage: K = GF(7)
|
|
297
|
+
sage: Kx.<x> = FunctionField(K)
|
|
298
|
+
sage: y = polygen(Kx)
|
|
299
|
+
sage: f = x^6 + 3
|
|
300
|
+
sage: g = f.subs(z=2)
|
|
301
|
+
sage: g == f
|
|
302
|
+
True
|
|
303
|
+
sage: g is f
|
|
304
|
+
True
|
|
305
|
+
|
|
306
|
+
Same purpose as above but over an extension field over the rationals::
|
|
307
|
+
|
|
308
|
+
sage: # needs sage.rings.function_field
|
|
309
|
+
sage: K.<x> = FunctionField(QQ)
|
|
310
|
+
sage: R.<y> = K[]
|
|
311
|
+
sage: L.<y> = K.extension(y^3 - (x^3 + 2*x*y + 1/x))
|
|
312
|
+
sage: S.<t> = L[]
|
|
313
|
+
sage: M.<t> = L.extension(t^2 - x*y)
|
|
314
|
+
sage: f = t + x*y
|
|
315
|
+
sage: f.subs() is f
|
|
316
|
+
True
|
|
317
|
+
sage: f.subs(w=7) is f
|
|
318
|
+
True
|
|
319
|
+
sage: f.subs(w=7) is f.subs(w=7)
|
|
320
|
+
True
|
|
321
|
+
sage: f.subs(y=y) is f
|
|
322
|
+
True
|
|
323
|
+
sage: f.subs({y: y}) is f
|
|
324
|
+
True
|
|
325
|
+
sage: f.subs(x=x, y=y, t=t) is f
|
|
326
|
+
True
|
|
327
|
+
|
|
328
|
+
Test proper handling of not making substitutions::
|
|
329
|
+
|
|
330
|
+
sage: # needs sage.rings.function_field
|
|
331
|
+
sage: K.<x> = FunctionField(QQ)
|
|
332
|
+
sage: f = x
|
|
333
|
+
sage: f.subs() is f
|
|
334
|
+
True
|
|
335
|
+
sage: f.subs(dict()) is f
|
|
336
|
+
True
|
|
337
|
+
sage: f.subs(w=0) is f
|
|
338
|
+
True
|
|
339
|
+
sage: R.<y> = K[]
|
|
340
|
+
sage: L.<y> = K.extension(y^3 - (x^3 + 2*x*y + 1/x))
|
|
341
|
+
sage: f = 3*y
|
|
342
|
+
sage: f.subs(x=0)
|
|
343
|
+
3*y
|
|
344
|
+
sage: f = 3*y
|
|
345
|
+
sage: f.subs(x=0, y=y)
|
|
346
|
+
3*y
|
|
347
|
+
|
|
348
|
+
Test error handling for wrong argument type::
|
|
349
|
+
|
|
350
|
+
sage: K.<x> = FunctionField(QQ)
|
|
351
|
+
sage: f = x
|
|
352
|
+
sage: f.subs(0)
|
|
353
|
+
Traceback (most recent call last):
|
|
354
|
+
...
|
|
355
|
+
TypeError: in_dict must be a dict
|
|
356
|
+
|
|
357
|
+
Test error handling for dictionary with keys that don't match
|
|
358
|
+
generators::
|
|
359
|
+
|
|
360
|
+
sage: K.<x> = FunctionField(QQ)
|
|
361
|
+
sage: f = x
|
|
362
|
+
sage: f.subs({1: 1})
|
|
363
|
+
Traceback (most recent call last):
|
|
364
|
+
...
|
|
365
|
+
TypeError: key does not match any field generators
|
|
366
|
+
|
|
367
|
+
Test error handling with ambiguously named generators::
|
|
368
|
+
|
|
369
|
+
sage: # needs sage.rings.function_field
|
|
370
|
+
sage: K.<x> = FunctionField(QQ)
|
|
371
|
+
sage: R.<x> = K[]
|
|
372
|
+
sage: L.<x> = K.extension(x^3 - x)
|
|
373
|
+
sage: str(L.gen()) == str(K.gen())
|
|
374
|
+
True
|
|
375
|
+
sage: f = K.gen() - L.gen()
|
|
376
|
+
sage: f.subs(x=2)
|
|
377
|
+
Traceback (most recent call last):
|
|
378
|
+
...
|
|
379
|
+
TypeError: multiple generators have the same name, making substitution ambiguous. Rename generators or pass substitution values in using dictionary format
|
|
380
|
+
sage: f.subs({K.gen(): 1})
|
|
381
|
+
-x + 1
|
|
382
|
+
sage: f.subs({L.gen(): 2})
|
|
383
|
+
x - 2
|
|
384
|
+
sage: f.subs({K.gen(): 1, L.gen(): 2})
|
|
385
|
+
-1
|
|
386
|
+
sage: f.subs({K.gen(): 2, L.gen(): 1})
|
|
387
|
+
1
|
|
388
|
+
"""
|
|
389
|
+
def sub_recurse(ff_element, sub_dict):
|
|
390
|
+
# Helper method to recurse through base fields.
|
|
391
|
+
ff = ff_element.parent()
|
|
392
|
+
if ff.base_field() == ff:
|
|
393
|
+
return ff(ff_element._x.subs({ff.gen(): sub_dict[ff.gen()]}))
|
|
394
|
+
total = ff.zero()
|
|
395
|
+
for i, v in enumerate(list(ff_element._x)):
|
|
396
|
+
total += sub_recurse(v, sub_dict) * sub_dict[ff.gen()]**i
|
|
397
|
+
return ff(total)
|
|
398
|
+
|
|
399
|
+
if in_dict is None and kwds is None:
|
|
400
|
+
return self
|
|
401
|
+
|
|
402
|
+
if in_dict is not None and not isinstance(in_dict, dict):
|
|
403
|
+
raise TypeError('in_dict must be a dict')
|
|
404
|
+
|
|
405
|
+
field_tower = [self.parent()]
|
|
406
|
+
ff = self.parent()
|
|
407
|
+
|
|
408
|
+
while ff.base_field() != ff:
|
|
409
|
+
ff = ff.base_field()
|
|
410
|
+
field_tower.append(ff)
|
|
411
|
+
sub_dict = {f.gen(): f.gen() for f in field_tower}
|
|
412
|
+
|
|
413
|
+
made_substitution = False
|
|
414
|
+
if in_dict is not None:
|
|
415
|
+
for k, v in in_dict.items():
|
|
416
|
+
if k not in sub_dict:
|
|
417
|
+
raise TypeError('key does not match any field generators')
|
|
418
|
+
sub_dict[k] = v
|
|
419
|
+
if v != k:
|
|
420
|
+
made_substitution = True
|
|
421
|
+
else:
|
|
422
|
+
used_kwds = {k: False for k in kwds}
|
|
423
|
+
for g in sub_dict:
|
|
424
|
+
strg = str(g)
|
|
425
|
+
if strg not in kwds:
|
|
426
|
+
continue
|
|
427
|
+
v = kwds[strg]
|
|
428
|
+
sub_dict[g] = v
|
|
429
|
+
|
|
430
|
+
if used_kwds[strg]:
|
|
431
|
+
raise TypeError('multiple generators have the '
|
|
432
|
+
'same name, making substitution '
|
|
433
|
+
'ambiguous. Rename generators '
|
|
434
|
+
'or pass substitution values in '
|
|
435
|
+
'using dictionary format')
|
|
436
|
+
used_kwds[strg] = True
|
|
437
|
+
if g != v:
|
|
438
|
+
made_substitution = True
|
|
439
|
+
|
|
440
|
+
if made_substitution:
|
|
441
|
+
return sub_recurse(self, sub_dict)
|
|
442
|
+
return self
|
|
443
|
+
|
|
444
|
+
@cached_method
|
|
445
|
+
def matrix(self, base=None):
|
|
446
|
+
r"""
|
|
447
|
+
Return the matrix of multiplication by this element, interpreting this
|
|
448
|
+
element as an element of a vector space over ``base``.
|
|
449
|
+
|
|
450
|
+
INPUT:
|
|
451
|
+
|
|
452
|
+
- ``base`` -- a function field (default: ``None``); if ``None``, then
|
|
453
|
+
the matrix is formed over the base field of this function field
|
|
454
|
+
|
|
455
|
+
EXAMPLES:
|
|
456
|
+
|
|
457
|
+
A rational function field::
|
|
458
|
+
|
|
459
|
+
sage: K.<t> = FunctionField(QQ)
|
|
460
|
+
sage: t.matrix() # needs sage.modules
|
|
461
|
+
[t]
|
|
462
|
+
sage: (1/(t+1)).matrix() # needs sage.modules
|
|
463
|
+
[1/(t + 1)]
|
|
464
|
+
|
|
465
|
+
Now an example in a nontrivial extension of a rational function field::
|
|
466
|
+
|
|
467
|
+
sage: # needs sage.rings.function_field
|
|
468
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
469
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3)
|
|
470
|
+
sage: y.matrix()
|
|
471
|
+
[ 0 1]
|
|
472
|
+
[-4*x^3 x]
|
|
473
|
+
sage: y.matrix().charpoly('Z')
|
|
474
|
+
Z^2 - x*Z + 4*x^3
|
|
475
|
+
|
|
476
|
+
An example in a relative extension, where neither function
|
|
477
|
+
field is rational::
|
|
478
|
+
|
|
479
|
+
sage: # needs sage.rings.function_field
|
|
480
|
+
sage: K.<x> = FunctionField(QQ)
|
|
481
|
+
sage: R.<y> = K[]
|
|
482
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3)
|
|
483
|
+
sage: M.<T> = L[]
|
|
484
|
+
sage: Z.<alpha> = L.extension(T^3 - y^2*T + x)
|
|
485
|
+
sage: alpha.matrix()
|
|
486
|
+
[ 0 1 0]
|
|
487
|
+
[ 0 0 1]
|
|
488
|
+
[ -x x*y - 4*x^3 0]
|
|
489
|
+
sage: alpha.matrix(K)
|
|
490
|
+
[ 0 0 1 0 0 0]
|
|
491
|
+
[ 0 0 0 1 0 0]
|
|
492
|
+
[ 0 0 0 0 1 0]
|
|
493
|
+
[ 0 0 0 0 0 1]
|
|
494
|
+
[ -x 0 -4*x^3 x 0 0]
|
|
495
|
+
[ 0 -x -4*x^4 -4*x^3 + x^2 0 0]
|
|
496
|
+
sage: alpha.matrix(Z)
|
|
497
|
+
[alpha]
|
|
498
|
+
|
|
499
|
+
We show that this matrix does indeed work as expected when making a
|
|
500
|
+
vector space from a function field::
|
|
501
|
+
|
|
502
|
+
sage: # needs sage.rings.function_field
|
|
503
|
+
sage: K.<x> = FunctionField(QQ)
|
|
504
|
+
sage: R.<y> = K[]
|
|
505
|
+
sage: L.<y> = K.extension(y^5 - (x^3 + 2*x*y + 1/x))
|
|
506
|
+
sage: V, from_V, to_V = L.vector_space()
|
|
507
|
+
sage: y5 = to_V(y^5); y5
|
|
508
|
+
((x^4 + 1)/x, 2*x, 0, 0, 0)
|
|
509
|
+
sage: y4y = to_V(y^4) * y.matrix(); y4y
|
|
510
|
+
((x^4 + 1)/x, 2*x, 0, 0, 0)
|
|
511
|
+
sage: y5 == y4y
|
|
512
|
+
True
|
|
513
|
+
"""
|
|
514
|
+
# multiply each element of the vector space isomorphic to the parent
|
|
515
|
+
# with this element; make matrix whose rows are the coefficients of the
|
|
516
|
+
# result, and transpose
|
|
517
|
+
V, f, t = self.parent().vector_space(base)
|
|
518
|
+
rows = [t(self*f(b)) for b in V.basis()]
|
|
519
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
520
|
+
MS = MatrixSpace(V.base_field(), V.dimension())
|
|
521
|
+
ret = MS(rows)
|
|
522
|
+
ret.transpose()
|
|
523
|
+
ret.set_immutable()
|
|
524
|
+
return ret
|
|
525
|
+
|
|
526
|
+
def trace(self):
|
|
527
|
+
"""
|
|
528
|
+
Return the trace of the element.
|
|
529
|
+
|
|
530
|
+
EXAMPLES::
|
|
531
|
+
|
|
532
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
533
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3) # needs sage.rings.function_field
|
|
534
|
+
sage: y.trace() # needs sage.rings.function_field
|
|
535
|
+
x
|
|
536
|
+
"""
|
|
537
|
+
return self.matrix().trace()
|
|
538
|
+
|
|
539
|
+
def norm(self):
|
|
540
|
+
"""
|
|
541
|
+
Return the norm of the element.
|
|
542
|
+
|
|
543
|
+
EXAMPLES::
|
|
544
|
+
|
|
545
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
546
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3) # needs sage.rings.function_field
|
|
547
|
+
sage: y.norm() # needs sage.rings.function_field
|
|
548
|
+
4*x^3
|
|
549
|
+
|
|
550
|
+
The norm is relative::
|
|
551
|
+
|
|
552
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
553
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3); R.<z> = L[] # needs sage.rings.function_field
|
|
554
|
+
sage: M.<z> = L.extension(z^3 - y^2*z + x) # needs sage.rings.function_field
|
|
555
|
+
sage: z.norm() # needs sage.rings.function_field
|
|
556
|
+
-x
|
|
557
|
+
sage: z.norm().parent() # needs sage.rings.function_field
|
|
558
|
+
Function field in y defined by y^2 - x*y + 4*x^3
|
|
559
|
+
"""
|
|
560
|
+
return self.matrix().determinant()
|
|
561
|
+
|
|
562
|
+
def degree(self):
|
|
563
|
+
"""
|
|
564
|
+
Return the max degree between the denominator and numerator.
|
|
565
|
+
|
|
566
|
+
EXAMPLES::
|
|
567
|
+
|
|
568
|
+
sage: FF.<t> = FunctionField(QQ)
|
|
569
|
+
sage: f = (t^2 + 3) / (t^3 - 1/3); f
|
|
570
|
+
(t^2 + 3)/(t^3 - 1/3)
|
|
571
|
+
sage: f.degree()
|
|
572
|
+
3
|
|
573
|
+
|
|
574
|
+
sage: FF.<t> = FunctionField(QQ)
|
|
575
|
+
sage: f = (t+8); f
|
|
576
|
+
t + 8
|
|
577
|
+
sage: f.degree()
|
|
578
|
+
1
|
|
579
|
+
|
|
580
|
+
TESTS::
|
|
581
|
+
|
|
582
|
+
sage: FF.<t> = FunctionField(QQ)
|
|
583
|
+
sage: f = FF(0); f
|
|
584
|
+
0
|
|
585
|
+
sage: f.degree()
|
|
586
|
+
0
|
|
587
|
+
sage: f = (t+1) / (t^2 - 1/3); f
|
|
588
|
+
(t + 1)/(t^2 - 1/3)
|
|
589
|
+
sage: f.degree()
|
|
590
|
+
2
|
|
591
|
+
sage: f = (t+1); f
|
|
592
|
+
t + 1
|
|
593
|
+
sage: f.degree()
|
|
594
|
+
1
|
|
595
|
+
"""
|
|
596
|
+
return max(self._x.denominator().degree(), self._x.numerator().degree())
|
|
597
|
+
|
|
598
|
+
def characteristic_polynomial(self, *args, **kwds):
|
|
599
|
+
"""
|
|
600
|
+
Return the characteristic polynomial of the element. Give an optional
|
|
601
|
+
input string to name the variable in the characteristic polynomial.
|
|
602
|
+
|
|
603
|
+
EXAMPLES::
|
|
604
|
+
|
|
605
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
606
|
+
sage: x.characteristic_polynomial('W') # needs sage.modules
|
|
607
|
+
W - x
|
|
608
|
+
|
|
609
|
+
sage: # needs sage.rings.function_field
|
|
610
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3); R.<z> = L[]
|
|
611
|
+
sage: M.<z> = L.extension(z^3 - y^2*z + x)
|
|
612
|
+
sage: y.characteristic_polynomial('W')
|
|
613
|
+
W^2 - x*W + 4*x^3
|
|
614
|
+
sage: z.characteristic_polynomial('W')
|
|
615
|
+
W^3 + (-x*y + 4*x^3)*W + x
|
|
616
|
+
"""
|
|
617
|
+
return self.matrix().characteristic_polynomial(*args, **kwds)
|
|
618
|
+
|
|
619
|
+
charpoly = characteristic_polynomial
|
|
620
|
+
|
|
621
|
+
def minimal_polynomial(self, *args, **kwds):
|
|
622
|
+
"""
|
|
623
|
+
Return the minimal polynomial of the element. Give an optional input
|
|
624
|
+
string to name the variable in the characteristic polynomial.
|
|
625
|
+
|
|
626
|
+
EXAMPLES::
|
|
627
|
+
|
|
628
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
629
|
+
sage: x.minimal_polynomial('W') # needs sage.modules
|
|
630
|
+
W - x
|
|
631
|
+
|
|
632
|
+
sage: # needs sage.rings.function_field
|
|
633
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3); R.<z> = L[]
|
|
634
|
+
sage: M.<z> = L.extension(z^3 - y^2*z + x)
|
|
635
|
+
sage: y.minimal_polynomial('W')
|
|
636
|
+
W^2 - x*W + 4*x^3
|
|
637
|
+
sage: z.minimal_polynomial('W')
|
|
638
|
+
W^3 + (-x*y + 4*x^3)*W + x
|
|
639
|
+
"""
|
|
640
|
+
return self.matrix().minimal_polynomial(*args, **kwds)
|
|
641
|
+
|
|
642
|
+
minpoly = minimal_polynomial
|
|
643
|
+
|
|
644
|
+
def is_integral(self):
|
|
645
|
+
r"""
|
|
646
|
+
Determine if the element is integral over the maximal order of the base field.
|
|
647
|
+
|
|
648
|
+
EXAMPLES::
|
|
649
|
+
|
|
650
|
+
sage: # needs sage.rings.function_field
|
|
651
|
+
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
|
|
652
|
+
sage: L.<y> = K.extension(y^2 - x*y + 4*x^3)
|
|
653
|
+
sage: y.is_integral()
|
|
654
|
+
True
|
|
655
|
+
sage: (y/x).is_integral()
|
|
656
|
+
True
|
|
657
|
+
sage: (y/x)^2 - (y/x) + 4*x
|
|
658
|
+
0
|
|
659
|
+
sage: (y/x^2).is_integral()
|
|
660
|
+
False
|
|
661
|
+
sage: (y/x).minimal_polynomial('W')
|
|
662
|
+
W^2 - W + 4*x
|
|
663
|
+
"""
|
|
664
|
+
R = self.parent().base_field().maximal_order()
|
|
665
|
+
return all(a in R for a in self.minimal_polynomial())
|
|
666
|
+
|
|
667
|
+
def differential(self):
|
|
668
|
+
"""
|
|
669
|
+
Return the differential `dx` where `x` is the element.
|
|
670
|
+
|
|
671
|
+
EXAMPLES::
|
|
672
|
+
|
|
673
|
+
sage: K.<t> = FunctionField(QQ)
|
|
674
|
+
sage: f = 1 / t
|
|
675
|
+
sage: f.differential() # needs sage.modules
|
|
676
|
+
(-1/t^2) d(t)
|
|
677
|
+
|
|
678
|
+
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings
|
|
679
|
+
sage: L.<y> = K.extension(Y^2 + Y + x +1/x) # needs sage.rings.finite_rings sage.rings.function_field
|
|
680
|
+
sage: (y^3 + x).differential() # needs sage.rings.finite_rings sage.rings.function_field
|
|
681
|
+
(((x^2 + 1)/x^2)*y + (x^4 + x^3 + 1)/x^3) d(x)
|
|
682
|
+
|
|
683
|
+
TESTS:
|
|
684
|
+
|
|
685
|
+
Verify that :issue:`27712` is resolved::
|
|
686
|
+
|
|
687
|
+
sage: K.<x> = FunctionField(GF(31))
|
|
688
|
+
sage: x.differential() # needs sage.modules
|
|
689
|
+
d(x)
|
|
690
|
+
|
|
691
|
+
sage: # needs sage.rings.function_field
|
|
692
|
+
sage: R.<y> = K[]
|
|
693
|
+
sage: L.<y> = K.extension(y^2 - x)
|
|
694
|
+
sage: R.<z> = L[]
|
|
695
|
+
sage: M.<z> = L.extension(z^2 - y)
|
|
696
|
+
sage: y.differential()
|
|
697
|
+
(16/x*y) d(x)
|
|
698
|
+
sage: z.differential()
|
|
699
|
+
(8/x*z) d(x)
|
|
700
|
+
"""
|
|
701
|
+
F = self.parent()
|
|
702
|
+
W = F.space_of_differentials()
|
|
703
|
+
return W.element_class(W, F.one(), self)
|
|
704
|
+
|
|
705
|
+
def derivative(self):
|
|
706
|
+
"""
|
|
707
|
+
Return the derivative of the element.
|
|
708
|
+
|
|
709
|
+
The derivative is with respect to the generator of the base rational
|
|
710
|
+
function field, over which the function field is a separable extension.
|
|
711
|
+
|
|
712
|
+
EXAMPLES::
|
|
713
|
+
|
|
714
|
+
sage: K.<t> = FunctionField(QQ)
|
|
715
|
+
sage: f = (t + 1) / (t^2 - 1/3)
|
|
716
|
+
sage: f.derivative() # needs sage.modules
|
|
717
|
+
(-t^2 - 2*t - 1/3)/(t^4 - 2/3*t^2 + 1/9)
|
|
718
|
+
|
|
719
|
+
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings
|
|
720
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.finite_rings sage.rings.function_field
|
|
721
|
+
sage: (y^3 + x).derivative() # needs sage.rings.finite_rings sage.rings.function_field
|
|
722
|
+
((x^2 + 1)/x^2)*y + (x^4 + x^3 + 1)/x^3
|
|
723
|
+
"""
|
|
724
|
+
D = self.parent().derivation()
|
|
725
|
+
return D(self)
|
|
726
|
+
|
|
727
|
+
def higher_derivative(self, i, separating_element=None):
|
|
728
|
+
"""
|
|
729
|
+
Return the `i`-th derivative of the element with respect to the
|
|
730
|
+
separating element.
|
|
731
|
+
|
|
732
|
+
INPUT:
|
|
733
|
+
|
|
734
|
+
- ``i`` -- nonnegative integer
|
|
735
|
+
|
|
736
|
+
- ``separating_element`` -- a separating element of the function field;
|
|
737
|
+
the default is the generator of the rational function field
|
|
738
|
+
|
|
739
|
+
EXAMPLES::
|
|
740
|
+
|
|
741
|
+
sage: K.<t> = FunctionField(GF(2))
|
|
742
|
+
sage: f = t^2
|
|
743
|
+
sage: f.higher_derivative(2) # needs sage.rings.function_field
|
|
744
|
+
1
|
|
745
|
+
|
|
746
|
+
::
|
|
747
|
+
|
|
748
|
+
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings
|
|
749
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.finite_rings sage.rings.function_field
|
|
750
|
+
sage: (y^3 + x).higher_derivative(2) # needs sage.rings.finite_rings sage.rings.function_field
|
|
751
|
+
1/x^3*y + (x^6 + x^4 + x^3 + x^2 + x + 1)/x^5
|
|
752
|
+
"""
|
|
753
|
+
D = self.parent().higher_derivation()
|
|
754
|
+
return D(self, i, separating_element)
|
|
755
|
+
|
|
756
|
+
@cached_method
|
|
757
|
+
def divisor(self):
|
|
758
|
+
"""
|
|
759
|
+
Return the divisor of the element.
|
|
760
|
+
|
|
761
|
+
EXAMPLES::
|
|
762
|
+
|
|
763
|
+
sage: K.<x> = FunctionField(GF(2))
|
|
764
|
+
sage: f = 1/(x^3 + x^2 + x)
|
|
765
|
+
sage: f.divisor() # needs sage.libs.pari sage.modules
|
|
766
|
+
3*Place (1/x)
|
|
767
|
+
- Place (x)
|
|
768
|
+
- Place (x^2 + x + 1)
|
|
769
|
+
|
|
770
|
+
::
|
|
771
|
+
|
|
772
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
773
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.function_field
|
|
774
|
+
sage: y.divisor() # needs sage.rings.function_field
|
|
775
|
+
- Place (1/x, 1/x*y)
|
|
776
|
+
- Place (x, x*y)
|
|
777
|
+
+ 2*Place (x + 1, x*y)
|
|
778
|
+
"""
|
|
779
|
+
if self.is_zero():
|
|
780
|
+
raise ValueError("divisor not defined for zero")
|
|
781
|
+
|
|
782
|
+
F = self.parent()
|
|
783
|
+
I = F.maximal_order().ideal(self)
|
|
784
|
+
J = F.maximal_order_infinite().ideal(self)
|
|
785
|
+
return I.divisor() + J.divisor()
|
|
786
|
+
|
|
787
|
+
def divisor_of_zeros(self):
|
|
788
|
+
"""
|
|
789
|
+
Return the divisor of zeros for the element.
|
|
790
|
+
|
|
791
|
+
EXAMPLES::
|
|
792
|
+
|
|
793
|
+
sage: K.<x> = FunctionField(GF(2))
|
|
794
|
+
sage: f = 1/(x^3 + x^2 + x)
|
|
795
|
+
sage: f.divisor_of_zeros() # needs sage.libs.pari sage.modules
|
|
796
|
+
3*Place (1/x)
|
|
797
|
+
|
|
798
|
+
::
|
|
799
|
+
|
|
800
|
+
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings
|
|
801
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.finite_rings sage.rings.function_field
|
|
802
|
+
sage: (x/y).divisor_of_zeros() # needs sage.rings.finite_rings sage.rings.function_field
|
|
803
|
+
3*Place (x, x*y)
|
|
804
|
+
"""
|
|
805
|
+
if self.is_zero():
|
|
806
|
+
raise ValueError("divisor of zeros not defined for zero")
|
|
807
|
+
|
|
808
|
+
F = self.parent()
|
|
809
|
+
I = F.maximal_order().ideal(self)
|
|
810
|
+
J = F.maximal_order_infinite().ideal(self)
|
|
811
|
+
return I.divisor_of_zeros() + J.divisor_of_zeros()
|
|
812
|
+
|
|
813
|
+
def divisor_of_poles(self):
|
|
814
|
+
"""
|
|
815
|
+
Return the divisor of poles for the element.
|
|
816
|
+
|
|
817
|
+
EXAMPLES::
|
|
818
|
+
|
|
819
|
+
sage: K.<x> = FunctionField(GF(2))
|
|
820
|
+
sage: f = 1/(x^3 + x^2 + x)
|
|
821
|
+
sage: f.divisor_of_poles() # needs sage.libs.pari sage.modules
|
|
822
|
+
Place (x)
|
|
823
|
+
+ Place (x^2 + x + 1)
|
|
824
|
+
|
|
825
|
+
::
|
|
826
|
+
|
|
827
|
+
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings
|
|
828
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.finite_rings sage.rings.function_field
|
|
829
|
+
sage: (x/y).divisor_of_poles() # needs sage.rings.finite_rings sage.rings.function_field
|
|
830
|
+
Place (1/x, 1/x*y) + 2*Place (x + 1, x*y)
|
|
831
|
+
"""
|
|
832
|
+
if self.is_zero():
|
|
833
|
+
raise ValueError("divisor of poles not defined for zero")
|
|
834
|
+
|
|
835
|
+
F = self.parent()
|
|
836
|
+
I = F.maximal_order().ideal(self)
|
|
837
|
+
J = F.maximal_order_infinite().ideal(self)
|
|
838
|
+
return I.divisor_of_poles() + J.divisor_of_poles()
|
|
839
|
+
|
|
840
|
+
def zeros(self):
|
|
841
|
+
"""
|
|
842
|
+
Return the list of the zeros of the element.
|
|
843
|
+
|
|
844
|
+
EXAMPLES::
|
|
845
|
+
|
|
846
|
+
sage: K.<x> = FunctionField(GF(2))
|
|
847
|
+
sage: f = 1/(x^3 + x^2 + x)
|
|
848
|
+
sage: f.zeros() # needs sage.libs.pari sage.modules
|
|
849
|
+
[Place (1/x)]
|
|
850
|
+
|
|
851
|
+
::
|
|
852
|
+
|
|
853
|
+
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings
|
|
854
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.finite_rings sage.rings.function_field
|
|
855
|
+
sage: (x/y).zeros() # needs sage.rings.finite_rings sage.rings.function_field
|
|
856
|
+
[Place (x, x*y)]
|
|
857
|
+
"""
|
|
858
|
+
return self.divisor_of_zeros().support()
|
|
859
|
+
|
|
860
|
+
def poles(self):
|
|
861
|
+
"""
|
|
862
|
+
Return the list of the poles of the element.
|
|
863
|
+
|
|
864
|
+
EXAMPLES::
|
|
865
|
+
|
|
866
|
+
sage: K.<x> = FunctionField(GF(2))
|
|
867
|
+
sage: f = 1/(x^3 + x^2 + x)
|
|
868
|
+
sage: f.poles() # needs sage.libs.pari sage.modules
|
|
869
|
+
[Place (x), Place (x^2 + x + 1)]
|
|
870
|
+
|
|
871
|
+
::
|
|
872
|
+
|
|
873
|
+
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings
|
|
874
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.finite_rings sage.rings.function_field
|
|
875
|
+
sage: (x/y).poles() # needs sage.rings.finite_rings sage.rings.function_field
|
|
876
|
+
[Place (1/x, 1/x*y), Place (x + 1, x*y)]
|
|
877
|
+
"""
|
|
878
|
+
return self.divisor_of_poles().support()
|
|
879
|
+
|
|
880
|
+
def valuation(self, place):
|
|
881
|
+
"""
|
|
882
|
+
Return the valuation of the element at the place.
|
|
883
|
+
|
|
884
|
+
INPUT:
|
|
885
|
+
|
|
886
|
+
- ``place`` -- a place of the function field
|
|
887
|
+
|
|
888
|
+
EXAMPLES::
|
|
889
|
+
|
|
890
|
+
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
|
|
891
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.function_field
|
|
892
|
+
sage: p = L.places_infinite()[0] # needs sage.rings.function_field
|
|
893
|
+
sage: y.valuation(p) # needs sage.rings.function_field
|
|
894
|
+
-1
|
|
895
|
+
|
|
896
|
+
::
|
|
897
|
+
|
|
898
|
+
sage: # needs sage.rings.function_field
|
|
899
|
+
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
|
|
900
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
901
|
+
sage: O = L.maximal_order()
|
|
902
|
+
sage: p = O.ideal(x - 1).place()
|
|
903
|
+
sage: y.valuation(p)
|
|
904
|
+
0
|
|
905
|
+
"""
|
|
906
|
+
prime = place.prime_ideal()
|
|
907
|
+
ideal = prime.ring().ideal(self)
|
|
908
|
+
return prime.valuation(ideal)
|
|
909
|
+
|
|
910
|
+
def evaluate(self, place):
|
|
911
|
+
"""
|
|
912
|
+
Return the value of the element at the place.
|
|
913
|
+
|
|
914
|
+
INPUT:
|
|
915
|
+
|
|
916
|
+
- ``place`` -- a function field place
|
|
917
|
+
|
|
918
|
+
OUTPUT:
|
|
919
|
+
|
|
920
|
+
If the element is in the valuation ring at the place, then an element
|
|
921
|
+
in the residue field at the place is returned. Otherwise, a
|
|
922
|
+
:exc:`ValueError` is raised.
|
|
923
|
+
|
|
924
|
+
EXAMPLES::
|
|
925
|
+
|
|
926
|
+
sage: K.<t> = FunctionField(GF(5))
|
|
927
|
+
sage: p = K.place_infinite()
|
|
928
|
+
sage: f = 1/t^2 + 3
|
|
929
|
+
sage: f.evaluate(p)
|
|
930
|
+
3
|
|
931
|
+
|
|
932
|
+
::
|
|
933
|
+
|
|
934
|
+
sage: # needs sage.rings.finite_rings sage.rings.function_field
|
|
935
|
+
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[]
|
|
936
|
+
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
|
|
937
|
+
sage: p, = L.places_infinite()
|
|
938
|
+
sage: p, = L.places_infinite()
|
|
939
|
+
sage: (y + x).evaluate(p)
|
|
940
|
+
Traceback (most recent call last):
|
|
941
|
+
...
|
|
942
|
+
ValueError: has a pole at the place
|
|
943
|
+
sage: (y/x + 1).evaluate(p)
|
|
944
|
+
1
|
|
945
|
+
"""
|
|
946
|
+
R, _, to_R = place._residue_field()
|
|
947
|
+
|
|
948
|
+
v = self.valuation(place)
|
|
949
|
+
if v > 0:
|
|
950
|
+
return R.zero()
|
|
951
|
+
if v == 0:
|
|
952
|
+
return to_R(self)
|
|
953
|
+
# v < 0
|
|
954
|
+
raise ValueError('has a pole at the place')
|
|
955
|
+
|
|
956
|
+
cpdef bint is_nth_power(self, n) noexcept:
|
|
957
|
+
r"""
|
|
958
|
+
Return whether this element is an ``n``-th power in the rational
|
|
959
|
+
function field.
|
|
960
|
+
|
|
961
|
+
INPUT:
|
|
962
|
+
|
|
963
|
+
- ``n`` -- integer
|
|
964
|
+
|
|
965
|
+
OUTPUT:
|
|
966
|
+
|
|
967
|
+
Returns ``True`` if there is an element `a` in the function field such
|
|
968
|
+
that this element equals `a^n`.
|
|
969
|
+
|
|
970
|
+
.. SEEALSO::
|
|
971
|
+
|
|
972
|
+
:meth:`nth_root`
|
|
973
|
+
|
|
974
|
+
EXAMPLES::
|
|
975
|
+
|
|
976
|
+
sage: K.<x> = FunctionField(GF(3))
|
|
977
|
+
sage: f = (x+1)/(x-1)
|
|
978
|
+
sage: f.is_nth_power(2)
|
|
979
|
+
False
|
|
980
|
+
"""
|
|
981
|
+
raise NotImplementedError("is_nth_power() not implemented for generic elements")
|
|
982
|
+
|
|
983
|
+
cpdef FunctionFieldElement nth_root(self, n):
|
|
984
|
+
"""
|
|
985
|
+
Return an ``n``-th root of this element in the function field.
|
|
986
|
+
|
|
987
|
+
INPUT:
|
|
988
|
+
|
|
989
|
+
- ``n`` -- integer
|
|
990
|
+
|
|
991
|
+
OUTPUT:
|
|
992
|
+
|
|
993
|
+
Returns an element ``a`` in the function field such that this element
|
|
994
|
+
equals `a^n`. Raises an error if no such element exists.
|
|
995
|
+
|
|
996
|
+
.. SEEALSO::
|
|
997
|
+
|
|
998
|
+
:meth:`is_nth_power`
|
|
999
|
+
|
|
1000
|
+
EXAMPLES::
|
|
1001
|
+
|
|
1002
|
+
sage: K.<x> = FunctionField(GF(3))
|
|
1003
|
+
sage: R.<y> = K[]
|
|
1004
|
+
sage: L.<y> = K.extension(y^2 - x) # needs sage.rings.function_field
|
|
1005
|
+
sage: L(y^27).nth_root(27) # needs sage.rings.function_field
|
|
1006
|
+
y
|
|
1007
|
+
"""
|
|
1008
|
+
raise NotImplementedError("nth_root() not implemented for generic elements")
|