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,736 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Commutative rings
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# Copyright (C) 2005 David Kohel <kohel@maths.usyd.edu>
|
|
7
|
+
# William Stein <wstein@math.ucsd.edu>
|
|
8
|
+
# 2008 Teresa Gomez-Diaz (CNRS) <Teresa.Gomez-Diaz@univ-mlv.fr>
|
|
9
|
+
# 2008-2013 Nicolas M. Thiery <nthiery at users.sf.net>
|
|
10
|
+
#
|
|
11
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
12
|
+
# https://www.gnu.org/licenses/
|
|
13
|
+
# *****************************************************************************
|
|
14
|
+
|
|
15
|
+
from sage.categories.category_with_axiom import CategoryWithAxiom
|
|
16
|
+
from sage.categories.cartesian_product import CartesianProductsCategory
|
|
17
|
+
from sage.structure.sequence import Sequence
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class CommutativeRings(CategoryWithAxiom):
|
|
21
|
+
"""
|
|
22
|
+
The category of commutative rings.
|
|
23
|
+
|
|
24
|
+
commutative rings with unity, i.e. rings with commutative * and
|
|
25
|
+
a multiplicative identity
|
|
26
|
+
|
|
27
|
+
EXAMPLES::
|
|
28
|
+
|
|
29
|
+
sage: C = CommutativeRings(); C
|
|
30
|
+
Category of commutative rings
|
|
31
|
+
sage: C.super_categories()
|
|
32
|
+
[Category of rings, Category of commutative monoids]
|
|
33
|
+
|
|
34
|
+
TESTS::
|
|
35
|
+
|
|
36
|
+
sage: TestSuite(C).run()
|
|
37
|
+
|
|
38
|
+
sage: QQ['x,y,z'] in CommutativeRings()
|
|
39
|
+
True
|
|
40
|
+
sage: GroupAlgebra(DihedralGroup(3), QQ) in CommutativeRings() # needs sage.groups sage.modules
|
|
41
|
+
False
|
|
42
|
+
sage: MatrixSpace(QQ, 2, 2) in CommutativeRings() # needs sage.modules
|
|
43
|
+
False
|
|
44
|
+
|
|
45
|
+
GroupAlgebra should be fixed::
|
|
46
|
+
|
|
47
|
+
sage: GroupAlgebra(CyclicPermutationGroup(3), QQ) in CommutativeRings() # not implemented, needs sage.groups sage.modules
|
|
48
|
+
True
|
|
49
|
+
|
|
50
|
+
Some tests for the method ``is_commutative``::
|
|
51
|
+
|
|
52
|
+
sage: QQ.is_commutative()
|
|
53
|
+
True
|
|
54
|
+
sage: ZpCA(7).is_commutative() # needs sage.rings.padics
|
|
55
|
+
True
|
|
56
|
+
sage: A = QuaternionAlgebra(QQ, -1, -3, names=('i','j','k')); A # needs sage.combinat sage.libs.singular sage.modules
|
|
57
|
+
Quaternion Algebra (-1, -3) with base ring Rational Field
|
|
58
|
+
sage: A.is_commutative() # needs sage.combinat sage.libs.singular sage.modules
|
|
59
|
+
False
|
|
60
|
+
"""
|
|
61
|
+
def __lean_init__(self):
|
|
62
|
+
r"""
|
|
63
|
+
Return the category as Lean mathlib input for a typeclass.
|
|
64
|
+
|
|
65
|
+
EXAMPLES::
|
|
66
|
+
|
|
67
|
+
sage: C = CommutativeRings(); C
|
|
68
|
+
Category of commutative rings
|
|
69
|
+
sage: C._lean_init_() # indirect doctest
|
|
70
|
+
'comm_ring'
|
|
71
|
+
"""
|
|
72
|
+
# defined in algebra.ring.basic
|
|
73
|
+
return 'comm_ring'
|
|
74
|
+
|
|
75
|
+
class ParentMethods:
|
|
76
|
+
def krull_dimension(self):
|
|
77
|
+
"""
|
|
78
|
+
Return the Krull dimension of this commutative ring.
|
|
79
|
+
|
|
80
|
+
The Krull dimension is the length of the longest ascending chain
|
|
81
|
+
of prime ideals.
|
|
82
|
+
|
|
83
|
+
This raises :exc:`NotImplementedError` by default
|
|
84
|
+
for generic commutative rings.
|
|
85
|
+
|
|
86
|
+
Fields and PIDs, with Krull dimension equal to 0 and 1,
|
|
87
|
+
respectively, have naive implementations of ``krull_dimension``.
|
|
88
|
+
Orders in number fields also have Krull dimension 1.
|
|
89
|
+
|
|
90
|
+
EXAMPLES:
|
|
91
|
+
|
|
92
|
+
Some polynomial rings::
|
|
93
|
+
|
|
94
|
+
sage: T.<x,y> = PolynomialRing(QQ,2); T
|
|
95
|
+
Multivariate Polynomial Ring in x, y over Rational Field
|
|
96
|
+
sage: T.krull_dimension()
|
|
97
|
+
2
|
|
98
|
+
sage: U.<x,y,z> = PolynomialRing(ZZ,3); U
|
|
99
|
+
Multivariate Polynomial Ring in x, y, z over Integer Ring
|
|
100
|
+
sage: U.krull_dimension()
|
|
101
|
+
4
|
|
102
|
+
|
|
103
|
+
All orders in number fields have Krull dimension 1, including
|
|
104
|
+
non-maximal orders::
|
|
105
|
+
|
|
106
|
+
sage: # needs sage.rings.number_field
|
|
107
|
+
sage: K.<i> = QuadraticField(-1)
|
|
108
|
+
sage: R = K.order(2*i); R
|
|
109
|
+
Order of conductor 2 generated by 2*i
|
|
110
|
+
in Number Field in i with defining polynomial x^2 + 1 with i = 1*I
|
|
111
|
+
sage: R.is_maximal()
|
|
112
|
+
False
|
|
113
|
+
sage: R.krull_dimension()
|
|
114
|
+
1
|
|
115
|
+
sage: R = K.maximal_order(); R
|
|
116
|
+
Gaussian Integers generated by i in Number Field in i
|
|
117
|
+
with defining polynomial x^2 + 1 with i = 1*I
|
|
118
|
+
sage: R.krull_dimension()
|
|
119
|
+
1
|
|
120
|
+
|
|
121
|
+
TESTS::
|
|
122
|
+
|
|
123
|
+
sage: R = CommutativeRing(ZZ)
|
|
124
|
+
sage: R.krull_dimension()
|
|
125
|
+
Traceback (most recent call last):
|
|
126
|
+
...
|
|
127
|
+
NotImplementedError
|
|
128
|
+
|
|
129
|
+
sage: # needs sage.groups sage.rings.finite_rings
|
|
130
|
+
sage: R = GF(9).galois_group().algebra(QQ)
|
|
131
|
+
sage: R.krull_dimension()
|
|
132
|
+
Traceback (most recent call last):
|
|
133
|
+
...
|
|
134
|
+
NotImplementedError
|
|
135
|
+
"""
|
|
136
|
+
raise NotImplementedError
|
|
137
|
+
|
|
138
|
+
def is_commutative(self) -> bool:
|
|
139
|
+
"""
|
|
140
|
+
Return whether the ring is commutative.
|
|
141
|
+
|
|
142
|
+
The answer is ``True`` only if the category is a sub-category of
|
|
143
|
+
``CommutativeRings``.
|
|
144
|
+
|
|
145
|
+
It is recommended to use instead ``R in Rings().Commutative()``.
|
|
146
|
+
|
|
147
|
+
EXAMPLES::
|
|
148
|
+
|
|
149
|
+
sage: QQ.is_commutative()
|
|
150
|
+
True
|
|
151
|
+
sage: QQ['x,y,z'].is_commutative()
|
|
152
|
+
True
|
|
153
|
+
"""
|
|
154
|
+
return True
|
|
155
|
+
|
|
156
|
+
def _ideal_class_(self, n=0):
|
|
157
|
+
r"""
|
|
158
|
+
Return a callable object that can be used to create ideals
|
|
159
|
+
in this commutative ring.
|
|
160
|
+
|
|
161
|
+
This class can depend on `n`, the number of generators of
|
|
162
|
+
the ideal. The default input of `n=0` indicates an
|
|
163
|
+
unspecified number of generators, in which case a class
|
|
164
|
+
that works for any number of generators is returned.
|
|
165
|
+
|
|
166
|
+
EXAMPLES::
|
|
167
|
+
|
|
168
|
+
sage: ZZ._ideal_class_()
|
|
169
|
+
<class 'sage.rings.ideal.Ideal_pid'>
|
|
170
|
+
sage: RR._ideal_class_()
|
|
171
|
+
<class 'sage.rings.ideal.Ideal_pid'>
|
|
172
|
+
sage: R.<x,y> = GF(5)[]
|
|
173
|
+
sage: R._ideal_class_(1)
|
|
174
|
+
<class 'sage.rings.polynomial.multi_polynomial_ideal.MPolynomialIdeal'>
|
|
175
|
+
sage: S = R.quo(x^3 - y^2)
|
|
176
|
+
sage: S._ideal_class_(1)
|
|
177
|
+
<class 'sage.rings.quotient_ring.QuotientRingIdeal_principal'>
|
|
178
|
+
sage: S._ideal_class_(2)
|
|
179
|
+
<class 'sage.rings.quotient_ring.QuotientRingIdeal_generic'>
|
|
180
|
+
sage: T.<z> = S[] # needs sage.libs.singular
|
|
181
|
+
sage: T._ideal_class_(5) # needs sage.libs.singular
|
|
182
|
+
<class 'sage.rings.ideal.Ideal_generic'>
|
|
183
|
+
sage: T._ideal_class_(1) # needs sage.libs.singular
|
|
184
|
+
<class 'sage.rings.ideal.Ideal_principal'>
|
|
185
|
+
"""
|
|
186
|
+
# One might need more than just n
|
|
187
|
+
from sage.rings.ideal import Ideal_generic, Ideal_principal
|
|
188
|
+
return Ideal_principal if n == 1 else Ideal_generic
|
|
189
|
+
|
|
190
|
+
def _test_divides(self, **options):
|
|
191
|
+
r"""
|
|
192
|
+
Run generic tests on the method :meth:`divides`.
|
|
193
|
+
|
|
194
|
+
EXAMPLES::
|
|
195
|
+
|
|
196
|
+
sage: ZZ._test_divides()
|
|
197
|
+
"""
|
|
198
|
+
tester = self._tester(**options)
|
|
199
|
+
|
|
200
|
+
# 1. is there a divides method ?
|
|
201
|
+
a = self.an_element()
|
|
202
|
+
try:
|
|
203
|
+
a.divides
|
|
204
|
+
except AttributeError:
|
|
205
|
+
return
|
|
206
|
+
|
|
207
|
+
# 2. divisibility of 0 and 1
|
|
208
|
+
z = self.zero()
|
|
209
|
+
o = self.one()
|
|
210
|
+
|
|
211
|
+
tester.assertTrue(z.divides(z))
|
|
212
|
+
tester.assertTrue(o.divides(o))
|
|
213
|
+
tester.assertTrue(o.divides(z))
|
|
214
|
+
tester.assertIs(z.divides(o), self.is_zero())
|
|
215
|
+
|
|
216
|
+
if not self.is_exact():
|
|
217
|
+
return
|
|
218
|
+
|
|
219
|
+
# 3. divisibility of some elements
|
|
220
|
+
for a, b in tester.some_elements(repeat=2):
|
|
221
|
+
try:
|
|
222
|
+
test = a.divides(a * b)
|
|
223
|
+
except NotImplementedError:
|
|
224
|
+
pass
|
|
225
|
+
else:
|
|
226
|
+
tester.assertTrue(test)
|
|
227
|
+
|
|
228
|
+
def over(self, base=None, gen=None, gens=None, name=None, names=None):
|
|
229
|
+
r"""
|
|
230
|
+
Return this ring, considered as an extension of ``base``.
|
|
231
|
+
|
|
232
|
+
INPUT:
|
|
233
|
+
|
|
234
|
+
- ``base`` -- a commutative ring or a morphism or ``None``
|
|
235
|
+
(default: ``None``); the base of this extension or its defining
|
|
236
|
+
morphism
|
|
237
|
+
|
|
238
|
+
- ``gen`` -- a generator of this extension (over its base) or ``None``
|
|
239
|
+
(default: ``None``)
|
|
240
|
+
|
|
241
|
+
- ``gens`` -- list of generators of this extension (over its base)
|
|
242
|
+
or ``None`` (default: ``None``)
|
|
243
|
+
|
|
244
|
+
- ``name`` -- a variable name or ``None`` (default: ``None``)
|
|
245
|
+
|
|
246
|
+
- ``names`` -- list or a tuple of variable names or ``None``
|
|
247
|
+
(default: ``None``)
|
|
248
|
+
|
|
249
|
+
EXAMPLES:
|
|
250
|
+
|
|
251
|
+
We construct an extension of finite fields::
|
|
252
|
+
|
|
253
|
+
sage: # needs sage.rings.finite_rings
|
|
254
|
+
sage: F = GF(5^2)
|
|
255
|
+
sage: k = GF(5^4)
|
|
256
|
+
sage: z4 = k.gen()
|
|
257
|
+
sage: K = k.over(F); K # needs sage.modules
|
|
258
|
+
Field in z4 with defining polynomial
|
|
259
|
+
x^2 + (4*z2 + 3)*x + z2 over its base
|
|
260
|
+
|
|
261
|
+
If not explicitly given, the default generator of the top ring
|
|
262
|
+
(here k) is used and the same name is kept::
|
|
263
|
+
|
|
264
|
+
sage: K.gen() # needs sage.modules sage.rings.finite_rings
|
|
265
|
+
z4
|
|
266
|
+
sage: K(z4) # needs sage.modules sage.rings.finite_rings
|
|
267
|
+
z4
|
|
268
|
+
|
|
269
|
+
However, it is possible to specify another generator and/or
|
|
270
|
+
another name. For example::
|
|
271
|
+
|
|
272
|
+
sage: # needs sage.modules sage.rings.finite_rings
|
|
273
|
+
sage: Ka = k.over(F, name='a'); Ka
|
|
274
|
+
Field in a with defining polynomial
|
|
275
|
+
x^2 + (4*z2 + 3)*x + z2 over its base
|
|
276
|
+
sage: Ka.gen()
|
|
277
|
+
a
|
|
278
|
+
sage: Ka(z4)
|
|
279
|
+
a
|
|
280
|
+
|
|
281
|
+
sage: # needs sage.modules sage.rings.finite_rings
|
|
282
|
+
sage: Kb = k.over(F, gen=-z4+1, name='b')
|
|
283
|
+
sage: Kb
|
|
284
|
+
Field in b with defining polynomial x^2 + z2*x + 4 over its base
|
|
285
|
+
sage: Kb.gen()
|
|
286
|
+
b
|
|
287
|
+
sage: Kb(-z4+1)
|
|
288
|
+
b
|
|
289
|
+
|
|
290
|
+
Note that the shortcut ``K.<a>`` is also available::
|
|
291
|
+
|
|
292
|
+
sage: KKa.<a> = k.over(F) # needs sage.modules sage.rings.finite_rings
|
|
293
|
+
sage: KKa is Ka # needs sage.modules sage.rings.finite_rings
|
|
294
|
+
True
|
|
295
|
+
|
|
296
|
+
Building an extension on top of another extension is allowed::
|
|
297
|
+
|
|
298
|
+
sage: L = GF(5^12).over(K); L # needs sage.modules sage.rings.finite_rings
|
|
299
|
+
Field in z12 with defining polynomial
|
|
300
|
+
x^3 + (1 + (4*z2 + 2)*z4)*x^2 + (2 + 2*z4)*x - z4 over its base
|
|
301
|
+
sage: L.base_ring() # needs sage.modules sage.rings.finite_rings
|
|
302
|
+
Field in z4 with defining polynomial
|
|
303
|
+
x^2 + (4*z2 + 3)*x + z2 over its base
|
|
304
|
+
|
|
305
|
+
The successive bases of an extension are accessible via the
|
|
306
|
+
method :meth:`sage.rings.ring_extension.RingExtension_generic.bases`::
|
|
307
|
+
|
|
308
|
+
sage: L.bases() # needs sage.modules sage.rings.finite_rings
|
|
309
|
+
[Field in z12 with defining polynomial
|
|
310
|
+
x^3 + (1 + (4*z2 + 2)*z4)*x^2 + (2 + 2*z4)*x - z4 over its base,
|
|
311
|
+
Field in z4 with defining polynomial
|
|
312
|
+
x^2 + (4*z2 + 3)*x + z2 over its base,
|
|
313
|
+
Finite Field in z2 of size 5^2]
|
|
314
|
+
|
|
315
|
+
When ``base`` is omitted, the canonical base of the ring is used::
|
|
316
|
+
|
|
317
|
+
sage: S.<x> = QQ[]
|
|
318
|
+
sage: E = S.over(); E # needs sage.modules
|
|
319
|
+
Univariate Polynomial Ring in x over Rational Field over its base
|
|
320
|
+
sage: E.base_ring() # needs sage.modules
|
|
321
|
+
Rational Field
|
|
322
|
+
|
|
323
|
+
Here is an example where ``base`` is a defining morphism::
|
|
324
|
+
|
|
325
|
+
sage: # needs sage.modules sage.rings.number_field
|
|
326
|
+
sage: k.<a> = QQ.extension(x^2 - 2)
|
|
327
|
+
sage: l.<b> = QQ.extension(x^4 - 2)
|
|
328
|
+
sage: f = k.hom([b^2])
|
|
329
|
+
sage: L = l.over(f)
|
|
330
|
+
sage: L
|
|
331
|
+
Field in b with defining polynomial x^2 - a over its base
|
|
332
|
+
sage: L.base_ring()
|
|
333
|
+
Number Field in a with defining polynomial x^2 - 2
|
|
334
|
+
|
|
335
|
+
Similarly, one can create a tower of extensions::
|
|
336
|
+
|
|
337
|
+
sage: # needs sage.modules sage.rings.number_field
|
|
338
|
+
sage: K = k.over()
|
|
339
|
+
sage: L = l.over(Hom(K, l)(f)); L
|
|
340
|
+
Field in b with defining polynomial x^2 - a over its base
|
|
341
|
+
sage: L.base_ring()
|
|
342
|
+
Field in a with defining polynomial x^2 - 2 over its base
|
|
343
|
+
sage: L.bases()
|
|
344
|
+
[Field in b with defining polynomial x^2 - a over its base,
|
|
345
|
+
Field in a with defining polynomial x^2 - 2 over its base,
|
|
346
|
+
Rational Field]
|
|
347
|
+
"""
|
|
348
|
+
from sage.rings.ring_extension import RingExtension
|
|
349
|
+
if name is not None:
|
|
350
|
+
if names is not None:
|
|
351
|
+
raise ValueError("keyword argument 'name' cannot be combined with 'names'")
|
|
352
|
+
names = (name,)
|
|
353
|
+
if gen is not None:
|
|
354
|
+
if gens is not None:
|
|
355
|
+
raise ValueError("keyword argument 'gen' cannot be combined with 'gens'")
|
|
356
|
+
gens = (gen,)
|
|
357
|
+
return RingExtension(self, base, gens, names)
|
|
358
|
+
|
|
359
|
+
def frobenius_endomorphism(self, n=1):
|
|
360
|
+
"""
|
|
361
|
+
Return the Frobenius endomorphism.
|
|
362
|
+
|
|
363
|
+
INPUT:
|
|
364
|
+
|
|
365
|
+
- ``n`` -- nonnegative integer (default: 1)
|
|
366
|
+
|
|
367
|
+
OUTPUT:
|
|
368
|
+
|
|
369
|
+
The `n`-th power of the absolute arithmetic Frobenius
|
|
370
|
+
endomorphism on this commutative ring.
|
|
371
|
+
|
|
372
|
+
EXAMPLES::
|
|
373
|
+
|
|
374
|
+
sage: K.<u> = PowerSeriesRing(GF(5))
|
|
375
|
+
sage: Frob = K.frobenius_endomorphism(); Frob
|
|
376
|
+
Frobenius endomorphism x |--> x^5 of Power Series Ring in u
|
|
377
|
+
over Finite Field of size 5
|
|
378
|
+
sage: Frob(u)
|
|
379
|
+
u^5
|
|
380
|
+
|
|
381
|
+
We can specify a power::
|
|
382
|
+
|
|
383
|
+
sage: f = K.frobenius_endomorphism(2); f
|
|
384
|
+
Frobenius endomorphism x |--> x^(5^2) of Power Series Ring in u
|
|
385
|
+
over Finite Field of size 5
|
|
386
|
+
sage: f(1+u)
|
|
387
|
+
1 + u^25
|
|
388
|
+
"""
|
|
389
|
+
from sage.rings.morphism import FrobeniusEndomorphism_generic
|
|
390
|
+
return FrobeniusEndomorphism_generic(self, n)
|
|
391
|
+
|
|
392
|
+
def derivation_module(self, codomain=None, twist=None):
|
|
393
|
+
r"""
|
|
394
|
+
Return the module of derivations over this ring.
|
|
395
|
+
|
|
396
|
+
INPUT:
|
|
397
|
+
|
|
398
|
+
- ``codomain`` -- an algebra over this ring or a ring homomorphism
|
|
399
|
+
whose domain is this ring or ``None`` (default: ``None``); if it
|
|
400
|
+
is a morphism, the codomain of derivations will be the codomain
|
|
401
|
+
of the morphism viewed as an algebra over ``self`` through the
|
|
402
|
+
given morphism; if ``None``, the codomain will be this ring
|
|
403
|
+
|
|
404
|
+
- ``twist`` -- a morphism from this ring to ``codomain``
|
|
405
|
+
or ``None`` (default: ``None``); if ``None``, the coercion
|
|
406
|
+
map from this ring to ``codomain`` will be used
|
|
407
|
+
|
|
408
|
+
.. NOTE::
|
|
409
|
+
|
|
410
|
+
A twisted derivation with respect to `\theta` (or a
|
|
411
|
+
`\theta`-derivation for short) is an additive map `d`
|
|
412
|
+
satisfying the following axiom for all `x, y` in the domain:
|
|
413
|
+
|
|
414
|
+
.. MATH::
|
|
415
|
+
|
|
416
|
+
d(xy) = \theta(x) d(y) + d(x) y.
|
|
417
|
+
|
|
418
|
+
EXAMPLES::
|
|
419
|
+
|
|
420
|
+
sage: R.<x,y,z> = QQ[]
|
|
421
|
+
sage: M = R.derivation_module(); M # needs sage.modules
|
|
422
|
+
Module of derivations over
|
|
423
|
+
Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
424
|
+
sage: M.gens() # needs sage.modules
|
|
425
|
+
(d/dx, d/dy, d/dz)
|
|
426
|
+
|
|
427
|
+
We can specify a different codomain::
|
|
428
|
+
|
|
429
|
+
sage: K = R.fraction_field()
|
|
430
|
+
sage: M = R.derivation_module(K); M # needs sage.libs.singular sage.modules
|
|
431
|
+
Module of derivations
|
|
432
|
+
from Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
433
|
+
to Fraction Field of
|
|
434
|
+
Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
435
|
+
sage: M.gen() / x # needs sage.libs.singular sage.modules
|
|
436
|
+
1/x*d/dx
|
|
437
|
+
|
|
438
|
+
Here is an example with a non-canonical defining morphism::
|
|
439
|
+
|
|
440
|
+
sage: ev = R.hom([QQ(0), QQ(1), QQ(2)])
|
|
441
|
+
sage: ev
|
|
442
|
+
Ring morphism:
|
|
443
|
+
From: Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
444
|
+
To: Rational Field
|
|
445
|
+
Defn: x |--> 0
|
|
446
|
+
y |--> 1
|
|
447
|
+
z |--> 2
|
|
448
|
+
sage: M = R.derivation_module(ev) # needs sage.modules
|
|
449
|
+
sage: M # needs sage.modules
|
|
450
|
+
Module of derivations
|
|
451
|
+
from Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
452
|
+
to Rational Field
|
|
453
|
+
|
|
454
|
+
Elements in `M` acts as derivations at `(0,1,2)`::
|
|
455
|
+
|
|
456
|
+
sage: # needs sage.modules
|
|
457
|
+
sage: Dx = M.gen(0); Dx
|
|
458
|
+
d/dx
|
|
459
|
+
sage: Dy = M.gen(1); Dy
|
|
460
|
+
d/dy
|
|
461
|
+
sage: Dz = M.gen(2); Dz
|
|
462
|
+
d/dz
|
|
463
|
+
sage: f = x^2 + y^2 + z^2
|
|
464
|
+
sage: Dx(f) # = 2*x evaluated at (0,1,2)
|
|
465
|
+
0
|
|
466
|
+
sage: Dy(f) # = 2*y evaluated at (0,1,2)
|
|
467
|
+
2
|
|
468
|
+
sage: Dz(f) # = 2*z evaluated at (0,1,2)
|
|
469
|
+
4
|
|
470
|
+
|
|
471
|
+
An example with a twisting homomorphism::
|
|
472
|
+
|
|
473
|
+
sage: theta = R.hom([x^2, y^2, z^2])
|
|
474
|
+
sage: M = R.derivation_module(twist=theta); M # needs sage.modules
|
|
475
|
+
Module of twisted derivations over Multivariate Polynomial Ring in x, y, z
|
|
476
|
+
over Rational Field (twisting morphism: x |--> x^2, y |--> y^2, z |--> z^2)
|
|
477
|
+
|
|
478
|
+
.. SEEALSO::
|
|
479
|
+
|
|
480
|
+
:meth:`derivation`
|
|
481
|
+
"""
|
|
482
|
+
from sage.rings.derivation import RingDerivationModule
|
|
483
|
+
if codomain is None:
|
|
484
|
+
codomain = self
|
|
485
|
+
return RingDerivationModule(self, codomain, twist)
|
|
486
|
+
|
|
487
|
+
def derivation(self, arg=None, twist=None):
|
|
488
|
+
r"""
|
|
489
|
+
Return the twisted or untwisted derivation over this ring
|
|
490
|
+
specified by ``arg``.
|
|
491
|
+
|
|
492
|
+
.. NOTE::
|
|
493
|
+
|
|
494
|
+
A twisted derivation with respect to `\theta` (or a
|
|
495
|
+
`\theta`-derivation for short) is an additive map `d`
|
|
496
|
+
satisfying the following axiom for all `x, y` in the domain:
|
|
497
|
+
|
|
498
|
+
.. MATH::
|
|
499
|
+
|
|
500
|
+
d(xy) = \theta(x) d(y) + d(x) y.
|
|
501
|
+
|
|
502
|
+
INPUT:
|
|
503
|
+
|
|
504
|
+
- ``arg`` -- (optional) a generator or a list of coefficients
|
|
505
|
+
that defines the derivation
|
|
506
|
+
|
|
507
|
+
- ``twist`` -- (optional) the twisting homomorphism
|
|
508
|
+
|
|
509
|
+
EXAMPLES::
|
|
510
|
+
|
|
511
|
+
sage: R.<x,y,z> = QQ[]
|
|
512
|
+
sage: R.derivation() # needs sage.modules
|
|
513
|
+
d/dx
|
|
514
|
+
|
|
515
|
+
In that case, ``arg`` could be a generator::
|
|
516
|
+
|
|
517
|
+
sage: R.derivation(y) # needs sage.modules
|
|
518
|
+
d/dy
|
|
519
|
+
|
|
520
|
+
or a list of coefficients::
|
|
521
|
+
|
|
522
|
+
sage: R.derivation([1,2,3]) # needs sage.modules
|
|
523
|
+
d/dx + 2*d/dy + 3*d/dz
|
|
524
|
+
|
|
525
|
+
It is not possible to define derivations with respect to a
|
|
526
|
+
polynomial which is not a variable::
|
|
527
|
+
|
|
528
|
+
sage: R.derivation(x^2) # needs sage.modules
|
|
529
|
+
Traceback (most recent call last):
|
|
530
|
+
...
|
|
531
|
+
ValueError: unable to create the derivation
|
|
532
|
+
|
|
533
|
+
Here is an example with twisted derivations::
|
|
534
|
+
|
|
535
|
+
sage: R.<x,y,z> = QQ[]
|
|
536
|
+
sage: theta = R.hom([x^2, y^2, z^2])
|
|
537
|
+
sage: f = R.derivation(twist=theta); f # needs sage.modules
|
|
538
|
+
0
|
|
539
|
+
sage: f.parent() # needs sage.modules
|
|
540
|
+
Module of twisted derivations over Multivariate Polynomial Ring in x, y, z
|
|
541
|
+
over Rational Field (twisting morphism: x |--> x^2, y |--> y^2, z |--> z^2)
|
|
542
|
+
|
|
543
|
+
Specifying a scalar, the returned twisted derivation is the
|
|
544
|
+
corresponding multiple of `\theta - id`::
|
|
545
|
+
|
|
546
|
+
sage: R.derivation(1, twist=theta) # needs sage.modules
|
|
547
|
+
[x |--> x^2, y |--> y^2, z |--> z^2] - id
|
|
548
|
+
sage: R.derivation(x, twist=theta) # needs sage.modules
|
|
549
|
+
x*([x |--> x^2, y |--> y^2, z |--> z^2] - id)
|
|
550
|
+
"""
|
|
551
|
+
if isinstance(arg, (list, tuple)):
|
|
552
|
+
codomain = Sequence([self(0)] + list(arg)).universe()
|
|
553
|
+
else:
|
|
554
|
+
codomain = self
|
|
555
|
+
return self.derivation_module(codomain, twist=twist)(arg)
|
|
556
|
+
|
|
557
|
+
class ElementMethods:
|
|
558
|
+
pass
|
|
559
|
+
|
|
560
|
+
class Finite(CategoryWithAxiom):
|
|
561
|
+
r"""
|
|
562
|
+
Check that Sage knows that Cartesian products of finite commutative
|
|
563
|
+
rings is a finite commutative ring.
|
|
564
|
+
|
|
565
|
+
EXAMPLES::
|
|
566
|
+
|
|
567
|
+
sage: cartesian_product([Zmod(34),
|
|
568
|
+
....: GF(5)]) in Rings().Commutative().Finite()
|
|
569
|
+
True
|
|
570
|
+
"""
|
|
571
|
+
def extra_super_categories(self):
|
|
572
|
+
r"""
|
|
573
|
+
Let Sage know that finite commutative rings are Noetherian.
|
|
574
|
+
|
|
575
|
+
EXAMPLES::
|
|
576
|
+
|
|
577
|
+
sage: CommutativeRings().Finite().extra_super_categories()
|
|
578
|
+
[Category of noetherian rings]
|
|
579
|
+
"""
|
|
580
|
+
from sage.categories.noetherian_rings import NoetherianRings
|
|
581
|
+
return [NoetherianRings()]
|
|
582
|
+
|
|
583
|
+
class ParentMethods:
|
|
584
|
+
def cyclotomic_cosets(self, q, cosets=None):
|
|
585
|
+
r"""
|
|
586
|
+
Return the (multiplicative) orbits of ``q`` in the ring.
|
|
587
|
+
|
|
588
|
+
Let `R` be a finite commutative ring. The group of invertible
|
|
589
|
+
elements `R^*` in `R` gives rise to a group action on `R` by
|
|
590
|
+
multiplication. An orbit of the subgroup generated by an
|
|
591
|
+
invertible element `q` is called a `q`-*cyclotomic coset* (since
|
|
592
|
+
in a finite ring, each invertible element is a root of unity).
|
|
593
|
+
|
|
594
|
+
These cosets arise in the theory of minimal polynomials of
|
|
595
|
+
finite fields, duadic codes and combinatorial designs. Fix a
|
|
596
|
+
primitive element `z` of `GF(q^k)`. The minimal polynomial of
|
|
597
|
+
`z^s` over `GF(q)` is given by
|
|
598
|
+
|
|
599
|
+
.. MATH::
|
|
600
|
+
|
|
601
|
+
M_s(x) = \prod_{i \in C_s} (x - z^i),
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
where `C_s` is the `q`-cyclotomic coset mod `n` containing `s`,
|
|
605
|
+
`n = q^k - 1`.
|
|
606
|
+
|
|
607
|
+
.. NOTE::
|
|
608
|
+
|
|
609
|
+
When `R = \ZZ / n \ZZ` the smallest element of each coset is
|
|
610
|
+
sometimes called a *coset leader*. This function returns
|
|
611
|
+
sorted lists so that the coset leader will always be the
|
|
612
|
+
first element of the coset.
|
|
613
|
+
|
|
614
|
+
INPUT:
|
|
615
|
+
|
|
616
|
+
- ``q`` -- an invertible element of the ring
|
|
617
|
+
|
|
618
|
+
- ``cosets`` -- an optional lists of elements of ``self``. If
|
|
619
|
+
provided, the function only return the list of cosets that
|
|
620
|
+
contain some element from ``cosets``.
|
|
621
|
+
|
|
622
|
+
OUTPUT: list of lists
|
|
623
|
+
|
|
624
|
+
EXAMPLES::
|
|
625
|
+
|
|
626
|
+
sage: Zmod(11).cyclotomic_cosets(2)
|
|
627
|
+
[[0], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]
|
|
628
|
+
sage: Zmod(15).cyclotomic_cosets(2)
|
|
629
|
+
[[0], [1, 2, 4, 8], [3, 6, 9, 12], [5, 10], [7, 11, 13, 14]]
|
|
630
|
+
|
|
631
|
+
Since the group of invertible elements of a finite field is
|
|
632
|
+
cyclic, the set of squares is a particular case of cyclotomic
|
|
633
|
+
coset::
|
|
634
|
+
|
|
635
|
+
sage: # needs sage.rings.finite_rings
|
|
636
|
+
sage: K = GF(25, 'z')
|
|
637
|
+
sage: a = K.multiplicative_generator()
|
|
638
|
+
sage: K.cyclotomic_cosets(a**2, cosets=[1])
|
|
639
|
+
[[1, 2, 3, 4, z + 1, z + 3,
|
|
640
|
+
2*z + 1, 2*z + 2, 3*z + 3,
|
|
641
|
+
3*z + 4, 4*z + 2, 4*z + 4]]
|
|
642
|
+
sage: sorted(b for b in K if not b.is_zero() and b.is_square())
|
|
643
|
+
[1, 2, 3, 4, z + 1, z + 3,
|
|
644
|
+
2*z + 1, 2*z + 2, 3*z + 3,
|
|
645
|
+
3*z + 4, 4*z + 2, 4*z + 4]
|
|
646
|
+
|
|
647
|
+
We compute some examples of minimal polynomials::
|
|
648
|
+
|
|
649
|
+
sage: # needs sage.rings.finite_rings
|
|
650
|
+
sage: K = GF(27, 'z')
|
|
651
|
+
sage: a = K.multiplicative_generator()
|
|
652
|
+
sage: R.<X> = PolynomialRing(K, 'X')
|
|
653
|
+
sage: a.minimal_polynomial('X')
|
|
654
|
+
X^3 + 2*X + 1
|
|
655
|
+
|
|
656
|
+
sage: cyc3 = Zmod(26).cyclotomic_cosets(3, cosets=[1]); cyc3
|
|
657
|
+
[[1, 3, 9]]
|
|
658
|
+
sage: prod(X - a**i for i in cyc3[0]) # needs sage.rings.finite_rings
|
|
659
|
+
X^3 + 2*X + 1
|
|
660
|
+
sage: (a**7).minimal_polynomial('X') # needs sage.rings.finite_rings
|
|
661
|
+
X^3 + X^2 + 2*X + 1
|
|
662
|
+
sage: cyc7 = Zmod(26).cyclotomic_cosets(3, cosets=[7]); cyc7
|
|
663
|
+
[[7, 11, 21]]
|
|
664
|
+
sage: prod(X - a**i for i in cyc7[0]) # needs sage.rings.finite_rings
|
|
665
|
+
X^3 + X^2 + 2*X + 1
|
|
666
|
+
|
|
667
|
+
Cyclotomic cosets of fields are useful in combinatorial design
|
|
668
|
+
theory to provide so called difference families (see
|
|
669
|
+
:wikipedia:`Difference_set` and
|
|
670
|
+
:mod:`~sage.combinat.designs.difference_family`). This is
|
|
671
|
+
illustrated on the following examples::
|
|
672
|
+
|
|
673
|
+
sage: K = GF(5)
|
|
674
|
+
sage: a = K.multiplicative_generator() # needs sage.libs.pari
|
|
675
|
+
sage: H = K.cyclotomic_cosets(a**2, cosets=[1, 2]); H # needs sage.rings.finite_rings
|
|
676
|
+
[[1, 4], [2, 3]]
|
|
677
|
+
sage: sorted(x - y for D in H for x in D for y in D if x != y) # needs sage.rings.finite_rings
|
|
678
|
+
[1, 2, 3, 4]
|
|
679
|
+
|
|
680
|
+
sage: K = GF(37)
|
|
681
|
+
sage: a = K.multiplicative_generator() # needs sage.libs.pari
|
|
682
|
+
sage: H = K.cyclotomic_cosets(a**4, cosets=[1]); H # needs sage.rings.finite_rings
|
|
683
|
+
[[1, 7, 9, 10, 12, 16, 26, 33, 34]]
|
|
684
|
+
sage: sorted(x - y for D in H for x in D for y in D if x != y) # needs sage.rings.finite_rings
|
|
685
|
+
[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, ..., 33, 34, 34, 35, 35, 36, 36]
|
|
686
|
+
|
|
687
|
+
The method ``cyclotomic_cosets`` works on any finite commutative
|
|
688
|
+
ring::
|
|
689
|
+
|
|
690
|
+
sage: R = cartesian_product([GF(7), Zmod(14)])
|
|
691
|
+
sage: a = R((3,5))
|
|
692
|
+
sage: R.cyclotomic_cosets((3,5), [(1,1)])
|
|
693
|
+
[[(1, 1), (2, 11), (3, 5), (4, 9), (5, 3), (6, 13)]]
|
|
694
|
+
"""
|
|
695
|
+
q = self(q)
|
|
696
|
+
|
|
697
|
+
try:
|
|
698
|
+
~q
|
|
699
|
+
except ZeroDivisionError:
|
|
700
|
+
raise ValueError("%s is not invertible in %s" % (q, self))
|
|
701
|
+
|
|
702
|
+
if cosets is None:
|
|
703
|
+
rest = set(self)
|
|
704
|
+
else:
|
|
705
|
+
rest = {self(x) for x in cosets}
|
|
706
|
+
|
|
707
|
+
orbits = []
|
|
708
|
+
while rest:
|
|
709
|
+
x0 = rest.pop()
|
|
710
|
+
o = [x0]
|
|
711
|
+
x = q * x0
|
|
712
|
+
while x != x0:
|
|
713
|
+
o.append(x)
|
|
714
|
+
rest.discard(x)
|
|
715
|
+
x *= q
|
|
716
|
+
o.sort()
|
|
717
|
+
orbits.append(o)
|
|
718
|
+
|
|
719
|
+
orbits.sort()
|
|
720
|
+
return orbits
|
|
721
|
+
|
|
722
|
+
class CartesianProducts(CartesianProductsCategory):
|
|
723
|
+
def extra_super_categories(self):
|
|
724
|
+
r"""
|
|
725
|
+
Let Sage knows that Cartesian products of commutative rings is a
|
|
726
|
+
commutative ring.
|
|
727
|
+
|
|
728
|
+
EXAMPLES::
|
|
729
|
+
|
|
730
|
+
sage: CommutativeRings().Commutative().CartesianProducts().extra_super_categories()
|
|
731
|
+
[Category of commutative rings]
|
|
732
|
+
sage: cartesian_product([ZZ, Zmod(34),
|
|
733
|
+
....: QQ, GF(5)]) in CommutativeRings()
|
|
734
|
+
True
|
|
735
|
+
"""
|
|
736
|
+
return [CommutativeRings()]
|