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/generic.py
ADDED
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Generic data structures and algorithms for rings
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Lorenz Panny (2022): :class:`ProductTree`, :func:`prod_with_derivative`
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from sage.misc.misc_c import prod
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ProductTree:
|
|
14
|
+
r"""
|
|
15
|
+
A simple binary product tree, i.e., a tree of ring elements in
|
|
16
|
+
which every node equals the product of its children.
|
|
17
|
+
(In particular, the *root* equals the product of all *leaves*.)
|
|
18
|
+
|
|
19
|
+
Product trees are a very useful building block for fast computer
|
|
20
|
+
algebra. For example, a quasilinear-time Discrete Fourier Transform
|
|
21
|
+
(the famous *Fast* Fourier Transform) can be implemented as follows
|
|
22
|
+
using the :meth:`remainders` method of this class::
|
|
23
|
+
|
|
24
|
+
sage: # needs sage.rings.finite_rings
|
|
25
|
+
sage: from sage.rings.generic import ProductTree
|
|
26
|
+
sage: F = GF(65537)
|
|
27
|
+
sage: a = F(1111)
|
|
28
|
+
sage: assert a.multiplicative_order() == 1024
|
|
29
|
+
sage: R.<x> = F[]
|
|
30
|
+
sage: ms = [x - a^i for i in range(1024)] # roots of unity
|
|
31
|
+
sage: ys = [F.random_element() for _ in range(1024)] # input vector
|
|
32
|
+
sage: tree = ProductTree(ms)
|
|
33
|
+
sage: zs = tree.remainders(R(ys)) # compute FFT!
|
|
34
|
+
sage: zs == [R(ys) % m for m in ms]
|
|
35
|
+
True
|
|
36
|
+
|
|
37
|
+
Similarly, the :meth:`interpolation` method can be used to implement
|
|
38
|
+
the inverse Fast Fourier Transform::
|
|
39
|
+
|
|
40
|
+
sage: tree.interpolation(zs).padded_list(len(ys)) == ys # needs sage.rings.finite_rings
|
|
41
|
+
True
|
|
42
|
+
|
|
43
|
+
This class encodes the tree as *layers*: Layer `0` is just a tuple
|
|
44
|
+
of the leaves. Layer `i+1` is obtained from layer `i` by replacing
|
|
45
|
+
each pair of two adjacent elements by their product, starting from
|
|
46
|
+
the left. (If the length is odd, the unpaired element at the end is
|
|
47
|
+
simply copied as is.) This iteration stops as soon as it yields a
|
|
48
|
+
layer containing only a single element (the root).
|
|
49
|
+
|
|
50
|
+
.. NOTE::
|
|
51
|
+
|
|
52
|
+
Use this class if you need the :meth:`remainders` method.
|
|
53
|
+
To compute just the product, :func:`prod` is likely faster.
|
|
54
|
+
|
|
55
|
+
INPUT:
|
|
56
|
+
|
|
57
|
+
- ``leaves`` -- an iterable of elements in a common ring
|
|
58
|
+
|
|
59
|
+
EXAMPLES::
|
|
60
|
+
|
|
61
|
+
sage: from sage.rings.generic import ProductTree
|
|
62
|
+
sage: R.<x> = GF(101)[]
|
|
63
|
+
sage: vs = [x - i for i in range(1,10)]
|
|
64
|
+
sage: tree = ProductTree(vs)
|
|
65
|
+
sage: tree.root()
|
|
66
|
+
x^9 + 56*x^8 + 62*x^7 + 44*x^6 + 47*x^5 + 42*x^4 + 15*x^3 + 11*x^2 + 12*x + 13
|
|
67
|
+
sage: tree.remainders(x^7 + x + 1)
|
|
68
|
+
[3, 30, 70, 27, 58, 72, 98, 98, 23]
|
|
69
|
+
sage: tree.remainders(x^100)
|
|
70
|
+
[1, 1, 1, 1, 1, 1, 1, 1, 1]
|
|
71
|
+
|
|
72
|
+
::
|
|
73
|
+
|
|
74
|
+
sage: # needs sage.libs.pari
|
|
75
|
+
sage: vs = prime_range(100)
|
|
76
|
+
sage: tree = ProductTree(vs)
|
|
77
|
+
sage: tree.root().factor()
|
|
78
|
+
2 * 3 * 5 * 7 * 11 * 13 * 17 * 19 * 23 * 29 * 31 * 37 * 41 * 43 * 47 * 53 * 59 * 61 * 67 * 71 * 73 * 79 * 83 * 89 * 97
|
|
79
|
+
sage: tree.remainders(3599)
|
|
80
|
+
[1, 2, 4, 1, 2, 11, 12, 8, 11, 3, 3, 10, 32, 30, 27, 48, 0, 0, 48, 49, 22, 44, 30, 39, 10]
|
|
81
|
+
|
|
82
|
+
We can access the individual layers of the tree::
|
|
83
|
+
|
|
84
|
+
sage: tree.layers # needs sage.libs.pari
|
|
85
|
+
[(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97),
|
|
86
|
+
(6, 35, 143, 323, 667, 1147, 1763, 2491, 3599, 4757, 5767, 7387, 97),
|
|
87
|
+
(210, 46189, 765049, 4391633, 17120443, 42600829, 97),
|
|
88
|
+
(9699690, 3359814435017, 729345064647247, 97),
|
|
89
|
+
(32589158477190044730, 70746471270782959),
|
|
90
|
+
(2305567963945518424753102147331756070,)]
|
|
91
|
+
"""
|
|
92
|
+
def __init__(self, leaves):
|
|
93
|
+
r"""
|
|
94
|
+
Initialize a product tree having the given ring elements
|
|
95
|
+
as its leaves.
|
|
96
|
+
|
|
97
|
+
EXAMPLES::
|
|
98
|
+
|
|
99
|
+
sage: from sage.rings.generic import ProductTree
|
|
100
|
+
sage: vs = prime_range(100) # needs sage.libs.pari
|
|
101
|
+
sage: tree = ProductTree(vs) # needs sage.libs.pari
|
|
102
|
+
"""
|
|
103
|
+
V = tuple(leaves)
|
|
104
|
+
self.layers = [V]
|
|
105
|
+
while len(V) > 1:
|
|
106
|
+
V = tuple(prod(V[i:i+2]) for i in range(0,len(V),2))
|
|
107
|
+
self.layers.append(V)
|
|
108
|
+
|
|
109
|
+
def __len__(self):
|
|
110
|
+
r"""
|
|
111
|
+
Return the number of leaves of this product tree.
|
|
112
|
+
|
|
113
|
+
EXAMPLES::
|
|
114
|
+
|
|
115
|
+
sage: from sage.rings.generic import ProductTree
|
|
116
|
+
sage: R.<x> = GF(101)[]
|
|
117
|
+
sage: vs = [x - i for i in range(1,10)]
|
|
118
|
+
sage: tree = ProductTree(vs)
|
|
119
|
+
sage: len(tree)
|
|
120
|
+
9
|
|
121
|
+
sage: len(tree) == len(vs)
|
|
122
|
+
True
|
|
123
|
+
sage: len(tree.remainders(x^2))
|
|
124
|
+
9
|
|
125
|
+
"""
|
|
126
|
+
return len(self.layers[0])
|
|
127
|
+
|
|
128
|
+
def __iter__(self):
|
|
129
|
+
r"""
|
|
130
|
+
Return an iterator over the leaves of this product tree.
|
|
131
|
+
|
|
132
|
+
EXAMPLES::
|
|
133
|
+
|
|
134
|
+
sage: from sage.rings.generic import ProductTree
|
|
135
|
+
sage: R.<x> = GF(101)[]
|
|
136
|
+
sage: vs = [x - i for i in range(1,10)]
|
|
137
|
+
sage: tree = ProductTree(vs)
|
|
138
|
+
sage: next(iter(tree)) == vs[0]
|
|
139
|
+
True
|
|
140
|
+
sage: list(tree) == vs
|
|
141
|
+
True
|
|
142
|
+
"""
|
|
143
|
+
return iter(self.layers[0])
|
|
144
|
+
|
|
145
|
+
def root(self):
|
|
146
|
+
r"""
|
|
147
|
+
Return the value at the root of this product tree (i.e., the product of all leaves).
|
|
148
|
+
|
|
149
|
+
EXAMPLES::
|
|
150
|
+
|
|
151
|
+
sage: from sage.rings.generic import ProductTree
|
|
152
|
+
sage: R.<x> = GF(101)[]
|
|
153
|
+
sage: vs = [x - i for i in range(1,10)]
|
|
154
|
+
sage: tree = ProductTree(vs)
|
|
155
|
+
sage: tree.root()
|
|
156
|
+
x^9 + 56*x^8 + 62*x^7 + 44*x^6 + 47*x^5 + 42*x^4 + 15*x^3 + 11*x^2 + 12*x + 13
|
|
157
|
+
sage: tree.root() == prod(vs)
|
|
158
|
+
True
|
|
159
|
+
"""
|
|
160
|
+
assert len(self.layers[-1]) == 1
|
|
161
|
+
return self.layers[-1][0]
|
|
162
|
+
|
|
163
|
+
def leaves(self):
|
|
164
|
+
r"""
|
|
165
|
+
Return a tuple containing the leaves of this product tree.
|
|
166
|
+
|
|
167
|
+
EXAMPLES::
|
|
168
|
+
|
|
169
|
+
sage: from sage.rings.generic import ProductTree
|
|
170
|
+
sage: R.<x> = GF(101)[]
|
|
171
|
+
sage: vs = [x - i for i in range(1,10)]
|
|
172
|
+
sage: tree = ProductTree(vs)
|
|
173
|
+
sage: tree.leaves()
|
|
174
|
+
(x + 100, x + 99, x + 98, ..., x + 93, x + 92)
|
|
175
|
+
sage: tree.leaves() == tuple(vs)
|
|
176
|
+
True
|
|
177
|
+
"""
|
|
178
|
+
return self.layers[0]
|
|
179
|
+
|
|
180
|
+
def remainders(self, x):
|
|
181
|
+
r"""
|
|
182
|
+
Given a value `x`, return a list of all remainders of `x`
|
|
183
|
+
modulo the leaves of this product tree.
|
|
184
|
+
|
|
185
|
+
The base ring must support the ``%`` operator for this
|
|
186
|
+
method to work.
|
|
187
|
+
|
|
188
|
+
INPUT:
|
|
189
|
+
|
|
190
|
+
- ``x`` -- an element of the base ring of this product tree
|
|
191
|
+
|
|
192
|
+
EXAMPLES::
|
|
193
|
+
|
|
194
|
+
sage: # needs sage.libs.pari
|
|
195
|
+
sage: from sage.rings.generic import ProductTree
|
|
196
|
+
sage: vs = prime_range(100)
|
|
197
|
+
sage: tree = ProductTree(vs)
|
|
198
|
+
sage: n = 1085749272377676749812331719267
|
|
199
|
+
sage: tree.remainders(n)
|
|
200
|
+
[1, 1, 2, 1, 9, 1, 7, 15, 8, 20, 15, 6, 27, 11, 2, 6, 0, 25, 49, 5, 51, 4, 19, 74, 13]
|
|
201
|
+
sage: [n % v for v in vs]
|
|
202
|
+
[1, 1, 2, 1, 9, 1, 7, 15, 8, 20, 15, 6, 27, 11, 2, 6, 0, 25, 49, 5, 51, 4, 19, 74, 13]
|
|
203
|
+
"""
|
|
204
|
+
X = [x]
|
|
205
|
+
for V in reversed(self.layers):
|
|
206
|
+
X = [X[i // 2] % V[i] for i in range(len(V))]
|
|
207
|
+
return X
|
|
208
|
+
|
|
209
|
+
_crt_bases = None
|
|
210
|
+
|
|
211
|
+
def interpolation(self, xs):
|
|
212
|
+
r"""
|
|
213
|
+
Given a sequence ``xs`` of values, one per leaf, return a
|
|
214
|
+
single element `x` which is congruent to the `i`\th value in
|
|
215
|
+
``xs`` modulo the `i`\th leaf, for all `i`.
|
|
216
|
+
|
|
217
|
+
This is an explicit version of the Chinese remainder theorem;
|
|
218
|
+
see also :meth:`CRT`. Using this product tree is faster for
|
|
219
|
+
repeated calls since the required CRT bases are cached after
|
|
220
|
+
the first run.
|
|
221
|
+
|
|
222
|
+
The base ring must support the :func:`xgcd` function for this
|
|
223
|
+
method to work.
|
|
224
|
+
|
|
225
|
+
EXAMPLES::
|
|
226
|
+
|
|
227
|
+
sage: # needs sage.libs.pari
|
|
228
|
+
sage: from sage.rings.generic import ProductTree
|
|
229
|
+
sage: vs = prime_range(100)
|
|
230
|
+
sage: tree = ProductTree(vs)
|
|
231
|
+
sage: tree.interpolation([1, 1, 2, 1, 9, 1, 7, 15, 8, 20, 15, 6, 27, 11, 2, 6, 0, 25, 49, 5, 51, 4, 19, 74, 13])
|
|
232
|
+
1085749272377676749812331719267
|
|
233
|
+
|
|
234
|
+
This method is faster than :func:`CRT` for repeated calls with
|
|
235
|
+
the same moduli::
|
|
236
|
+
|
|
237
|
+
sage: # needs sage.libs.pari
|
|
238
|
+
sage: vs = prime_range(1000,2000)
|
|
239
|
+
sage: rs = lambda: [randrange(1,100) for _ in vs]
|
|
240
|
+
sage: tree = ProductTree(vs)
|
|
241
|
+
sage: %timeit CRT(rs(), vs) # not tested
|
|
242
|
+
372 µs ± 3.34 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
|
|
243
|
+
sage: %timeit tree.interpolation(rs()) # not tested
|
|
244
|
+
146 µs ± 479 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
|
|
245
|
+
"""
|
|
246
|
+
if self._crt_bases is None:
|
|
247
|
+
from sage.arith.misc import CRT_basis
|
|
248
|
+
self._crt_bases = []
|
|
249
|
+
for V in self.layers[:-1]:
|
|
250
|
+
B = tuple(CRT_basis(V[i:i+2]) for i in range(0, len(V), 2))
|
|
251
|
+
self._crt_bases.append(B)
|
|
252
|
+
if len(xs) != len(self.layers[0]):
|
|
253
|
+
raise ValueError('number of given elements must equal the number of leaves')
|
|
254
|
+
for basis, layer in zip(self._crt_bases, self.layers[1:]):
|
|
255
|
+
xs = [sum(c*x for c, x in zip(cs, xs[2*i:2*i+2])) % mod
|
|
256
|
+
for i, (cs, mod) in enumerate(zip(basis, layer))]
|
|
257
|
+
assert len(xs) == 1
|
|
258
|
+
return xs[0]
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def prod_with_derivative(pairs):
|
|
262
|
+
r"""
|
|
263
|
+
Given an iterable of pairs `(f, \partial f)` of ring elements,
|
|
264
|
+
return the pair `(\prod f, \partial \prod f)`, assuming `\partial`
|
|
265
|
+
is an operator obeying the standard product rule.
|
|
266
|
+
|
|
267
|
+
This function is entirely algebraic, hence still works when the
|
|
268
|
+
elements `f` and `\partial f` are all passed through some ring
|
|
269
|
+
homomorphism first. One particularly useful instance of this is
|
|
270
|
+
evaluating the derivative of a product of polynomials at a point
|
|
271
|
+
without fully expanding the product; see the second example below.
|
|
272
|
+
|
|
273
|
+
INPUT:
|
|
274
|
+
|
|
275
|
+
- ``pairs`` -- an iterable of tuples `(f, \partial f)` of elements
|
|
276
|
+
of a common ring
|
|
277
|
+
|
|
278
|
+
ALGORITHM: Repeated application of the product rule.
|
|
279
|
+
|
|
280
|
+
EXAMPLES::
|
|
281
|
+
|
|
282
|
+
sage: from sage.rings.generic import prod_with_derivative
|
|
283
|
+
sage: R.<x> = ZZ[]
|
|
284
|
+
sage: fs = [x^2 + 2*x + 3, 4*x + 5, 6*x^7 + 8*x + 9]
|
|
285
|
+
sage: prod(fs)
|
|
286
|
+
24*x^10 + 78*x^9 + 132*x^8 + 90*x^7 + 32*x^4 + 140*x^3 + 293*x^2 + 318*x + 135
|
|
287
|
+
sage: prod(fs).derivative()
|
|
288
|
+
240*x^9 + 702*x^8 + 1056*x^7 + 630*x^6 + 128*x^3 + 420*x^2 + 586*x + 318
|
|
289
|
+
sage: F, dF = prod_with_derivative((f, f.derivative()) for f in fs)
|
|
290
|
+
sage: F
|
|
291
|
+
24*x^10 + 78*x^9 + 132*x^8 + 90*x^7 + 32*x^4 + 140*x^3 + 293*x^2 + 318*x + 135
|
|
292
|
+
sage: dF
|
|
293
|
+
240*x^9 + 702*x^8 + 1056*x^7 + 630*x^6 + 128*x^3 + 420*x^2 + 586*x + 318
|
|
294
|
+
|
|
295
|
+
The main reason for this function to exist is that it allows us to
|
|
296
|
+
*evaluate* the derivative of a product of polynomials at a point
|
|
297
|
+
`\alpha` without ever fully expanding the product *as a polynomial*::
|
|
298
|
+
|
|
299
|
+
sage: alpha = 42
|
|
300
|
+
sage: F(alpha)
|
|
301
|
+
442943981574522759
|
|
302
|
+
sage: dF(alpha)
|
|
303
|
+
104645261461514994
|
|
304
|
+
sage: us = [f(alpha) for f in fs]
|
|
305
|
+
sage: vs = [f.derivative()(alpha) for f in fs]
|
|
306
|
+
sage: prod_with_derivative(zip(us, vs))
|
|
307
|
+
(442943981574522759, 104645261461514994)
|
|
308
|
+
"""
|
|
309
|
+
class _aux:
|
|
310
|
+
def __init__(self, f, df):
|
|
311
|
+
self.f, self.df = f, df
|
|
312
|
+
|
|
313
|
+
def __mul__(self, other):
|
|
314
|
+
return _aux(self.f * other.f, self.df * other.f + self.f * other.df)
|
|
315
|
+
|
|
316
|
+
def __iter__(self):
|
|
317
|
+
yield self.f
|
|
318
|
+
yield self.df
|
|
319
|
+
|
|
320
|
+
return tuple(prod(_aux(*tup) for tup in pairs))
|
sage/rings/homset.py
ADDED
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Space of homomorphisms between two rings
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
#*****************************************************************************
|
|
7
|
+
# Copyright (C) 2006 William Stein <wstein@gmail.com>
|
|
8
|
+
#
|
|
9
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
10
|
+
#
|
|
11
|
+
# http://www.gnu.org/licenses/
|
|
12
|
+
#*****************************************************************************
|
|
13
|
+
|
|
14
|
+
from sage.categories.homset import HomsetWithBase
|
|
15
|
+
from sage.categories.rings import Rings
|
|
16
|
+
|
|
17
|
+
_Rings = Rings()
|
|
18
|
+
|
|
19
|
+
from sage.rings import morphism, quotient_ring
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def is_RingHomset(H):
|
|
23
|
+
"""
|
|
24
|
+
Return ``True`` if ``H`` is a space of homomorphisms between two rings.
|
|
25
|
+
|
|
26
|
+
EXAMPLES::
|
|
27
|
+
|
|
28
|
+
sage: from sage.rings.homset import is_RingHomset as is_RH
|
|
29
|
+
sage: is_RH(Hom(ZZ, QQ))
|
|
30
|
+
doctest:warning...
|
|
31
|
+
DeprecationWarning: the function is_RingHomset is deprecated;
|
|
32
|
+
use 'isinstance(..., RingHomset_generic)' instead
|
|
33
|
+
See https://github.com/sagemath/sage/issues/37922 for details.
|
|
34
|
+
True
|
|
35
|
+
sage: is_RH(ZZ)
|
|
36
|
+
False
|
|
37
|
+
sage: is_RH(Hom(RR, CC)) # needs sage.rings.real_mpfr
|
|
38
|
+
True
|
|
39
|
+
sage: is_RH(Hom(FreeModule(ZZ,1), FreeModule(QQ,1))) # needs sage.modules
|
|
40
|
+
False
|
|
41
|
+
"""
|
|
42
|
+
from sage.misc.superseded import deprecation
|
|
43
|
+
deprecation(37922, "the function is_RingHomset is deprecated; use 'isinstance(..., RingHomset_generic)' instead")
|
|
44
|
+
return isinstance(H, RingHomset_generic)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def RingHomset(R, S, category=None):
|
|
48
|
+
"""
|
|
49
|
+
Construct a space of homomorphisms between the rings ``R`` and ``S``.
|
|
50
|
+
|
|
51
|
+
For more on homsets, see :func:`Hom()`.
|
|
52
|
+
|
|
53
|
+
EXAMPLES::
|
|
54
|
+
|
|
55
|
+
sage: Hom(ZZ, QQ) # indirect doctest
|
|
56
|
+
Set of Homomorphisms from Integer Ring to Rational Field
|
|
57
|
+
"""
|
|
58
|
+
if isinstance(R, quotient_ring.QuotientRing_nc):
|
|
59
|
+
from .polynomial.polynomial_quotient_ring import PolynomialQuotientRing_generic
|
|
60
|
+
if not isinstance(R, PolynomialQuotientRing_generic): # backwards compatibility
|
|
61
|
+
return RingHomset_quo_ring(R, S, category=category)
|
|
62
|
+
return RingHomset_generic(R, S, category=category)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class RingHomset_generic(HomsetWithBase):
|
|
66
|
+
"""
|
|
67
|
+
A generic space of homomorphisms between two rings.
|
|
68
|
+
|
|
69
|
+
EXAMPLES::
|
|
70
|
+
|
|
71
|
+
sage: Hom(ZZ, QQ)
|
|
72
|
+
Set of Homomorphisms from Integer Ring to Rational Field
|
|
73
|
+
sage: QQ.Hom(ZZ)
|
|
74
|
+
Set of Homomorphisms from Rational Field to Integer Ring
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
Element = morphism.RingHomomorphism
|
|
78
|
+
|
|
79
|
+
def __init__(self, R, S, category=None):
|
|
80
|
+
"""
|
|
81
|
+
Initialize ``self``.
|
|
82
|
+
|
|
83
|
+
EXAMPLES::
|
|
84
|
+
|
|
85
|
+
sage: Hom(ZZ, QQ)
|
|
86
|
+
Set of Homomorphisms from Integer Ring to Rational Field
|
|
87
|
+
"""
|
|
88
|
+
if category is None:
|
|
89
|
+
category = _Rings
|
|
90
|
+
HomsetWithBase.__init__(self, R, S, category)
|
|
91
|
+
|
|
92
|
+
def _repr_(self):
|
|
93
|
+
"""
|
|
94
|
+
Return a string representation of ``self``.
|
|
95
|
+
|
|
96
|
+
EXAMPLES::
|
|
97
|
+
|
|
98
|
+
sage: Hom(ZZ, QQ) # indirect doctest
|
|
99
|
+
Set of Homomorphisms from Integer Ring to Rational Field
|
|
100
|
+
"""
|
|
101
|
+
return "Set of Homomorphisms from %s to %s" % (self.domain(), self.codomain())
|
|
102
|
+
|
|
103
|
+
def has_coerce_map_from(self, x):
|
|
104
|
+
"""
|
|
105
|
+
The default for coercion maps between ring homomorphism spaces is
|
|
106
|
+
very restrictive (until more implementation work is done).
|
|
107
|
+
|
|
108
|
+
Currently this checks if the domains and the codomains are equal.
|
|
109
|
+
|
|
110
|
+
EXAMPLES::
|
|
111
|
+
|
|
112
|
+
sage: H = Hom(ZZ, QQ)
|
|
113
|
+
sage: H2 = Hom(QQ, ZZ)
|
|
114
|
+
sage: H.has_coerce_map_from(H2)
|
|
115
|
+
False
|
|
116
|
+
"""
|
|
117
|
+
return (x.domain() == self.domain() and x.codomain() == self.codomain())
|
|
118
|
+
|
|
119
|
+
def _element_constructor_(self, x, check=True, base_map=None):
|
|
120
|
+
"""
|
|
121
|
+
Construct an element of ``self`` from ``x``.
|
|
122
|
+
|
|
123
|
+
EXAMPLES::
|
|
124
|
+
|
|
125
|
+
sage: H = Hom(ZZ, QQ)
|
|
126
|
+
sage: phi = H([1]); phi
|
|
127
|
+
Ring morphism:
|
|
128
|
+
From: Integer Ring
|
|
129
|
+
To: Rational Field
|
|
130
|
+
Defn: 1 |--> 1
|
|
131
|
+
sage: H2 = Hom(QQ, QQ)
|
|
132
|
+
sage: phi2 = H2(phi); phi2
|
|
133
|
+
Ring endomorphism of Rational Field
|
|
134
|
+
Defn: 1 |--> 1
|
|
135
|
+
sage: H(phi2)
|
|
136
|
+
Ring morphism:
|
|
137
|
+
From: Integer Ring
|
|
138
|
+
To: Rational Field
|
|
139
|
+
Defn: 1 |--> 1
|
|
140
|
+
|
|
141
|
+
You can provide a morphism on the base::
|
|
142
|
+
|
|
143
|
+
sage: # needs sage.rings.finite_rings
|
|
144
|
+
sage: k = GF(9)
|
|
145
|
+
sage: z2 = k.gen()
|
|
146
|
+
sage: cc = k.frobenius_endomorphism()
|
|
147
|
+
sage: R.<x> = k[]
|
|
148
|
+
sage: H = Hom(R, R)
|
|
149
|
+
sage: phi = H([x^2], base_map=cc); phi
|
|
150
|
+
Ring endomorphism of Univariate Polynomial Ring in x
|
|
151
|
+
over Finite Field in z2 of size 3^2
|
|
152
|
+
Defn: x |--> x^2
|
|
153
|
+
with map of base ring
|
|
154
|
+
sage: phi(z2 * x) == z2^3 * x^2
|
|
155
|
+
True
|
|
156
|
+
|
|
157
|
+
sage: R.<x> = ZZ[]
|
|
158
|
+
sage: K.<a> = GF(7^2) # needs sage.rings.finite_rings
|
|
159
|
+
sage: L.<u> = K.extension(x^3 - 3) # needs sage.rings.finite_rings
|
|
160
|
+
sage: phi = L.hom([u^7], base_map=K.frobenius_endomorphism()) # needs sage.rings.finite_rings
|
|
161
|
+
sage: phi(u) == u^7 # needs sage.rings.finite_rings
|
|
162
|
+
True
|
|
163
|
+
sage: phi(a) == a^7 # needs sage.rings.finite_rings
|
|
164
|
+
True
|
|
165
|
+
|
|
166
|
+
TESTS::
|
|
167
|
+
|
|
168
|
+
sage: H = Hom(ZZ, QQ)
|
|
169
|
+
sage: H == loads(dumps(H))
|
|
170
|
+
True
|
|
171
|
+
"""
|
|
172
|
+
from sage.categories.map import Map
|
|
173
|
+
# Case 0: the homomorphism is given by images of generators
|
|
174
|
+
if not (isinstance(x, Map) and x.category_for().is_subcategory(Rings())):
|
|
175
|
+
return morphism.RingHomomorphism_im_gens(self, x, base_map=base_map, check=check)
|
|
176
|
+
if base_map is not None:
|
|
177
|
+
raise ValueError("cannot specify base_map when providing a map")
|
|
178
|
+
# Case 1: the parent fits
|
|
179
|
+
if x.parent() == self:
|
|
180
|
+
if isinstance(x, morphism.RingHomomorphism_im_gens):
|
|
181
|
+
return morphism.RingHomomorphism_im_gens(self, x.im_gens())
|
|
182
|
+
elif isinstance(x, morphism.RingHomomorphism_cover):
|
|
183
|
+
return morphism.RingHomomorphism_cover(self)
|
|
184
|
+
elif isinstance(x, morphism.RingHomomorphism_from_base):
|
|
185
|
+
return morphism.RingHomomorphism_from_base(self, x.underlying_map())
|
|
186
|
+
# Case 2: unique extension via fraction field
|
|
187
|
+
try:
|
|
188
|
+
if (isinstance(x, morphism.RingHomomorphism_im_gens)
|
|
189
|
+
and x.domain().fraction_field().has_coerce_map_from(self.domain())):
|
|
190
|
+
return morphism.RingHomomorphism_im_gens(self, x.im_gens())
|
|
191
|
+
except (TypeError, ValueError):
|
|
192
|
+
pass
|
|
193
|
+
# Case 3: the homomorphism can be extended by coercion
|
|
194
|
+
try:
|
|
195
|
+
return x.extend_codomain(self.codomain()).extend_domain(self.domain())
|
|
196
|
+
except (TypeError, ValueError):
|
|
197
|
+
pass
|
|
198
|
+
# Case 4: the homomorphism is induced from the base ring
|
|
199
|
+
if (self.domain() != self.domain().base()
|
|
200
|
+
or self.codomain() != self.codomain().base()):
|
|
201
|
+
x = self.domain().base().Hom(self.codomain().base())(x)
|
|
202
|
+
return morphism.RingHomomorphism_from_base(self, x)
|
|
203
|
+
raise ValueError('cannot convert {} to an element of {}'.format(x, self))
|
|
204
|
+
|
|
205
|
+
def natural_map(self):
|
|
206
|
+
"""
|
|
207
|
+
Return the natural map from the domain to the codomain.
|
|
208
|
+
|
|
209
|
+
The natural map is the coercion map from the domain ring to the
|
|
210
|
+
codomain ring.
|
|
211
|
+
|
|
212
|
+
EXAMPLES::
|
|
213
|
+
|
|
214
|
+
sage: H = Hom(ZZ, QQ)
|
|
215
|
+
sage: H.natural_map()
|
|
216
|
+
Natural morphism:
|
|
217
|
+
From: Integer Ring
|
|
218
|
+
To: Rational Field
|
|
219
|
+
"""
|
|
220
|
+
f = self.codomain().coerce_map_from(self.domain())
|
|
221
|
+
if f is None:
|
|
222
|
+
raise TypeError("natural coercion morphism from %s to %s not defined" % (self.domain(), self.codomain()))
|
|
223
|
+
return f
|
|
224
|
+
|
|
225
|
+
def zero(self):
|
|
226
|
+
r"""
|
|
227
|
+
Return the zero element of this homset.
|
|
228
|
+
|
|
229
|
+
EXAMPLES:
|
|
230
|
+
|
|
231
|
+
Since a ring homomorphism maps 1 to 1, there can only be a zero
|
|
232
|
+
morphism when mapping to the trivial ring::
|
|
233
|
+
|
|
234
|
+
sage: Hom(ZZ, Zmod(1)).zero()
|
|
235
|
+
Ring morphism:
|
|
236
|
+
From: Integer Ring
|
|
237
|
+
To: Ring of integers modulo 1
|
|
238
|
+
Defn: 1 |--> 0
|
|
239
|
+
sage: Hom(ZZ, Zmod(2)).zero()
|
|
240
|
+
Traceback (most recent call last):
|
|
241
|
+
...
|
|
242
|
+
ValueError: homset has no zero element
|
|
243
|
+
"""
|
|
244
|
+
if not self.codomain().is_zero():
|
|
245
|
+
raise ValueError("homset has no zero element")
|
|
246
|
+
# there is only one map in this homset
|
|
247
|
+
return self.an_element()
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
class RingHomset_quo_ring(RingHomset_generic):
|
|
251
|
+
"""
|
|
252
|
+
Space of ring homomorphisms where the domain is a (formal) quotient
|
|
253
|
+
ring.
|
|
254
|
+
|
|
255
|
+
EXAMPLES::
|
|
256
|
+
|
|
257
|
+
sage: R.<x,y> = PolynomialRing(QQ, 2)
|
|
258
|
+
sage: S.<a,b> = R.quotient(x^2 + y^2) # needs sage.libs.singular
|
|
259
|
+
sage: phi = S.hom([b,a]); phi # needs sage.libs.singular
|
|
260
|
+
Ring endomorphism of Quotient of Multivariate Polynomial Ring in x, y
|
|
261
|
+
over Rational Field by the ideal (x^2 + y^2)
|
|
262
|
+
Defn: a |--> b
|
|
263
|
+
b |--> a
|
|
264
|
+
sage: phi(a) # needs sage.libs.singular
|
|
265
|
+
b
|
|
266
|
+
sage: phi(b) # needs sage.libs.singular
|
|
267
|
+
a
|
|
268
|
+
|
|
269
|
+
TESTS:
|
|
270
|
+
|
|
271
|
+
We test pickling of a homset from a quotient.
|
|
272
|
+
|
|
273
|
+
::
|
|
274
|
+
|
|
275
|
+
sage: # needs sage.libs.singular
|
|
276
|
+
sage: R.<x,y> = PolynomialRing(QQ, 2)
|
|
277
|
+
sage: S.<a,b> = R.quotient(x^2 + y^2)
|
|
278
|
+
sage: H = S.Hom(R)
|
|
279
|
+
sage: H == loads(dumps(H))
|
|
280
|
+
True
|
|
281
|
+
|
|
282
|
+
We test pickling of actual homomorphisms in a quotient::
|
|
283
|
+
|
|
284
|
+
sage: phi = S.hom([b,a]) # needs sage.libs.singular
|
|
285
|
+
sage: phi == loads(dumps(phi)) # needs sage.libs.singular
|
|
286
|
+
True
|
|
287
|
+
"""
|
|
288
|
+
|
|
289
|
+
Element = morphism.RingHomomorphism_from_quotient
|
|
290
|
+
|
|
291
|
+
def _element_constructor_(self, x, base_map=None, check=True):
|
|
292
|
+
"""
|
|
293
|
+
Construct an element of ``self`` from ``x``.
|
|
294
|
+
|
|
295
|
+
EXAMPLES::
|
|
296
|
+
|
|
297
|
+
sage: # needs sage.libs.singular
|
|
298
|
+
sage: R.<x,y> = PolynomialRing(QQ, 2)
|
|
299
|
+
sage: S.<a,b> = R.quotient(x^2 + y^2)
|
|
300
|
+
sage: H = S.Hom(R)
|
|
301
|
+
sage: phi = H([b, a]); phi
|
|
302
|
+
Ring morphism:
|
|
303
|
+
From: Quotient of Multivariate Polynomial Ring in x, y over Rational Field by the ideal (x^2 + y^2)
|
|
304
|
+
To: Multivariate Polynomial Ring in x, y over Rational Field
|
|
305
|
+
Defn: a |--> b
|
|
306
|
+
b |--> a
|
|
307
|
+
sage: R2.<x,y> = PolynomialRing(ZZ, 2)
|
|
308
|
+
sage: H2 = Hom(R2, S)
|
|
309
|
+
sage: H2(phi)
|
|
310
|
+
Composite map:
|
|
311
|
+
From: Multivariate Polynomial Ring in x, y over Integer Ring
|
|
312
|
+
To: Quotient of Multivariate Polynomial Ring in x, y over Rational Field by the ideal (x^2 + y^2)
|
|
313
|
+
Defn: Coercion map:
|
|
314
|
+
From: Multivariate Polynomial Ring in x, y over Integer Ring
|
|
315
|
+
To: Quotient of Multivariate Polynomial Ring in x, y over Rational Field by the ideal (x^2 + y^2)
|
|
316
|
+
then
|
|
317
|
+
Ring morphism:
|
|
318
|
+
From: Quotient of Multivariate Polynomial Ring in x, y over Rational Field by the ideal (x^2 + y^2)
|
|
319
|
+
To: Multivariate Polynomial Ring in x, y over Rational Field
|
|
320
|
+
Defn: a |--> b
|
|
321
|
+
b |--> a
|
|
322
|
+
then
|
|
323
|
+
Coercion map:
|
|
324
|
+
From: Multivariate Polynomial Ring in x, y over Rational Field
|
|
325
|
+
To: Quotient of Multivariate Polynomial Ring in x, y over Rational Field by the ideal (x^2 + y^2)
|
|
326
|
+
"""
|
|
327
|
+
if isinstance(x, morphism.RingHomomorphism_from_quotient):
|
|
328
|
+
phi = x._phi()
|
|
329
|
+
else:
|
|
330
|
+
pi = self.domain().cover()
|
|
331
|
+
phi = pi.domain().hom(x, base_map=base_map, check=check)
|
|
332
|
+
return self.element_class(self, phi)
|