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,991 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Fields
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# Copyright (C) 2005 David Kohel <kohel@maths.usyd.edu>
|
|
7
|
+
# William Stein <wstein@math.ucsd.edu>
|
|
8
|
+
# 2008 Teresa Gomez-Diaz (CNRS) <Teresa.Gomez-Diaz@univ-mlv.fr>
|
|
9
|
+
# 2008-2009 Nicolas M. Thiery <nthiery at users.sf.net>
|
|
10
|
+
# 2012-2014 Julian Rueth <julian.rueth@fsfe.org>
|
|
11
|
+
#
|
|
12
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
13
|
+
# https://www.gnu.org/licenses/
|
|
14
|
+
# *****************************************************************************
|
|
15
|
+
|
|
16
|
+
from sage.misc.lazy_attribute import lazy_class_attribute
|
|
17
|
+
from sage.misc.lazy_import import LazyImport
|
|
18
|
+
from sage.categories.category_with_axiom import CategoryWithAxiom
|
|
19
|
+
from sage.categories.category_singleton import Category_contains_method_by_parent_class
|
|
20
|
+
from sage.categories.euclidean_domains import EuclideanDomains
|
|
21
|
+
from sage.categories.division_rings import DivisionRings
|
|
22
|
+
from sage.categories.noetherian_rings import NoetherianRings
|
|
23
|
+
|
|
24
|
+
from sage.structure.element import coerce_binop
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class Fields(CategoryWithAxiom):
|
|
28
|
+
"""
|
|
29
|
+
The category of (commutative) fields, i.e. commutative rings where
|
|
30
|
+
all nonzero elements have multiplicative inverses
|
|
31
|
+
|
|
32
|
+
EXAMPLES::
|
|
33
|
+
|
|
34
|
+
sage: K = Fields()
|
|
35
|
+
sage: K
|
|
36
|
+
Category of fields
|
|
37
|
+
sage: Fields().super_categories()
|
|
38
|
+
[Category of euclidean domains,
|
|
39
|
+
Category of division rings,
|
|
40
|
+
Category of noetherian rings]
|
|
41
|
+
|
|
42
|
+
sage: K(IntegerRing())
|
|
43
|
+
Rational Field
|
|
44
|
+
sage: K(PolynomialRing(GF(3), 'x'))
|
|
45
|
+
Fraction Field of Univariate Polynomial Ring in x over
|
|
46
|
+
Finite Field of size 3
|
|
47
|
+
sage: K(RealField()) # needs sage.rings.real_mpfr
|
|
48
|
+
Real Field with 53 bits of precision
|
|
49
|
+
|
|
50
|
+
TESTS::
|
|
51
|
+
|
|
52
|
+
sage: TestSuite(Fields()).run()
|
|
53
|
+
"""
|
|
54
|
+
_base_category_class_and_axiom = (DivisionRings, "Commutative")
|
|
55
|
+
|
|
56
|
+
def extra_super_categories(self):
|
|
57
|
+
"""
|
|
58
|
+
EXAMPLES::
|
|
59
|
+
|
|
60
|
+
sage: Fields().extra_super_categories()
|
|
61
|
+
[Category of euclidean domains, Category of noetherian rings]
|
|
62
|
+
"""
|
|
63
|
+
return [EuclideanDomains(), NoetherianRings()]
|
|
64
|
+
|
|
65
|
+
def __contains__(self, x):
|
|
66
|
+
"""
|
|
67
|
+
EXAMPLES::
|
|
68
|
+
|
|
69
|
+
sage: GF(4, "a") in Fields() # needs sage.rings.finite_rings
|
|
70
|
+
True
|
|
71
|
+
sage: QQ in Fields()
|
|
72
|
+
True
|
|
73
|
+
sage: ZZ in Fields()
|
|
74
|
+
False
|
|
75
|
+
sage: IntegerModRing(4) in Fields()
|
|
76
|
+
False
|
|
77
|
+
sage: InfinityRing in Fields()
|
|
78
|
+
False
|
|
79
|
+
|
|
80
|
+
This implementation will not be needed anymore once every
|
|
81
|
+
field in Sage will be properly declared in the category
|
|
82
|
+
:class:`Fields() <Fields>`.
|
|
83
|
+
|
|
84
|
+
Caveat: this should eventually be fixed::
|
|
85
|
+
|
|
86
|
+
sage: gap.Rationals in Fields() # needs sage.libs.gap
|
|
87
|
+
False
|
|
88
|
+
|
|
89
|
+
typically by implementing the method :meth:`category`
|
|
90
|
+
appropriately for Gap objects::
|
|
91
|
+
|
|
92
|
+
sage: GR = gap.Rationals # needs sage.libs.gap
|
|
93
|
+
sage: GR.category = lambda: Fields() # needs sage.libs.gap
|
|
94
|
+
sage: GR in Fields() # needs sage.libs.gap
|
|
95
|
+
True
|
|
96
|
+
|
|
97
|
+
The following tests against a memory leak fixed in :issue:`13370`. In order
|
|
98
|
+
to prevent non-deterministic deallocation of fields that have been created
|
|
99
|
+
in other doctests, we introduced a strong reference to all previously created
|
|
100
|
+
uncollected objects in :issue:`19244`. ::
|
|
101
|
+
|
|
102
|
+
sage: # needs sage.libs.pari
|
|
103
|
+
sage: import gc
|
|
104
|
+
sage: _ = gc.collect()
|
|
105
|
+
sage: permstore = [X for X in gc.get_objects()
|
|
106
|
+
....: if isinstance(X, sage.rings.finite_rings.integer_mod_ring.IntegerModRing_generic)]
|
|
107
|
+
sage: n = len(permstore)
|
|
108
|
+
sage: for i in prime_range(100):
|
|
109
|
+
....: R = ZZ.quotient(i)
|
|
110
|
+
....: t = R in Fields()
|
|
111
|
+
|
|
112
|
+
First, we show that there are now more quotient rings in cache than before::
|
|
113
|
+
|
|
114
|
+
sage: # needs sage.libs.pari
|
|
115
|
+
sage: len([X for X in gc.get_objects()
|
|
116
|
+
....: if isinstance(X, sage.rings.finite_rings.integer_mod_ring.IntegerModRing_generic)]) > n
|
|
117
|
+
True
|
|
118
|
+
|
|
119
|
+
When we delete the last quotient ring created in the loop and then do a garbage
|
|
120
|
+
collection, all newly created rings vanish::
|
|
121
|
+
|
|
122
|
+
sage: # needs sage.libs.pari
|
|
123
|
+
sage: del R
|
|
124
|
+
sage: _ = gc.collect()
|
|
125
|
+
sage: len([X for X in gc.get_objects()
|
|
126
|
+
....: if isinstance(X, sage.rings.finite_rings.integer_mod_ring.IntegerModRing_generic)]) - n
|
|
127
|
+
0
|
|
128
|
+
"""
|
|
129
|
+
from sage.rings.ring import _is_Field
|
|
130
|
+
try:
|
|
131
|
+
return self._contains_helper(x) or _is_Field(x)
|
|
132
|
+
except Exception:
|
|
133
|
+
return False
|
|
134
|
+
|
|
135
|
+
@lazy_class_attribute
|
|
136
|
+
def _contains_helper(cls):
|
|
137
|
+
"""
|
|
138
|
+
Helper for containment tests in the category of fields.
|
|
139
|
+
|
|
140
|
+
This helper just tests whether the given object's category
|
|
141
|
+
is already known to be a sub-category of the category of
|
|
142
|
+
fields. There are, however, rings that are initialised
|
|
143
|
+
as plain commutative rings and found out to be fields
|
|
144
|
+
only afterwards. Hence, this helper alone is not enough
|
|
145
|
+
for a proper containment test.
|
|
146
|
+
|
|
147
|
+
TESTS::
|
|
148
|
+
|
|
149
|
+
sage: # needs sage.libs.pari
|
|
150
|
+
sage: P.<x> = QQ[]
|
|
151
|
+
sage: Q = P.quotient(x^2 + 2)
|
|
152
|
+
sage: Q.category()
|
|
153
|
+
Category of commutative no zero divisors quotients of algebras
|
|
154
|
+
over (number fields and quotient fields and metric spaces)
|
|
155
|
+
sage: F = Fields()
|
|
156
|
+
sage: F._contains_helper(Q)
|
|
157
|
+
False
|
|
158
|
+
sage: Q in F # This changes the category!
|
|
159
|
+
True
|
|
160
|
+
sage: F._contains_helper(Q)
|
|
161
|
+
True
|
|
162
|
+
"""
|
|
163
|
+
return Category_contains_method_by_parent_class(cls())
|
|
164
|
+
|
|
165
|
+
def _call_(self, x):
|
|
166
|
+
"""
|
|
167
|
+
Construct a field from the data in ``x``.
|
|
168
|
+
|
|
169
|
+
EXAMPLES::
|
|
170
|
+
|
|
171
|
+
sage: K = Fields()
|
|
172
|
+
sage: K
|
|
173
|
+
Category of fields
|
|
174
|
+
sage: Fields().super_categories()
|
|
175
|
+
[Category of euclidean domains,
|
|
176
|
+
Category of division rings,
|
|
177
|
+
Category of noetherian rings]
|
|
178
|
+
|
|
179
|
+
sage: K(IntegerRing()) # indirect doctest
|
|
180
|
+
Rational Field
|
|
181
|
+
sage: K(PolynomialRing(GF(3), 'x')) # indirect doctest
|
|
182
|
+
Fraction Field of Univariate Polynomial Ring in x over
|
|
183
|
+
Finite Field of size 3
|
|
184
|
+
sage: K(RealField()) # needs sage.rings.real_mpfr
|
|
185
|
+
Real Field with 53 bits of precision
|
|
186
|
+
"""
|
|
187
|
+
try:
|
|
188
|
+
return x.fraction_field()
|
|
189
|
+
except AttributeError:
|
|
190
|
+
raise TypeError("unable to associate a field to %s" % x)
|
|
191
|
+
|
|
192
|
+
Finite = LazyImport('sage.categories.finite_fields', 'FiniteFields', at_startup=True)
|
|
193
|
+
|
|
194
|
+
class ParentMethods:
|
|
195
|
+
def krull_dimension(self):
|
|
196
|
+
"""
|
|
197
|
+
Return the Krull dimension of this field, which is 0.
|
|
198
|
+
|
|
199
|
+
EXAMPLES::
|
|
200
|
+
|
|
201
|
+
sage: QQ.krull_dimension()
|
|
202
|
+
0
|
|
203
|
+
sage: Frac(QQ['x,y']).krull_dimension()
|
|
204
|
+
0
|
|
205
|
+
"""
|
|
206
|
+
return 0
|
|
207
|
+
|
|
208
|
+
def is_field(self, proof=True):
|
|
209
|
+
r"""
|
|
210
|
+
Return ``True`` as ``self`` is a field.
|
|
211
|
+
|
|
212
|
+
EXAMPLES::
|
|
213
|
+
|
|
214
|
+
sage: QQ.is_field()
|
|
215
|
+
True
|
|
216
|
+
sage: Parent(QQ,category=Fields()).is_field()
|
|
217
|
+
True
|
|
218
|
+
|
|
219
|
+
sage: Frac(ZZ['x,y']).is_field()
|
|
220
|
+
True
|
|
221
|
+
"""
|
|
222
|
+
return True
|
|
223
|
+
|
|
224
|
+
def is_integrally_closed(self) -> bool:
|
|
225
|
+
r"""
|
|
226
|
+
Return whether ``self`` is integrally closed.
|
|
227
|
+
|
|
228
|
+
For every field `F`, `F` is its own field of fractions.
|
|
229
|
+
Therefore every element of `F` is integral over `F`.
|
|
230
|
+
|
|
231
|
+
EXAMPLES::
|
|
232
|
+
|
|
233
|
+
sage: QQ.is_integrally_closed()
|
|
234
|
+
True
|
|
235
|
+
sage: QQbar.is_integrally_closed() # needs sage.rings.number_field
|
|
236
|
+
True
|
|
237
|
+
sage: Z5 = GF(5); Z5
|
|
238
|
+
Finite Field of size 5
|
|
239
|
+
sage: Z5.is_integrally_closed()
|
|
240
|
+
True
|
|
241
|
+
sage: Frac(ZZ['x,y']).is_integrally_closed()
|
|
242
|
+
True
|
|
243
|
+
"""
|
|
244
|
+
return True
|
|
245
|
+
|
|
246
|
+
def integral_closure(self):
|
|
247
|
+
"""
|
|
248
|
+
Return this field, since fields are integrally closed in their
|
|
249
|
+
fraction field.
|
|
250
|
+
|
|
251
|
+
EXAMPLES::
|
|
252
|
+
|
|
253
|
+
sage: QQ.integral_closure()
|
|
254
|
+
Rational Field
|
|
255
|
+
sage: Frac(ZZ['x,y']).integral_closure()
|
|
256
|
+
Fraction Field of Multivariate Polynomial Ring in x, y
|
|
257
|
+
over Integer Ring
|
|
258
|
+
"""
|
|
259
|
+
return self
|
|
260
|
+
|
|
261
|
+
def algebraic_closure(self):
|
|
262
|
+
"""
|
|
263
|
+
Return the algebraic closure of ``self``.
|
|
264
|
+
|
|
265
|
+
.. NOTE::
|
|
266
|
+
|
|
267
|
+
This is only implemented for certain classes of field.
|
|
268
|
+
|
|
269
|
+
EXAMPLES::
|
|
270
|
+
|
|
271
|
+
sage: K = PolynomialRing(QQ,'x').fraction_field(); K
|
|
272
|
+
Fraction Field of Univariate Polynomial Ring in x over Rational Field
|
|
273
|
+
sage: K.algebraic_closure()
|
|
274
|
+
Traceback (most recent call last):
|
|
275
|
+
...
|
|
276
|
+
NotImplementedError: algebraic closures of general fields not implemented
|
|
277
|
+
"""
|
|
278
|
+
raise NotImplementedError("algebraic closures of general fields not implemented")
|
|
279
|
+
|
|
280
|
+
def prime_subfield(self):
|
|
281
|
+
"""
|
|
282
|
+
Return the prime subfield of ``self``.
|
|
283
|
+
|
|
284
|
+
EXAMPLES::
|
|
285
|
+
|
|
286
|
+
sage: k = GF(9, 'a') # needs sage.rings.finite_rings
|
|
287
|
+
sage: k.prime_subfield() # needs sage.rings.finite_rings
|
|
288
|
+
Finite Field of size 3
|
|
289
|
+
"""
|
|
290
|
+
if self.characteristic() == 0:
|
|
291
|
+
import sage.rings.rational_field
|
|
292
|
+
return sage.rings.rational_field.RationalField()
|
|
293
|
+
|
|
294
|
+
from sage.rings.finite_rings.finite_field_constructor import GF
|
|
295
|
+
return GF(self.characteristic())
|
|
296
|
+
|
|
297
|
+
def divides(self, x, y, coerce=True):
|
|
298
|
+
"""
|
|
299
|
+
Return ``True`` if ``x`` divides ``y`` in this field.
|
|
300
|
+
|
|
301
|
+
This is usually ``True`` in a field!.
|
|
302
|
+
|
|
303
|
+
If ``coerce`` is ``True`` (the default), first coerce
|
|
304
|
+
``x`` and ``y`` into ``self``.
|
|
305
|
+
|
|
306
|
+
EXAMPLES::
|
|
307
|
+
|
|
308
|
+
sage: QQ.divides(2, 3/4)
|
|
309
|
+
True
|
|
310
|
+
sage: QQ.divides(0, 5)
|
|
311
|
+
False
|
|
312
|
+
"""
|
|
313
|
+
if coerce:
|
|
314
|
+
x = self(x)
|
|
315
|
+
y = self(y)
|
|
316
|
+
if x.is_zero():
|
|
317
|
+
return y.is_zero()
|
|
318
|
+
return True
|
|
319
|
+
|
|
320
|
+
def _gcd_univariate_polynomial(self, a, b):
|
|
321
|
+
"""
|
|
322
|
+
Return the gcd of ``a`` and ``b`` as a monic polynomial.
|
|
323
|
+
|
|
324
|
+
INPUT:
|
|
325
|
+
|
|
326
|
+
- ``a``, ``b`` -- two univariate polynomials defined over ``self``
|
|
327
|
+
|
|
328
|
+
.. WARNING::
|
|
329
|
+
|
|
330
|
+
If the base ring is inexact, the results may not be
|
|
331
|
+
entirely stable.
|
|
332
|
+
|
|
333
|
+
EXAMPLES::
|
|
334
|
+
|
|
335
|
+
sage: R.<x> = QQbar[] # needs sage.rings.number_field
|
|
336
|
+
sage: QQbar._gcd_univariate_polynomial(2*x, 2*x^2) # needs sage.rings.number_field
|
|
337
|
+
x
|
|
338
|
+
|
|
339
|
+
TESTS::
|
|
340
|
+
|
|
341
|
+
sage: fields = []
|
|
342
|
+
sage: fields += [RR, CC] # needs sage.rings.real_mpfr
|
|
343
|
+
sage: fields.append(QQbar) # needs sage.rings.number_field
|
|
344
|
+
sage: for A in fields:
|
|
345
|
+
....: g = A._gcd_univariate_polynomial
|
|
346
|
+
....: R.<x> = A[]
|
|
347
|
+
....: z = R.zero()
|
|
348
|
+
....: assert(g(2*x, 2*x^2) == x and
|
|
349
|
+
....: g(z, 2*x) == x and
|
|
350
|
+
....: g(2*x, z) == x and
|
|
351
|
+
....: g(z, z) == z)
|
|
352
|
+
|
|
353
|
+
sage: # needs sage.rings.real_mpfr
|
|
354
|
+
sage: R.<x> = RR[]
|
|
355
|
+
sage: (x^3).gcd(x^5 + 1)
|
|
356
|
+
1.00000000000000
|
|
357
|
+
sage: (x^3).gcd(x^5 + x^2)
|
|
358
|
+
x^2
|
|
359
|
+
sage: f = (x+3)^2 * (x-1)
|
|
360
|
+
sage: g = (x+3)^5
|
|
361
|
+
sage: f.gcd(g)
|
|
362
|
+
x^2 + 6.00000000000000*x + 9.00000000000000
|
|
363
|
+
|
|
364
|
+
The following example illustrates the fact that for inexact
|
|
365
|
+
base rings, the returned gcd is often 1 due to rounding::
|
|
366
|
+
|
|
367
|
+
sage: # needs sage.rings.real_mpfr
|
|
368
|
+
sage: f = (x+RR.pi())^2 * (x-1)
|
|
369
|
+
sage: g = (x+RR.pi())^5
|
|
370
|
+
sage: f.gcd(g)
|
|
371
|
+
1.00000000000000
|
|
372
|
+
|
|
373
|
+
Check :issue:`23012`::
|
|
374
|
+
|
|
375
|
+
sage: # needs sage.libs.pari
|
|
376
|
+
sage: R.<x> = QQ[]
|
|
377
|
+
sage: Q = R.quotient(x^2 - 1) # Not a field
|
|
378
|
+
sage: P.<x> = Q[]
|
|
379
|
+
sage: def always_True(*args, **kwds): return True
|
|
380
|
+
sage: Q.is_field = always_True
|
|
381
|
+
sage: Q in Fields()
|
|
382
|
+
True
|
|
383
|
+
sage: Q._gcd_univariate_polynomial(x, x)
|
|
384
|
+
x
|
|
385
|
+
"""
|
|
386
|
+
while b:
|
|
387
|
+
q, r = a.quo_rem(b)
|
|
388
|
+
a, b = b, r
|
|
389
|
+
if a:
|
|
390
|
+
a = a.monic()
|
|
391
|
+
return a
|
|
392
|
+
|
|
393
|
+
def _xgcd_univariate_polynomial(self, a, b):
|
|
394
|
+
r"""
|
|
395
|
+
Return an extended gcd of ``a`` and ``b``.
|
|
396
|
+
|
|
397
|
+
INPUT:
|
|
398
|
+
|
|
399
|
+
- ``a``, ``b`` -- two univariate polynomials defined over ``self``
|
|
400
|
+
|
|
401
|
+
OUTPUT:
|
|
402
|
+
|
|
403
|
+
A tuple ``(d, u, v)`` of polynomials such that ``d`` is the
|
|
404
|
+
greatest common divisor (monic or zero) of ``a`` and ``b``,
|
|
405
|
+
and ``u``, ``v`` satisfy ``d = u*a + v*b``.
|
|
406
|
+
|
|
407
|
+
.. WARNING::
|
|
408
|
+
|
|
409
|
+
If the base ring is inexact, the results may not be
|
|
410
|
+
entirely stable.
|
|
411
|
+
|
|
412
|
+
ALGORITHM:
|
|
413
|
+
|
|
414
|
+
This uses the extended Euclidean algorithm; see for example
|
|
415
|
+
[Coh1993]_, Algorithm 3.2.2.
|
|
416
|
+
|
|
417
|
+
EXAMPLES::
|
|
418
|
+
|
|
419
|
+
sage: P.<x> = QQ[]
|
|
420
|
+
sage: F = (x^2 + 2)*x^3; G = (x^2+2)*(x-3)
|
|
421
|
+
sage: g, u, v = QQ._xgcd_univariate_polynomial(F,G)
|
|
422
|
+
sage: g, u, v
|
|
423
|
+
(x^2 + 2, 1/27, -1/27*x^2 - 1/9*x - 1/3)
|
|
424
|
+
sage: u*F + v*G
|
|
425
|
+
x^2 + 2
|
|
426
|
+
|
|
427
|
+
::
|
|
428
|
+
|
|
429
|
+
sage: g, u, v = QQ._xgcd_univariate_polynomial(x,P(0)); g, u, v
|
|
430
|
+
(x, 1, 0)
|
|
431
|
+
sage: g == u*x + v*P(0)
|
|
432
|
+
True
|
|
433
|
+
sage: g, u, v = QQ._xgcd_univariate_polynomial(P(0),x); g, u, v
|
|
434
|
+
(x, 0, 1)
|
|
435
|
+
sage: g == u*P(0) + v*x
|
|
436
|
+
True
|
|
437
|
+
|
|
438
|
+
TESTS::
|
|
439
|
+
|
|
440
|
+
sage: fields = []
|
|
441
|
+
sage: fields += [RR, CC] # needs sage.rings.real_mpfr
|
|
442
|
+
sage: fields.append(QQbar) # needs sage.rings.number_field
|
|
443
|
+
sage: for A in fields:
|
|
444
|
+
....: g = A._xgcd_univariate_polynomial
|
|
445
|
+
....: R.<x> = A[]
|
|
446
|
+
....: z, h = R(0), R(1/2)
|
|
447
|
+
....: assert(g(2*x, 2*x^2) == (x, h, z) and
|
|
448
|
+
....: g(z, 2*x) == (x, z, h) and
|
|
449
|
+
....: g(2*x, z) == (x, h, z) and
|
|
450
|
+
....: g(z, z) == (z, z, z))
|
|
451
|
+
|
|
452
|
+
sage: P.<x> = QQ[]
|
|
453
|
+
sage: F = (x^2 + 2)*x^3; G = (x^2+2)*(x-3)
|
|
454
|
+
sage: g, u, v = QQ._xgcd_univariate_polynomial(F,G)
|
|
455
|
+
sage: g, u, v
|
|
456
|
+
(x^2 + 2, 1/27, -1/27*x^2 - 1/9*x - 1/3)
|
|
457
|
+
sage: u*F + v*G
|
|
458
|
+
x^2 + 2
|
|
459
|
+
|
|
460
|
+
We check that the behavior of xgcd with zero elements is
|
|
461
|
+
compatible with gcd (:issue:`17671`)::
|
|
462
|
+
|
|
463
|
+
sage: # needs sage.rings.number_field
|
|
464
|
+
sage: R.<x> = QQbar[]
|
|
465
|
+
sage: zero = R.zero()
|
|
466
|
+
sage: zero.xgcd(2*x)
|
|
467
|
+
(x, 0, 1/2)
|
|
468
|
+
sage: (2*x).xgcd(zero)
|
|
469
|
+
(x, 1/2, 0)
|
|
470
|
+
sage: zero.xgcd(zero)
|
|
471
|
+
(0, 0, 0)
|
|
472
|
+
"""
|
|
473
|
+
R = a.parent()
|
|
474
|
+
zero = R.zero()
|
|
475
|
+
if not b:
|
|
476
|
+
if not a:
|
|
477
|
+
return (zero, zero, zero)
|
|
478
|
+
c = ~a.leading_coefficient()
|
|
479
|
+
return (c * a, R(c), zero)
|
|
480
|
+
elif not a:
|
|
481
|
+
c = ~b.leading_coefficient()
|
|
482
|
+
return (c * b, zero, R(c))
|
|
483
|
+
u, d, v1, v3 = (R.one(), a, zero, b)
|
|
484
|
+
while v3:
|
|
485
|
+
q, r = d.quo_rem(v3)
|
|
486
|
+
u, d, v1, v3 = (v1, v3, u - v1 * q, r)
|
|
487
|
+
v = (d - a * u) // b
|
|
488
|
+
if d:
|
|
489
|
+
c = ~d.leading_coefficient()
|
|
490
|
+
d, u, v = c * d, c * u, c * v
|
|
491
|
+
return d, u, v
|
|
492
|
+
|
|
493
|
+
def is_perfect(self):
|
|
494
|
+
r"""
|
|
495
|
+
Return whether this field is perfect, i.e., its characteristic is
|
|
496
|
+
`p=0` or every element has a `p`-th root.
|
|
497
|
+
|
|
498
|
+
EXAMPLES::
|
|
499
|
+
|
|
500
|
+
sage: QQ.is_perfect()
|
|
501
|
+
True
|
|
502
|
+
sage: GF(2).is_perfect()
|
|
503
|
+
True
|
|
504
|
+
sage: FunctionField(GF(2), 'x').is_perfect()
|
|
505
|
+
False
|
|
506
|
+
"""
|
|
507
|
+
if self.characteristic() == 0:
|
|
508
|
+
return True
|
|
509
|
+
else:
|
|
510
|
+
raise NotImplementedError
|
|
511
|
+
|
|
512
|
+
def _test_characteristic_fields(self, **options):
|
|
513
|
+
"""
|
|
514
|
+
Run generic tests on the method :meth:`.characteristic`.
|
|
515
|
+
|
|
516
|
+
EXAMPLES::
|
|
517
|
+
|
|
518
|
+
sage: QQ._test_characteristic_fields()
|
|
519
|
+
|
|
520
|
+
.. NOTE::
|
|
521
|
+
|
|
522
|
+
We cannot call this method ``_test_characteristic`` since that
|
|
523
|
+
would overwrite the method in the super category, and for
|
|
524
|
+
cython classes just calling
|
|
525
|
+
``super(sage.categories.fields.Fields().parent_class,
|
|
526
|
+
self)._test_characteristic`` doesn't have the desired effect.
|
|
527
|
+
|
|
528
|
+
.. SEEALSO::
|
|
529
|
+
|
|
530
|
+
:meth:`sage.categories.rings.Rings.ParentMethods._test_characteristic`
|
|
531
|
+
"""
|
|
532
|
+
tester = self._tester(**options)
|
|
533
|
+
try:
|
|
534
|
+
char = self.characteristic()
|
|
535
|
+
tester.assertTrue(char.is_zero() or char.is_prime())
|
|
536
|
+
except AttributeError:
|
|
537
|
+
return
|
|
538
|
+
# raised when self.one() does not have a additive_order() [or when char is an int and not an Integer which is already checked by _test_characteristic for rings]
|
|
539
|
+
except NotImplementedError:
|
|
540
|
+
return
|
|
541
|
+
|
|
542
|
+
def fraction_field(self):
|
|
543
|
+
"""
|
|
544
|
+
Return the *fraction field* of ``self``, which is ``self``.
|
|
545
|
+
|
|
546
|
+
EXAMPLES:
|
|
547
|
+
|
|
548
|
+
Since fields are their own field of fractions, we simply get the
|
|
549
|
+
original field in return::
|
|
550
|
+
|
|
551
|
+
sage: QQ.fraction_field()
|
|
552
|
+
Rational Field
|
|
553
|
+
sage: RR.fraction_field() # needs sage.rings.real_mpfr
|
|
554
|
+
Real Field with 53 bits of precision
|
|
555
|
+
sage: CC.fraction_field() # needs sage.rings.real_mpfr
|
|
556
|
+
Complex Field with 53 bits of precision
|
|
557
|
+
|
|
558
|
+
sage: x = polygen(ZZ, 'x')
|
|
559
|
+
sage: F = NumberField(x^2 + 1, 'i') # needs sage.rings.number_field
|
|
560
|
+
sage: F.fraction_field() # needs sage.rings.number_field
|
|
561
|
+
Number Field in i with defining polynomial x^2 + 1
|
|
562
|
+
"""
|
|
563
|
+
return self
|
|
564
|
+
|
|
565
|
+
def ideal(self, *gens, **kwds):
|
|
566
|
+
"""
|
|
567
|
+
Return the ideal generated by ``gens``.
|
|
568
|
+
|
|
569
|
+
INPUT:
|
|
570
|
+
|
|
571
|
+
- an element or a list/tuple/sequence of elements, the generators
|
|
572
|
+
|
|
573
|
+
Any named arguments are ignored.
|
|
574
|
+
|
|
575
|
+
EXAMPLES::
|
|
576
|
+
|
|
577
|
+
sage: QQ.ideal(2)
|
|
578
|
+
Principal ideal (1) of Rational Field
|
|
579
|
+
sage: QQ.ideal(0)
|
|
580
|
+
Principal ideal (0) of Rational Field
|
|
581
|
+
|
|
582
|
+
TESTS::
|
|
583
|
+
|
|
584
|
+
sage: QQ.ideal(2, 4)
|
|
585
|
+
Principal ideal (1) of Rational Field
|
|
586
|
+
|
|
587
|
+
sage: QQ.ideal([2, 4])
|
|
588
|
+
Principal ideal (1) of Rational Field
|
|
589
|
+
"""
|
|
590
|
+
if len(gens) == 1 and isinstance(gens[0], (list, tuple)):
|
|
591
|
+
gens = gens[0]
|
|
592
|
+
for x in gens:
|
|
593
|
+
if not self(x).is_zero():
|
|
594
|
+
return self.unit_ideal()
|
|
595
|
+
return self.zero_ideal()
|
|
596
|
+
|
|
597
|
+
def _squarefree_decomposition_univariate_polynomial(self, f):
|
|
598
|
+
r"""
|
|
599
|
+
Return the square-free decomposition of ``f`` over this field.
|
|
600
|
+
|
|
601
|
+
This is a helper method for
|
|
602
|
+
:meth:`sage.rings.polynomial.squarefree_decomposition`.
|
|
603
|
+
|
|
604
|
+
INPUT:
|
|
605
|
+
|
|
606
|
+
- ``f`` -- a univariate nonzero polynomial over this field
|
|
607
|
+
|
|
608
|
+
ALGORITHM: For rings of characteristic zero, we use the algorithm
|
|
609
|
+
described in [Yun1976]_. Other fields may provide their own
|
|
610
|
+
implementation by overriding this method.
|
|
611
|
+
|
|
612
|
+
EXAMPLES::
|
|
613
|
+
|
|
614
|
+
sage: x = polygen(QQ)
|
|
615
|
+
sage: p = 37 * (x-1)^3 * (x-2)^3 * (x-1/3)^7 * (x-3/7)
|
|
616
|
+
sage: p.squarefree_decomposition()
|
|
617
|
+
(37*x - 111/7) * (x^2 - 3*x + 2)^3 * (x - 1/3)^7
|
|
618
|
+
sage: p = 37 * (x-2/3)^2
|
|
619
|
+
sage: p.squarefree_decomposition()
|
|
620
|
+
(37) * (x - 2/3)^2
|
|
621
|
+
sage: x = polygen(GF(3))
|
|
622
|
+
sage: x.squarefree_decomposition()
|
|
623
|
+
x
|
|
624
|
+
sage: f = QQbar['x'](1) # needs sage.rings.number_field
|
|
625
|
+
sage: f.squarefree_decomposition() # needs sage.rings.number_field
|
|
626
|
+
1
|
|
627
|
+
"""
|
|
628
|
+
from sage.structure.factorization import Factorization
|
|
629
|
+
if f.degree() == 0:
|
|
630
|
+
return Factorization([], unit=f[0])
|
|
631
|
+
if self.characteristic() != 0:
|
|
632
|
+
raise NotImplementedError("square-free decomposition not implemented for this polynomial")
|
|
633
|
+
|
|
634
|
+
factors = []
|
|
635
|
+
cur = f
|
|
636
|
+
f = [f]
|
|
637
|
+
while cur.degree() > 0:
|
|
638
|
+
cur = cur.gcd(cur.derivative())
|
|
639
|
+
f.append(cur)
|
|
640
|
+
|
|
641
|
+
g = [f[i] // f[i + 1] for i in range(len(f) - 1)]
|
|
642
|
+
a = [g[i] // g[i + 1] for i in range(len(g) - 1)]
|
|
643
|
+
a.append(g[-1])
|
|
644
|
+
|
|
645
|
+
unit = f[-1]
|
|
646
|
+
for i in range(len(a)):
|
|
647
|
+
if a[i].degree() > 0:
|
|
648
|
+
factors.append((a[i], i + 1))
|
|
649
|
+
else:
|
|
650
|
+
unit = unit * a[i].constant_coefficient() ** (i + 1)
|
|
651
|
+
|
|
652
|
+
return Factorization(factors, unit=unit, sort=False)
|
|
653
|
+
|
|
654
|
+
def vector_space(self, *args, **kwds):
|
|
655
|
+
r"""
|
|
656
|
+
Give an isomorphism of this field with a vector space over a subfield.
|
|
657
|
+
|
|
658
|
+
This method is an alias for ``free_module``, which may have more documentation.
|
|
659
|
+
|
|
660
|
+
INPUT:
|
|
661
|
+
|
|
662
|
+
- ``base`` -- a subfield or morphism into this field (defaults to the base field)
|
|
663
|
+
|
|
664
|
+
- ``basis`` -- a basis of the field as a vector space
|
|
665
|
+
over the subfield; if not given, one is chosen automatically
|
|
666
|
+
|
|
667
|
+
- ``map`` -- whether to return maps from and to the vector space
|
|
668
|
+
|
|
669
|
+
OUTPUT:
|
|
670
|
+
|
|
671
|
+
- ``V`` -- a vector space over ``base``
|
|
672
|
+
- ``from_V`` -- an isomorphism from ``V`` to this field
|
|
673
|
+
- ``to_V`` -- the inverse isomorphism from this field to ``V``
|
|
674
|
+
|
|
675
|
+
EXAMPLES::
|
|
676
|
+
|
|
677
|
+
sage: # needs sage.rings.padics
|
|
678
|
+
sage: K.<a> = Qq(125)
|
|
679
|
+
sage: V, fr, to = K.vector_space()
|
|
680
|
+
sage: v = V([1, 2, 3])
|
|
681
|
+
sage: fr(v, 7)
|
|
682
|
+
(3*a^2 + 2*a + 1) + O(5^7)
|
|
683
|
+
"""
|
|
684
|
+
return self.free_module(*args, **kwds)
|
|
685
|
+
|
|
686
|
+
def _pseudo_fraction_field(self):
|
|
687
|
+
"""
|
|
688
|
+
The fraction field of ``self`` is always available as ``self``.
|
|
689
|
+
|
|
690
|
+
EXAMPLES::
|
|
691
|
+
|
|
692
|
+
sage: QQ._pseudo_fraction_field()
|
|
693
|
+
Rational Field
|
|
694
|
+
sage: K = GF(5)
|
|
695
|
+
sage: K._pseudo_fraction_field()
|
|
696
|
+
Finite Field of size 5
|
|
697
|
+
sage: K._pseudo_fraction_field() is K
|
|
698
|
+
True
|
|
699
|
+
"""
|
|
700
|
+
return self
|
|
701
|
+
|
|
702
|
+
class ElementMethods:
|
|
703
|
+
def euclidean_degree(self):
|
|
704
|
+
r"""
|
|
705
|
+
Return the degree of this element as an element of a Euclidean
|
|
706
|
+
domain.
|
|
707
|
+
|
|
708
|
+
In a field, this returns 0 for all but the zero element (for
|
|
709
|
+
which it is undefined).
|
|
710
|
+
|
|
711
|
+
EXAMPLES::
|
|
712
|
+
|
|
713
|
+
sage: QQ.one().euclidean_degree()
|
|
714
|
+
0
|
|
715
|
+
"""
|
|
716
|
+
if self.is_zero():
|
|
717
|
+
raise ValueError("euclidean degree not defined for the zero element")
|
|
718
|
+
from sage.rings.integer_ring import ZZ
|
|
719
|
+
return ZZ.zero()
|
|
720
|
+
|
|
721
|
+
def quo_rem(self, other):
|
|
722
|
+
r"""
|
|
723
|
+
Return the quotient with remainder of the division of this element
|
|
724
|
+
by ``other``.
|
|
725
|
+
|
|
726
|
+
INPUT:
|
|
727
|
+
|
|
728
|
+
- ``other`` -- an element of the field
|
|
729
|
+
|
|
730
|
+
EXAMPLES::
|
|
731
|
+
|
|
732
|
+
sage: f,g = QQ(1), QQ(2)
|
|
733
|
+
sage: f.quo_rem(g)
|
|
734
|
+
(1/2, 0)
|
|
735
|
+
"""
|
|
736
|
+
if other.is_zero():
|
|
737
|
+
raise ZeroDivisionError
|
|
738
|
+
return (self / other, self.parent().zero())
|
|
739
|
+
|
|
740
|
+
def is_unit(self):
|
|
741
|
+
r"""
|
|
742
|
+
Return ``True`` if ``self`` has a multiplicative inverse.
|
|
743
|
+
|
|
744
|
+
EXAMPLES::
|
|
745
|
+
|
|
746
|
+
sage: QQ(2).is_unit()
|
|
747
|
+
True
|
|
748
|
+
sage: QQ(0).is_unit()
|
|
749
|
+
False
|
|
750
|
+
"""
|
|
751
|
+
return not self.is_zero()
|
|
752
|
+
|
|
753
|
+
# Fields are unique factorization domains, so, there is gcd and lcm
|
|
754
|
+
# Of course, in general gcd and lcm in a field are not very interesting.
|
|
755
|
+
# However, they should be implemented!
|
|
756
|
+
@coerce_binop
|
|
757
|
+
def gcd(self, other):
|
|
758
|
+
"""
|
|
759
|
+
Greatest common divisor.
|
|
760
|
+
|
|
761
|
+
.. NOTE::
|
|
762
|
+
|
|
763
|
+
Since we are in a field and the greatest common divisor is only
|
|
764
|
+
determined up to a unit, it is correct to either return zero or
|
|
765
|
+
one. Note that fraction fields of unique factorization domains
|
|
766
|
+
provide a more sophisticated gcd.
|
|
767
|
+
|
|
768
|
+
EXAMPLES::
|
|
769
|
+
|
|
770
|
+
sage: K = GF(5)
|
|
771
|
+
sage: K(2).gcd(K(1))
|
|
772
|
+
1
|
|
773
|
+
sage: K(0).gcd(K(0))
|
|
774
|
+
0
|
|
775
|
+
sage: all(x.gcd(y) == (0 if x == 0 and y == 0 else 1)
|
|
776
|
+
....: for x in K for y in K)
|
|
777
|
+
True
|
|
778
|
+
|
|
779
|
+
For field of characteristic zero, the gcd of integers is considered
|
|
780
|
+
as if they were elements of the integer ring::
|
|
781
|
+
|
|
782
|
+
sage: gcd(15.0,12.0) # needs sage.rings.real_mpfr
|
|
783
|
+
3.00000000000000
|
|
784
|
+
|
|
785
|
+
But for other floating point numbers, the gcd is just `0.0` or `1.0`::
|
|
786
|
+
|
|
787
|
+
sage: gcd(3.2, 2.18) # needs sage.rings.real_mpfr
|
|
788
|
+
1.00000000000000
|
|
789
|
+
|
|
790
|
+
sage: gcd(0.0, 0.0) # needs sage.rings.real_mpfr
|
|
791
|
+
0.000000000000000
|
|
792
|
+
|
|
793
|
+
TESTS::
|
|
794
|
+
|
|
795
|
+
sage: QQbar(0).gcd(QQbar.zeta(3)) # needs sage.rings.number_field
|
|
796
|
+
1
|
|
797
|
+
|
|
798
|
+
AUTHOR:
|
|
799
|
+
|
|
800
|
+
- Simon King (2011-02) -- :issue:`10771`
|
|
801
|
+
- Vincent Delecroix (2015) -- :issue:`17671`
|
|
802
|
+
"""
|
|
803
|
+
P = self.parent()
|
|
804
|
+
try:
|
|
805
|
+
has_zero_char = P.characteristic() == 0
|
|
806
|
+
except (AttributeError, NotImplementedError):
|
|
807
|
+
has_zero_char = False
|
|
808
|
+
if has_zero_char:
|
|
809
|
+
from sage.rings.integer_ring import ZZ
|
|
810
|
+
try:
|
|
811
|
+
return P(ZZ(self).gcd(ZZ(other)))
|
|
812
|
+
except (TypeError, ValueError):
|
|
813
|
+
pass
|
|
814
|
+
|
|
815
|
+
if self == P.zero() and other == P.zero():
|
|
816
|
+
return P.zero()
|
|
817
|
+
return P.one()
|
|
818
|
+
|
|
819
|
+
@coerce_binop
|
|
820
|
+
def lcm(self, other):
|
|
821
|
+
"""
|
|
822
|
+
Least common multiple.
|
|
823
|
+
|
|
824
|
+
.. NOTE::
|
|
825
|
+
|
|
826
|
+
Since we are in a field and the least common multiple is only
|
|
827
|
+
determined up to a unit, it is correct to either return zero or
|
|
828
|
+
one. Note that fraction fields of unique factorization domains
|
|
829
|
+
provide a more sophisticated lcm.
|
|
830
|
+
|
|
831
|
+
EXAMPLES::
|
|
832
|
+
|
|
833
|
+
sage: GF(2)(1).lcm(GF(2)(0))
|
|
834
|
+
0
|
|
835
|
+
sage: GF(2)(1).lcm(GF(2)(1))
|
|
836
|
+
1
|
|
837
|
+
|
|
838
|
+
For field of characteristic zero, the lcm of integers is considered
|
|
839
|
+
as if they were elements of the integer ring::
|
|
840
|
+
|
|
841
|
+
sage: lcm(15.0, 12.0) # needs sage.rings.real_mpfr
|
|
842
|
+
60.0000000000000
|
|
843
|
+
|
|
844
|
+
But for others floating point numbers, it is just `0.0` or `1.0`::
|
|
845
|
+
|
|
846
|
+
sage: lcm(3.2, 2.18) # needs sage.rings.real_mpfr
|
|
847
|
+
1.00000000000000
|
|
848
|
+
|
|
849
|
+
sage: lcm(0.0, 0.0) # needs sage.rings.real_mpfr
|
|
850
|
+
0.000000000000000
|
|
851
|
+
|
|
852
|
+
AUTHOR:
|
|
853
|
+
|
|
854
|
+
- Simon King (2011-02) -- :issue:`10771`
|
|
855
|
+
- Vincent Delecroix (2015) -- :issue:`17671`
|
|
856
|
+
"""
|
|
857
|
+
P = self.parent()
|
|
858
|
+
try:
|
|
859
|
+
has_zero_char = P.characteristic() == 0
|
|
860
|
+
except (AttributeError, NotImplementedError):
|
|
861
|
+
has_zero_char = False
|
|
862
|
+
if has_zero_char:
|
|
863
|
+
from sage.rings.integer_ring import ZZ
|
|
864
|
+
try:
|
|
865
|
+
return P(ZZ(self).lcm(ZZ(other)))
|
|
866
|
+
except TypeError:
|
|
867
|
+
pass
|
|
868
|
+
|
|
869
|
+
if self.is_zero() or other.is_zero():
|
|
870
|
+
return P.zero()
|
|
871
|
+
return P.one()
|
|
872
|
+
|
|
873
|
+
@coerce_binop
|
|
874
|
+
def xgcd(self, other):
|
|
875
|
+
r"""
|
|
876
|
+
Compute the extended gcd of ``self`` and ``other``.
|
|
877
|
+
|
|
878
|
+
INPUT:
|
|
879
|
+
|
|
880
|
+
- ``other`` -- an element with the same parent as ``self``
|
|
881
|
+
|
|
882
|
+
OUTPUT:
|
|
883
|
+
|
|
884
|
+
A tuple ``(r, s, t)`` of elements in the parent of ``self`` such
|
|
885
|
+
that ``r = s * self + t * other``. Since the computations are done
|
|
886
|
+
over a field, ``r`` is zero if ``self`` and ``other`` are zero,
|
|
887
|
+
and one otherwise.
|
|
888
|
+
|
|
889
|
+
AUTHORS:
|
|
890
|
+
|
|
891
|
+
- Julian Rueth (2012-10-19): moved here from
|
|
892
|
+
:class:`sage.structure.element.FieldElement`
|
|
893
|
+
|
|
894
|
+
EXAMPLES::
|
|
895
|
+
|
|
896
|
+
sage: K = GF(5)
|
|
897
|
+
sage: K(2).xgcd(K(1))
|
|
898
|
+
(1, 3, 0)
|
|
899
|
+
sage: K(0).xgcd(K(4))
|
|
900
|
+
(1, 0, 4)
|
|
901
|
+
sage: K(1).xgcd(K(1))
|
|
902
|
+
(1, 1, 0)
|
|
903
|
+
sage: GF(5)(0).xgcd(GF(5)(0))
|
|
904
|
+
(0, 0, 0)
|
|
905
|
+
|
|
906
|
+
The xgcd of nonzero floating point numbers will be a triple of
|
|
907
|
+
floating points. But if the input are two integral floating points
|
|
908
|
+
the result is a floating point version of the standard gcd on
|
|
909
|
+
`\ZZ`::
|
|
910
|
+
|
|
911
|
+
sage: xgcd(12.0, 8.0) # needs sage.rings.real_mpfr
|
|
912
|
+
(4.00000000000000, 1.00000000000000, -1.00000000000000)
|
|
913
|
+
|
|
914
|
+
sage: xgcd(3.1, 2.98714) # needs sage.rings.real_mpfr
|
|
915
|
+
(1.00000000000000, 0.322580645161290, 0.000000000000000)
|
|
916
|
+
|
|
917
|
+
sage: xgcd(0.0, 1.1) # needs sage.rings.real_mpfr
|
|
918
|
+
(1.00000000000000, 0.000000000000000, 0.909090909090909)
|
|
919
|
+
"""
|
|
920
|
+
P = self.parent()
|
|
921
|
+
try:
|
|
922
|
+
has_zero_char = P.characteristic() == 0
|
|
923
|
+
except (AttributeError, NotImplementedError):
|
|
924
|
+
has_zero_char = False
|
|
925
|
+
if has_zero_char:
|
|
926
|
+
from sage.rings.integer_ring import ZZ
|
|
927
|
+
try:
|
|
928
|
+
return tuple(P(x) for x in ZZ(self).xgcd(ZZ(other)))
|
|
929
|
+
except TypeError:
|
|
930
|
+
pass
|
|
931
|
+
|
|
932
|
+
if not self.is_zero():
|
|
933
|
+
return (P.one(), ~self, P.zero())
|
|
934
|
+
if not other.is_zero():
|
|
935
|
+
return (P.one(), P.zero(), ~other)
|
|
936
|
+
# else both are 0
|
|
937
|
+
return (P.zero(), P.zero(), P.zero())
|
|
938
|
+
|
|
939
|
+
def factor(self):
|
|
940
|
+
"""
|
|
941
|
+
Return a factorization of ``self``.
|
|
942
|
+
|
|
943
|
+
Since ``self`` is either a unit or zero, this function is trivial.
|
|
944
|
+
|
|
945
|
+
EXAMPLES::
|
|
946
|
+
|
|
947
|
+
sage: x = GF(7)(5)
|
|
948
|
+
sage: x.factor()
|
|
949
|
+
5
|
|
950
|
+
sage: RR(0).factor() # needs sage.rings.real_mpfr
|
|
951
|
+
Traceback (most recent call last):
|
|
952
|
+
...
|
|
953
|
+
ArithmeticError: factorization of 0.000000000000000 is not defined
|
|
954
|
+
"""
|
|
955
|
+
if not self:
|
|
956
|
+
raise ArithmeticError("factorization of {!r} is not defined".format(self))
|
|
957
|
+
from sage.structure.factorization import Factorization
|
|
958
|
+
return Factorization([], self) # No factor; "self" as unit
|
|
959
|
+
|
|
960
|
+
def inverse_of_unit(self):
|
|
961
|
+
r"""
|
|
962
|
+
Return the inverse of this element.
|
|
963
|
+
|
|
964
|
+
EXAMPLES::
|
|
965
|
+
|
|
966
|
+
sage: x = polygen(ZZ, 'x')
|
|
967
|
+
sage: NumberField(x^7 + 2, 'a')(2).inverse_of_unit() # needs sage.rings.number_field
|
|
968
|
+
1/2
|
|
969
|
+
|
|
970
|
+
Trying to invert the zero element typically raises a
|
|
971
|
+
:exc:`ZeroDivisionError`::
|
|
972
|
+
|
|
973
|
+
sage: QQ(0).inverse_of_unit()
|
|
974
|
+
Traceback (most recent call last):
|
|
975
|
+
...
|
|
976
|
+
ZeroDivisionError: rational division by zero
|
|
977
|
+
|
|
978
|
+
To catch that exception in a way that also works for non-units
|
|
979
|
+
in more general rings, use something like::
|
|
980
|
+
|
|
981
|
+
sage: try:
|
|
982
|
+
....: QQ(0).inverse_of_unit()
|
|
983
|
+
....: except ArithmeticError:
|
|
984
|
+
....: pass
|
|
985
|
+
|
|
986
|
+
Also note that some “fields” allow one to invert the zero element::
|
|
987
|
+
|
|
988
|
+
sage: RR(0).inverse_of_unit()
|
|
989
|
+
+infinity
|
|
990
|
+
"""
|
|
991
|
+
return ~self
|