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
sage/rings/ring.pyx
ADDED
|
@@ -0,0 +1,850 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Rings
|
|
4
|
+
|
|
5
|
+
This module provides the abstract base class :class:`Ring` from which
|
|
6
|
+
all rings in Sage (used to) derive, as well as a selection of more
|
|
7
|
+
specific base classes.
|
|
8
|
+
|
|
9
|
+
.. WARNING::
|
|
10
|
+
|
|
11
|
+
Those classes, except maybe for the lowest ones like
|
|
12
|
+
:class:`CommutativeRing` and :class:`Field`,
|
|
13
|
+
are being progressively deprecated in favor of the corresponding
|
|
14
|
+
categories. which are more flexible, in particular with respect to multiple
|
|
15
|
+
inheritance.
|
|
16
|
+
|
|
17
|
+
The class inheritance hierarchy is:
|
|
18
|
+
|
|
19
|
+
- :class:`Ring` (to be deprecated)
|
|
20
|
+
|
|
21
|
+
- :class:`Algebra` (deprecated and essentially removed)
|
|
22
|
+
- :class:`CommutativeRing`
|
|
23
|
+
|
|
24
|
+
- :class:`NoetherianRing` (deprecated and essentially removed)
|
|
25
|
+
- :class:`CommutativeAlgebra` (deprecated and essentially removed)
|
|
26
|
+
- :class:`IntegralDomain` (deprecated and essentially removed)
|
|
27
|
+
|
|
28
|
+
- :class:`DedekindDomain` (deprecated and essentially removed)
|
|
29
|
+
- :class:`PrincipalIdealDomain` (deprecated and essentially removed)
|
|
30
|
+
|
|
31
|
+
Subclasses of :class:`CommutativeRing` are
|
|
32
|
+
|
|
33
|
+
- :class:`Field`
|
|
34
|
+
|
|
35
|
+
- :class:`~sage.rings.finite_rings.finite_field_base.FiniteField`
|
|
36
|
+
|
|
37
|
+
Some aspects of this structure may seem strange, but this is an unfortunate
|
|
38
|
+
consequence of the fact that Cython classes do not support multiple
|
|
39
|
+
inheritance.
|
|
40
|
+
|
|
41
|
+
(A distinct but equally awkward issue is that sometimes we may not know *in
|
|
42
|
+
advance* whether or not a ring belongs in one of these classes; e.g. some
|
|
43
|
+
orders in number fields are Dedekind domains, but others are not, and we still
|
|
44
|
+
want to offer a unified interface, so orders are never instances of the
|
|
45
|
+
deprecated :class:`DedekindDomain` class.)
|
|
46
|
+
|
|
47
|
+
AUTHORS:
|
|
48
|
+
|
|
49
|
+
- David Harvey (2006-10-16): changed :class:`CommutativeAlgebra` to derive from
|
|
50
|
+
:class:`CommutativeRing` instead of from :class:`Algebra`.
|
|
51
|
+
- David Loeffler (2009-07-09): documentation fixes, added to reference manual.
|
|
52
|
+
- Simon King (2011-03-29): Proper use of the category framework for rings.
|
|
53
|
+
- Simon King (2011-05-20): Modify multiplication and _ideal_class_ to support
|
|
54
|
+
ideals of non-commutative rings.
|
|
55
|
+
|
|
56
|
+
TESTS:
|
|
57
|
+
|
|
58
|
+
This is to test a deprecation::
|
|
59
|
+
|
|
60
|
+
sage: from sage.rings.ring import DedekindDomain
|
|
61
|
+
sage: class No(DedekindDomain):
|
|
62
|
+
....: pass
|
|
63
|
+
sage: F = No(QQ)
|
|
64
|
+
...:
|
|
65
|
+
DeprecationWarning: use the category DedekindDomains
|
|
66
|
+
See https://github.com/sagemath/sage/issues/37234 for details.
|
|
67
|
+
sage: F.category()
|
|
68
|
+
Category of Dedekind domains
|
|
69
|
+
|
|
70
|
+
sage: from sage.rings.ring import CommutativeAlgebra
|
|
71
|
+
sage: class Nein(CommutativeAlgebra):
|
|
72
|
+
....: pass
|
|
73
|
+
sage: F = Nein(QQ)
|
|
74
|
+
...:
|
|
75
|
+
DeprecationWarning: use the category CommutativeAlgebras
|
|
76
|
+
See https://github.com/sagemath/sage/issues/37999 for details.
|
|
77
|
+
sage: F.category()
|
|
78
|
+
Category of commutative algebras over Rational Field
|
|
79
|
+
|
|
80
|
+
sage: from sage.rings.ring import PrincipalIdealDomain
|
|
81
|
+
sage: class Non(PrincipalIdealDomain):
|
|
82
|
+
....: pass
|
|
83
|
+
sage: F = Non(QQ)
|
|
84
|
+
...:
|
|
85
|
+
DeprecationWarning: use the category PrincipalIdealDomains
|
|
86
|
+
See https://github.com/sagemath/sage/issues/37719 for details.
|
|
87
|
+
sage: F.category()
|
|
88
|
+
Category of principal ideal domains
|
|
89
|
+
|
|
90
|
+
sage: from sage.rings.ring import Algebra
|
|
91
|
+
sage: class Nichts(Algebra):
|
|
92
|
+
....: pass
|
|
93
|
+
sage: F = Nichts(QQ)
|
|
94
|
+
...:
|
|
95
|
+
DeprecationWarning: use the category Algebras
|
|
96
|
+
See https://github.com/sagemath/sage/issues/38502 for details.
|
|
97
|
+
sage: F.category()
|
|
98
|
+
Category of algebras over Rational Field
|
|
99
|
+
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
# ****************************************************************************
|
|
103
|
+
# Copyright (C) 2005, 2007 William Stein <wstein@gmail.com>
|
|
104
|
+
#
|
|
105
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
106
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
107
|
+
# the License, or (at your option) any later version.
|
|
108
|
+
# https://www.gnu.org/licenses/
|
|
109
|
+
# ****************************************************************************
|
|
110
|
+
|
|
111
|
+
from sage.misc.cachefunc import cached_method
|
|
112
|
+
from sage.misc.superseded import deprecation
|
|
113
|
+
|
|
114
|
+
from sage.structure.coerce cimport coercion_model
|
|
115
|
+
from sage.structure.parent cimport Parent
|
|
116
|
+
from sage.structure.category_object cimport check_default_category
|
|
117
|
+
from sage.categories.rings import Rings
|
|
118
|
+
from sage.categories.algebras import Algebras
|
|
119
|
+
from sage.categories.commutative_algebras import CommutativeAlgebras
|
|
120
|
+
from sage.categories.commutative_rings import CommutativeRings
|
|
121
|
+
from sage.categories.integral_domains import IntegralDomains
|
|
122
|
+
from sage.categories.dedekind_domains import DedekindDomains
|
|
123
|
+
from sage.categories.principal_ideal_domains import PrincipalIdealDomains
|
|
124
|
+
from sage.categories.noetherian_rings import NoetherianRings
|
|
125
|
+
|
|
126
|
+
_Rings = Rings()
|
|
127
|
+
_CommutativeRings = CommutativeRings()
|
|
128
|
+
|
|
129
|
+
cdef class Ring(ParentWithGens):
|
|
130
|
+
"""
|
|
131
|
+
Generic ring class.
|
|
132
|
+
|
|
133
|
+
TESTS:
|
|
134
|
+
|
|
135
|
+
This is to test against the bug fixed in :issue:`9138`::
|
|
136
|
+
|
|
137
|
+
sage: R.<x> = QQ[]
|
|
138
|
+
sage: R.sum([x,x])
|
|
139
|
+
2*x
|
|
140
|
+
sage: R.<x,y> = ZZ[]
|
|
141
|
+
sage: R.sum([x,y])
|
|
142
|
+
x + y
|
|
143
|
+
sage: TestSuite(QQ['x']).run(verbose=True)
|
|
144
|
+
running ._test_additive_associativity() . . . pass
|
|
145
|
+
running ._test_an_element() . . . pass
|
|
146
|
+
running ._test_associativity() . . . pass
|
|
147
|
+
running ._test_cardinality() . . . pass
|
|
148
|
+
running ._test_category() . . . pass
|
|
149
|
+
running ._test_characteristic() . . . pass
|
|
150
|
+
running ._test_construction() . . . pass
|
|
151
|
+
running ._test_distributivity() . . . pass
|
|
152
|
+
running ._test_divides() . . . pass
|
|
153
|
+
running ._test_elements() . . .
|
|
154
|
+
Running the test suite of self.an_element()
|
|
155
|
+
running ._test_category() . . . pass
|
|
156
|
+
running ._test_eq() . . . pass
|
|
157
|
+
running ._test_monomial_coefficients() . . . pass
|
|
158
|
+
running ._test_new() . . . pass
|
|
159
|
+
running ._test_nonzero_equal() . . . pass
|
|
160
|
+
running ._test_not_implemented_methods() . . . pass
|
|
161
|
+
running ._test_pickling() . . . pass
|
|
162
|
+
pass
|
|
163
|
+
running ._test_elements_eq_reflexive() . . . pass
|
|
164
|
+
running ._test_elements_eq_symmetric() . . . pass
|
|
165
|
+
running ._test_elements_eq_transitive() . . . pass
|
|
166
|
+
running ._test_elements_neq() . . . pass
|
|
167
|
+
running ._test_eq() . . . pass
|
|
168
|
+
running ._test_euclidean_degree() . . . pass
|
|
169
|
+
running ._test_fraction_field() . . . pass
|
|
170
|
+
running ._test_gcd_vs_xgcd() . . . pass
|
|
171
|
+
running ._test_new() . . . pass
|
|
172
|
+
running ._test_not_implemented_methods() . . . pass
|
|
173
|
+
running ._test_one() . . . pass
|
|
174
|
+
running ._test_pickling() . . . pass
|
|
175
|
+
running ._test_prod() . . . pass
|
|
176
|
+
running ._test_quo_rem() . . . pass
|
|
177
|
+
running ._test_some_elements() . . . pass
|
|
178
|
+
running ._test_zero() . . . pass
|
|
179
|
+
running ._test_zero_divisors() . . . pass
|
|
180
|
+
sage: TestSuite(QQ['x','y']).run(skip='_test_elements') # needs sage.libs.singular
|
|
181
|
+
sage: TestSuite(ZZ['x','y']).run(skip='_test_elements') # needs sage.libs.singular
|
|
182
|
+
sage: TestSuite(ZZ['x','y']['t']).run()
|
|
183
|
+
|
|
184
|
+
Test against another bug fixed in :issue:`9944`::
|
|
185
|
+
|
|
186
|
+
sage: QQ['x'].category()
|
|
187
|
+
Join of Category of euclidean domains
|
|
188
|
+
and Category of algebras with basis
|
|
189
|
+
over (number fields and quotient fields and metric spaces)
|
|
190
|
+
and Category of commutative algebras
|
|
191
|
+
over (number fields and quotient fields and metric spaces)
|
|
192
|
+
and Category of infinite sets
|
|
193
|
+
sage: QQ['x','y'].category()
|
|
194
|
+
Join of Category of unique factorization domains
|
|
195
|
+
and Category of algebras with basis
|
|
196
|
+
over (number fields and quotient fields and metric spaces)
|
|
197
|
+
and Category of commutative algebras
|
|
198
|
+
over (number fields and quotient fields and metric spaces)
|
|
199
|
+
and Category of infinite sets
|
|
200
|
+
sage: PolynomialRing(MatrixSpace(QQ, 2),'x').category() # needs sage.modules
|
|
201
|
+
Category of infinite algebras with basis
|
|
202
|
+
over (finite dimensional algebras with basis
|
|
203
|
+
over (number fields and quotient fields and metric spaces)
|
|
204
|
+
and infinite sets)
|
|
205
|
+
sage: PolynomialRing(SteenrodAlgebra(2),'x').category() # needs sage.combinat sage.modules
|
|
206
|
+
Category of infinite algebras with basis
|
|
207
|
+
over (super Hopf algebras with basis over Finite Field of size 2
|
|
208
|
+
and supercocommutative super coalgebras
|
|
209
|
+
over Finite Field of size 2)
|
|
210
|
+
|
|
211
|
+
TESTS::
|
|
212
|
+
|
|
213
|
+
sage: Zp(7)._repr_option('element_is_atomic') # needs sage.rings.padics
|
|
214
|
+
False
|
|
215
|
+
sage: QQ._repr_option('element_is_atomic')
|
|
216
|
+
True
|
|
217
|
+
sage: CDF._repr_option('element_is_atomic') # needs sage.rings.complex_double
|
|
218
|
+
False
|
|
219
|
+
|
|
220
|
+
Check that categories correctly implement ``is_finite`` and ``cardinality``::
|
|
221
|
+
|
|
222
|
+
sage: QQ.is_finite()
|
|
223
|
+
False
|
|
224
|
+
sage: GF(2^10, 'a').is_finite() # needs sage.rings.finite_rings
|
|
225
|
+
True
|
|
226
|
+
sage: R.<x> = GF(7)[]
|
|
227
|
+
sage: R.is_finite()
|
|
228
|
+
False
|
|
229
|
+
sage: S.<y> = R.quo(x^2 + 1) # needs sage.rings.finite_rings
|
|
230
|
+
sage: S.is_finite() # needs sage.rings.finite_rings
|
|
231
|
+
True
|
|
232
|
+
|
|
233
|
+
sage: Integers(7).cardinality()
|
|
234
|
+
7
|
|
235
|
+
sage: QQ.cardinality()
|
|
236
|
+
+Infinity
|
|
237
|
+
"""
|
|
238
|
+
def __init__(self, base, names=None, normalize=True, category=None):
|
|
239
|
+
"""
|
|
240
|
+
Initialize ``self``.
|
|
241
|
+
|
|
242
|
+
EXAMPLES::
|
|
243
|
+
|
|
244
|
+
sage: ZZ
|
|
245
|
+
Integer Ring
|
|
246
|
+
sage: R.<x,y> = QQ[]
|
|
247
|
+
sage: R
|
|
248
|
+
Multivariate Polynomial Ring in x, y over Rational Field
|
|
249
|
+
"""
|
|
250
|
+
# Unfortunately, ParentWithGens inherits from sage.structure.parent_old.Parent.
|
|
251
|
+
# Its __init__ method does *not* call Parent.__init__, since this would somehow
|
|
252
|
+
# yield an infinite recursion. But when we call it from here, it works.
|
|
253
|
+
# This is done in order to ensure that __init_extra__ is called.
|
|
254
|
+
#
|
|
255
|
+
# This is a low-level class. For performance, we trust that the category
|
|
256
|
+
# is fine, if it is provided. If it isn't, we use the category of rings.
|
|
257
|
+
if category is None:
|
|
258
|
+
category = check_default_category(_Rings, category)
|
|
259
|
+
Parent.__init__(self, base=base, names=names, normalize=normalize,
|
|
260
|
+
category=category)
|
|
261
|
+
|
|
262
|
+
def __iter__(self):
|
|
263
|
+
r"""
|
|
264
|
+
Return an iterator through the elements of ``self``.
|
|
265
|
+
Not implemented in general.
|
|
266
|
+
|
|
267
|
+
EXAMPLES::
|
|
268
|
+
|
|
269
|
+
sage: sage.rings.ring.Ring.__iter__(ZZ)
|
|
270
|
+
Traceback (most recent call last):
|
|
271
|
+
...
|
|
272
|
+
NotImplementedError: object does not support iteration
|
|
273
|
+
"""
|
|
274
|
+
raise NotImplementedError("object does not support iteration")
|
|
275
|
+
|
|
276
|
+
def __len__(self):
|
|
277
|
+
r"""
|
|
278
|
+
Return the cardinality of this ring if it is finite, else raise
|
|
279
|
+
a :exc:`NotImplementedError`.
|
|
280
|
+
|
|
281
|
+
EXAMPLES::
|
|
282
|
+
|
|
283
|
+
sage: len(Integers(24))
|
|
284
|
+
24
|
|
285
|
+
sage: len(RR)
|
|
286
|
+
Traceback (most recent call last):
|
|
287
|
+
...
|
|
288
|
+
NotImplementedError: len() of an infinite set
|
|
289
|
+
"""
|
|
290
|
+
if self.is_finite():
|
|
291
|
+
return self.cardinality()
|
|
292
|
+
raise NotImplementedError('len() of an infinite set')
|
|
293
|
+
|
|
294
|
+
def __xor__(self, n):
|
|
295
|
+
r"""
|
|
296
|
+
Trap the operation ``^``.
|
|
297
|
+
|
|
298
|
+
EXAMPLES::
|
|
299
|
+
|
|
300
|
+
sage: eval('RR^3')
|
|
301
|
+
Traceback (most recent call last):
|
|
302
|
+
...
|
|
303
|
+
RuntimeError: use ** for exponentiation, not '^', which means xor in Python, and has the wrong precedence
|
|
304
|
+
"""
|
|
305
|
+
raise RuntimeError("use ** for exponentiation, not '^', which means xor "
|
|
306
|
+
"in Python, and has the wrong precedence")
|
|
307
|
+
|
|
308
|
+
def base_extend(self, R):
|
|
309
|
+
"""
|
|
310
|
+
EXAMPLES::
|
|
311
|
+
|
|
312
|
+
sage: QQ.base_extend(GF(7))
|
|
313
|
+
Traceback (most recent call last):
|
|
314
|
+
...
|
|
315
|
+
TypeError: no base extension defined
|
|
316
|
+
sage: ZZ.base_extend(GF(7))
|
|
317
|
+
Finite Field of size 7
|
|
318
|
+
"""
|
|
319
|
+
if R.has_coerce_map_from(self):
|
|
320
|
+
return R
|
|
321
|
+
raise TypeError('no base extension defined')
|
|
322
|
+
|
|
323
|
+
def category(self):
|
|
324
|
+
"""
|
|
325
|
+
Return the category to which this ring belongs.
|
|
326
|
+
|
|
327
|
+
.. NOTE::
|
|
328
|
+
|
|
329
|
+
This method exists because sometimes a ring is its own base ring.
|
|
330
|
+
During initialisation of a ring `R`, it may be checked whether the
|
|
331
|
+
base ring (hence, the ring itself) is a ring. Hence, it is
|
|
332
|
+
necessary that ``R.category()`` tells that ``R`` is a ring, even
|
|
333
|
+
*before* its category is properly initialised.
|
|
334
|
+
|
|
335
|
+
EXAMPLES::
|
|
336
|
+
|
|
337
|
+
sage: FreeAlgebra(QQ, 3, 'x').category() # todo: use a ring which is not an algebra! # needs sage.combinat sage.modules
|
|
338
|
+
Category of algebras with basis over Rational Field
|
|
339
|
+
|
|
340
|
+
Since a quotient of the integers is its own base ring, and during
|
|
341
|
+
initialisation of a ring it is tested whether the base ring belongs
|
|
342
|
+
to the category of rings, the following is an indirect test that the
|
|
343
|
+
``category()`` method of rings returns the category of rings
|
|
344
|
+
even before the initialisation was successful::
|
|
345
|
+
|
|
346
|
+
sage: I = Integers(15)
|
|
347
|
+
sage: I.base_ring() is I
|
|
348
|
+
True
|
|
349
|
+
sage: I.category()
|
|
350
|
+
Join of Category of finite commutative rings
|
|
351
|
+
and Category of subquotients of monoids
|
|
352
|
+
and Category of quotients of semigroups
|
|
353
|
+
and Category of finite enumerated sets
|
|
354
|
+
"""
|
|
355
|
+
# Defining a category method is deprecated for parents.
|
|
356
|
+
# For rings, however, it is strictly needed that self.category()
|
|
357
|
+
# returns (a sub-category of) the category of rings before
|
|
358
|
+
# initialisation has finished.
|
|
359
|
+
return self._category or _Rings
|
|
360
|
+
|
|
361
|
+
def __mul__(self, x):
|
|
362
|
+
"""
|
|
363
|
+
Return the ideal ``x*R`` generated by ``x``, where ``x`` is either an
|
|
364
|
+
element or tuple or list of elements.
|
|
365
|
+
|
|
366
|
+
EXAMPLES::
|
|
367
|
+
|
|
368
|
+
sage: R.<x,y,z> = GF(7)[]
|
|
369
|
+
sage: (x + y) * R
|
|
370
|
+
Ideal (x + y) of Multivariate Polynomial Ring in x, y, z
|
|
371
|
+
over Finite Field of size 7
|
|
372
|
+
sage: (x + y, z + y^3) * R
|
|
373
|
+
Ideal (x + y, y^3 + z) of Multivariate Polynomial Ring in x, y, z
|
|
374
|
+
over Finite Field of size 7
|
|
375
|
+
|
|
376
|
+
The following was implemented in :issue:`7797`::
|
|
377
|
+
|
|
378
|
+
sage: # needs sage.combinat sage.modules
|
|
379
|
+
sage: A = SteenrodAlgebra(2)
|
|
380
|
+
sage: A * [A.1 + A.2, A.1^2]
|
|
381
|
+
Left Ideal (Sq(2) + Sq(4), Sq(1,1)) of mod 2 Steenrod algebra, milnor basis
|
|
382
|
+
sage: [A.1 + A.2, A.1^2] * A
|
|
383
|
+
Right Ideal (Sq(2) + Sq(4), Sq(1,1)) of mod 2 Steenrod algebra, milnor basis
|
|
384
|
+
sage: A * [A.1 + A.2, A.1^2] * A
|
|
385
|
+
Twosided Ideal (Sq(2) + Sq(4), Sq(1,1)) of mod 2 Steenrod algebra, milnor basis
|
|
386
|
+
"""
|
|
387
|
+
if isinstance(self, Ring):
|
|
388
|
+
if self.is_commutative():
|
|
389
|
+
return self.ideal(x)
|
|
390
|
+
try:
|
|
391
|
+
side = x.side()
|
|
392
|
+
except AttributeError:
|
|
393
|
+
return self.ideal(x, side='left')
|
|
394
|
+
# presumably x is an ideal...
|
|
395
|
+
try:
|
|
396
|
+
x = x.gens()
|
|
397
|
+
except (AttributeError, NotImplementedError):
|
|
398
|
+
pass # ... not an ideal
|
|
399
|
+
if side in ['left','twosided']:
|
|
400
|
+
return self.ideal(x,side=side)
|
|
401
|
+
elif side=='right':
|
|
402
|
+
return self.ideal(x,side='twosided')
|
|
403
|
+
else: # duck typing failed
|
|
404
|
+
raise TypeError("Don't know how to transform %s into an ideal of %s" % (x, self))
|
|
405
|
+
else: # the sides are switched because this is a Cython / extension class
|
|
406
|
+
if x.is_commutative():
|
|
407
|
+
return x.ideal(self)
|
|
408
|
+
try:
|
|
409
|
+
side = self.side()
|
|
410
|
+
except AttributeError:
|
|
411
|
+
return x.ideal(self, side='right')
|
|
412
|
+
# presumably self is an ideal...
|
|
413
|
+
try:
|
|
414
|
+
self = self.gens()
|
|
415
|
+
except (AttributeError, NotImplementedError):
|
|
416
|
+
pass # ... not an ideal
|
|
417
|
+
if side in ['right','twosided']:
|
|
418
|
+
return x.ideal(self,side='twosided')
|
|
419
|
+
elif side=='left':
|
|
420
|
+
return x.ideal(self,side='twosided')
|
|
421
|
+
else:
|
|
422
|
+
raise TypeError("Don't know how to transform %s into an ideal of %s" % (self, x))
|
|
423
|
+
|
|
424
|
+
def zero(self):
|
|
425
|
+
"""
|
|
426
|
+
Return the zero element of this ring (cached).
|
|
427
|
+
|
|
428
|
+
EXAMPLES::
|
|
429
|
+
|
|
430
|
+
sage: ZZ.zero()
|
|
431
|
+
0
|
|
432
|
+
sage: QQ.zero()
|
|
433
|
+
0
|
|
434
|
+
sage: QQ['x'].zero()
|
|
435
|
+
0
|
|
436
|
+
|
|
437
|
+
The result is cached::
|
|
438
|
+
|
|
439
|
+
sage: ZZ.zero() is ZZ.zero()
|
|
440
|
+
True
|
|
441
|
+
"""
|
|
442
|
+
if self._zero_element is None:
|
|
443
|
+
x = self(0)
|
|
444
|
+
self._zero_element = x
|
|
445
|
+
return x
|
|
446
|
+
return self._zero_element
|
|
447
|
+
|
|
448
|
+
def one(self):
|
|
449
|
+
"""
|
|
450
|
+
Return the one element of this ring (cached), if it exists.
|
|
451
|
+
|
|
452
|
+
EXAMPLES::
|
|
453
|
+
|
|
454
|
+
sage: ZZ.one()
|
|
455
|
+
1
|
|
456
|
+
sage: QQ.one()
|
|
457
|
+
1
|
|
458
|
+
sage: QQ['x'].one()
|
|
459
|
+
1
|
|
460
|
+
|
|
461
|
+
The result is cached::
|
|
462
|
+
|
|
463
|
+
sage: ZZ.one() is ZZ.one()
|
|
464
|
+
True
|
|
465
|
+
"""
|
|
466
|
+
if self._one_element is None:
|
|
467
|
+
x = self(1)
|
|
468
|
+
self._one_element = x
|
|
469
|
+
return x
|
|
470
|
+
return self._one_element
|
|
471
|
+
|
|
472
|
+
def order(self):
|
|
473
|
+
"""
|
|
474
|
+
The number of elements of ``self``.
|
|
475
|
+
|
|
476
|
+
EXAMPLES::
|
|
477
|
+
|
|
478
|
+
sage: GF(19).order()
|
|
479
|
+
19
|
|
480
|
+
sage: QQ.order()
|
|
481
|
+
+Infinity
|
|
482
|
+
"""
|
|
483
|
+
if self.is_zero():
|
|
484
|
+
return 1
|
|
485
|
+
raise NotImplementedError
|
|
486
|
+
|
|
487
|
+
@cached_method
|
|
488
|
+
def epsilon(self):
|
|
489
|
+
"""
|
|
490
|
+
Return the precision error of elements in this ring.
|
|
491
|
+
|
|
492
|
+
EXAMPLES::
|
|
493
|
+
|
|
494
|
+
sage: RDF.epsilon()
|
|
495
|
+
2.220446049250313e-16
|
|
496
|
+
sage: ComplexField(53).epsilon() # needs sage.rings.real_mpfr
|
|
497
|
+
2.22044604925031e-16
|
|
498
|
+
sage: RealField(10).epsilon() # needs sage.rings.real_mpfr
|
|
499
|
+
0.0020
|
|
500
|
+
|
|
501
|
+
For exact rings, zero is returned::
|
|
502
|
+
|
|
503
|
+
sage: ZZ.epsilon()
|
|
504
|
+
0
|
|
505
|
+
|
|
506
|
+
This also works over derived rings::
|
|
507
|
+
|
|
508
|
+
sage: RR['x'].epsilon() # needs sage.rings.real_mpfr
|
|
509
|
+
2.22044604925031e-16
|
|
510
|
+
sage: QQ['x'].epsilon()
|
|
511
|
+
0
|
|
512
|
+
|
|
513
|
+
For the symbolic ring, there is no reasonable answer::
|
|
514
|
+
|
|
515
|
+
sage: SR.epsilon() # needs sage.symbolic
|
|
516
|
+
Traceback (most recent call last):
|
|
517
|
+
...
|
|
518
|
+
NotImplementedError
|
|
519
|
+
"""
|
|
520
|
+
one = self.one()
|
|
521
|
+
try:
|
|
522
|
+
return one.ulp()
|
|
523
|
+
except AttributeError:
|
|
524
|
+
pass
|
|
525
|
+
|
|
526
|
+
try:
|
|
527
|
+
eps = one.real().ulp()
|
|
528
|
+
except AttributeError:
|
|
529
|
+
pass
|
|
530
|
+
else:
|
|
531
|
+
return self(eps)
|
|
532
|
+
|
|
533
|
+
B = self._base
|
|
534
|
+
if B is not None and B is not self:
|
|
535
|
+
eps = self.base_ring().epsilon()
|
|
536
|
+
return self(eps)
|
|
537
|
+
if self.is_exact():
|
|
538
|
+
return self.zero()
|
|
539
|
+
raise NotImplementedError
|
|
540
|
+
|
|
541
|
+
cdef class CommutativeRing(Ring):
|
|
542
|
+
"""
|
|
543
|
+
Generic commutative ring.
|
|
544
|
+
"""
|
|
545
|
+
_default_category = _CommutativeRings
|
|
546
|
+
|
|
547
|
+
def __init__(self, base_ring, names=None, normalize=True, category=None):
|
|
548
|
+
"""
|
|
549
|
+
Initialize ``self``.
|
|
550
|
+
|
|
551
|
+
EXAMPLES::
|
|
552
|
+
|
|
553
|
+
sage: Integers(389)['x,y']
|
|
554
|
+
Multivariate Polynomial Ring in x, y over Ring of integers modulo 389
|
|
555
|
+
"""
|
|
556
|
+
if base_ring is not self and base_ring not in _CommutativeRings:
|
|
557
|
+
raise TypeError("base ring %s is no commutative ring" % base_ring)
|
|
558
|
+
|
|
559
|
+
# This is a low-level class. For performance, we trust that
|
|
560
|
+
# the category is fine, if it is provided. If it isn't, we use
|
|
561
|
+
# the category of commutative rings.
|
|
562
|
+
category = check_default_category(self._default_category, category)
|
|
563
|
+
Ring.__init__(self, base_ring, names=names, normalize=normalize,
|
|
564
|
+
category=category)
|
|
565
|
+
|
|
566
|
+
def fraction_field(self):
|
|
567
|
+
"""
|
|
568
|
+
Return the fraction field of ``self``.
|
|
569
|
+
|
|
570
|
+
EXAMPLES::
|
|
571
|
+
|
|
572
|
+
sage: R = Integers(389)['x,y']
|
|
573
|
+
sage: Frac(R)
|
|
574
|
+
Fraction Field of Multivariate Polynomial Ring in x, y over Ring of integers modulo 389
|
|
575
|
+
sage: R.fraction_field()
|
|
576
|
+
Fraction Field of Multivariate Polynomial Ring in x, y over Ring of integers modulo 389
|
|
577
|
+
"""
|
|
578
|
+
try:
|
|
579
|
+
if self.is_field():
|
|
580
|
+
return self
|
|
581
|
+
except NotImplementedError:
|
|
582
|
+
pass
|
|
583
|
+
|
|
584
|
+
if not self.is_integral_domain():
|
|
585
|
+
raise TypeError("self must be an integral domain.")
|
|
586
|
+
|
|
587
|
+
if self.__fraction_field is not None:
|
|
588
|
+
return self.__fraction_field
|
|
589
|
+
else:
|
|
590
|
+
import sage.rings.fraction_field
|
|
591
|
+
K = sage.rings.fraction_field.FractionField_generic(self)
|
|
592
|
+
self.__fraction_field = K
|
|
593
|
+
return self.__fraction_field
|
|
594
|
+
|
|
595
|
+
def _pseudo_fraction_field(self):
|
|
596
|
+
r"""
|
|
597
|
+
This method is used by the coercion model to determine if `a / b`
|
|
598
|
+
should be treated as `a * (1/b)`, for example when dividing an element
|
|
599
|
+
of `\ZZ[x]` by an element of `\ZZ`.
|
|
600
|
+
|
|
601
|
+
The default is to return the same value as ``self.fraction_field()``,
|
|
602
|
+
but it may return some other domain in which division is usually
|
|
603
|
+
defined (for example, ``\ZZ/n\ZZ`` for possibly composite `n`).
|
|
604
|
+
|
|
605
|
+
EXAMPLES::
|
|
606
|
+
|
|
607
|
+
sage: ZZ._pseudo_fraction_field()
|
|
608
|
+
Rational Field
|
|
609
|
+
sage: ZZ['x']._pseudo_fraction_field()
|
|
610
|
+
Fraction Field of Univariate Polynomial Ring in x over Integer Ring
|
|
611
|
+
sage: Integers(15)._pseudo_fraction_field()
|
|
612
|
+
Ring of integers modulo 15
|
|
613
|
+
sage: Integers(15).fraction_field()
|
|
614
|
+
Traceback (most recent call last):
|
|
615
|
+
...
|
|
616
|
+
TypeError: self must be an integral domain.
|
|
617
|
+
"""
|
|
618
|
+
try:
|
|
619
|
+
return self.fraction_field()
|
|
620
|
+
except (NotImplementedError,TypeError):
|
|
621
|
+
return coercion_model.division_parent(self)
|
|
622
|
+
|
|
623
|
+
def extension(self, poly, name=None, names=None, **kwds):
|
|
624
|
+
"""
|
|
625
|
+
Algebraically extend ``self`` by taking the quotient
|
|
626
|
+
``self[x] / (f(x))``.
|
|
627
|
+
|
|
628
|
+
INPUT:
|
|
629
|
+
|
|
630
|
+
- ``poly`` -- a polynomial whose coefficients are coercible into
|
|
631
|
+
``self``
|
|
632
|
+
|
|
633
|
+
- ``name`` -- (optional) name for the root of `f`
|
|
634
|
+
|
|
635
|
+
.. NOTE::
|
|
636
|
+
|
|
637
|
+
Using this method on an algebraically complete field does *not*
|
|
638
|
+
return this field; the construction ``self[x] / (f(x))`` is done
|
|
639
|
+
anyway.
|
|
640
|
+
|
|
641
|
+
EXAMPLES::
|
|
642
|
+
|
|
643
|
+
sage: R = QQ['x']
|
|
644
|
+
sage: y = polygen(R)
|
|
645
|
+
sage: R.extension(y^2 - 5, 'a') # needs sage.libs.pari
|
|
646
|
+
Univariate Quotient Polynomial Ring in a over
|
|
647
|
+
Univariate Polynomial Ring in x over Rational Field with modulus a^2 - 5
|
|
648
|
+
|
|
649
|
+
::
|
|
650
|
+
|
|
651
|
+
sage: # needs sage.rings.finite_rings
|
|
652
|
+
sage: P.<x> = PolynomialRing(GF(5))
|
|
653
|
+
sage: F.<a> = GF(5).extension(x^2 - 2)
|
|
654
|
+
sage: P.<t> = F[]
|
|
655
|
+
sage: R.<b> = F.extension(t^2 - a); R
|
|
656
|
+
Univariate Quotient Polynomial Ring in b over
|
|
657
|
+
Finite Field in a of size 5^2 with modulus b^2 + 4*a
|
|
658
|
+
"""
|
|
659
|
+
from sage.rings.polynomial.polynomial_element import Polynomial
|
|
660
|
+
if not isinstance(poly, Polynomial):
|
|
661
|
+
try:
|
|
662
|
+
poly = poly.polynomial(self)
|
|
663
|
+
except (AttributeError, TypeError):
|
|
664
|
+
raise TypeError("polynomial (=%s) must be a polynomial." % repr(poly))
|
|
665
|
+
if names is not None:
|
|
666
|
+
name = names
|
|
667
|
+
if isinstance(name, tuple):
|
|
668
|
+
name = name[0]
|
|
669
|
+
if name is None:
|
|
670
|
+
name = str(poly.parent().gen(0))
|
|
671
|
+
for key, val in kwds.items():
|
|
672
|
+
if key not in ['structure', 'implementation', 'prec', 'embedding', 'latex_name', 'latex_names']:
|
|
673
|
+
raise TypeError("extension() got an unexpected keyword argument '%s'" % key)
|
|
674
|
+
if not (val is None or isinstance(val, list) and all(c is None for c in val)):
|
|
675
|
+
raise NotImplementedError("ring extension with prescribed %s is not implemented" % key)
|
|
676
|
+
R = self[name]
|
|
677
|
+
I = R.ideal(R(poly.list()))
|
|
678
|
+
return R.quotient(I, name)
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
cdef class IntegralDomain(CommutativeRing):
|
|
682
|
+
_default_category = IntegralDomains()
|
|
683
|
+
|
|
684
|
+
def __init__(self, *args, **kwds):
|
|
685
|
+
deprecation(39227, "use the category IntegralDomains")
|
|
686
|
+
super().__init__(*args, **kwds)
|
|
687
|
+
|
|
688
|
+
|
|
689
|
+
cdef class NoetherianRing(CommutativeRing):
|
|
690
|
+
_default_category = NoetherianRings()
|
|
691
|
+
|
|
692
|
+
def __init__(self, *args, **kwds):
|
|
693
|
+
deprecation(37234, "use the category NoetherianRings")
|
|
694
|
+
super().__init__(*args, **kwds)
|
|
695
|
+
|
|
696
|
+
|
|
697
|
+
cdef class DedekindDomain(CommutativeRing):
|
|
698
|
+
_default_category = DedekindDomains()
|
|
699
|
+
|
|
700
|
+
def __init__(self, *args, **kwds):
|
|
701
|
+
deprecation(37234, "use the category DedekindDomains")
|
|
702
|
+
super().__init__(*args, **kwds)
|
|
703
|
+
|
|
704
|
+
|
|
705
|
+
cdef class PrincipalIdealDomain(CommutativeRing):
|
|
706
|
+
_default_category = PrincipalIdealDomains()
|
|
707
|
+
|
|
708
|
+
def __init__(self, *args, **kwds):
|
|
709
|
+
deprecation(37719, "use the category PrincipalIdealDomains")
|
|
710
|
+
super().__init__(*args, **kwds)
|
|
711
|
+
|
|
712
|
+
|
|
713
|
+
cpdef bint _is_Field(x) except -2:
|
|
714
|
+
"""
|
|
715
|
+
Return ``True`` if ``x`` is a field.
|
|
716
|
+
|
|
717
|
+
EXAMPLES::
|
|
718
|
+
|
|
719
|
+
sage: from sage.rings.ring import _is_Field
|
|
720
|
+
sage: _is_Field(QQ)
|
|
721
|
+
True
|
|
722
|
+
sage: _is_Field(ZZ)
|
|
723
|
+
False
|
|
724
|
+
sage: _is_Field(pAdicField(2)) # needs sage.rings.padics
|
|
725
|
+
True
|
|
726
|
+
sage: _is_Field(5)
|
|
727
|
+
False
|
|
728
|
+
|
|
729
|
+
NOTE:
|
|
730
|
+
|
|
731
|
+
``_is_Field(R)`` is of internal use. It is better (and faster) to
|
|
732
|
+
use ``R in Fields()`` instead.
|
|
733
|
+
"""
|
|
734
|
+
# The result is not immediately returned, since we want to refine
|
|
735
|
+
# x's category, so that calling x in Fields() will be faster next time.
|
|
736
|
+
try:
|
|
737
|
+
result = isinstance(x, Field) or x.is_field()
|
|
738
|
+
except AttributeError:
|
|
739
|
+
result = False
|
|
740
|
+
if result:
|
|
741
|
+
x._refine_category_(_Fields)
|
|
742
|
+
return result
|
|
743
|
+
|
|
744
|
+
from sage.categories.algebras import Algebras
|
|
745
|
+
from sage.categories.commutative_algebras import CommutativeAlgebras
|
|
746
|
+
from sage.categories.fields import Fields
|
|
747
|
+
_Fields = Fields()
|
|
748
|
+
|
|
749
|
+
cdef class Field(CommutativeRing):
|
|
750
|
+
"""
|
|
751
|
+
Generic field
|
|
752
|
+
|
|
753
|
+
TESTS::
|
|
754
|
+
|
|
755
|
+
sage: QQ.is_noetherian()
|
|
756
|
+
True
|
|
757
|
+
"""
|
|
758
|
+
_default_category = _Fields
|
|
759
|
+
|
|
760
|
+
def an_embedding(self, K):
|
|
761
|
+
r"""
|
|
762
|
+
Return some embedding of this field into another field `K`,
|
|
763
|
+
and raise a :class:`ValueError` if none exists.
|
|
764
|
+
|
|
765
|
+
EXAMPLES::
|
|
766
|
+
|
|
767
|
+
sage: # needs sage.rings.finite_rings
|
|
768
|
+
sage: GF(2).an_embedding(GF(4))
|
|
769
|
+
Ring morphism:
|
|
770
|
+
From: Finite Field of size 2
|
|
771
|
+
To: Finite Field in z2 of size 2^2
|
|
772
|
+
Defn: 1 |--> 1
|
|
773
|
+
sage: GF(4).an_embedding(GF(8))
|
|
774
|
+
Traceback (most recent call last):
|
|
775
|
+
...
|
|
776
|
+
ValueError: no embedding from Finite Field in z2 of size 2^2 to Finite Field in z3 of size 2^3
|
|
777
|
+
sage: GF(4).an_embedding(GF(16))
|
|
778
|
+
Ring morphism:
|
|
779
|
+
From: Finite Field in z2 of size 2^2
|
|
780
|
+
To: Finite Field in z4 of size 2^4
|
|
781
|
+
Defn: z2 |--> z4^2 + z4
|
|
782
|
+
|
|
783
|
+
::
|
|
784
|
+
|
|
785
|
+
sage: # needs sage.rings.nunmber_field
|
|
786
|
+
sage: CyclotomicField(5).an_embedding(QQbar)
|
|
787
|
+
Coercion map:
|
|
788
|
+
From: Cyclotomic Field of order 5 and degree 4
|
|
789
|
+
To: Algebraic Field
|
|
790
|
+
sage: CyclotomicField(3).an_embedding(CyclotomicField(7))
|
|
791
|
+
Traceback (most recent call last):
|
|
792
|
+
...
|
|
793
|
+
ValueError: no embedding from Cyclotomic Field of order 3 and degree 2 to Cyclotomic Field of order 7 and degree 6
|
|
794
|
+
sage: CyclotomicField(3).an_embedding(CyclotomicField(6))
|
|
795
|
+
Generic morphism:
|
|
796
|
+
From: Cyclotomic Field of order 3 and degree 2
|
|
797
|
+
To: Cyclotomic Field of order 6 and degree 2
|
|
798
|
+
Defn: zeta3 -> zeta6 - 1
|
|
799
|
+
"""
|
|
800
|
+
if self.characteristic() != K.characteristic():
|
|
801
|
+
raise ValueError(f'no embedding from {self} to {K}: incompatible characteristics')
|
|
802
|
+
|
|
803
|
+
H = self.Hom(K)
|
|
804
|
+
try:
|
|
805
|
+
return H.natural_map()
|
|
806
|
+
except TypeError:
|
|
807
|
+
pass
|
|
808
|
+
from sage.categories.sets_cat import EmptySetError
|
|
809
|
+
try:
|
|
810
|
+
return H.an_element()
|
|
811
|
+
except EmptySetError:
|
|
812
|
+
raise ValueError(f'no embedding from {self} to {K}')
|
|
813
|
+
|
|
814
|
+
|
|
815
|
+
cdef class Algebra(Ring):
|
|
816
|
+
def __init__(self, base_ring, *args, **kwds):
|
|
817
|
+
if 'category' not in kwds:
|
|
818
|
+
kwds['category'] = Algebras(base_ring)
|
|
819
|
+
deprecation(38502, "use the category Algebras")
|
|
820
|
+
super().__init__(base_ring, *args, **kwds)
|
|
821
|
+
|
|
822
|
+
|
|
823
|
+
cdef class CommutativeAlgebra(CommutativeRing):
|
|
824
|
+
def __init__(self, base_ring, *args, **kwds):
|
|
825
|
+
self._default_category = CommutativeAlgebras(base_ring)
|
|
826
|
+
deprecation(37999, "use the category CommutativeAlgebras")
|
|
827
|
+
super().__init__(base_ring, *args, **kwds)
|
|
828
|
+
|
|
829
|
+
|
|
830
|
+
def is_Ring(x):
|
|
831
|
+
"""
|
|
832
|
+
Return ``True`` if ``x`` is a ring.
|
|
833
|
+
|
|
834
|
+
EXAMPLES::
|
|
835
|
+
|
|
836
|
+
sage: from sage.rings.ring import is_Ring
|
|
837
|
+
sage: is_Ring(ZZ)
|
|
838
|
+
doctest:warning...
|
|
839
|
+
DeprecationWarning: The function is_Ring is deprecated; use '... in Rings()' instead
|
|
840
|
+
See https://github.com/sagemath/sage/issues/38288 for details.
|
|
841
|
+
True
|
|
842
|
+
sage: MS = MatrixSpace(QQ, 2) # needs sage.modules
|
|
843
|
+
sage: is_Ring(MS) # needs sage.modules
|
|
844
|
+
True
|
|
845
|
+
"""
|
|
846
|
+
from sage.misc.superseded import deprecation_cython
|
|
847
|
+
deprecation_cython(38288,
|
|
848
|
+
"The function is_Ring is deprecated; "
|
|
849
|
+
"use '... in Rings()' instead")
|
|
850
|
+
return x in _Rings
|