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,1043 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Localization
|
|
4
|
+
|
|
5
|
+
Localization is an important ring construction tool. Whenever you have
|
|
6
|
+
to extend a given integral domain such that it contains the inverses
|
|
7
|
+
of a finite set of elements but should allow non injective homomorphic
|
|
8
|
+
images this construction will be needed. See the example on
|
|
9
|
+
Ariki-Koike algebras below for such an application.
|
|
10
|
+
|
|
11
|
+
EXAMPLES::
|
|
12
|
+
|
|
13
|
+
sage: # needs sage.modules
|
|
14
|
+
sage: LZ = Localization(ZZ, (5,11))
|
|
15
|
+
sage: m = matrix(LZ, [[5, 7], [0,11]])
|
|
16
|
+
sage: m.parent()
|
|
17
|
+
Full MatrixSpace of 2 by 2 dense matrices over Integer Ring localized at (5, 11)
|
|
18
|
+
sage: ~m # parent of inverse is different: see documentation of m.__invert__
|
|
19
|
+
[ 1/5 -7/55]
|
|
20
|
+
[ 0 1/11]
|
|
21
|
+
sage: _.parent()
|
|
22
|
+
Full MatrixSpace of 2 by 2 dense matrices over Rational Field
|
|
23
|
+
sage: mi = matrix(LZ, ~m)
|
|
24
|
+
sage: mi.parent()
|
|
25
|
+
Full MatrixSpace of 2 by 2 dense matrices over Integer Ring localized at (5, 11)
|
|
26
|
+
sage: mi == ~m
|
|
27
|
+
True
|
|
28
|
+
|
|
29
|
+
The next example defines the most general ring containing the coefficients of the irreducible
|
|
30
|
+
representations of the Ariki-Koike algebra corresponding to the three colored permutations on
|
|
31
|
+
three elements::
|
|
32
|
+
|
|
33
|
+
sage: R.<u0, u1, u2, q> = ZZ[]
|
|
34
|
+
sage: u = [u0, u1, u2]
|
|
35
|
+
sage: S = Set(u)
|
|
36
|
+
sage: I = S.cartesian_product(S)
|
|
37
|
+
sage: add_units = u + [q, q + 1] + [ui - uj for ui, uj in I if ui != uj]
|
|
38
|
+
sage: add_units += [q*ui - uj for ui, uj in I if ui != uj]
|
|
39
|
+
sage: L = R.localization(tuple(add_units)); L # needs sage.libs.pari
|
|
40
|
+
Multivariate Polynomial Ring in u0, u1, u2, q over Integer Ring localized at
|
|
41
|
+
(q, q + 1, u2, u1 - u2, u1, u0 - u1, u0 - u2, u0, u2*q - u0, u2*q - u1, u1*q - u0,
|
|
42
|
+
u1*q - u2, u0*q - u1, u0*q - u2)
|
|
43
|
+
|
|
44
|
+
Define the representation matrices (of one of the three dimensional irreducible representations)::
|
|
45
|
+
|
|
46
|
+
sage: # needs sage.libs.pari sage.modules
|
|
47
|
+
sage: m1 = matrix(L, [[u1, 0, 0], [0, u0, 0], [0, 0, u0]])
|
|
48
|
+
sage: m2 = matrix(L, [[(u0*q - u0)/(u0 - u1), (u0*q - u1)/(u0 - u1), 0],
|
|
49
|
+
....: [(-u1*q + u0)/(u0 - u1), (-u1*q + u1)/(u0 - u1), 0],
|
|
50
|
+
....: [0, 0, -1]])
|
|
51
|
+
sage: m3 = matrix(L, [[-1, 0, 0],
|
|
52
|
+
....: [0, u0*(1 - q)/(u1*q - u0), q*(u1 - u0)/(u1*q - u0)],
|
|
53
|
+
....: [0, (u1*q^2 - u0)/(u1*q - u0), (u1*q^ 2 - u1*q)/(u1*q - u0)]])
|
|
54
|
+
sage: m1.base_ring() == L
|
|
55
|
+
True
|
|
56
|
+
|
|
57
|
+
Check relations of the Ariki-Koike algebra::
|
|
58
|
+
|
|
59
|
+
sage: # needs sage.libs.pari sage.modules
|
|
60
|
+
sage: m1*m2*m1*m2 == m2*m1*m2*m1
|
|
61
|
+
True
|
|
62
|
+
sage: m2*m3*m2 == m3*m2*m3
|
|
63
|
+
True
|
|
64
|
+
sage: m1*m3 == m3*m1
|
|
65
|
+
True
|
|
66
|
+
sage: m1**3 - (u0+u1+u2)*m1**2 + (u0*u1+u0*u2+u1*u2)*m1 - u0*u1*u2 == 0
|
|
67
|
+
True
|
|
68
|
+
sage: m2**2 - (q-1)*m2 - q == 0
|
|
69
|
+
True
|
|
70
|
+
sage: m3**2 - (q-1)*m3 - q == 0
|
|
71
|
+
True
|
|
72
|
+
sage: ~m1 in m1.parent()
|
|
73
|
+
True
|
|
74
|
+
sage: ~m2 in m2.parent()
|
|
75
|
+
True
|
|
76
|
+
sage: ~m3 in m3.parent()
|
|
77
|
+
True
|
|
78
|
+
|
|
79
|
+
Obtain specializations in positive characteristic::
|
|
80
|
+
|
|
81
|
+
sage: # needs sage.libs.pari sage.modules
|
|
82
|
+
sage: Fp = GF(17)
|
|
83
|
+
sage: f = L.hom((3,5,7,11), codomain=Fp); f
|
|
84
|
+
Ring morphism:
|
|
85
|
+
From: Multivariate Polynomial Ring in u0, u1, u2, q over Integer Ring localized at
|
|
86
|
+
(q, q + 1, u2, u1 - u2, u1, u0 - u1, u0 - u2, u0, u2*q - u0, u2*q - u1,
|
|
87
|
+
u1*q - u0, u1*q - u2, u0*q - u1, u0*q - u2)
|
|
88
|
+
To: Finite Field of size 17
|
|
89
|
+
Defn: u0 |--> 3
|
|
90
|
+
u1 |--> 5
|
|
91
|
+
u2 |--> 7
|
|
92
|
+
q |--> 11
|
|
93
|
+
sage: mFp1 = matrix({k: f(v) for k, v in m1.dict().items()}); mFp1
|
|
94
|
+
[5 0 0]
|
|
95
|
+
[0 3 0]
|
|
96
|
+
[0 0 3]
|
|
97
|
+
sage: mFp1.base_ring()
|
|
98
|
+
Finite Field of size 17
|
|
99
|
+
sage: mFp2 = matrix({k: f(v) for k, v in m2.dict().items()}); mFp2
|
|
100
|
+
[ 2 3 0]
|
|
101
|
+
[ 9 8 0]
|
|
102
|
+
[ 0 0 16]
|
|
103
|
+
sage: mFp3 = matrix({k: f(v) for k, v in m3.dict().items()}); mFp3
|
|
104
|
+
[16 0 0]
|
|
105
|
+
[ 0 4 5]
|
|
106
|
+
[ 0 7 6]
|
|
107
|
+
|
|
108
|
+
Obtain specializations in characteristic 0::
|
|
109
|
+
|
|
110
|
+
sage: # needs sage.libs.pari
|
|
111
|
+
sage: fQ = L.hom((3,5,7,11), codomain=QQ); fQ
|
|
112
|
+
Ring morphism:
|
|
113
|
+
From: Multivariate Polynomial Ring in u0, u1, u2, q over Integer Ring
|
|
114
|
+
localized at (q, q + 1, u2, u1 - u2, u1, u0 - u1, u0 - u2, u0, u2*q - u0,
|
|
115
|
+
u2*q - u1, u1*q - u0, u1*q - u2, u0*q - u1, u0*q - u2)
|
|
116
|
+
To: Rational Field
|
|
117
|
+
Defn: u0 |--> 3
|
|
118
|
+
u1 |--> 5
|
|
119
|
+
u2 |--> 7
|
|
120
|
+
q |--> 11
|
|
121
|
+
|
|
122
|
+
sage: # needs sage.libs.pari sage.modules sage.rings.finite_rings
|
|
123
|
+
sage: mQ1 = matrix({k: fQ(v) for k, v in m1.dict().items()}); mQ1
|
|
124
|
+
[5 0 0]
|
|
125
|
+
[0 3 0]
|
|
126
|
+
[0 0 3]
|
|
127
|
+
sage: mQ1.base_ring()
|
|
128
|
+
Rational Field
|
|
129
|
+
sage: mQ2 = matrix({k: fQ(v) for k, v in m2.dict().items()}); mQ2
|
|
130
|
+
[-15 -14 0]
|
|
131
|
+
[ 26 25 0]
|
|
132
|
+
[ 0 0 -1]
|
|
133
|
+
sage: mQ3 = matrix({k: fQ(v) for k, v in m3.dict().items()}); mQ3
|
|
134
|
+
[ -1 0 0]
|
|
135
|
+
[ 0 -15/26 11/26]
|
|
136
|
+
[ 0 301/26 275/26]
|
|
137
|
+
|
|
138
|
+
sage: # needs sage.libs.pari sage.libs.singular
|
|
139
|
+
sage: S.<x, y, z, t> = QQ[]
|
|
140
|
+
sage: T = S.quo(x + y + z)
|
|
141
|
+
sage: F = T.fraction_field()
|
|
142
|
+
sage: fF = L.hom((x, y, z, t), codomain=F); fF
|
|
143
|
+
Ring morphism:
|
|
144
|
+
From: Multivariate Polynomial Ring in u0, u1, u2, q over Integer Ring
|
|
145
|
+
localized at (q, q + 1, u2, u1 - u2, u1, u0 - u1, u0 - u2, u0, u2*q - u0,
|
|
146
|
+
u2*q - u1, u1*q - u0, u1*q - u2, u0*q - u1, u0*q - u2)
|
|
147
|
+
To: Fraction Field of Quotient of Multivariate Polynomial Ring in x, y, z, t
|
|
148
|
+
over Rational Field by the ideal (x + y + z)
|
|
149
|
+
Defn: u0 |--> -ybar - zbar
|
|
150
|
+
u1 |--> ybar
|
|
151
|
+
u2 |--> zbar
|
|
152
|
+
q |--> tbar
|
|
153
|
+
sage: mF1 = matrix({k: fF(v) for k, v in m1.dict().items()}); mF1 # needs sage.modules
|
|
154
|
+
[ ybar 0 0]
|
|
155
|
+
[ 0 -ybar - zbar 0]
|
|
156
|
+
[ 0 0 -ybar - zbar]
|
|
157
|
+
sage: mF1.base_ring() == F # needs sage.modules
|
|
158
|
+
True
|
|
159
|
+
|
|
160
|
+
TESTS::
|
|
161
|
+
|
|
162
|
+
sage: TestSuite(L).run() # needs sage.libs.pari sage.libs.singular sage.modules
|
|
163
|
+
|
|
164
|
+
AUTHORS:
|
|
165
|
+
|
|
166
|
+
- Sebastian Oehms 2019-12-09: initial version.
|
|
167
|
+
- Sebastian Oehms 2022-03-05: fix some corner cases and add :meth:`factor` (:issue:`33463`)
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
# ****************************************************************************
|
|
172
|
+
# Copyright (C) 2019 Sebastian Oehms <seb.oehms@gmail.com>
|
|
173
|
+
#
|
|
174
|
+
# This program is free software: you can redistribute it and/or modify
|
|
175
|
+
# it under the terms of the GNU General Public License as published by
|
|
176
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
177
|
+
# (at your option) any later version.
|
|
178
|
+
# https://www.gnu.org/licenses/
|
|
179
|
+
# ****************************************************************************
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
183
|
+
from sage.categories.integral_domains import IntegralDomains
|
|
184
|
+
from sage.structure.parent import Parent
|
|
185
|
+
from sage.structure.element import IntegralDomainElement
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def normalize_extra_units(base_ring, add_units, warning=True):
|
|
189
|
+
"""
|
|
190
|
+
Function to normalize input data.
|
|
191
|
+
|
|
192
|
+
The given list will be replaced by a list of the involved prime factors
|
|
193
|
+
(if possible).
|
|
194
|
+
|
|
195
|
+
INPUT:
|
|
196
|
+
|
|
197
|
+
- ``base_ring`` -- a ring in the category of :class:`IntegralDomains`
|
|
198
|
+
- ``add_units`` -- list of elements from base ring
|
|
199
|
+
- ``warning`` -- boolean (default: ``True``); to suppress a warning which
|
|
200
|
+
is thrown if no normalization was possible
|
|
201
|
+
|
|
202
|
+
OUTPUT: list of all prime factors of the elements of the given list
|
|
203
|
+
|
|
204
|
+
EXAMPLES::
|
|
205
|
+
|
|
206
|
+
sage: from sage.rings.localization import normalize_extra_units
|
|
207
|
+
sage: normalize_extra_units(ZZ, [3, -15, 45, 9, 2, 50])
|
|
208
|
+
[2, 3, 5]
|
|
209
|
+
sage: P.<x,y,z> = ZZ[]
|
|
210
|
+
sage: normalize_extra_units(P, # needs sage.libs.pari
|
|
211
|
+
....: [3*x, z*y**2, 2*z, 18*(x*y*z)**2, x*z, 6*x*z, 5])
|
|
212
|
+
[2, 3, 5, z, y, x]
|
|
213
|
+
sage: P.<x,y,z> = QQ[]
|
|
214
|
+
sage: normalize_extra_units(P, # needs sage.libs.pari
|
|
215
|
+
....: [3*x, z*y**2, 2*z, 18*(x*y*z)**2, x*z, 6*x*z, 5])
|
|
216
|
+
[z, y, x]
|
|
217
|
+
|
|
218
|
+
sage: # needs sage.libs.singular
|
|
219
|
+
sage: R.<x, y> = ZZ[]
|
|
220
|
+
sage: Q.<a, b> = R.quo(x**2 - 5)
|
|
221
|
+
sage: p = b**2 - 5
|
|
222
|
+
sage: p == (b-a)*(b+a)
|
|
223
|
+
True
|
|
224
|
+
sage: normalize_extra_units(Q, [p]) # needs sage.libs.pari
|
|
225
|
+
doctest:...: UserWarning: Localization may not be represented uniquely
|
|
226
|
+
[b^2 - 5]
|
|
227
|
+
sage: normalize_extra_units(Q, [p], warning=False) # needs sage.libs.pari
|
|
228
|
+
[b^2 - 5]
|
|
229
|
+
"""
|
|
230
|
+
# convert to base ring
|
|
231
|
+
add_units = [base_ring(n) for n in add_units]
|
|
232
|
+
|
|
233
|
+
# split down to prime factors if possible
|
|
234
|
+
add_units_result = []
|
|
235
|
+
for n in add_units:
|
|
236
|
+
try:
|
|
237
|
+
if n.is_unit():
|
|
238
|
+
continue
|
|
239
|
+
F = list(n.factor())
|
|
240
|
+
add_units_result += [f[0] for f in F]
|
|
241
|
+
except (NotImplementedError, AttributeError):
|
|
242
|
+
# if :meth:`is_unit` or :meth:`factor` are not available we can't do any more.
|
|
243
|
+
if warning:
|
|
244
|
+
from warnings import warn
|
|
245
|
+
warn('Localization may not be represented uniquely')
|
|
246
|
+
add_units_result = add_units
|
|
247
|
+
break
|
|
248
|
+
|
|
249
|
+
return sorted(set(add_units_result))
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
class LocalizationElement(IntegralDomainElement):
|
|
253
|
+
"""
|
|
254
|
+
Element class for localizations of integral domains.
|
|
255
|
+
|
|
256
|
+
INPUT:
|
|
257
|
+
|
|
258
|
+
- ``parent`` -- instance of :class:`Localization`
|
|
259
|
+
- ``x`` -- instance of :class:`FractionFieldElement` whose parent is the
|
|
260
|
+
fraction field of the parent's base ring
|
|
261
|
+
|
|
262
|
+
EXAMPLES::
|
|
263
|
+
|
|
264
|
+
sage: # needs sage.libs.pari
|
|
265
|
+
sage: from sage.rings.localization import LocalizationElement
|
|
266
|
+
sage: P.<x,y,z> = GF(5)[]
|
|
267
|
+
sage: L = P.localization((x, y*z - x))
|
|
268
|
+
sage: LocalizationElement(L, 4/(y*z-x)**2)
|
|
269
|
+
(-1)/(y^2*z^2 - 2*x*y*z + x^2)
|
|
270
|
+
sage: _.parent()
|
|
271
|
+
Multivariate Polynomial Ring in x, y, z over Finite Field of size 5
|
|
272
|
+
localized at (x, y*z - x)
|
|
273
|
+
"""
|
|
274
|
+
|
|
275
|
+
def __init__(self, parent, x):
|
|
276
|
+
"""
|
|
277
|
+
Python constructor for the element class for localizations of integral domains.
|
|
278
|
+
|
|
279
|
+
EXAMPLES::
|
|
280
|
+
|
|
281
|
+
sage: from sage.rings.localization import LocalizationElement
|
|
282
|
+
sage: P.<x> = RR[]
|
|
283
|
+
sage: L = Localization(P, x**2 + x + 1) # needs sage.libs.pari
|
|
284
|
+
sage: l = LocalizationElement(L, (x**2+1)/(x**2+x+1)) # needs sage.libs.pari
|
|
285
|
+
sage: l._value == (x**2+1)/(x**2+x+1) # needs sage.libs.pari
|
|
286
|
+
True
|
|
287
|
+
"""
|
|
288
|
+
IntegralDomainElement.__init__(self, parent)
|
|
289
|
+
self._value = x
|
|
290
|
+
|
|
291
|
+
def _repr_(self):
|
|
292
|
+
"""
|
|
293
|
+
How to print ``self``.
|
|
294
|
+
|
|
295
|
+
EXAMPLES::
|
|
296
|
+
|
|
297
|
+
sage: # needs sage.libs.pari sage.rings.real_mpfr
|
|
298
|
+
sage: from sage.rings.localization import LocalizationElement
|
|
299
|
+
sage: P.<x> = CC[]
|
|
300
|
+
sage: L = Localization(P, x**2 + x + 1)
|
|
301
|
+
sage: l = LocalizationElement(L, (x**2+1)/(x**2+x+1))
|
|
302
|
+
sage: l._repr_() == str(l)
|
|
303
|
+
True
|
|
304
|
+
|
|
305
|
+
sage: R.<X, Y> = ZZ[]
|
|
306
|
+
sage: L.<x, y> = R.localization(X - Y) # needs sage.libs.singular
|
|
307
|
+
sage: x*y/(x-y) # needs sage.libs.singular
|
|
308
|
+
x*y/(x - y)
|
|
309
|
+
"""
|
|
310
|
+
s = "%s" % self._value
|
|
311
|
+
L = self.parent()
|
|
312
|
+
names = L._names
|
|
313
|
+
if names:
|
|
314
|
+
n = len(names)
|
|
315
|
+
bnames = L.base_ring()._names
|
|
316
|
+
if bnames != names and n == len(bnames):
|
|
317
|
+
# replace separate names (see :issue:`33482`)
|
|
318
|
+
for i in range(n):
|
|
319
|
+
s = s.replace(bnames[i], names[i])
|
|
320
|
+
return s
|
|
321
|
+
|
|
322
|
+
def _add_(left, right):
|
|
323
|
+
"""
|
|
324
|
+
Compute addition with another instance of ``self`` (via `+` operator).
|
|
325
|
+
|
|
326
|
+
EXAMPLES::
|
|
327
|
+
|
|
328
|
+
sage: L = Localization(ZZ, (5,11)) # indirect doctest
|
|
329
|
+
sage: L(1/5) + L(2/11)
|
|
330
|
+
21/55
|
|
331
|
+
"""
|
|
332
|
+
return left.parent()._fraction_to_element(left._value + right._value)
|
|
333
|
+
|
|
334
|
+
def _sub_(left, right):
|
|
335
|
+
"""
|
|
336
|
+
Compute subtraction with another instance of ``self`` (via `-` operator).
|
|
337
|
+
|
|
338
|
+
EXAMPLES::
|
|
339
|
+
|
|
340
|
+
sage: L = Localization(ZZ, (5,11))
|
|
341
|
+
sage: L(2) - L(1/121) # indirect doctest
|
|
342
|
+
241/121
|
|
343
|
+
"""
|
|
344
|
+
return left.parent()._fraction_to_element(left._value - right._value)
|
|
345
|
+
|
|
346
|
+
def _mul_(left, right):
|
|
347
|
+
"""
|
|
348
|
+
Compute multiplication with another instance of ``self`` (via `*` operator).
|
|
349
|
+
|
|
350
|
+
EXAMPLES::
|
|
351
|
+
|
|
352
|
+
sage: L = Localization(ZZ, (5,11))
|
|
353
|
+
sage: L(1/55) * L(2/25) # indirect doctest
|
|
354
|
+
2/1375
|
|
355
|
+
"""
|
|
356
|
+
return left.parent()._fraction_to_element(left._value * right._value)
|
|
357
|
+
|
|
358
|
+
def _div_(left, right):
|
|
359
|
+
"""
|
|
360
|
+
Compute division with another instance of ``self`` (via `/` operator).
|
|
361
|
+
|
|
362
|
+
EXAMPLES::
|
|
363
|
+
|
|
364
|
+
sage: L = Localization(ZZ, (5,11))
|
|
365
|
+
sage: L(1/5) / L(5/11) # indirect doctest
|
|
366
|
+
11/25
|
|
367
|
+
"""
|
|
368
|
+
return left.parent()._fraction_to_element(left._value / right._value)
|
|
369
|
+
|
|
370
|
+
def _rmul_(self, c):
|
|
371
|
+
"""
|
|
372
|
+
Compute right multiplication with an instance of the base ring of ``self`` (via `*` operator).
|
|
373
|
+
|
|
374
|
+
EXAMPLES::
|
|
375
|
+
|
|
376
|
+
sage: L = Localization(ZZ, (5,11))
|
|
377
|
+
sage: L(2/11) * 11 # indirect doctest
|
|
378
|
+
2
|
|
379
|
+
"""
|
|
380
|
+
return self.parent()._fraction_to_element(c * self._value)
|
|
381
|
+
|
|
382
|
+
def _lmul_(self, c):
|
|
383
|
+
"""
|
|
384
|
+
Compute left multiplication with an instance of the base ring of ``self`` (via `*` operator).
|
|
385
|
+
|
|
386
|
+
EXAMPLES::
|
|
387
|
+
|
|
388
|
+
sage: L = Localization(ZZ, (5,11))
|
|
389
|
+
sage: 7 * L(3/5) # indirect doctest
|
|
390
|
+
21/5
|
|
391
|
+
"""
|
|
392
|
+
return self.parent()._fraction_to_element(self._value * c)
|
|
393
|
+
|
|
394
|
+
def factor(self, proof=None):
|
|
395
|
+
r"""
|
|
396
|
+
Return the factorization of this polynomial.
|
|
397
|
+
|
|
398
|
+
INPUT:
|
|
399
|
+
|
|
400
|
+
- ``proof`` -- (optional) if given it is passed to the
|
|
401
|
+
corresponding method of the numerator of ``self``
|
|
402
|
+
|
|
403
|
+
EXAMPLES::
|
|
404
|
+
|
|
405
|
+
sage: P.<X, Y> = QQ['x, y']
|
|
406
|
+
sage: L = P.localization(X - Y)
|
|
407
|
+
sage: x, y = L.gens() # needs sage.libs.singular
|
|
408
|
+
sage: p = (x^2 - y^2)/(x-y)^2 # needs sage.libs.singular
|
|
409
|
+
sage: p.factor() # needs sage.libs.singular
|
|
410
|
+
(1/(x - y)) * (x + y)
|
|
411
|
+
"""
|
|
412
|
+
num = self._value.numerator()
|
|
413
|
+
den = self._value.denominator()
|
|
414
|
+
if proof is not None:
|
|
415
|
+
F = num.factor(proof=proof)
|
|
416
|
+
else:
|
|
417
|
+
F = num.factor()
|
|
418
|
+
P = self.parent()
|
|
419
|
+
fac = [(P(f), e) for (f, e) in F]
|
|
420
|
+
from sage.structure.factorization import Factorization
|
|
421
|
+
return Factorization(fac, unit=~P(den)*F.unit())
|
|
422
|
+
|
|
423
|
+
def _im_gens_(self, codomain, im_gens, base_map=None):
|
|
424
|
+
"""
|
|
425
|
+
EXAMPLES::
|
|
426
|
+
|
|
427
|
+
sage: R.<x> = ZZ[]
|
|
428
|
+
sage: L = Localization(R, x**2 + 1) # needs sage.libs.pari
|
|
429
|
+
sage: f = L.hom([5], codomain=Localization(ZZ, 26)) # indirect doctest # needs sage.libs.pari
|
|
430
|
+
sage: f(x/(x**2+1)) # needs sage.libs.pari
|
|
431
|
+
5/26
|
|
432
|
+
"""
|
|
433
|
+
return self._value._im_gens_(codomain, im_gens, base_map=base_map)
|
|
434
|
+
|
|
435
|
+
def numerator(self):
|
|
436
|
+
"""
|
|
437
|
+
Return the numerator of ``self``.
|
|
438
|
+
|
|
439
|
+
EXAMPLES::
|
|
440
|
+
|
|
441
|
+
sage: L = ZZ.localization((3,5))
|
|
442
|
+
sage: L(7/15).numerator()
|
|
443
|
+
7
|
|
444
|
+
"""
|
|
445
|
+
return self._value.numerator()
|
|
446
|
+
|
|
447
|
+
def denominator(self):
|
|
448
|
+
"""
|
|
449
|
+
Return the denominator of ``self``.
|
|
450
|
+
|
|
451
|
+
EXAMPLES::
|
|
452
|
+
|
|
453
|
+
sage: L = Localization(ZZ, (3,5))
|
|
454
|
+
sage: L(7/15).denominator()
|
|
455
|
+
15
|
|
456
|
+
"""
|
|
457
|
+
return self._value.denominator()
|
|
458
|
+
|
|
459
|
+
def is_unit(self):
|
|
460
|
+
"""
|
|
461
|
+
Return ``True`` if ``self`` is a unit.
|
|
462
|
+
|
|
463
|
+
EXAMPLES::
|
|
464
|
+
|
|
465
|
+
sage: # needs sage.libs.pari sage.singular
|
|
466
|
+
sage: P.<x,y,z> = QQ[]
|
|
467
|
+
sage: L = P.localization((x, y*z))
|
|
468
|
+
sage: L(y*z).is_unit()
|
|
469
|
+
True
|
|
470
|
+
sage: L(z).is_unit()
|
|
471
|
+
True
|
|
472
|
+
sage: L(x*y*z).is_unit()
|
|
473
|
+
True
|
|
474
|
+
"""
|
|
475
|
+
return self.parent()._cut_off_extra_units_from_base_ring_element(self._value.numerator()).is_unit()
|
|
476
|
+
|
|
477
|
+
def inverse_of_unit(self):
|
|
478
|
+
"""
|
|
479
|
+
Return the inverse of ``self``.
|
|
480
|
+
|
|
481
|
+
EXAMPLES::
|
|
482
|
+
|
|
483
|
+
sage: P.<x,y,z> = ZZ[]
|
|
484
|
+
sage: L = Localization(P, x*y*z)
|
|
485
|
+
sage: L(x*y*z).inverse_of_unit() # needs sage.libs.singular
|
|
486
|
+
1/(x*y*z)
|
|
487
|
+
sage: L(z).inverse_of_unit() # needs sage.libs.singular
|
|
488
|
+
1/z
|
|
489
|
+
"""
|
|
490
|
+
parent = self.parent()
|
|
491
|
+
if not self.is_unit():
|
|
492
|
+
raise ArithmeticError("element is not a unit")
|
|
493
|
+
return parent.element_class(parent, ~(parent._fraction_field(self)))
|
|
494
|
+
|
|
495
|
+
def _richcmp_(self, other, op):
|
|
496
|
+
"""
|
|
497
|
+
EXAMPLES::
|
|
498
|
+
|
|
499
|
+
sage: # needs sage.libs.singular
|
|
500
|
+
sage: P.<x,y,z> = GF(7)[]
|
|
501
|
+
sage: L = Localization(P, (x, y, z))
|
|
502
|
+
sage: L(1/x) < L(3/(x*y*z)**3)
|
|
503
|
+
False
|
|
504
|
+
sage: ~L(y*z/x) == L(x/(y*z))
|
|
505
|
+
True
|
|
506
|
+
"""
|
|
507
|
+
sval = self._value
|
|
508
|
+
oval = other._value
|
|
509
|
+
return sval._richcmp_(oval, op)
|
|
510
|
+
|
|
511
|
+
def __hash__(self):
|
|
512
|
+
"""
|
|
513
|
+
Return the hash of the corresponding fraction field element.
|
|
514
|
+
|
|
515
|
+
EXAMPLES::
|
|
516
|
+
|
|
517
|
+
sage: L = ZZ.localization(5)
|
|
518
|
+
sage: l5 = L(5); l7 = L(7)
|
|
519
|
+
sage: {l5: ~l5, l7: 7} # indirect doctest
|
|
520
|
+
{5: 1/5, 7: 7}
|
|
521
|
+
"""
|
|
522
|
+
return hash(self._value)
|
|
523
|
+
|
|
524
|
+
def _rational_(self):
|
|
525
|
+
r"""
|
|
526
|
+
Convert ``self`` to a rational.
|
|
527
|
+
|
|
528
|
+
This is only possible if its base ring is the ring of integers.
|
|
529
|
+
|
|
530
|
+
OUTPUT: a rational
|
|
531
|
+
|
|
532
|
+
TESTS::
|
|
533
|
+
|
|
534
|
+
sage: L = ZZ.localization(5)
|
|
535
|
+
sage: cp3 = cyclotomic_polynomial(3).change_ring(L)
|
|
536
|
+
sage: cp3.splitting_field('t') # indirect doctest # needs sage.libs.pari sage.rings.number_field
|
|
537
|
+
Number Field in t with defining polynomial x^2 + x + 1
|
|
538
|
+
"""
|
|
539
|
+
from sage.rings.rational_field import QQ
|
|
540
|
+
if not self._value.parent() == QQ:
|
|
541
|
+
raise ValueError('{} is not a rational'.format(self))
|
|
542
|
+
return self._value
|
|
543
|
+
|
|
544
|
+
def _integer_(self, Z=None):
|
|
545
|
+
r"""
|
|
546
|
+
Convert ``self`` to an integer.
|
|
547
|
+
|
|
548
|
+
This is only possible if its base ring is the ring of integers and
|
|
549
|
+
the denominator of ``self`` is one.
|
|
550
|
+
|
|
551
|
+
OUTPUT: integer
|
|
552
|
+
|
|
553
|
+
TESTS::
|
|
554
|
+
|
|
555
|
+
sage: L = ZZ.localization(5)
|
|
556
|
+
sage: L(5) in ZZ # indirect doctest
|
|
557
|
+
True
|
|
558
|
+
"""
|
|
559
|
+
from sage.rings.rational_field import QQ
|
|
560
|
+
if not self._value.parent() == QQ:
|
|
561
|
+
raise ValueError('{} is not a rational'.format(self))
|
|
562
|
+
return self._value._integer_(Z=Z)
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
class Localization(Parent, UniqueRepresentation):
|
|
566
|
+
r"""
|
|
567
|
+
The localization generalizes the construction of the field of fractions of
|
|
568
|
+
an integral domain to an arbitrary ring. Given a (not necessarily
|
|
569
|
+
commutative) ring `R` and a subset `S` of `R`, there exists a ring
|
|
570
|
+
`R[S^{-1}]` together with the ring homomorphism `R \longrightarrow R[S^{-1}]`
|
|
571
|
+
that "inverts" `S`; that is, the homomorphism maps elements in `S` to unit
|
|
572
|
+
elements in `R[S^{-1}]` and, moreover, any ring homomorphism from `R` that
|
|
573
|
+
"inverts" `S` uniquely factors through `R[S^{-1}]`.
|
|
574
|
+
|
|
575
|
+
The ring `R[S^{-1}]` is called the *localization* of `R` with respect to
|
|
576
|
+
`S`. For example, if `R` is a commutative ring and `f` an element in `R`,
|
|
577
|
+
then the localization consists of elements of the form
|
|
578
|
+
`r/f, r\in R, n \geq 0` (to be precise, `R[f^{-1}] = R[t]/(ft-1)`).
|
|
579
|
+
|
|
580
|
+
The above text is taken from `Wikipedia`. The construction here used for
|
|
581
|
+
this class relies on the construction of the field of fraction and is
|
|
582
|
+
therefore restricted to integral domains.
|
|
583
|
+
|
|
584
|
+
Accordingly, the base ring must be in the category of ``IntegralDomains``.
|
|
585
|
+
Furthermore, the base ring should support
|
|
586
|
+
:meth:`sage.structure.element.CommutativeRingElement.divides` and the exact
|
|
587
|
+
division operator ``//`` (:meth:`sage.structure.element.Element.__floordiv__`)
|
|
588
|
+
in order to guarantee a successful application.
|
|
589
|
+
|
|
590
|
+
INPUT:
|
|
591
|
+
|
|
592
|
+
- ``base_ring`` -- a ring in the category of ``IntegralDomains``
|
|
593
|
+
- ``extra_units`` -- tuple of elements of ``base_ring`` which should be
|
|
594
|
+
turned into units
|
|
595
|
+
- ``category`` -- (default: ``None``) passed to :class:`Parent`
|
|
596
|
+
- ``warning`` -- boolean (default: ``True``); to suppress a warning which
|
|
597
|
+
is thrown if ``self`` cannot be represented uniquely
|
|
598
|
+
|
|
599
|
+
REFERENCES:
|
|
600
|
+
|
|
601
|
+
- :wikipedia:`Ring_(mathematics)#Localization`
|
|
602
|
+
|
|
603
|
+
EXAMPLES::
|
|
604
|
+
|
|
605
|
+
sage: L = Localization(ZZ, (3,5))
|
|
606
|
+
sage: 1/45 in L
|
|
607
|
+
True
|
|
608
|
+
sage: 1/43 in L
|
|
609
|
+
False
|
|
610
|
+
|
|
611
|
+
sage: Localization(L, (7,11))
|
|
612
|
+
Integer Ring localized at (3, 5, 7, 11)
|
|
613
|
+
sage: _.is_subring(QQ)
|
|
614
|
+
True
|
|
615
|
+
|
|
616
|
+
sage: L(~7)
|
|
617
|
+
Traceback (most recent call last):
|
|
618
|
+
...
|
|
619
|
+
ValueError: factor 7 of denominator is not a unit
|
|
620
|
+
|
|
621
|
+
sage: Localization(Zp(7), (3, 5)) # needs sage.rings.padics
|
|
622
|
+
Traceback (most recent call last):
|
|
623
|
+
...
|
|
624
|
+
ValueError: all given elements are invertible in
|
|
625
|
+
7-adic Ring with capped relative precision 20
|
|
626
|
+
|
|
627
|
+
sage: # needs sage.libs.pari
|
|
628
|
+
sage: R.<x> = ZZ[]
|
|
629
|
+
sage: L = R.localization(x**2 + 1)
|
|
630
|
+
sage: s = (x+5)/(x**2+1)
|
|
631
|
+
sage: s in L
|
|
632
|
+
True
|
|
633
|
+
sage: t = (x+5)/(x**2+2)
|
|
634
|
+
sage: t in L
|
|
635
|
+
False
|
|
636
|
+
sage: L(t)
|
|
637
|
+
Traceback (most recent call last):
|
|
638
|
+
...
|
|
639
|
+
TypeError: fraction must have unit denominator
|
|
640
|
+
sage: L(s) in R
|
|
641
|
+
False
|
|
642
|
+
sage: y = L(x)
|
|
643
|
+
sage: g = L(s)
|
|
644
|
+
sage: g.parent()
|
|
645
|
+
Univariate Polynomial Ring in x over Integer Ring localized at (x^2 + 1,)
|
|
646
|
+
sage: f = (y+5)/(y**2+1); f
|
|
647
|
+
(x + 5)/(x^2 + 1)
|
|
648
|
+
sage: f == g
|
|
649
|
+
True
|
|
650
|
+
sage: (y+5)/(y**2+2)
|
|
651
|
+
Traceback (most recent call last):
|
|
652
|
+
...
|
|
653
|
+
ValueError: factor x^2 + 2 of denominator is not a unit
|
|
654
|
+
|
|
655
|
+
sage: Lau.<u, v> = LaurentPolynomialRing(ZZ) # needs sage.modules
|
|
656
|
+
sage: LauL = Lau.localization(u + 1) # needs sage.modules
|
|
657
|
+
sage: LauL(~u).parent() # needs sage.modules
|
|
658
|
+
Multivariate Polynomial Ring in u, v over Integer Ring localized at (v, u, u + 1)
|
|
659
|
+
|
|
660
|
+
More examples will be shown typing ``sage.rings.localization?``
|
|
661
|
+
|
|
662
|
+
TESTS:
|
|
663
|
+
|
|
664
|
+
Check that :issue:`33463` is fixed::
|
|
665
|
+
|
|
666
|
+
sage: R = ZZ.localization(5)
|
|
667
|
+
sage: R.localization(~5)
|
|
668
|
+
Integer Ring localized at (5,)
|
|
669
|
+
"""
|
|
670
|
+
|
|
671
|
+
Element = LocalizationElement
|
|
672
|
+
|
|
673
|
+
def __init__(self, base_ring, extra_units, names=None, normalize=True, category=None, warning=True):
|
|
674
|
+
"""
|
|
675
|
+
Python constructor of Localization.
|
|
676
|
+
|
|
677
|
+
TESTS::
|
|
678
|
+
|
|
679
|
+
sage: L = Localization(ZZ, (3, 5))
|
|
680
|
+
sage: TestSuite(L).run()
|
|
681
|
+
|
|
682
|
+
sage: R.<x> = ZZ[]
|
|
683
|
+
sage: L = R.localization(x**2 + 1) # needs sage.libs.pari
|
|
684
|
+
sage: TestSuite(L).run()
|
|
685
|
+
"""
|
|
686
|
+
if isinstance(extra_units, tuple):
|
|
687
|
+
extra_units = list(extra_units)
|
|
688
|
+
elif not isinstance(extra_units, list):
|
|
689
|
+
extra_units = [extra_units]
|
|
690
|
+
|
|
691
|
+
from sage.rings.polynomial.laurent_polynomial_ring_base import LaurentPolynomialRing_generic
|
|
692
|
+
|
|
693
|
+
if isinstance(base_ring, LaurentPolynomialRing_generic):
|
|
694
|
+
extra_units += list(base_ring.gens())
|
|
695
|
+
base_ring = base_ring.polynomial_ring()
|
|
696
|
+
|
|
697
|
+
if isinstance(base_ring, Localization):
|
|
698
|
+
# don't allow recursive constructions
|
|
699
|
+
extra_units = [u for u in extra_units
|
|
700
|
+
if ~u not in base_ring._extra_units] # :issue:`33463`
|
|
701
|
+
extra_units += base_ring._extra_units
|
|
702
|
+
base_ring = base_ring.base_ring()
|
|
703
|
+
|
|
704
|
+
extra_units = normalize_extra_units(base_ring, extra_units, warning=warning)
|
|
705
|
+
|
|
706
|
+
if not extra_units:
|
|
707
|
+
raise ValueError('all given elements are invertible in %s' % (base_ring))
|
|
708
|
+
|
|
709
|
+
if category is None:
|
|
710
|
+
# since by construction the base ring must contain non units self must be infinite
|
|
711
|
+
category = IntegralDomains().Infinite()
|
|
712
|
+
|
|
713
|
+
Parent.__init__(self, base=base_ring, names=names, normalize=normalize, category=category)
|
|
714
|
+
self._extra_units = tuple(extra_units)
|
|
715
|
+
self._fraction_field = base_ring.fraction_field()
|
|
716
|
+
self._populate_coercion_lists_()
|
|
717
|
+
|
|
718
|
+
def _repr_(self):
|
|
719
|
+
"""
|
|
720
|
+
How to print ``self``.
|
|
721
|
+
|
|
722
|
+
EXAMPLES::
|
|
723
|
+
|
|
724
|
+
sage: R.<a> = GF(3)[]
|
|
725
|
+
sage: Localization(R, a**2 - 1) # needs sage.libs.pari
|
|
726
|
+
Univariate Polynomial Ring in a over Finite Field of size 3
|
|
727
|
+
localized at (a + 1, a + 2)
|
|
728
|
+
"""
|
|
729
|
+
return "%s localized at %s" % (self.base(), self._extra_units)
|
|
730
|
+
|
|
731
|
+
def _element_constructor_(self, x):
|
|
732
|
+
"""
|
|
733
|
+
Make sure x is a valid member of self, and return the constructed element.
|
|
734
|
+
|
|
735
|
+
EXAMPLES::
|
|
736
|
+
|
|
737
|
+
sage: L = Localization(ZZ, (5, 2))
|
|
738
|
+
sage: L._element_constructor_(1/25)
|
|
739
|
+
1/25
|
|
740
|
+
sage: L._element_constructor_(1/20)
|
|
741
|
+
1/20
|
|
742
|
+
sage: L._element_constructor_(1/10)
|
|
743
|
+
1/10
|
|
744
|
+
"""
|
|
745
|
+
if isinstance(x, LocalizationElement):
|
|
746
|
+
x = x._value
|
|
747
|
+
else:
|
|
748
|
+
x = self._fraction_field(x)
|
|
749
|
+
return self._fraction_to_element(x)
|
|
750
|
+
|
|
751
|
+
def _is_valid_homomorphism_(self, codomain, im_gens, base_map=None):
|
|
752
|
+
"""
|
|
753
|
+
EXAMPLES::
|
|
754
|
+
|
|
755
|
+
sage: R.<x> = ZZ[]
|
|
756
|
+
sage: L = Localization(R, x**2 + 1) # needs sage.libs.pari
|
|
757
|
+
sage: L.hom([5]) # indirect doctest # needs sage.libs.pari
|
|
758
|
+
Traceback (most recent call last):
|
|
759
|
+
...
|
|
760
|
+
ValueError: images of some localized elements fail to be units
|
|
761
|
+
|
|
762
|
+
sage: L.hom([5], codomain=Localization(ZZ, 26)) # indirect doctest # needs sage.libs.pari
|
|
763
|
+
Ring morphism:
|
|
764
|
+
From: Univariate Polynomial Ring in x over Integer Ring
|
|
765
|
+
localized at (x^2 + 1,)
|
|
766
|
+
To: Integer Ring localized at (2, 13)
|
|
767
|
+
Defn: x |--> 5
|
|
768
|
+
|
|
769
|
+
TESTS::
|
|
770
|
+
|
|
771
|
+
sage: # needs sage.libs.pari
|
|
772
|
+
sage: phi = R.hom([5])
|
|
773
|
+
sage: L._is_valid_homomorphism_(ZZ, [3], base_map=phi)
|
|
774
|
+
Traceback (most recent call last):
|
|
775
|
+
...
|
|
776
|
+
ValueError: given base_map is not compatible with im_gens
|
|
777
|
+
sage: L._is_valid_homomorphism_(ZZ, [5], base_map=phi)
|
|
778
|
+
Traceback (most recent call last):
|
|
779
|
+
...
|
|
780
|
+
ValueError: images of some localized elements fail to be units
|
|
781
|
+
sage: phi = R.hom([5], codomain=QQ)
|
|
782
|
+
sage: L._is_valid_homomorphism_(ZZ, [5], base_map=phi)
|
|
783
|
+
Traceback (most recent call last):
|
|
784
|
+
...
|
|
785
|
+
ValueError: codomain of base_map must be Integer Ring
|
|
786
|
+
sage: L._is_valid_homomorphism_(QQ, [5], base_map=phi)
|
|
787
|
+
True
|
|
788
|
+
"""
|
|
789
|
+
B = self.base_ring()
|
|
790
|
+
if base_map is not None:
|
|
791
|
+
if base_map.domain() is not B:
|
|
792
|
+
raise ValueError('domain of base_map must be %s' % B)
|
|
793
|
+
if base_map.codomain() is not codomain.base_ring():
|
|
794
|
+
raise ValueError('codomain of base_map must be %s' % codomain.base_ring())
|
|
795
|
+
bas_gens = B.gens()
|
|
796
|
+
if im_gens and not all(base_map(g) == im_gens[bas_gens.index(g)] for g in bas_gens):
|
|
797
|
+
raise ValueError('given base_map is not compatible with im_gens')
|
|
798
|
+
im_gens = [base_map(g) for g in bas_gens]
|
|
799
|
+
if not all(base_map(au).is_unit() for au in self._extra_units):
|
|
800
|
+
raise ValueError('images of some localized elements fail to be units')
|
|
801
|
+
return B._is_valid_homomorphism_(codomain, im_gens, base_map=None)
|
|
802
|
+
else:
|
|
803
|
+
if B._is_valid_homomorphism_(codomain, im_gens, base_map=base_map):
|
|
804
|
+
phi = B.hom(im_gens, base_map=base_map)
|
|
805
|
+
if not all(phi(au).is_unit() for au in self._extra_units):
|
|
806
|
+
raise ValueError('images of some localized elements fail to be units')
|
|
807
|
+
return True
|
|
808
|
+
return False
|
|
809
|
+
|
|
810
|
+
def ngens(self):
|
|
811
|
+
"""
|
|
812
|
+
Return the number of generators of ``self``
|
|
813
|
+
according to the same method for the base ring.
|
|
814
|
+
|
|
815
|
+
EXAMPLES::
|
|
816
|
+
|
|
817
|
+
sage: R.<x, y> = ZZ[]
|
|
818
|
+
sage: Localization(R, (x**2 + 1, y - 1)).ngens() # needs sage.libs.pari
|
|
819
|
+
2
|
|
820
|
+
|
|
821
|
+
sage: Localization(ZZ, 2).ngens()
|
|
822
|
+
1
|
|
823
|
+
"""
|
|
824
|
+
return self.base_ring().ngens()
|
|
825
|
+
|
|
826
|
+
def gen(self, i):
|
|
827
|
+
"""
|
|
828
|
+
Return the ``i``-th generator of ``self`` which is
|
|
829
|
+
the ``i``-th generator of the base ring.
|
|
830
|
+
|
|
831
|
+
EXAMPLES::
|
|
832
|
+
|
|
833
|
+
sage: R.<x, y> = ZZ[]
|
|
834
|
+
sage: R.localization((x**2 + 1, y - 1)).gen(0) # needs sage.libs.pari
|
|
835
|
+
x
|
|
836
|
+
|
|
837
|
+
sage: ZZ.localization(2).gen(0)
|
|
838
|
+
1
|
|
839
|
+
"""
|
|
840
|
+
return self(self.base_ring().gen(i))
|
|
841
|
+
|
|
842
|
+
def gens(self) -> tuple:
|
|
843
|
+
"""
|
|
844
|
+
Return a tuple whose entries are the generators for this
|
|
845
|
+
object, in order.
|
|
846
|
+
|
|
847
|
+
EXAMPLES::
|
|
848
|
+
|
|
849
|
+
sage: R.<x, y> = ZZ[]
|
|
850
|
+
sage: Localization(R, (x**2 + 1, y - 1)).gens() # needs sage.libs.pari
|
|
851
|
+
(x, y)
|
|
852
|
+
|
|
853
|
+
sage: Localization(ZZ, 2).gens()
|
|
854
|
+
(1,)
|
|
855
|
+
"""
|
|
856
|
+
return tuple(self(g) for g in self.base_ring().gens())
|
|
857
|
+
|
|
858
|
+
def _cut_off_extra_units_from_base_ring_element(self, x):
|
|
859
|
+
"""
|
|
860
|
+
Return a factor of x not divided by any additional unit of ``self``.
|
|
861
|
+
|
|
862
|
+
INPUT:
|
|
863
|
+
|
|
864
|
+
- ``x`` -- an element of the base ring of ``self``
|
|
865
|
+
|
|
866
|
+
OUTPUT:
|
|
867
|
+
|
|
868
|
+
A factor of ``x`` not divided by any additional unit of ``self`` as element
|
|
869
|
+
of the base ring of ``self``.
|
|
870
|
+
|
|
871
|
+
EXAMPLES::
|
|
872
|
+
|
|
873
|
+
sage: P.<x,y,z> = QQ[]
|
|
874
|
+
sage: L = Localization(P, (x, y*z)) # needs sage.libs.pari
|
|
875
|
+
sage: L._cut_off_extra_units_from_base_ring_element(x*y*z) # needs sage.libs.pari
|
|
876
|
+
1
|
|
877
|
+
sage: L._cut_off_extra_units_from_base_ring_element(x*z) # needs sage.libs.pari
|
|
878
|
+
1
|
|
879
|
+
|
|
880
|
+
TESTS:
|
|
881
|
+
|
|
882
|
+
Check that :issue:`33463` is fixed::
|
|
883
|
+
|
|
884
|
+
sage: L = ZZ.localization(5)
|
|
885
|
+
sage: L(0).is_unit()
|
|
886
|
+
False
|
|
887
|
+
"""
|
|
888
|
+
if x.is_zero() or x.numerator().is_unit():
|
|
889
|
+
# treat corner cases
|
|
890
|
+
return x
|
|
891
|
+
add_units = self._extra_units
|
|
892
|
+
res = x
|
|
893
|
+
for au in add_units:
|
|
894
|
+
if au.divides(x):
|
|
895
|
+
# recursion must terminate by reducing the number of factors
|
|
896
|
+
res = self._cut_off_extra_units_from_base_ring_element(x // au)
|
|
897
|
+
if res.is_unit():
|
|
898
|
+
return res
|
|
899
|
+
return res
|
|
900
|
+
|
|
901
|
+
def _fraction_to_element(self, x):
|
|
902
|
+
"""
|
|
903
|
+
Check if the given element of the fraction field is contained in ``self``
|
|
904
|
+
and construct it as an element of ``self`` in case the answer is true.
|
|
905
|
+
|
|
906
|
+
INPUT:
|
|
907
|
+
|
|
908
|
+
- ``x`` -- an element of the fraction field of the base ring
|
|
909
|
+
|
|
910
|
+
OUTPUT: an instance of the element class of ``self`` representing `x`
|
|
911
|
+
|
|
912
|
+
EXAMPLES::
|
|
913
|
+
|
|
914
|
+
sage: # needs sage.libs.pari sage.libs.singular
|
|
915
|
+
sage: P.<x,y,z> = QQ[]
|
|
916
|
+
sage: d = x**2 + y**2 + z**2
|
|
917
|
+
sage: L = Localization(P, d)
|
|
918
|
+
sage: L._fraction_to_element((x+y+z)/d)
|
|
919
|
+
(x + y + z)/(x^2 + y^2 + z^2)
|
|
920
|
+
sage: _ in L
|
|
921
|
+
True
|
|
922
|
+
|
|
923
|
+
TESTS::
|
|
924
|
+
|
|
925
|
+
sage: TestSuite(L).run() # needs sage.libs.pari sage.libs.singular
|
|
926
|
+
"""
|
|
927
|
+
potential_non_unit_denom = self._cut_off_extra_units_from_base_ring_element(x.denominator())
|
|
928
|
+
if potential_non_unit_denom.is_unit():
|
|
929
|
+
return self.element_class(self, x)
|
|
930
|
+
raise ValueError("factor %s of denominator is not a unit" % potential_non_unit_denom)
|
|
931
|
+
|
|
932
|
+
def _coerce_map_from_(self, S):
|
|
933
|
+
"""
|
|
934
|
+
The only things that coerce into this ring are:
|
|
935
|
+
|
|
936
|
+
- the base ring
|
|
937
|
+
- other localizations
|
|
938
|
+
|
|
939
|
+
EXAMPLES::
|
|
940
|
+
|
|
941
|
+
sage: # needs sage.libs.pari sage.libs.singular
|
|
942
|
+
sage: P.<x,y,z> = QQ[]
|
|
943
|
+
sage: L = Localization(P, y*z)
|
|
944
|
+
sage: M = Localization(P, (x, y, z))
|
|
945
|
+
sage: M._coerce_map_from_(L)
|
|
946
|
+
True
|
|
947
|
+
sage: L._coerce_map_from_(M)
|
|
948
|
+
False
|
|
949
|
+
sage: Q.<u, v, w> = ZZ[]
|
|
950
|
+
sage: N = Localization(Q, v*w)
|
|
951
|
+
sage: L._coerce_map_from_(N)
|
|
952
|
+
True
|
|
953
|
+
sage: N._coerce_map_from_(M)
|
|
954
|
+
False
|
|
955
|
+
sage: O = Localization(L, x**2 + 1)
|
|
956
|
+
sage: O._coerce_map_from_(M)
|
|
957
|
+
False
|
|
958
|
+
sage: O._coerce_map_from_(L)
|
|
959
|
+
True
|
|
960
|
+
"""
|
|
961
|
+
if S is self.base_ring():
|
|
962
|
+
return True
|
|
963
|
+
elif self.base_ring().has_coerce_map_from(S):
|
|
964
|
+
return True
|
|
965
|
+
elif isinstance(S, Localization):
|
|
966
|
+
return all(self(p).is_unit() for p in S._extra_units)
|
|
967
|
+
|
|
968
|
+
def fraction_field(self):
|
|
969
|
+
"""
|
|
970
|
+
Return the fraction field of ``self``.
|
|
971
|
+
|
|
972
|
+
EXAMPLES::
|
|
973
|
+
|
|
974
|
+
sage: # needs sage.libs.pari
|
|
975
|
+
sage: R.<a> = GF(5)[]
|
|
976
|
+
sage: L = Localization(R, (a**2 - 3, a))
|
|
977
|
+
sage: L.fraction_field()
|
|
978
|
+
Fraction Field of Univariate Polynomial Ring in a over Finite Field of size 5
|
|
979
|
+
sage: L.is_subring(_)
|
|
980
|
+
True
|
|
981
|
+
"""
|
|
982
|
+
return self._fraction_field
|
|
983
|
+
|
|
984
|
+
def characteristic(self):
|
|
985
|
+
"""
|
|
986
|
+
Return the characteristic of ``self``.
|
|
987
|
+
|
|
988
|
+
EXAMPLES::
|
|
989
|
+
|
|
990
|
+
sage: # needs sage.libs.pari
|
|
991
|
+
sage: R.<a> = GF(5)[]
|
|
992
|
+
sage: L = R.localization((a**2 - 3, a))
|
|
993
|
+
sage: L.characteristic()
|
|
994
|
+
5
|
|
995
|
+
"""
|
|
996
|
+
return self.base_ring().characteristic()
|
|
997
|
+
|
|
998
|
+
def krull_dimension(self):
|
|
999
|
+
"""
|
|
1000
|
+
Return the Krull dimension of this localization.
|
|
1001
|
+
|
|
1002
|
+
Since the current implementation just allows integral domains as base ring
|
|
1003
|
+
and localization at a finite set of elements the spectrum of ``self``
|
|
1004
|
+
is open in the irreducible spectrum of its base ring.
|
|
1005
|
+
Therefore, by density we may take the dimension from there.
|
|
1006
|
+
|
|
1007
|
+
EXAMPLES::
|
|
1008
|
+
|
|
1009
|
+
sage: R = ZZ.localization((2, 3))
|
|
1010
|
+
sage: R.krull_dimension()
|
|
1011
|
+
1
|
|
1012
|
+
"""
|
|
1013
|
+
return self.base_ring().krull_dimension()
|
|
1014
|
+
|
|
1015
|
+
def is_field(self, proof=True):
|
|
1016
|
+
"""
|
|
1017
|
+
Return ``True`` if this ring is a field.
|
|
1018
|
+
|
|
1019
|
+
INPUT:
|
|
1020
|
+
|
|
1021
|
+
- ``proof`` -- boolean (default: ``True``); determines what to do in
|
|
1022
|
+
unknown cases
|
|
1023
|
+
|
|
1024
|
+
ALGORITHM:
|
|
1025
|
+
|
|
1026
|
+
If the parameter ``proof`` is set to ``True``, the returned value is
|
|
1027
|
+
correct but the method might throw an error. Otherwise, if it is set
|
|
1028
|
+
to ``False``, the method returns ``True`` if it can establish that
|
|
1029
|
+
``self`` is a field and ``False`` otherwise.
|
|
1030
|
+
|
|
1031
|
+
EXAMPLES::
|
|
1032
|
+
|
|
1033
|
+
sage: R = ZZ.localization((2, 3))
|
|
1034
|
+
sage: R.is_field()
|
|
1035
|
+
False
|
|
1036
|
+
"""
|
|
1037
|
+
if proof:
|
|
1038
|
+
try:
|
|
1039
|
+
if self.krull_dimension() > 0:
|
|
1040
|
+
return False
|
|
1041
|
+
except NotImplementedError:
|
|
1042
|
+
pass
|
|
1043
|
+
return super().is_field(proof=proof)
|