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,1730 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Field `\QQ` of Rational Numbers
|
|
4
|
+
|
|
5
|
+
The class :class:`RationalField` represents the field `\QQ` of (arbitrary
|
|
6
|
+
precision) rational numbers. Each rational number is an instance of the class
|
|
7
|
+
:class:`Rational`.
|
|
8
|
+
|
|
9
|
+
Interactively, an instance of :class:`RationalField` is available as ``QQ``::
|
|
10
|
+
|
|
11
|
+
sage: QQ
|
|
12
|
+
Rational Field
|
|
13
|
+
|
|
14
|
+
Values of various types can be converted to rational numbers by using the
|
|
15
|
+
:meth:`__call__` method of :class:`RationalField` (that is, by treating ``QQ`` as a
|
|
16
|
+
function).
|
|
17
|
+
|
|
18
|
+
::
|
|
19
|
+
|
|
20
|
+
sage: RealField(9).pi() # needs sage.rings.real_mpfr
|
|
21
|
+
3.1
|
|
22
|
+
sage: QQ(RealField(9).pi()) # needs sage.rings.real_interval_field sage.rings.real_mpfr
|
|
23
|
+
22/7
|
|
24
|
+
sage: QQ(RealField().pi()) # needs sage.rings.real_interval_field sage.rings.real_mpfr
|
|
25
|
+
245850922/78256779
|
|
26
|
+
sage: QQ(35)
|
|
27
|
+
35
|
|
28
|
+
sage: QQ('12/347')
|
|
29
|
+
12/347
|
|
30
|
+
sage: QQ(exp(pi*I)) # needs sage.symbolic
|
|
31
|
+
-1
|
|
32
|
+
sage: x = polygen(ZZ)
|
|
33
|
+
sage: QQ((3*x)/(4*x))
|
|
34
|
+
3/4
|
|
35
|
+
|
|
36
|
+
TESTS::
|
|
37
|
+
|
|
38
|
+
sage: Q = RationalField()
|
|
39
|
+
sage: Q == loads(dumps(Q))
|
|
40
|
+
True
|
|
41
|
+
sage: RationalField() is RationalField()
|
|
42
|
+
True
|
|
43
|
+
sage: Q in Fields().Infinite()
|
|
44
|
+
True
|
|
45
|
+
|
|
46
|
+
AUTHORS:
|
|
47
|
+
|
|
48
|
+
- Niles Johnson (2010-08): :issue:`3893`: ``random_element()`` should pass on
|
|
49
|
+
``*args`` and ``**kwds``.
|
|
50
|
+
|
|
51
|
+
- Travis Scrimshaw (2012-10-18): Added additional docstrings for full coverage.
|
|
52
|
+
Removed duplicates of ``discriminant()`` and ``signature()``.
|
|
53
|
+
|
|
54
|
+
- Anna Haensch (2018-03): Added function ``quadratic_defect()``
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
from sage.rings.integer import Integer
|
|
58
|
+
from sage.rings.rational import Rational
|
|
59
|
+
|
|
60
|
+
ZZ = None
|
|
61
|
+
|
|
62
|
+
import sage.rings.number_field.number_field_base as number_field_base
|
|
63
|
+
from sage.misc.fast_methods import Singleton
|
|
64
|
+
from sage.misc.superseded import deprecated_function_alias
|
|
65
|
+
from sage.structure.parent import Parent
|
|
66
|
+
from sage.structure.sequence import Sequence
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class RationalField(Singleton, number_field_base.NumberField):
|
|
70
|
+
r"""
|
|
71
|
+
The class ``RationalField`` represents the field `\QQ` of rational numbers.
|
|
72
|
+
|
|
73
|
+
EXAMPLES::
|
|
74
|
+
|
|
75
|
+
sage: a = 901824309821093821093812093810928309183091832091
|
|
76
|
+
sage: b = QQ(a); b
|
|
77
|
+
901824309821093821093812093810928309183091832091
|
|
78
|
+
sage: QQ(b)
|
|
79
|
+
901824309821093821093812093810928309183091832091
|
|
80
|
+
sage: QQ(int(93820984323))
|
|
81
|
+
93820984323
|
|
82
|
+
sage: QQ(ZZ(901824309821093821093812093810928309183091832091))
|
|
83
|
+
901824309821093821093812093810928309183091832091
|
|
84
|
+
sage: QQ('-930482/9320842317')
|
|
85
|
+
-930482/9320842317
|
|
86
|
+
sage: QQ((-930482, 9320842317))
|
|
87
|
+
-930482/9320842317
|
|
88
|
+
sage: QQ([9320842317])
|
|
89
|
+
9320842317
|
|
90
|
+
sage: QQ(pari(39029384023840928309482842098430284398243982394)) # needs sage.libs.pari
|
|
91
|
+
39029384023840928309482842098430284398243982394
|
|
92
|
+
sage: QQ('sage')
|
|
93
|
+
Traceback (most recent call last):
|
|
94
|
+
...
|
|
95
|
+
TypeError: unable to convert 'sage' to a rational
|
|
96
|
+
|
|
97
|
+
Conversion from the reals to the rationals is done by default using
|
|
98
|
+
continued fractions.
|
|
99
|
+
|
|
100
|
+
::
|
|
101
|
+
|
|
102
|
+
sage: QQ(RR(3929329/32))
|
|
103
|
+
3929329/32
|
|
104
|
+
sage: QQ(-RR(3929329/32))
|
|
105
|
+
-3929329/32
|
|
106
|
+
sage: QQ(RR(1/7)) - 1/7 # needs sage.rings.real_mpfr
|
|
107
|
+
0
|
|
108
|
+
|
|
109
|
+
If you specify the optional second argument ``base``, then the string
|
|
110
|
+
representation of the float is used.
|
|
111
|
+
|
|
112
|
+
::
|
|
113
|
+
|
|
114
|
+
sage: # needs sage.rings.real_mpfr
|
|
115
|
+
sage: QQ(23.2, 2)
|
|
116
|
+
6530219459687219/281474976710656
|
|
117
|
+
sage: 6530219459687219.0/281474976710656
|
|
118
|
+
23.20000000000000
|
|
119
|
+
sage: a = 23.2; a
|
|
120
|
+
23.2000000000000
|
|
121
|
+
sage: QQ(a, 10)
|
|
122
|
+
116/5
|
|
123
|
+
|
|
124
|
+
Here's a nice example involving elliptic curves::
|
|
125
|
+
|
|
126
|
+
sage: # needs database_cremona_mini_ellcurve sage.rings.real_mpfr sage.schemes
|
|
127
|
+
sage: E = EllipticCurve('11a')
|
|
128
|
+
sage: L = E.lseries().at1(300)[0]; L
|
|
129
|
+
0.2538418608559106843377589233...
|
|
130
|
+
sage: O = E.period_lattice().omega(); O
|
|
131
|
+
1.26920930427955
|
|
132
|
+
sage: t = L/O; t
|
|
133
|
+
0.200000000000000
|
|
134
|
+
sage: QQ(RealField(45)(t))
|
|
135
|
+
1/5
|
|
136
|
+
"""
|
|
137
|
+
def __new__(cls):
|
|
138
|
+
"""
|
|
139
|
+
This method actually is not needed for using :class:`RationalField`.
|
|
140
|
+
But it is used to unpickle some very old pickles.
|
|
141
|
+
|
|
142
|
+
TESTS::
|
|
143
|
+
|
|
144
|
+
sage: RationalField() in Fields() # indirect doctest
|
|
145
|
+
True
|
|
146
|
+
"""
|
|
147
|
+
try:
|
|
148
|
+
return QQ
|
|
149
|
+
except BaseException:
|
|
150
|
+
from sage.rings.number_field.number_field_base import NumberField
|
|
151
|
+
return NumberField.__new__(cls)
|
|
152
|
+
|
|
153
|
+
def __init__(self):
|
|
154
|
+
r"""
|
|
155
|
+
We create the rational numbers `\QQ`, and call a few functions::
|
|
156
|
+
|
|
157
|
+
sage: Q = RationalField(); Q
|
|
158
|
+
Rational Field
|
|
159
|
+
sage: Q.characteristic()
|
|
160
|
+
0
|
|
161
|
+
sage: Q.is_field()
|
|
162
|
+
True
|
|
163
|
+
sage: Q.category()
|
|
164
|
+
Join of Category of number fields
|
|
165
|
+
and Category of quotient fields
|
|
166
|
+
and Category of metric spaces
|
|
167
|
+
sage: Q.zeta()
|
|
168
|
+
-1
|
|
169
|
+
|
|
170
|
+
We next illustrate arithmetic in `\QQ`.
|
|
171
|
+
|
|
172
|
+
::
|
|
173
|
+
|
|
174
|
+
sage: Q('49/7')
|
|
175
|
+
7
|
|
176
|
+
sage: type(Q('49/7'))
|
|
177
|
+
<class 'sage.rings.rational.Rational'>
|
|
178
|
+
sage: a = Q('19/374'); a
|
|
179
|
+
19/374
|
|
180
|
+
sage: b = Q('17/371'); b
|
|
181
|
+
17/371
|
|
182
|
+
sage: a + b
|
|
183
|
+
13407/138754
|
|
184
|
+
sage: b + a
|
|
185
|
+
13407/138754
|
|
186
|
+
sage: a * b
|
|
187
|
+
19/8162
|
|
188
|
+
sage: b * a
|
|
189
|
+
19/8162
|
|
190
|
+
sage: a - b
|
|
191
|
+
691/138754
|
|
192
|
+
sage: b - a
|
|
193
|
+
-691/138754
|
|
194
|
+
sage: a / b
|
|
195
|
+
7049/6358
|
|
196
|
+
sage: b / a
|
|
197
|
+
6358/7049
|
|
198
|
+
sage: b < a
|
|
199
|
+
True
|
|
200
|
+
sage: a < b
|
|
201
|
+
False
|
|
202
|
+
|
|
203
|
+
Next finally illustrate arithmetic with automatic coercion. The
|
|
204
|
+
types that coerce into the rational field include ``str, int,
|
|
205
|
+
long, Integer``.
|
|
206
|
+
|
|
207
|
+
::
|
|
208
|
+
|
|
209
|
+
sage: a + Q('17/371')
|
|
210
|
+
13407/138754
|
|
211
|
+
sage: a * 374
|
|
212
|
+
19
|
|
213
|
+
sage: 374 * a
|
|
214
|
+
19
|
|
215
|
+
sage: a/19
|
|
216
|
+
1/374
|
|
217
|
+
sage: a + 1
|
|
218
|
+
393/374
|
|
219
|
+
|
|
220
|
+
TESTS::
|
|
221
|
+
|
|
222
|
+
sage: TestSuite(QQ).run()
|
|
223
|
+
sage: QQ.variable_name()
|
|
224
|
+
'x'
|
|
225
|
+
sage: QQ.variable_names()
|
|
226
|
+
('x',)
|
|
227
|
+
sage: QQ._element_constructor_((2, 3))
|
|
228
|
+
2/3
|
|
229
|
+
|
|
230
|
+
sage: QQ.is_finite()
|
|
231
|
+
False
|
|
232
|
+
|
|
233
|
+
sage: QQ.is_field()
|
|
234
|
+
True
|
|
235
|
+
"""
|
|
236
|
+
from sage.categories.basic import QuotientFields
|
|
237
|
+
from sage.categories.number_fields import NumberFields
|
|
238
|
+
Parent.__init__(self, base=self,
|
|
239
|
+
category=[QuotientFields().Metric(),
|
|
240
|
+
NumberFields()])
|
|
241
|
+
self._assign_names(('x',), normalize=False) # ?????
|
|
242
|
+
self._populate_coercion_lists_(init_no_parent=True)
|
|
243
|
+
|
|
244
|
+
_element_constructor_ = Rational
|
|
245
|
+
|
|
246
|
+
def _repr_(self):
|
|
247
|
+
"""
|
|
248
|
+
Return a string representation of ``self``.
|
|
249
|
+
|
|
250
|
+
EXAMPLES::
|
|
251
|
+
|
|
252
|
+
sage: QQ # indirect doctest
|
|
253
|
+
Rational Field
|
|
254
|
+
"""
|
|
255
|
+
return "Rational Field"
|
|
256
|
+
|
|
257
|
+
def _repr_option(self, key):
|
|
258
|
+
"""
|
|
259
|
+
Metadata about the :meth:`_repr_` output.
|
|
260
|
+
|
|
261
|
+
See :meth:`sage.structure.parent._repr_option` for details.
|
|
262
|
+
|
|
263
|
+
EXAMPLES::
|
|
264
|
+
|
|
265
|
+
sage: QQ._repr_option('element_is_atomic')
|
|
266
|
+
True
|
|
267
|
+
"""
|
|
268
|
+
if key == 'element_is_atomic':
|
|
269
|
+
return True
|
|
270
|
+
return super()._repr_option(key)
|
|
271
|
+
|
|
272
|
+
def _latex_(self):
|
|
273
|
+
r"""
|
|
274
|
+
Return a latex representation of ``self``.
|
|
275
|
+
|
|
276
|
+
EXAMPLES::
|
|
277
|
+
|
|
278
|
+
sage: latex(QQ) # indirect doctest
|
|
279
|
+
\Bold{Q}
|
|
280
|
+
"""
|
|
281
|
+
return r"\Bold{Q}"
|
|
282
|
+
|
|
283
|
+
def __reduce__(self):
|
|
284
|
+
r"""
|
|
285
|
+
Used for pickling `\QQ`.
|
|
286
|
+
|
|
287
|
+
EXAMPLES::
|
|
288
|
+
|
|
289
|
+
sage: loads(dumps(QQ)) is QQ
|
|
290
|
+
True
|
|
291
|
+
"""
|
|
292
|
+
return RationalField, tuple()
|
|
293
|
+
|
|
294
|
+
def __len__(self):
|
|
295
|
+
"""
|
|
296
|
+
Return the number of elements in ``self``.
|
|
297
|
+
|
|
298
|
+
Since this does not have a size, this throws a :exc:`TypeError`.
|
|
299
|
+
|
|
300
|
+
EXAMPLES::
|
|
301
|
+
|
|
302
|
+
sage: len(QQ)
|
|
303
|
+
Traceback (most recent call last):
|
|
304
|
+
...
|
|
305
|
+
TypeError: len() of unsized object
|
|
306
|
+
"""
|
|
307
|
+
raise TypeError('len() of unsized object')
|
|
308
|
+
|
|
309
|
+
def construction(self):
|
|
310
|
+
r"""
|
|
311
|
+
Return a pair ``(functor, parent)`` such that ``functor(parent)``
|
|
312
|
+
returns ``self``.
|
|
313
|
+
|
|
314
|
+
This is the construction of `\QQ` as the fraction field of `\ZZ`.
|
|
315
|
+
|
|
316
|
+
EXAMPLES::
|
|
317
|
+
|
|
318
|
+
sage: QQ.construction()
|
|
319
|
+
(FractionField, Integer Ring)
|
|
320
|
+
"""
|
|
321
|
+
from sage.categories.pushout import FractionField
|
|
322
|
+
|
|
323
|
+
from . import integer_ring
|
|
324
|
+
return FractionField(), integer_ring.ZZ
|
|
325
|
+
|
|
326
|
+
def completion(self, p, prec, extras={}):
|
|
327
|
+
r"""
|
|
328
|
+
Return the completion of `\QQ` at `p`.
|
|
329
|
+
|
|
330
|
+
EXAMPLES::
|
|
331
|
+
|
|
332
|
+
sage: QQ.completion(infinity, 53) # needs sage.rings.real_mpfr
|
|
333
|
+
Real Field with 53 bits of precision
|
|
334
|
+
sage: QQ.completion(5, 15, {'print_mode': 'bars'}) # needs sage.rings.padics
|
|
335
|
+
5-adic Field with capped relative precision 15
|
|
336
|
+
"""
|
|
337
|
+
from sage.rings.infinity import Infinity
|
|
338
|
+
if p == Infinity:
|
|
339
|
+
try:
|
|
340
|
+
from sage.rings.real_field import create_RealField
|
|
341
|
+
except ImportError:
|
|
342
|
+
if prec == 53:
|
|
343
|
+
from sage.rings.real_double import RDF
|
|
344
|
+
return RDF
|
|
345
|
+
else:
|
|
346
|
+
raise
|
|
347
|
+
else:
|
|
348
|
+
return create_RealField(prec, **extras)
|
|
349
|
+
else:
|
|
350
|
+
from sage.rings.padics.factory import Qp
|
|
351
|
+
return Qp(p, prec, **extras)
|
|
352
|
+
|
|
353
|
+
def _coerce_map_from_(self, S):
|
|
354
|
+
"""
|
|
355
|
+
Return a coerce map from ``S``.
|
|
356
|
+
|
|
357
|
+
EXAMPLES::
|
|
358
|
+
|
|
359
|
+
sage: f = QQ.coerce_map_from(ZZ); f # indirect doctest
|
|
360
|
+
Natural morphism:
|
|
361
|
+
From: Integer Ring
|
|
362
|
+
To: Rational Field
|
|
363
|
+
sage: f(3)
|
|
364
|
+
3
|
|
365
|
+
sage: f(3^99) - 3^99
|
|
366
|
+
0
|
|
367
|
+
sage: f = QQ.coerce_map_from(int); f # indirect doctest
|
|
368
|
+
Native morphism:
|
|
369
|
+
From: Set of Python objects of class 'int'
|
|
370
|
+
To: Rational Field
|
|
371
|
+
sage: f(44)
|
|
372
|
+
44
|
|
373
|
+
|
|
374
|
+
::
|
|
375
|
+
|
|
376
|
+
sage: L = Localization(ZZ, (3,5))
|
|
377
|
+
sage: 1/45 in L # indirect doctest
|
|
378
|
+
True
|
|
379
|
+
sage: 1/43 in L # indirect doctest
|
|
380
|
+
False
|
|
381
|
+
"""
|
|
382
|
+
global ZZ
|
|
383
|
+
from . import rational
|
|
384
|
+
if ZZ is None:
|
|
385
|
+
from . import integer_ring
|
|
386
|
+
ZZ = integer_ring.ZZ
|
|
387
|
+
if S is ZZ:
|
|
388
|
+
return rational.Z_to_Q()
|
|
389
|
+
elif S is int:
|
|
390
|
+
return rational.int_to_Q()
|
|
391
|
+
elif ZZ.has_coerce_map_from(S):
|
|
392
|
+
return rational.Z_to_Q() * ZZ._internal_coerce_map_from(S)
|
|
393
|
+
from sage.rings.localization import Localization
|
|
394
|
+
if isinstance(S, Localization):
|
|
395
|
+
if S.fraction_field() is self:
|
|
396
|
+
from sage.structure.coerce_maps import CallableConvertMap
|
|
397
|
+
return CallableConvertMap(S, self, lambda x: x._value, parent_as_first_arg=False)
|
|
398
|
+
|
|
399
|
+
def _is_valid_homomorphism_(self, codomain, im_gens, base_map=None):
|
|
400
|
+
"""
|
|
401
|
+
Check to see if the map into ``codomain`` determined by ``im_gens`` is
|
|
402
|
+
a valid homomorphism.
|
|
403
|
+
|
|
404
|
+
EXAMPLES::
|
|
405
|
+
|
|
406
|
+
sage: QQ._is_valid_homomorphism_(ZZ, [1])
|
|
407
|
+
False
|
|
408
|
+
sage: QQ._is_valid_homomorphism_(QQ, [1])
|
|
409
|
+
True
|
|
410
|
+
sage: QQ._is_valid_homomorphism_(RR, [1])
|
|
411
|
+
True
|
|
412
|
+
sage: QQ._is_valid_homomorphism_(RR, [2])
|
|
413
|
+
False
|
|
414
|
+
"""
|
|
415
|
+
try:
|
|
416
|
+
return im_gens[0] == codomain.coerce(self.gen(0))
|
|
417
|
+
except TypeError:
|
|
418
|
+
return False
|
|
419
|
+
|
|
420
|
+
def __iter__(self):
|
|
421
|
+
r"""
|
|
422
|
+
Create an iterator that generates the rational numbers without
|
|
423
|
+
repetition, in order of the height.
|
|
424
|
+
|
|
425
|
+
See also :meth:`range_by_height()`.
|
|
426
|
+
|
|
427
|
+
EXAMPLES:
|
|
428
|
+
|
|
429
|
+
The first 17 rational numbers, ordered by height::
|
|
430
|
+
|
|
431
|
+
sage: import itertools
|
|
432
|
+
sage: lst = [a for a in itertools.islice(Rationals(), 17r)]
|
|
433
|
+
sage: lst
|
|
434
|
+
[0, 1, -1, 1/2, -1/2, 2, -2, 1/3, -1/3, 3, -3, 2/3, -2/3, 3/2, -3/2, 1/4, -1/4]
|
|
435
|
+
sage: [a.height() for a in lst]
|
|
436
|
+
[1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4]
|
|
437
|
+
"""
|
|
438
|
+
yield self(0)
|
|
439
|
+
yield self(1)
|
|
440
|
+
yield self(-1)
|
|
441
|
+
height = Integer(1)
|
|
442
|
+
while True:
|
|
443
|
+
height = height + 1
|
|
444
|
+
for other in range(1, height):
|
|
445
|
+
if height.gcd(other) == 1:
|
|
446
|
+
yield self(other/height)
|
|
447
|
+
yield self(-other/height)
|
|
448
|
+
yield self(height/other)
|
|
449
|
+
yield self(-height/other)
|
|
450
|
+
|
|
451
|
+
def __truediv__(self, I):
|
|
452
|
+
"""
|
|
453
|
+
Form the quotient by an integral ideal.
|
|
454
|
+
|
|
455
|
+
EXAMPLES::
|
|
456
|
+
|
|
457
|
+
sage: QQ / ZZ # needs sage.modules
|
|
458
|
+
Q/Z
|
|
459
|
+
"""
|
|
460
|
+
from sage.groups.additive_abelian.qmodnz import QmodnZ
|
|
461
|
+
from sage.rings.ideal import Ideal_generic
|
|
462
|
+
if I is ZZ:
|
|
463
|
+
return QmodnZ(1)
|
|
464
|
+
elif isinstance(I, Ideal_generic) and I.base_ring() is ZZ:
|
|
465
|
+
return QmodnZ(I.gen())
|
|
466
|
+
else:
|
|
467
|
+
return super().__truediv__(I)
|
|
468
|
+
|
|
469
|
+
def range_by_height(self, start, end=None):
|
|
470
|
+
r"""
|
|
471
|
+
Range function for rational numbers, ordered by height.
|
|
472
|
+
|
|
473
|
+
Returns a Python generator for the list of rational numbers with
|
|
474
|
+
heights in ``range(start, end)``. Follows the same
|
|
475
|
+
convention as Python :func:`range`, type ``range?`` for details.
|
|
476
|
+
|
|
477
|
+
See also :meth:`__iter__`.
|
|
478
|
+
|
|
479
|
+
EXAMPLES:
|
|
480
|
+
|
|
481
|
+
All rational numbers with height strictly less than 4::
|
|
482
|
+
|
|
483
|
+
sage: list(QQ.range_by_height(4))
|
|
484
|
+
[0, 1, -1, 1/2, -1/2, 2, -2, 1/3, -1/3, 3, -3, 2/3, -2/3, 3/2, -3/2]
|
|
485
|
+
sage: [a.height() for a in QQ.range_by_height(4)]
|
|
486
|
+
[1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3]
|
|
487
|
+
|
|
488
|
+
All rational numbers with height 2::
|
|
489
|
+
|
|
490
|
+
sage: list(QQ.range_by_height(2, 3))
|
|
491
|
+
[1/2, -1/2, 2, -2]
|
|
492
|
+
|
|
493
|
+
Nonsensical integer arguments will return an empty generator::
|
|
494
|
+
|
|
495
|
+
sage: list(QQ.range_by_height(3, 3))
|
|
496
|
+
[]
|
|
497
|
+
sage: list(QQ.range_by_height(10, 1))
|
|
498
|
+
[]
|
|
499
|
+
|
|
500
|
+
There are no rational numbers with height `\leq 0`::
|
|
501
|
+
|
|
502
|
+
sage: list(QQ.range_by_height(-10, 1))
|
|
503
|
+
[]
|
|
504
|
+
"""
|
|
505
|
+
if end is None:
|
|
506
|
+
end = start
|
|
507
|
+
start = 1
|
|
508
|
+
start = max(start, 1)
|
|
509
|
+
for height in ZZ.range(start, end):
|
|
510
|
+
if height == 1:
|
|
511
|
+
yield self(0)
|
|
512
|
+
yield self(1)
|
|
513
|
+
yield self(-1)
|
|
514
|
+
for other in ZZ.range(1, height):
|
|
515
|
+
if height.gcd(other) == 1:
|
|
516
|
+
yield self(other/height)
|
|
517
|
+
yield self(-other/height)
|
|
518
|
+
yield self(height/other)
|
|
519
|
+
yield self(-height/other)
|
|
520
|
+
|
|
521
|
+
def primes_of_bounded_norm_iter(self, B):
|
|
522
|
+
r"""
|
|
523
|
+
Iterator yielding all primes less than or equal to `B`.
|
|
524
|
+
|
|
525
|
+
INPUT:
|
|
526
|
+
|
|
527
|
+
- ``B`` -- positive integer; upper bound on the primes generated
|
|
528
|
+
|
|
529
|
+
OUTPUT: an iterator over all integer primes less than or equal to `B`
|
|
530
|
+
|
|
531
|
+
.. NOTE::
|
|
532
|
+
|
|
533
|
+
This function exists for compatibility with the related number
|
|
534
|
+
field method, though it returns prime integers, not ideals.
|
|
535
|
+
|
|
536
|
+
EXAMPLES::
|
|
537
|
+
|
|
538
|
+
sage: it = QQ.primes_of_bounded_norm_iter(10)
|
|
539
|
+
sage: list(it) # needs sage.libs.pari
|
|
540
|
+
[2, 3, 5, 7]
|
|
541
|
+
sage: list(QQ.primes_of_bounded_norm_iter(1))
|
|
542
|
+
[]
|
|
543
|
+
"""
|
|
544
|
+
try:
|
|
545
|
+
B = ZZ(B.ceil())
|
|
546
|
+
except (TypeError, AttributeError):
|
|
547
|
+
raise TypeError("%s is not valid bound on prime ideals" % B)
|
|
548
|
+
|
|
549
|
+
if B < 2:
|
|
550
|
+
return
|
|
551
|
+
|
|
552
|
+
from sage.arith.misc import primes
|
|
553
|
+
yield from primes(B + 1)
|
|
554
|
+
|
|
555
|
+
def discriminant(self):
|
|
556
|
+
"""
|
|
557
|
+
Return the discriminant of the field of rational numbers, which is 1.
|
|
558
|
+
|
|
559
|
+
EXAMPLES::
|
|
560
|
+
|
|
561
|
+
sage: QQ.discriminant()
|
|
562
|
+
1
|
|
563
|
+
"""
|
|
564
|
+
return Integer(1)
|
|
565
|
+
|
|
566
|
+
def absolute_discriminant(self):
|
|
567
|
+
"""
|
|
568
|
+
Return the absolute discriminant, which is 1.
|
|
569
|
+
|
|
570
|
+
EXAMPLES::
|
|
571
|
+
|
|
572
|
+
sage: QQ.absolute_discriminant()
|
|
573
|
+
1
|
|
574
|
+
"""
|
|
575
|
+
return self.discriminant()
|
|
576
|
+
|
|
577
|
+
def relative_discriminant(self):
|
|
578
|
+
"""
|
|
579
|
+
Return the relative discriminant, which is 1.
|
|
580
|
+
|
|
581
|
+
EXAMPLES::
|
|
582
|
+
|
|
583
|
+
sage: QQ.relative_discriminant()
|
|
584
|
+
1
|
|
585
|
+
"""
|
|
586
|
+
return self.discriminant()
|
|
587
|
+
|
|
588
|
+
def class_number(self):
|
|
589
|
+
"""
|
|
590
|
+
Return the class number of the field of rational numbers, which is 1.
|
|
591
|
+
|
|
592
|
+
EXAMPLES::
|
|
593
|
+
|
|
594
|
+
sage: QQ.class_number()
|
|
595
|
+
1
|
|
596
|
+
"""
|
|
597
|
+
return Integer(1)
|
|
598
|
+
|
|
599
|
+
def signature(self):
|
|
600
|
+
r"""
|
|
601
|
+
Return the signature of the rational field, which is `(1,0)`, since
|
|
602
|
+
there are 1 real and no complex embeddings.
|
|
603
|
+
|
|
604
|
+
EXAMPLES::
|
|
605
|
+
|
|
606
|
+
sage: QQ.signature()
|
|
607
|
+
(1, 0)
|
|
608
|
+
"""
|
|
609
|
+
return (Integer(1), Integer(0))
|
|
610
|
+
|
|
611
|
+
def embeddings(self, K):
|
|
612
|
+
r"""
|
|
613
|
+
Return the list containing the unique embedding of `\QQ` into `K`,
|
|
614
|
+
if it exists, and an empty list otherwise.
|
|
615
|
+
|
|
616
|
+
EXAMPLES::
|
|
617
|
+
|
|
618
|
+
sage: QQ.embeddings(QQ)
|
|
619
|
+
[Identity endomorphism of Rational Field]
|
|
620
|
+
sage: QQ.embeddings(CyclotomicField(5)) # needs sage.rings.number_field
|
|
621
|
+
[Coercion map:
|
|
622
|
+
From: Rational Field
|
|
623
|
+
To: Cyclotomic Field of order 5 and degree 4]
|
|
624
|
+
|
|
625
|
+
The field `K` must have characteristic `0` for an embedding of `\QQ`
|
|
626
|
+
to exist::
|
|
627
|
+
|
|
628
|
+
sage: QQ.embeddings(GF(3))
|
|
629
|
+
[]
|
|
630
|
+
"""
|
|
631
|
+
if K.characteristic() == 0:
|
|
632
|
+
v = [self.hom(K)]
|
|
633
|
+
else:
|
|
634
|
+
v = []
|
|
635
|
+
return Sequence(v, check=False, universe=self.Hom(K))
|
|
636
|
+
|
|
637
|
+
def automorphisms(self):
|
|
638
|
+
r"""
|
|
639
|
+
Return all Galois automorphisms of ``self``.
|
|
640
|
+
|
|
641
|
+
OUTPUT: a sequence containing just the identity morphism
|
|
642
|
+
|
|
643
|
+
EXAMPLES::
|
|
644
|
+
|
|
645
|
+
sage: QQ.automorphisms()
|
|
646
|
+
[Ring endomorphism of Rational Field
|
|
647
|
+
Defn: 1 |--> 1]
|
|
648
|
+
"""
|
|
649
|
+
return Sequence([self.hom(1, self)], cr=True, immutable=False,
|
|
650
|
+
check=False)
|
|
651
|
+
|
|
652
|
+
def places(self, all_complex=False, prec=None):
|
|
653
|
+
r"""
|
|
654
|
+
Return the collection of all infinite places of ``self``, which
|
|
655
|
+
in this case is just the embedding of ``self`` into `\RR`.
|
|
656
|
+
|
|
657
|
+
By default, this returns homomorphisms into ``RR``. If
|
|
658
|
+
``prec`` is not None, we simply return homomorphisms into
|
|
659
|
+
``RealField(prec)`` (or ``RDF`` if ``prec=53``).
|
|
660
|
+
|
|
661
|
+
There is an optional flag ``all_complex``, which defaults to
|
|
662
|
+
``False``. If ``all_complex`` is ``True``, then the real embeddings
|
|
663
|
+
are returned as embeddings into the corresponding complex
|
|
664
|
+
field.
|
|
665
|
+
|
|
666
|
+
For consistency with non-trivial number fields.
|
|
667
|
+
|
|
668
|
+
EXAMPLES::
|
|
669
|
+
|
|
670
|
+
sage: QQ.places() # needs sage.rings.real_mpfr
|
|
671
|
+
[Ring morphism:
|
|
672
|
+
From: Rational Field
|
|
673
|
+
To: Real Field with 53 bits of precision
|
|
674
|
+
Defn: 1 |--> 1.00000000000000]
|
|
675
|
+
sage: QQ.places(prec=53)
|
|
676
|
+
[Ring morphism:
|
|
677
|
+
From: Rational Field
|
|
678
|
+
To: Real Double Field
|
|
679
|
+
Defn: 1 |--> 1.0]
|
|
680
|
+
sage: QQ.places(prec=200, all_complex=True) # needs sage.rings.real_mpfr
|
|
681
|
+
[Ring morphism:
|
|
682
|
+
From: Rational Field
|
|
683
|
+
To: Complex Field with 200 bits of precision
|
|
684
|
+
Defn: 1 |--> 1.0000000000000000000000000000000000000000000000000000000000]
|
|
685
|
+
"""
|
|
686
|
+
from sage.rings.infinity import Infinity
|
|
687
|
+
if prec is None:
|
|
688
|
+
if all_complex:
|
|
689
|
+
from sage.rings.cc import CC as domain
|
|
690
|
+
else:
|
|
691
|
+
from sage.rings.real_mpfr import RR as domain
|
|
692
|
+
elif prec == 53:
|
|
693
|
+
if all_complex:
|
|
694
|
+
from sage.rings.complex_double import CDF as domain
|
|
695
|
+
else:
|
|
696
|
+
from sage.rings.real_double import RDF as domain
|
|
697
|
+
elif prec == Infinity:
|
|
698
|
+
if all_complex:
|
|
699
|
+
from sage.rings.qqbar import QQbar as domain
|
|
700
|
+
else:
|
|
701
|
+
from sage.rings.qqbar import AA as domain
|
|
702
|
+
else:
|
|
703
|
+
if all_complex:
|
|
704
|
+
from sage.rings.complex_mpfr import ComplexField
|
|
705
|
+
domain = ComplexField(prec)
|
|
706
|
+
else:
|
|
707
|
+
from sage.rings.real_mpfr import RealField
|
|
708
|
+
domain = RealField(prec)
|
|
709
|
+
return [self.hom([domain(1)])]
|
|
710
|
+
|
|
711
|
+
def complex_embedding(self, prec=53):
|
|
712
|
+
"""
|
|
713
|
+
Return embedding of the rational numbers into the complex numbers.
|
|
714
|
+
|
|
715
|
+
EXAMPLES::
|
|
716
|
+
|
|
717
|
+
sage: QQ.complex_embedding() # needs sage.rings.real_mpfr
|
|
718
|
+
Ring morphism:
|
|
719
|
+
From: Rational Field
|
|
720
|
+
To: Complex Field with 53 bits of precision
|
|
721
|
+
Defn: 1 |--> 1.00000000000000
|
|
722
|
+
sage: QQ.complex_embedding(20) # needs sage.rings.real_mpfr
|
|
723
|
+
Ring morphism:
|
|
724
|
+
From: Rational Field
|
|
725
|
+
To: Complex Field with 20 bits of precision
|
|
726
|
+
Defn: 1 |--> 1.0000
|
|
727
|
+
"""
|
|
728
|
+
from . import complex_mpfr
|
|
729
|
+
CC = complex_mpfr.ComplexField(prec)
|
|
730
|
+
return self.hom([CC(1)])
|
|
731
|
+
|
|
732
|
+
def residue_field(self, p, check=True):
|
|
733
|
+
r"""
|
|
734
|
+
Return the residue field of `\QQ` at the prime `p`, for
|
|
735
|
+
consistency with other number fields.
|
|
736
|
+
|
|
737
|
+
INPUT:
|
|
738
|
+
|
|
739
|
+
- ``p`` -- prime integer
|
|
740
|
+
|
|
741
|
+
- ``check`` -- (default: ``True``) if ``True``, check the primality of
|
|
742
|
+
`p`, else do not
|
|
743
|
+
|
|
744
|
+
OUTPUT: the residue field at this prime
|
|
745
|
+
|
|
746
|
+
EXAMPLES::
|
|
747
|
+
|
|
748
|
+
sage: QQ.residue_field(5)
|
|
749
|
+
Residue field of Integers modulo 5
|
|
750
|
+
sage: QQ.residue_field(next_prime(10^9)) # needs sage.rings.finite_rings
|
|
751
|
+
Residue field of Integers modulo 1000000007
|
|
752
|
+
"""
|
|
753
|
+
from sage.rings.finite_rings.residue_field import ResidueField
|
|
754
|
+
return ResidueField(ZZ.ideal(p), check=check)
|
|
755
|
+
|
|
756
|
+
def hilbert_symbol_negative_at_S(self, S, b, check=True):
|
|
757
|
+
r"""
|
|
758
|
+
Return an integer that has a negative Hilbert symbol with respect
|
|
759
|
+
to a given rational number and a given set of primes (or places).
|
|
760
|
+
|
|
761
|
+
The function is algorithm 3.4.1 in [Kir2016]_. It finds an integer `a`
|
|
762
|
+
that has negative Hilbert symbol with respect to a given rational number
|
|
763
|
+
exactly at a given set of primes (or places).
|
|
764
|
+
|
|
765
|
+
INPUT:
|
|
766
|
+
|
|
767
|
+
- ``S`` -- list of rational primes, the infinite place as real
|
|
768
|
+
embedding of `\QQ` or as `-1`
|
|
769
|
+
- ``b`` -- a nonzero rational number which is a non-square locally
|
|
770
|
+
at every prime in ``S``
|
|
771
|
+
- ``check`` -- boolean (default: ``True``); perform additional checks on
|
|
772
|
+
input and confirm the output
|
|
773
|
+
|
|
774
|
+
OUTPUT:
|
|
775
|
+
|
|
776
|
+
- An integer `a` that has negative Hilbert symbol `(a,b)_p` for
|
|
777
|
+
every place `p` in `S` and no other place.
|
|
778
|
+
|
|
779
|
+
EXAMPLES::
|
|
780
|
+
|
|
781
|
+
sage: QQ.hilbert_symbol_negative_at_S([-1,5,3,2,7,11,13,23], -10/7) # needs sage.rings.padics
|
|
782
|
+
-9867
|
|
783
|
+
sage: QQ.hilbert_symbol_negative_at_S([3, 5, QQ.places()[0], 11], -15) # needs sage.rings.padics
|
|
784
|
+
-33
|
|
785
|
+
sage: QQ.hilbert_symbol_negative_at_S([3, 5], 2) # needs sage.rings.padics
|
|
786
|
+
15
|
|
787
|
+
|
|
788
|
+
TESTS::
|
|
789
|
+
|
|
790
|
+
sage: QQ.hilbert_symbol_negative_at_S(5/2, -2) # needs sage.modules
|
|
791
|
+
Traceback (most recent call last):
|
|
792
|
+
...
|
|
793
|
+
TypeError: first argument must be a list or integer
|
|
794
|
+
|
|
795
|
+
::
|
|
796
|
+
|
|
797
|
+
sage: QQ.hilbert_symbol_negative_at_S([1, 3], 0) # needs sage.modules
|
|
798
|
+
Traceback (most recent call last):
|
|
799
|
+
...
|
|
800
|
+
ValueError: second argument must be nonzero
|
|
801
|
+
|
|
802
|
+
::
|
|
803
|
+
|
|
804
|
+
sage: QQ.hilbert_symbol_negative_at_S([-1, 3, 5], 2) # needs sage.modules
|
|
805
|
+
Traceback (most recent call last):
|
|
806
|
+
...
|
|
807
|
+
ValueError: list should be of even cardinality
|
|
808
|
+
|
|
809
|
+
::
|
|
810
|
+
|
|
811
|
+
sage: QQ.hilbert_symbol_negative_at_S([1, 3], 2) # needs sage.modules
|
|
812
|
+
Traceback (most recent call last):
|
|
813
|
+
...
|
|
814
|
+
ValueError: all entries in list must be prime or -1 for
|
|
815
|
+
infinite place
|
|
816
|
+
|
|
817
|
+
::
|
|
818
|
+
|
|
819
|
+
sage: QQ.hilbert_symbol_negative_at_S([5, 7], 2) # needs sage.libs.pari sage.modules sage.rings.padics
|
|
820
|
+
Traceback (most recent call last):
|
|
821
|
+
...
|
|
822
|
+
ValueError: second argument must be a nonsquare with
|
|
823
|
+
respect to every finite prime in the list
|
|
824
|
+
|
|
825
|
+
::
|
|
826
|
+
|
|
827
|
+
sage: QQ.hilbert_symbol_negative_at_S([1, 3], sqrt(2)) # needs sage.libs.pari sage.modules sage.symbolic
|
|
828
|
+
Traceback (most recent call last):
|
|
829
|
+
...
|
|
830
|
+
TypeError: second argument must be a rational number
|
|
831
|
+
|
|
832
|
+
::
|
|
833
|
+
|
|
834
|
+
sage: QQ.hilbert_symbol_negative_at_S([-1, 3], 2) # needs sage.modules
|
|
835
|
+
Traceback (most recent call last):
|
|
836
|
+
...
|
|
837
|
+
ValueError: if the infinite place is in the list, the second
|
|
838
|
+
argument must be negative
|
|
839
|
+
|
|
840
|
+
AUTHORS:
|
|
841
|
+
|
|
842
|
+
- Simon Brandhorst, Juanita Duque, Anna Haensch, Manami Roy, Sandi Rudzinski (10-24-2017)
|
|
843
|
+
"""
|
|
844
|
+
from sage.arith.misc import hilbert_symbol, is_prime
|
|
845
|
+
from sage.matrix.constructor import matrix
|
|
846
|
+
from sage.modules.free_module import VectorSpace
|
|
847
|
+
from sage.rings.finite_rings.finite_field_constructor import FiniteField as GF
|
|
848
|
+
from sage.sets.primes import Primes
|
|
849
|
+
|
|
850
|
+
# input checks
|
|
851
|
+
if type(S) is not list:
|
|
852
|
+
raise TypeError("first argument must be a list or integer")
|
|
853
|
+
# -1 is used for the infinite place
|
|
854
|
+
infty = -1
|
|
855
|
+
for i in range(len(S)):
|
|
856
|
+
if S[i] == self.places()[0]:
|
|
857
|
+
S[i] = -1
|
|
858
|
+
if b not in self:
|
|
859
|
+
raise TypeError("second argument must be a rational number")
|
|
860
|
+
b = self(b)
|
|
861
|
+
if b == 0:
|
|
862
|
+
raise ValueError("second argument must be nonzero")
|
|
863
|
+
if len(S) % 2:
|
|
864
|
+
raise ValueError("list should be of even cardinality")
|
|
865
|
+
for p in S:
|
|
866
|
+
if p != infty:
|
|
867
|
+
if check and not is_prime(p):
|
|
868
|
+
raise ValueError("all entries in list must be prime"
|
|
869
|
+
" or -1 for infinite place")
|
|
870
|
+
from sage.rings.padics.factory import Qp
|
|
871
|
+
R = Qp(p)
|
|
872
|
+
if R(b).is_square():
|
|
873
|
+
raise ValueError("second argument must be a nonsquare with"
|
|
874
|
+
" respect to every finite prime in the list")
|
|
875
|
+
elif b > 0:
|
|
876
|
+
raise ValueError("if the infinite place is in the list, "
|
|
877
|
+
"the second argument must be negative")
|
|
878
|
+
# L is the list of primes that we need to consider, b must have
|
|
879
|
+
# nonzero valuation for each prime in L, this is the set S'
|
|
880
|
+
# in Kirschmer's algorithm
|
|
881
|
+
L = []
|
|
882
|
+
L = [p[0] for p in b.factor() if p[0] not in S]
|
|
883
|
+
# We must also consider 2 to be in L
|
|
884
|
+
if 2 not in L and 2 not in S:
|
|
885
|
+
L.append(2)
|
|
886
|
+
# This adds the infinite place to L
|
|
887
|
+
if b < 0 and infty not in S:
|
|
888
|
+
L.append(infty)
|
|
889
|
+
|
|
890
|
+
P = S + L
|
|
891
|
+
# This constructs the vector v in the algorithm. This is the vector
|
|
892
|
+
# that we are searching for. It represents the case when the Hilbert
|
|
893
|
+
# symbol is negative for all primes in S and positive
|
|
894
|
+
# at all primes in S'
|
|
895
|
+
V = VectorSpace(GF(2), len(P))
|
|
896
|
+
v = V([1]*len(S) + [0]*len(L))
|
|
897
|
+
|
|
898
|
+
# Compute the map phi of Hilbert symbols at all the primes
|
|
899
|
+
# in S and S'
|
|
900
|
+
# For technical reasons, a Hilbert symbol of -1 is
|
|
901
|
+
# represented as 1 and a Hilbert symbol of 1
|
|
902
|
+
# is represented as 0
|
|
903
|
+
def phi(x):
|
|
904
|
+
v = [(1-hilbert_symbol(x, b, p))//2 for p in P]
|
|
905
|
+
return V(v)
|
|
906
|
+
|
|
907
|
+
M = matrix(GF(2), [phi(p) for p in P+[-1]])
|
|
908
|
+
# We search through all the primes
|
|
909
|
+
for q in Primes():
|
|
910
|
+
# Only look at this prime if it is not in our list
|
|
911
|
+
if q in P:
|
|
912
|
+
continue
|
|
913
|
+
|
|
914
|
+
# The algorithm terminates when the vector v is in the
|
|
915
|
+
# subspace of V generated by the image of the phi map
|
|
916
|
+
# on the set of generators
|
|
917
|
+
w = phi(q)
|
|
918
|
+
W = M.stack(matrix(w))
|
|
919
|
+
if v in W.row_space():
|
|
920
|
+
break
|
|
921
|
+
Pq = P + [-1] + [q]
|
|
922
|
+
l = W.solve_left(v)
|
|
923
|
+
a = self.prod([Pq[i]**ZZ(l[i]) for i in range(l.degree())])
|
|
924
|
+
if check:
|
|
925
|
+
assert phi(a) == v, "oops"
|
|
926
|
+
return a
|
|
927
|
+
|
|
928
|
+
def gens(self) -> tuple:
|
|
929
|
+
r"""
|
|
930
|
+
Return a tuple of generators of `\QQ`, which is only ``(1,)``.
|
|
931
|
+
|
|
932
|
+
EXAMPLES::
|
|
933
|
+
|
|
934
|
+
sage: QQ.gens()
|
|
935
|
+
(1,)
|
|
936
|
+
"""
|
|
937
|
+
return (self(1), )
|
|
938
|
+
|
|
939
|
+
def gen(self, n=0):
|
|
940
|
+
r"""
|
|
941
|
+
Return the n-th generator of `\QQ`.
|
|
942
|
+
|
|
943
|
+
There is only the 0-th generator, which is 1.
|
|
944
|
+
|
|
945
|
+
EXAMPLES::
|
|
946
|
+
|
|
947
|
+
sage: QQ.gen()
|
|
948
|
+
1
|
|
949
|
+
"""
|
|
950
|
+
if n == 0:
|
|
951
|
+
return self(1)
|
|
952
|
+
else:
|
|
953
|
+
raise IndexError("n must be 0")
|
|
954
|
+
|
|
955
|
+
def degree(self):
|
|
956
|
+
r"""
|
|
957
|
+
Return the degree of `\QQ`, which is 1.
|
|
958
|
+
|
|
959
|
+
EXAMPLES::
|
|
960
|
+
|
|
961
|
+
sage: QQ.degree()
|
|
962
|
+
1
|
|
963
|
+
"""
|
|
964
|
+
return Integer(1)
|
|
965
|
+
|
|
966
|
+
def absolute_degree(self):
|
|
967
|
+
r"""
|
|
968
|
+
Return the absolute degree of `\QQ`, which is 1.
|
|
969
|
+
|
|
970
|
+
EXAMPLES::
|
|
971
|
+
|
|
972
|
+
sage: QQ.absolute_degree()
|
|
973
|
+
1
|
|
974
|
+
"""
|
|
975
|
+
return Integer(1)
|
|
976
|
+
|
|
977
|
+
def ngens(self):
|
|
978
|
+
r"""
|
|
979
|
+
Return the number of generators of `\QQ`, which is 1.
|
|
980
|
+
|
|
981
|
+
EXAMPLES::
|
|
982
|
+
|
|
983
|
+
sage: QQ.ngens()
|
|
984
|
+
1
|
|
985
|
+
"""
|
|
986
|
+
return Integer(1)
|
|
987
|
+
|
|
988
|
+
def is_absolute(self):
|
|
989
|
+
r"""
|
|
990
|
+
`\QQ` is an absolute extension of `\QQ`.
|
|
991
|
+
|
|
992
|
+
EXAMPLES::
|
|
993
|
+
|
|
994
|
+
sage: QQ.is_absolute()
|
|
995
|
+
True
|
|
996
|
+
"""
|
|
997
|
+
return True
|
|
998
|
+
|
|
999
|
+
def is_prime_field(self):
|
|
1000
|
+
r"""
|
|
1001
|
+
Return ``True`` since `\QQ` is a prime field.
|
|
1002
|
+
|
|
1003
|
+
EXAMPLES::
|
|
1004
|
+
|
|
1005
|
+
sage: QQ.is_prime_field()
|
|
1006
|
+
True
|
|
1007
|
+
"""
|
|
1008
|
+
return True
|
|
1009
|
+
|
|
1010
|
+
def characteristic(self):
|
|
1011
|
+
r"""
|
|
1012
|
+
Return 0 since the rational field has characteristic 0.
|
|
1013
|
+
|
|
1014
|
+
EXAMPLES::
|
|
1015
|
+
|
|
1016
|
+
sage: c = QQ.characteristic(); c
|
|
1017
|
+
0
|
|
1018
|
+
sage: parent(c)
|
|
1019
|
+
Integer Ring
|
|
1020
|
+
"""
|
|
1021
|
+
return Integer(0)
|
|
1022
|
+
|
|
1023
|
+
def maximal_order(self):
|
|
1024
|
+
r"""
|
|
1025
|
+
Return the maximal order of the rational numbers, i.e., the ring
|
|
1026
|
+
`\ZZ` of integers.
|
|
1027
|
+
|
|
1028
|
+
EXAMPLES::
|
|
1029
|
+
|
|
1030
|
+
sage: QQ.maximal_order()
|
|
1031
|
+
Integer Ring
|
|
1032
|
+
sage: QQ.ring_of_integers ()
|
|
1033
|
+
Integer Ring
|
|
1034
|
+
"""
|
|
1035
|
+
from .integer_ring import ZZ
|
|
1036
|
+
return ZZ
|
|
1037
|
+
|
|
1038
|
+
def number_field(self):
|
|
1039
|
+
r"""
|
|
1040
|
+
Return the number field associated to `\QQ`. Since `\QQ` is a number
|
|
1041
|
+
field, this just returns `\QQ` again.
|
|
1042
|
+
|
|
1043
|
+
EXAMPLES::
|
|
1044
|
+
|
|
1045
|
+
sage: QQ.number_field() is QQ
|
|
1046
|
+
True
|
|
1047
|
+
"""
|
|
1048
|
+
return self
|
|
1049
|
+
|
|
1050
|
+
def power_basis(self):
|
|
1051
|
+
r"""
|
|
1052
|
+
Return a power basis for this number field over its base field.
|
|
1053
|
+
|
|
1054
|
+
The power basis is always ``[1]`` for the rational field. This method
|
|
1055
|
+
is defined to make the rational field behave more like a number
|
|
1056
|
+
field.
|
|
1057
|
+
|
|
1058
|
+
EXAMPLES::
|
|
1059
|
+
|
|
1060
|
+
sage: QQ.power_basis()
|
|
1061
|
+
[1]
|
|
1062
|
+
"""
|
|
1063
|
+
return [self.gen()]
|
|
1064
|
+
|
|
1065
|
+
def extension(self, poly, names, **kwds):
|
|
1066
|
+
r"""
|
|
1067
|
+
Create a field extension of `\QQ`.
|
|
1068
|
+
|
|
1069
|
+
EXAMPLES:
|
|
1070
|
+
|
|
1071
|
+
We make a single absolute extension::
|
|
1072
|
+
|
|
1073
|
+
sage: x = polygen(QQ, 'x')
|
|
1074
|
+
sage: K.<a> = QQ.extension(x^3 + 5); K # needs sage.rings.number_field
|
|
1075
|
+
Number Field in a with defining polynomial x^3 + 5
|
|
1076
|
+
|
|
1077
|
+
We make an extension generated by roots of two polynomials::
|
|
1078
|
+
|
|
1079
|
+
sage: K.<a,b> = QQ.extension([x^3 + 5, x^2 + 3]); K # needs sage.rings.number_field
|
|
1080
|
+
Number Field in a with defining polynomial x^3 + 5 over its base field
|
|
1081
|
+
sage: b^2 # needs sage.rings.number_field
|
|
1082
|
+
-3
|
|
1083
|
+
sage: a^3 # needs sage.rings.number_field
|
|
1084
|
+
-5
|
|
1085
|
+
"""
|
|
1086
|
+
from sage.rings.number_field.number_field import NumberField
|
|
1087
|
+
return NumberField(poly, names=names, **kwds)
|
|
1088
|
+
|
|
1089
|
+
def algebraic_closure(self):
|
|
1090
|
+
r"""
|
|
1091
|
+
Return the algebraic closure of ``self`` (which is `\QQbar`).
|
|
1092
|
+
|
|
1093
|
+
EXAMPLES::
|
|
1094
|
+
|
|
1095
|
+
sage: QQ.algebraic_closure() # needs sage.rings.number_field
|
|
1096
|
+
Algebraic Field
|
|
1097
|
+
"""
|
|
1098
|
+
from sage.rings.qqbar import QQbar
|
|
1099
|
+
return QQbar
|
|
1100
|
+
|
|
1101
|
+
def order(self):
|
|
1102
|
+
r"""
|
|
1103
|
+
Return the order of `\QQ`, which is `\infty`.
|
|
1104
|
+
|
|
1105
|
+
EXAMPLES::
|
|
1106
|
+
|
|
1107
|
+
sage: QQ.order()
|
|
1108
|
+
+Infinity
|
|
1109
|
+
"""
|
|
1110
|
+
from sage.rings.infinity import Infinity
|
|
1111
|
+
return Infinity
|
|
1112
|
+
|
|
1113
|
+
def polynomial(self):
|
|
1114
|
+
r"""
|
|
1115
|
+
Return a defining polynomial of `\QQ`, as for other number fields.
|
|
1116
|
+
|
|
1117
|
+
This is also aliased to :meth:`defining_polynomial`
|
|
1118
|
+
and :meth:`absolute_polynomial`.
|
|
1119
|
+
|
|
1120
|
+
EXAMPLES::
|
|
1121
|
+
|
|
1122
|
+
sage: QQ.polynomial()
|
|
1123
|
+
x
|
|
1124
|
+
"""
|
|
1125
|
+
from sage.rings.polynomial.polynomial_ring import polygen
|
|
1126
|
+
return polygen(self)
|
|
1127
|
+
|
|
1128
|
+
defining_polynomial = polynomial
|
|
1129
|
+
absolute_polynomial = polynomial
|
|
1130
|
+
|
|
1131
|
+
def _an_element_(self):
|
|
1132
|
+
r"""
|
|
1133
|
+
Return an element of `\QQ`.
|
|
1134
|
+
|
|
1135
|
+
EXAMPLES::
|
|
1136
|
+
|
|
1137
|
+
sage: QQ.an_element() # indirect doctest
|
|
1138
|
+
1/2
|
|
1139
|
+
"""
|
|
1140
|
+
return Rational((1, 2))
|
|
1141
|
+
|
|
1142
|
+
def some_elements(self):
|
|
1143
|
+
r"""
|
|
1144
|
+
Return some elements of `\QQ`.
|
|
1145
|
+
|
|
1146
|
+
See :func:`TestSuite` for a typical use case.
|
|
1147
|
+
|
|
1148
|
+
OUTPUT: an iterator over 100 elements of `\QQ`
|
|
1149
|
+
|
|
1150
|
+
EXAMPLES::
|
|
1151
|
+
|
|
1152
|
+
sage: tuple(QQ.some_elements())
|
|
1153
|
+
(1/2, -1/2, 2, -2,
|
|
1154
|
+
0, 1, -1, 42,
|
|
1155
|
+
2/3, -2/3, 3/2, -3/2,
|
|
1156
|
+
4/5, -4/5, 5/4, -5/4,
|
|
1157
|
+
6/7, -6/7, 7/6, -7/6,
|
|
1158
|
+
8/9, -8/9, 9/8, -9/8,
|
|
1159
|
+
10/11, -10/11, 11/10, -11/10,
|
|
1160
|
+
12/13, -12/13, 13/12, -13/12,
|
|
1161
|
+
14/15, -14/15, 15/14, -15/14,
|
|
1162
|
+
16/17, -16/17, 17/16, -17/16,
|
|
1163
|
+
18/19, -18/19, 19/18, -19/18,
|
|
1164
|
+
20/441, -20/441, 441/20, -441/20,
|
|
1165
|
+
22/529, -22/529, 529/22, -529/22,
|
|
1166
|
+
24/625, -24/625, 625/24, -625/24,
|
|
1167
|
+
...)
|
|
1168
|
+
"""
|
|
1169
|
+
yield self.an_element()
|
|
1170
|
+
yield -self.an_element()
|
|
1171
|
+
yield 1/self.an_element()
|
|
1172
|
+
yield -1/self.an_element()
|
|
1173
|
+
yield self(0)
|
|
1174
|
+
yield self(1)
|
|
1175
|
+
yield self(-1)
|
|
1176
|
+
yield self(42)
|
|
1177
|
+
for n in range(1, 24):
|
|
1178
|
+
a = 2*n
|
|
1179
|
+
b = (2*n + 1)**(n//10 + 1)
|
|
1180
|
+
yield Rational((a, b))
|
|
1181
|
+
yield Rational((-a, b))
|
|
1182
|
+
yield Rational((b, a))
|
|
1183
|
+
yield Rational((-b, a))
|
|
1184
|
+
|
|
1185
|
+
def random_element(self, num_bound=None, den_bound=None, *args, **kwds):
|
|
1186
|
+
r"""
|
|
1187
|
+
Return a random element of `\QQ`.
|
|
1188
|
+
|
|
1189
|
+
Elements are constructed by randomly choosing integers
|
|
1190
|
+
for the numerator and denominator, not necessarily coprime.
|
|
1191
|
+
|
|
1192
|
+
INPUT:
|
|
1193
|
+
|
|
1194
|
+
- ``num_bound`` -- positive integer, specifying a bound
|
|
1195
|
+
on the absolute value of the numerator.
|
|
1196
|
+
If absent, no bound is enforced.
|
|
1197
|
+
|
|
1198
|
+
- ``den_bound`` -- positive integer, specifying a bound
|
|
1199
|
+
on the value of the denominator.
|
|
1200
|
+
If absent, the bound for the numerator will be reused.
|
|
1201
|
+
|
|
1202
|
+
Any extra positional or keyword arguments are passed through to
|
|
1203
|
+
:meth:`sage.rings.integer_ring.IntegerRing_class.random_element`.
|
|
1204
|
+
|
|
1205
|
+
EXAMPLES::
|
|
1206
|
+
|
|
1207
|
+
sage: QQ.random_element().parent() is QQ
|
|
1208
|
+
True
|
|
1209
|
+
sage: while QQ.random_element() != 0:
|
|
1210
|
+
....: pass
|
|
1211
|
+
sage: while QQ.random_element() != -1/2:
|
|
1212
|
+
....: pass
|
|
1213
|
+
|
|
1214
|
+
In the following example, the resulting numbers range from
|
|
1215
|
+
-5/1 to 5/1 (both inclusive),
|
|
1216
|
+
while the smallest possible positive value is 1/10::
|
|
1217
|
+
|
|
1218
|
+
sage: q = QQ.random_element(5, 10)
|
|
1219
|
+
sage: -5/1 <= q <= 5/1
|
|
1220
|
+
True
|
|
1221
|
+
sage: q.denominator() <= 10
|
|
1222
|
+
True
|
|
1223
|
+
sage: q.numerator() <= 5
|
|
1224
|
+
True
|
|
1225
|
+
|
|
1226
|
+
Extra positional or keyword arguments are passed through::
|
|
1227
|
+
|
|
1228
|
+
sage: QQ.random_element(distribution='1/n').parent() is QQ
|
|
1229
|
+
True
|
|
1230
|
+
sage: QQ.random_element(distribution='1/n').parent() is QQ
|
|
1231
|
+
True
|
|
1232
|
+
"""
|
|
1233
|
+
global ZZ
|
|
1234
|
+
if ZZ is None:
|
|
1235
|
+
from . import integer_ring
|
|
1236
|
+
ZZ = integer_ring.ZZ
|
|
1237
|
+
if num_bound is None:
|
|
1238
|
+
num = ZZ.random_element(*args, **kwds)
|
|
1239
|
+
den = ZZ.random_element(*args, **kwds)
|
|
1240
|
+
while den == 0:
|
|
1241
|
+
den = ZZ.random_element(*args, **kwds)
|
|
1242
|
+
return self((num, den))
|
|
1243
|
+
else:
|
|
1244
|
+
if num_bound == 0:
|
|
1245
|
+
num_bound = 2
|
|
1246
|
+
if den_bound is None:
|
|
1247
|
+
den_bound = num_bound
|
|
1248
|
+
if den_bound < 1:
|
|
1249
|
+
den_bound = 2
|
|
1250
|
+
num = ZZ.random_element(-num_bound, num_bound+1, *args, **kwds)
|
|
1251
|
+
den = ZZ.random_element(1, den_bound+1, *args, **kwds)
|
|
1252
|
+
while den == 0:
|
|
1253
|
+
den = ZZ.random_element(1, den_bound+1, *args, **kwds)
|
|
1254
|
+
return self((num, den))
|
|
1255
|
+
|
|
1256
|
+
def zeta(self, n=2):
|
|
1257
|
+
"""
|
|
1258
|
+
Return a root of unity in ``self``.
|
|
1259
|
+
|
|
1260
|
+
INPUT:
|
|
1261
|
+
|
|
1262
|
+
- ``n`` -- integer (default: 2); order of the root of unity
|
|
1263
|
+
|
|
1264
|
+
EXAMPLES::
|
|
1265
|
+
|
|
1266
|
+
sage: QQ.zeta()
|
|
1267
|
+
-1
|
|
1268
|
+
sage: QQ.zeta(2)
|
|
1269
|
+
-1
|
|
1270
|
+
sage: QQ.zeta(1)
|
|
1271
|
+
1
|
|
1272
|
+
sage: QQ.zeta(3)
|
|
1273
|
+
Traceback (most recent call last):
|
|
1274
|
+
...
|
|
1275
|
+
ValueError: no n-th root of unity in rational field
|
|
1276
|
+
"""
|
|
1277
|
+
if n == 1:
|
|
1278
|
+
return Rational(1)
|
|
1279
|
+
elif n == 2:
|
|
1280
|
+
return Rational(-1)
|
|
1281
|
+
else:
|
|
1282
|
+
raise ValueError("no n-th root of unity in rational field")
|
|
1283
|
+
|
|
1284
|
+
def selmer_generators(self, S, m, proof=True, orders=False):
|
|
1285
|
+
r"""
|
|
1286
|
+
Return generators of the group `\QQ(S,m)`.
|
|
1287
|
+
|
|
1288
|
+
INPUT:
|
|
1289
|
+
|
|
1290
|
+
- ``S`` -- set of primes
|
|
1291
|
+
|
|
1292
|
+
- ``m`` -- positive integer
|
|
1293
|
+
|
|
1294
|
+
- ``proof`` -- ignored
|
|
1295
|
+
|
|
1296
|
+
- ``orders`` -- (default: ``False``) if ``True``, output two lists, the
|
|
1297
|
+
generators and their orders
|
|
1298
|
+
|
|
1299
|
+
OUTPUT:
|
|
1300
|
+
|
|
1301
|
+
A list of generators of `\QQ(S,m)` (and, optionally, their
|
|
1302
|
+
orders in `\QQ^\times/(\QQ^\times)^m`). This is the subgroup
|
|
1303
|
+
of `\QQ^\times/(\QQ^\times)^m` consisting of elements `a` such
|
|
1304
|
+
that the valuation of `a` is divisible by `m` at all primes
|
|
1305
|
+
not in `S`. It is equal to the group of `S`-units modulo
|
|
1306
|
+
`m`-th powers. The group `\QQ(S,m)` contains the subgroup of
|
|
1307
|
+
those `a` such that `\QQ(\sqrt[m]{a})/\QQ` is unramified at
|
|
1308
|
+
all primes of `\QQ` outside of `S`, but may contain it
|
|
1309
|
+
properly when not all primes dividing `m` are in `S`.
|
|
1310
|
+
|
|
1311
|
+
.. SEEALSO::
|
|
1312
|
+
|
|
1313
|
+
:meth:`RationalField.selmer_space`, which gives additional
|
|
1314
|
+
output when `m=p` is prime: as well as generators, it gives an
|
|
1315
|
+
abstract vector space over `\GF{p}` isomorphic to `\QQ(S,p)`
|
|
1316
|
+
and maps implementing the isomorphism between this space and
|
|
1317
|
+
`\QQ(S,p)` as a subgroup of `\QQ^*/(\QQ^*)^p`.
|
|
1318
|
+
|
|
1319
|
+
EXAMPLES::
|
|
1320
|
+
|
|
1321
|
+
sage: QQ.selmer_generators((), 2)
|
|
1322
|
+
[-1]
|
|
1323
|
+
sage: QQ.selmer_generators((3,), 2)
|
|
1324
|
+
[-1, 3]
|
|
1325
|
+
sage: QQ.selmer_generators((5,), 2)
|
|
1326
|
+
[-1, 5]
|
|
1327
|
+
|
|
1328
|
+
The previous examples show that the group generated by the
|
|
1329
|
+
output may be strictly larger than the 'true' Selmer group of
|
|
1330
|
+
elements giving extensions unramified outside `S`.
|
|
1331
|
+
|
|
1332
|
+
When `m` is even, `-1` is a generator of order `2`::
|
|
1333
|
+
|
|
1334
|
+
sage: QQ.selmer_generators((2,3,5,7,), 2, orders=True)
|
|
1335
|
+
([-1, 2, 3, 5, 7], [2, 2, 2, 2, 2])
|
|
1336
|
+
sage: QQ.selmer_generators((2,3,5,7,), 3, orders=True)
|
|
1337
|
+
([2, 3, 5, 7], [3, 3, 3, 3])
|
|
1338
|
+
"""
|
|
1339
|
+
gens = list(S)
|
|
1340
|
+
ords = [ZZ(m)] * len(S)
|
|
1341
|
+
if m % 2 == 0:
|
|
1342
|
+
gens = [ZZ(-1)] + gens
|
|
1343
|
+
ords = [ZZ(2)] + ords
|
|
1344
|
+
if orders:
|
|
1345
|
+
return gens, ords
|
|
1346
|
+
else:
|
|
1347
|
+
return gens
|
|
1348
|
+
|
|
1349
|
+
# For backwards compatibility:
|
|
1350
|
+
selmer_group = deprecated_function_alias(31345, selmer_generators)
|
|
1351
|
+
|
|
1352
|
+
def selmer_group_iterator(self, S, m, proof=True):
|
|
1353
|
+
r"""
|
|
1354
|
+
Return an iterator through elements of the finite group `\QQ(S,m)`.
|
|
1355
|
+
|
|
1356
|
+
INPUT:
|
|
1357
|
+
|
|
1358
|
+
- ``S`` -- set of primes
|
|
1359
|
+
|
|
1360
|
+
- ``m`` -- positive integer
|
|
1361
|
+
|
|
1362
|
+
- ``proof`` -- ignored
|
|
1363
|
+
|
|
1364
|
+
OUTPUT:
|
|
1365
|
+
|
|
1366
|
+
An iterator yielding the distinct elements of `\QQ(S,m)`. See
|
|
1367
|
+
the docstring for :meth:`selmer_generators` for more information.
|
|
1368
|
+
|
|
1369
|
+
EXAMPLES::
|
|
1370
|
+
|
|
1371
|
+
sage: list(QQ.selmer_group_iterator((), 2))
|
|
1372
|
+
[1, -1]
|
|
1373
|
+
sage: list(QQ.selmer_group_iterator((2,), 2))
|
|
1374
|
+
[1, 2, -1, -2]
|
|
1375
|
+
sage: list(QQ.selmer_group_iterator((2,3), 2))
|
|
1376
|
+
[1, 3, 2, 6, -1, -3, -2, -6]
|
|
1377
|
+
sage: list(QQ.selmer_group_iterator((5,), 2))
|
|
1378
|
+
[1, 5, -1, -5]
|
|
1379
|
+
"""
|
|
1380
|
+
KSgens, ords = self.selmer_generators(S=S, m=m, proof=proof, orders=True)
|
|
1381
|
+
one = self.one()
|
|
1382
|
+
from itertools import product
|
|
1383
|
+
|
|
1384
|
+
from sage.misc.misc_c import prod
|
|
1385
|
+
for ev in product(*[range(o) for o in ords]):
|
|
1386
|
+
yield prod((p**e for p, e in zip(KSgens, ev)), one)
|
|
1387
|
+
|
|
1388
|
+
def selmer_space(self, S, p, proof=None):
|
|
1389
|
+
r"""
|
|
1390
|
+
Compute the group `\QQ(S,p)` as a vector space with maps to and from `\QQ^*`.
|
|
1391
|
+
|
|
1392
|
+
INPUT:
|
|
1393
|
+
|
|
1394
|
+
- ``S`` -- list of prime numbers
|
|
1395
|
+
|
|
1396
|
+
- ``p`` -- a prime number
|
|
1397
|
+
|
|
1398
|
+
OUTPUT:
|
|
1399
|
+
|
|
1400
|
+
(tuple) ``QSp``, ``QSp_gens``, ``from_QSp``, ``to_QSp`` where
|
|
1401
|
+
|
|
1402
|
+
- ``QSp`` is an abstract vector space over `\GF{p}` isomorphic to `\QQ(S,p)`;
|
|
1403
|
+
|
|
1404
|
+
- ``QSp_gens`` is a list of elements of `\QQ^*` generating `\QQ(S,p)`;
|
|
1405
|
+
|
|
1406
|
+
- ``from_QSp`` is a function from ``QSp`` to `\QQ^*`
|
|
1407
|
+
implementing the isomorphism from the abstract `\QQ(S,p)` to
|
|
1408
|
+
`\QQ(S,p)` as a subgroup of `\QQ^*/(\QQ^*)^p`;
|
|
1409
|
+
|
|
1410
|
+
- ``to_QSP`` is a partial function from `\QQ^*` to ``QSp``,
|
|
1411
|
+
defined on elements `a` whose image in `\QQ^*/(\QQ^*)^p` lies in
|
|
1412
|
+
`\QQ(S,p)`, mapping them via the inverse isomorphism to the
|
|
1413
|
+
abstract vector space ``QSp``.
|
|
1414
|
+
|
|
1415
|
+
The group `\QQ(S,p)` is the finite subgroup of
|
|
1416
|
+
`\QQ^*/(\QQ^*)^p` consisting of elements whose valuation at
|
|
1417
|
+
all primes not in `S` is a multiple of `p`. It contains the
|
|
1418
|
+
subgroup of those `a\in \QQ^*` such that
|
|
1419
|
+
`\QQ(\sqrt[p]{a})/\QQ` is unramified at all primes of `\QQ`
|
|
1420
|
+
outside of `S`, but may contain it properly when `p` is not in `S`.
|
|
1421
|
+
|
|
1422
|
+
EXAMPLES:
|
|
1423
|
+
|
|
1424
|
+
When `S` is empty, `\QQ(S,p)` is only nontrivial for `p=2`::
|
|
1425
|
+
|
|
1426
|
+
sage: QS2, QS2gens, fromQS2, toQS2 = QQ.selmer_space([], 2) # needs sage.rings.number_field
|
|
1427
|
+
sage: QS2 # needs sage.rings.number_field
|
|
1428
|
+
Vector space of dimension 1 over Finite Field of size 2
|
|
1429
|
+
sage: QS2gens # needs sage.rings.number_field
|
|
1430
|
+
[-1]
|
|
1431
|
+
|
|
1432
|
+
sage: all(QQ.selmer_space([], p)[0].dimension() == 0 # needs sage.libs.pari sage.rings.number_field
|
|
1433
|
+
....: for p in primes(3, 10))
|
|
1434
|
+
True
|
|
1435
|
+
|
|
1436
|
+
In general there is one generator for each `p\in S`, and an
|
|
1437
|
+
additional generator of `-1` when `p=2`::
|
|
1438
|
+
|
|
1439
|
+
sage: # needs sage.modules sage.rings.number_field
|
|
1440
|
+
sage: QS2, QS2gens, fromQS2, toQS2 = QQ.selmer_space([5,7], 2)
|
|
1441
|
+
sage: QS2
|
|
1442
|
+
Vector space of dimension 3 over Finite Field of size 2
|
|
1443
|
+
sage: QS2gens
|
|
1444
|
+
[5, 7, -1]
|
|
1445
|
+
sage: toQS2(-7)
|
|
1446
|
+
(0, 1, 1)
|
|
1447
|
+
sage: fromQS2((0,1,1))
|
|
1448
|
+
-7
|
|
1449
|
+
|
|
1450
|
+
The map ``fromQS2`` is only well-defined modulo `p`-th powers
|
|
1451
|
+
(in this case, modulo squares)::
|
|
1452
|
+
|
|
1453
|
+
sage: toQS2(-5/7) # needs sage.modules sage.rings.number_field
|
|
1454
|
+
(1, 1, 1)
|
|
1455
|
+
sage: fromQS2((1,1,1)) # needs sage.modules sage.rings.number_field
|
|
1456
|
+
-35
|
|
1457
|
+
sage: ((-5/7)/(-35)).is_square()
|
|
1458
|
+
True
|
|
1459
|
+
|
|
1460
|
+
The map ``toQS2`` is not defined on all of `\QQ^*`, only on
|
|
1461
|
+
those numbers which are squares away from `5` and `7`::
|
|
1462
|
+
|
|
1463
|
+
sage: toQS2(210) # needs sage.modules sage.rings.number_field
|
|
1464
|
+
Traceback (most recent call last):
|
|
1465
|
+
...
|
|
1466
|
+
ValueError: argument 210 should have valuations divisible by 2
|
|
1467
|
+
at all primes in [5, 7]
|
|
1468
|
+
"""
|
|
1469
|
+
from sage.rings.number_field.selmer_group import pSelmerGroup
|
|
1470
|
+
return pSelmerGroup(self, S, p)
|
|
1471
|
+
|
|
1472
|
+
def quadratic_defect(self, a, p, check=True):
|
|
1473
|
+
r"""
|
|
1474
|
+
Return the valuation of the quadratic defect of `a` at `p`.
|
|
1475
|
+
|
|
1476
|
+
INPUT:
|
|
1477
|
+
|
|
1478
|
+
- ``a`` -- an element of ``self``
|
|
1479
|
+
- ``p`` -- a prime ideal or a prime number
|
|
1480
|
+
- ``check`` -- (default: ``True``) check if `p` is prime
|
|
1481
|
+
|
|
1482
|
+
REFERENCE:
|
|
1483
|
+
|
|
1484
|
+
[Kir2016]_
|
|
1485
|
+
|
|
1486
|
+
EXAMPLES::
|
|
1487
|
+
|
|
1488
|
+
sage: QQ.quadratic_defect(0, 7)
|
|
1489
|
+
+Infinity
|
|
1490
|
+
sage: QQ.quadratic_defect(5, 7)
|
|
1491
|
+
0
|
|
1492
|
+
sage: QQ.quadratic_defect(5, 2)
|
|
1493
|
+
2
|
|
1494
|
+
sage: QQ.quadratic_defect(5, 5)
|
|
1495
|
+
1
|
|
1496
|
+
"""
|
|
1497
|
+
from sage.arith.misc import legendre_symbol
|
|
1498
|
+
from sage.rings.infinity import Infinity
|
|
1499
|
+
if a not in self:
|
|
1500
|
+
raise TypeError(str(a) + " must be an element of " + str(self))
|
|
1501
|
+
if p.parent() == ZZ.ideal_monoid():
|
|
1502
|
+
p = p.gen()
|
|
1503
|
+
if check and not p.is_prime():
|
|
1504
|
+
raise ValueError(str(p) + " must be prime")
|
|
1505
|
+
if a.is_zero():
|
|
1506
|
+
return Infinity
|
|
1507
|
+
v, u = self(a).val_unit(p)
|
|
1508
|
+
if v % 2 == 1:
|
|
1509
|
+
return v
|
|
1510
|
+
if p != 2:
|
|
1511
|
+
if legendre_symbol(u, p) == 1:
|
|
1512
|
+
return Infinity
|
|
1513
|
+
else:
|
|
1514
|
+
return v
|
|
1515
|
+
if p == 2:
|
|
1516
|
+
if u % 8 == 1:
|
|
1517
|
+
return Infinity
|
|
1518
|
+
if u % 8 == 5:
|
|
1519
|
+
return v + 2
|
|
1520
|
+
if u % 8 in [3, 7]:
|
|
1521
|
+
return v + 1
|
|
1522
|
+
|
|
1523
|
+
#################################
|
|
1524
|
+
# Coercions to interfaces
|
|
1525
|
+
#################################
|
|
1526
|
+
def _gap_init_(self):
|
|
1527
|
+
r"""
|
|
1528
|
+
Return the GAP representation of `\QQ`.
|
|
1529
|
+
|
|
1530
|
+
EXAMPLES::
|
|
1531
|
+
|
|
1532
|
+
sage: gap(QQ) # indirect doctest # needs sage.libs.gap
|
|
1533
|
+
Rationals
|
|
1534
|
+
"""
|
|
1535
|
+
return 'Rationals'
|
|
1536
|
+
|
|
1537
|
+
def _lean_init_(self):
|
|
1538
|
+
return 'rat'
|
|
1539
|
+
|
|
1540
|
+
def _magma_init_(self, magma):
|
|
1541
|
+
r"""
|
|
1542
|
+
Return the magma representation of `\QQ`.
|
|
1543
|
+
|
|
1544
|
+
EXAMPLES::
|
|
1545
|
+
|
|
1546
|
+
sage: magma(QQ) # optional - magma # indirect doctest
|
|
1547
|
+
Rational Field
|
|
1548
|
+
|
|
1549
|
+
TESTS:
|
|
1550
|
+
|
|
1551
|
+
See :issue:`5521`::
|
|
1552
|
+
|
|
1553
|
+
sage: loads(dumps(QQ)) == QQ # optional - magma
|
|
1554
|
+
True
|
|
1555
|
+
"""
|
|
1556
|
+
return 'RationalField()'
|
|
1557
|
+
|
|
1558
|
+
def _macaulay2_init_(self, macaulay2=None):
|
|
1559
|
+
r"""
|
|
1560
|
+
Return the macaulay2 representation of `\QQ`.
|
|
1561
|
+
|
|
1562
|
+
EXAMPLES::
|
|
1563
|
+
|
|
1564
|
+
sage: macaulay2(QQ) # optional - macaulay2 # indirect doctest
|
|
1565
|
+
QQ
|
|
1566
|
+
"""
|
|
1567
|
+
return "QQ"
|
|
1568
|
+
|
|
1569
|
+
def _axiom_init_(self):
|
|
1570
|
+
r"""
|
|
1571
|
+
Return the axiom/fricas representation of `\QQ`.
|
|
1572
|
+
|
|
1573
|
+
EXAMPLES::
|
|
1574
|
+
|
|
1575
|
+
sage: axiom(QQ) #optional - axiom # indirect doctest
|
|
1576
|
+
Fraction Integer
|
|
1577
|
+
sage: fricas(QQ) #optional - fricas # indirect doctest
|
|
1578
|
+
Fraction(Integer)
|
|
1579
|
+
"""
|
|
1580
|
+
return 'Fraction Integer'
|
|
1581
|
+
|
|
1582
|
+
_fricas_init_ = _axiom_init_
|
|
1583
|
+
|
|
1584
|
+
def _polymake_init_(self):
|
|
1585
|
+
r"""
|
|
1586
|
+
Return the polymake representation of `\QQ`.
|
|
1587
|
+
|
|
1588
|
+
EXAMPLES::
|
|
1589
|
+
|
|
1590
|
+
sage: polymake(QQ) #optional - jupymake # indirect doctest
|
|
1591
|
+
Rational
|
|
1592
|
+
"""
|
|
1593
|
+
return '"Rational"'
|
|
1594
|
+
|
|
1595
|
+
def _sympy_(self):
|
|
1596
|
+
r"""
|
|
1597
|
+
Return the SymPy set ``Rationals``.
|
|
1598
|
+
|
|
1599
|
+
EXAMPLES::
|
|
1600
|
+
|
|
1601
|
+
sage: QQ._sympy_() # needs sympy
|
|
1602
|
+
Rationals
|
|
1603
|
+
"""
|
|
1604
|
+
from sage.interfaces.sympy import sympy_init
|
|
1605
|
+
from sympy import Rationals
|
|
1606
|
+
sympy_init()
|
|
1607
|
+
return Rationals
|
|
1608
|
+
|
|
1609
|
+
def _sage_input_(self, sib, coerced):
|
|
1610
|
+
r"""
|
|
1611
|
+
Produce an expression which will reproduce this value when evaluated.
|
|
1612
|
+
|
|
1613
|
+
EXAMPLES::
|
|
1614
|
+
|
|
1615
|
+
sage: sage_input(QQ, verify=True)
|
|
1616
|
+
# Verified
|
|
1617
|
+
QQ
|
|
1618
|
+
sage: from sage.misc.sage_input import SageInputBuilder
|
|
1619
|
+
sage: QQ._sage_input_(SageInputBuilder(), False)
|
|
1620
|
+
{atomic:QQ}
|
|
1621
|
+
"""
|
|
1622
|
+
return sib.name('QQ')
|
|
1623
|
+
|
|
1624
|
+
def _factor_univariate_polynomial(self, f):
|
|
1625
|
+
"""
|
|
1626
|
+
Factor the univariate polynomial ``f``.
|
|
1627
|
+
|
|
1628
|
+
INPUT:
|
|
1629
|
+
|
|
1630
|
+
- ``f`` -- a univariate polynomial defined over the rationals
|
|
1631
|
+
|
|
1632
|
+
OUTPUT:
|
|
1633
|
+
|
|
1634
|
+
- A factorization of ``f`` over the rationals into a unit and monic
|
|
1635
|
+
irreducible factors
|
|
1636
|
+
|
|
1637
|
+
.. NOTE::
|
|
1638
|
+
|
|
1639
|
+
This is a helper method for
|
|
1640
|
+
:meth:`sage.rings.polynomial.polynomial_element.Polynomial.factor`.
|
|
1641
|
+
|
|
1642
|
+
This method calls PARI to compute the factorization.
|
|
1643
|
+
|
|
1644
|
+
TESTS::
|
|
1645
|
+
|
|
1646
|
+
sage: # needs sage.libs.pari
|
|
1647
|
+
sage: R.<x> = QQ[]
|
|
1648
|
+
sage: QQ._factor_univariate_polynomial(x)
|
|
1649
|
+
x
|
|
1650
|
+
sage: QQ._factor_univariate_polynomial(2*x)
|
|
1651
|
+
(2) * x
|
|
1652
|
+
sage: QQ._factor_univariate_polynomial((x^2 - 1/4)^4)
|
|
1653
|
+
(x - 1/2)^4 * (x + 1/2)^4
|
|
1654
|
+
sage: QQ._factor_univariate_polynomial((2*x + 1) * (3*x^2 - 5)^2)
|
|
1655
|
+
(18) * (x + 1/2) * (x^2 - 5/3)^2
|
|
1656
|
+
sage: f = prod((k^2*x^k + k)^(k-1) for k in primes(10))
|
|
1657
|
+
sage: QQ._factor_univariate_polynomial(f)
|
|
1658
|
+
(1751787911376562500) * (x^2 + 1/2) * (x^3 + 1/3)^2 * (x^5 + 1/5)^4 * (x^7 + 1/7)^6
|
|
1659
|
+
sage: QQ._factor_univariate_polynomial(10*x^5 - 1)
|
|
1660
|
+
(10) * (x^5 - 1/10)
|
|
1661
|
+
sage: QQ._factor_univariate_polynomial(10*x^5 - 10)
|
|
1662
|
+
(10) * (x - 1) * (x^4 + x^3 + x^2 + x + 1)
|
|
1663
|
+
"""
|
|
1664
|
+
G = f._pari_with_name().factor()
|
|
1665
|
+
|
|
1666
|
+
# normalize the leading coefficients
|
|
1667
|
+
P = f.parent()
|
|
1668
|
+
F = [(P(g).monic(), int(e)) for g, e in zip(*G)]
|
|
1669
|
+
|
|
1670
|
+
from sage.structure.factorization import Factorization
|
|
1671
|
+
return Factorization(F, f.leading_coefficient())
|
|
1672
|
+
|
|
1673
|
+
def valuation(self, p):
|
|
1674
|
+
r"""
|
|
1675
|
+
Return the discrete valuation with uniformizer ``p``.
|
|
1676
|
+
|
|
1677
|
+
EXAMPLES::
|
|
1678
|
+
|
|
1679
|
+
sage: v = QQ.valuation(3); v # needs sage.rings.padics
|
|
1680
|
+
3-adic valuation
|
|
1681
|
+
sage: v(1/3) # needs sage.rings.padics
|
|
1682
|
+
-1
|
|
1683
|
+
|
|
1684
|
+
.. SEEALSO::
|
|
1685
|
+
|
|
1686
|
+
:meth:`NumberField_generic.valuation() <sage.rings.number_field.number_field.NumberField_generic.valuation>`,
|
|
1687
|
+
:meth:`IntegerRing_class.valuation() <sage.rings.integer_ring.IntegerRing_class.valuation>`
|
|
1688
|
+
"""
|
|
1689
|
+
from sage.rings.padics.padic_valuation import pAdicValuation
|
|
1690
|
+
return pAdicValuation(self, p)
|
|
1691
|
+
|
|
1692
|
+
|
|
1693
|
+
QQ = RationalField()
|
|
1694
|
+
Q = QQ
|
|
1695
|
+
|
|
1696
|
+
|
|
1697
|
+
def is_RationalField(x) -> bool:
|
|
1698
|
+
"""
|
|
1699
|
+
Check to see if ``x`` is the rational field.
|
|
1700
|
+
|
|
1701
|
+
EXAMPLES::
|
|
1702
|
+
|
|
1703
|
+
sage: from sage.rings.rational_field import is_RationalField as is_RF
|
|
1704
|
+
sage: is_RF(QQ)
|
|
1705
|
+
doctest:warning...
|
|
1706
|
+
DeprecationWarning: The function is_RationalField is deprecated;
|
|
1707
|
+
use 'isinstance(..., RationalField)' instead.
|
|
1708
|
+
See https://github.com/sagemath/sage/issues/38128 for details.
|
|
1709
|
+
True
|
|
1710
|
+
sage: is_RF(ZZ)
|
|
1711
|
+
False
|
|
1712
|
+
"""
|
|
1713
|
+
from sage.misc.superseded import deprecation
|
|
1714
|
+
deprecation(38128,
|
|
1715
|
+
"The function is_RationalField is deprecated; "
|
|
1716
|
+
"use 'isinstance(..., RationalField)' instead.")
|
|
1717
|
+
return isinstance(x, RationalField)
|
|
1718
|
+
|
|
1719
|
+
|
|
1720
|
+
def frac(n, d):
|
|
1721
|
+
"""
|
|
1722
|
+
Return the fraction ``n/d``.
|
|
1723
|
+
|
|
1724
|
+
EXAMPLES::
|
|
1725
|
+
|
|
1726
|
+
sage: from sage.rings.rational_field import frac
|
|
1727
|
+
sage: frac(1,2)
|
|
1728
|
+
1/2
|
|
1729
|
+
"""
|
|
1730
|
+
return Rational(n) / Rational(d)
|