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,711 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Class to flatten polynomial rings over polynomial ring
|
|
4
|
+
|
|
5
|
+
For example ``QQ['a','b'],['x','y']`` flattens to ``QQ['a','b','x','y']``.
|
|
6
|
+
|
|
7
|
+
EXAMPLES::
|
|
8
|
+
|
|
9
|
+
sage: R = QQ['x']['y']['s','t']['X']
|
|
10
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
11
|
+
sage: phi = FlatteningMorphism(R); phi
|
|
12
|
+
Flattening morphism:
|
|
13
|
+
From: Univariate Polynomial Ring in X
|
|
14
|
+
over Multivariate Polynomial Ring in s, t
|
|
15
|
+
over Univariate Polynomial Ring in y
|
|
16
|
+
over Univariate Polynomial Ring in x over Rational Field
|
|
17
|
+
To: Multivariate Polynomial Ring in x, y, s, t, X over Rational Field
|
|
18
|
+
sage: phi('x*y*s + t*X').parent()
|
|
19
|
+
Multivariate Polynomial Ring in x, y, s, t, X over Rational Field
|
|
20
|
+
|
|
21
|
+
Authors:
|
|
22
|
+
|
|
23
|
+
Vincent Delecroix, Ben Hutz (July 2016): initial implementation
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
# ****************************************************************************
|
|
27
|
+
# Copyright (C) 2016
|
|
28
|
+
#
|
|
29
|
+
# This program is free software: you can redistribute it and/or modify
|
|
30
|
+
# it under the terms of the GNU General Public License as published by
|
|
31
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
32
|
+
# (at your option) any later version.
|
|
33
|
+
# https://www.gnu.org/licenses/
|
|
34
|
+
# ****************************************************************************
|
|
35
|
+
|
|
36
|
+
import itertools
|
|
37
|
+
|
|
38
|
+
from sage.categories.homset import Homset
|
|
39
|
+
from sage.categories.morphism import Morphism
|
|
40
|
+
from sage.misc.cachefunc import cached_method
|
|
41
|
+
from .polynomial_ring_constructor import PolynomialRing
|
|
42
|
+
from .polynomial_ring import PolynomialRing_generic
|
|
43
|
+
from .multi_polynomial_ring_base import MPolynomialRing_base
|
|
44
|
+
from sage.rings.fraction_field import FractionField_generic
|
|
45
|
+
from sage.rings.fraction_field_element import FractionFieldElement
|
|
46
|
+
from sage.rings.polynomial.polydict import ETuple
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class FlatteningMorphism(Morphism):
|
|
50
|
+
r"""
|
|
51
|
+
EXAMPLES::
|
|
52
|
+
|
|
53
|
+
sage: R = QQ['a','b']['x','y','z']['t1','t2']
|
|
54
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
55
|
+
sage: f = FlatteningMorphism(R)
|
|
56
|
+
sage: f.codomain()
|
|
57
|
+
Multivariate Polynomial Ring in a, b, x, y, z, t1, t2 over Rational Field
|
|
58
|
+
sage: p = R('(a+b)*x + (a^2-b)*t2*(z+y)')
|
|
59
|
+
sage: p
|
|
60
|
+
((a^2 - b)*y + (a^2 - b)*z)*t2 + (a + b)*x
|
|
61
|
+
sage: f(p)
|
|
62
|
+
a^2*y*t2 + a^2*z*t2 - b*y*t2 - b*z*t2 + a*x + b*x
|
|
63
|
+
sage: f(p).parent()
|
|
64
|
+
Multivariate Polynomial Ring in a, b, x, y, z, t1, t2 over Rational Field
|
|
65
|
+
|
|
66
|
+
Also works when univariate polynomial ring are involved::
|
|
67
|
+
|
|
68
|
+
sage: R = QQ['x']['y']['s','t']['X']
|
|
69
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
70
|
+
sage: f = FlatteningMorphism(R)
|
|
71
|
+
sage: f.codomain()
|
|
72
|
+
Multivariate Polynomial Ring in x, y, s, t, X over Rational Field
|
|
73
|
+
sage: p = R('((x^2 + 1) + (x+2)*y + x*y^3)*(s+t) + x*y*X')
|
|
74
|
+
sage: p
|
|
75
|
+
x*y*X + (x*y^3 + (x + 2)*y + x^2 + 1)*s + (x*y^3 + (x + 2)*y + x^2 + 1)*t
|
|
76
|
+
sage: f(p)
|
|
77
|
+
x*y^3*s + x*y^3*t + x^2*s + x*y*s + x^2*t + x*y*t + x*y*X + 2*y*s + 2*y*t + s + t
|
|
78
|
+
sage: f(p).parent()
|
|
79
|
+
Multivariate Polynomial Ring in x, y, s, t, X over Rational Field
|
|
80
|
+
"""
|
|
81
|
+
def __init__(self, domain):
|
|
82
|
+
"""
|
|
83
|
+
The Python constructor.
|
|
84
|
+
|
|
85
|
+
EXAMPLES::
|
|
86
|
+
|
|
87
|
+
sage: R = ZZ['a', 'b', 'c']['x', 'y', 'z']
|
|
88
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
89
|
+
sage: FlatteningMorphism(R)
|
|
90
|
+
Flattening morphism:
|
|
91
|
+
From: Multivariate Polynomial Ring in x, y, z over Multivariate Polynomial Ring in a, b, c over Integer Ring
|
|
92
|
+
To: Multivariate Polynomial Ring in a, b, c, x, y, z over Integer Ring
|
|
93
|
+
|
|
94
|
+
::
|
|
95
|
+
|
|
96
|
+
sage: R = ZZ['a']['b']['c']
|
|
97
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
98
|
+
sage: FlatteningMorphism(R)
|
|
99
|
+
Flattening morphism:
|
|
100
|
+
From: Univariate Polynomial Ring in c over Univariate Polynomial Ring in b over Univariate Polynomial Ring in a over Integer Ring
|
|
101
|
+
To: Multivariate Polynomial Ring in a, b, c over Integer Ring
|
|
102
|
+
|
|
103
|
+
::
|
|
104
|
+
|
|
105
|
+
sage: R = ZZ['a']['a','b']
|
|
106
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
107
|
+
sage: FlatteningMorphism(R)
|
|
108
|
+
Flattening morphism:
|
|
109
|
+
From: Multivariate Polynomial Ring in a, b over Univariate Polynomial Ring in a over Integer Ring
|
|
110
|
+
To: Multivariate Polynomial Ring in a, a0, b over Integer Ring
|
|
111
|
+
|
|
112
|
+
::
|
|
113
|
+
|
|
114
|
+
sage: # needs sage.rings.number_field
|
|
115
|
+
sage: x = polygen(ZZ, 'x')
|
|
116
|
+
sage: K.<v> = NumberField(x^3 - 2)
|
|
117
|
+
sage: R = K['x','y']['a','b']
|
|
118
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
119
|
+
sage: f = FlatteningMorphism(R)
|
|
120
|
+
sage: f(R('v*a*x^2 + b^2 + 1/v*y'))
|
|
121
|
+
v*x^2*a + b^2 + (1/2*v^2)*y
|
|
122
|
+
|
|
123
|
+
::
|
|
124
|
+
|
|
125
|
+
sage: # needs sage.rings.number_field
|
|
126
|
+
sage: R = QQbar['x','y']['a','b']
|
|
127
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
128
|
+
sage: f = FlatteningMorphism(R)
|
|
129
|
+
sage: f(R('QQbar(sqrt(2))*a*x^2 + b^2 + QQbar(I)*y')) # needs sage.symbolic
|
|
130
|
+
1.414213562373095?*x^2*a + b^2 + I*y
|
|
131
|
+
|
|
132
|
+
::
|
|
133
|
+
|
|
134
|
+
sage: # needs sage.rings.number_field
|
|
135
|
+
sage: R.<z> = PolynomialRing(QQbar, 1)
|
|
136
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
137
|
+
sage: f = FlatteningMorphism(R)
|
|
138
|
+
sage: f.domain(), f.codomain()
|
|
139
|
+
(Multivariate Polynomial Ring in z over Algebraic Field,
|
|
140
|
+
Multivariate Polynomial Ring in z over Algebraic Field)
|
|
141
|
+
|
|
142
|
+
::
|
|
143
|
+
|
|
144
|
+
sage: # needs sage.rings.number_field
|
|
145
|
+
sage: R.<z> = PolynomialRing(QQbar)
|
|
146
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
147
|
+
sage: f = FlatteningMorphism(R)
|
|
148
|
+
sage: f.domain(), f.codomain()
|
|
149
|
+
(Univariate Polynomial Ring in z over Algebraic Field,
|
|
150
|
+
Univariate Polynomial Ring in z over Algebraic Field)
|
|
151
|
+
|
|
152
|
+
TESTS::
|
|
153
|
+
|
|
154
|
+
sage: Pol = QQ['x']['x0']['x']
|
|
155
|
+
sage: fl = FlatteningMorphism(Pol)
|
|
156
|
+
sage: fl
|
|
157
|
+
Flattening morphism:
|
|
158
|
+
From: Univariate Polynomial Ring in x over Univariate Polynomial Ring in x0 over Univariate Polynomial Ring in x over Rational Field
|
|
159
|
+
To: Multivariate Polynomial Ring in x, x0, x1 over Rational Field
|
|
160
|
+
sage: p = Pol([[[1,2],[3,4]],[[5,6],[7,8]]])
|
|
161
|
+
sage: fl.section()(fl(p)) == p
|
|
162
|
+
True
|
|
163
|
+
"""
|
|
164
|
+
if not isinstance(domain, (PolynomialRing_generic, MPolynomialRing_base)):
|
|
165
|
+
raise ValueError("domain should be a polynomial ring")
|
|
166
|
+
|
|
167
|
+
ring = domain
|
|
168
|
+
variables = []
|
|
169
|
+
intermediate_rings = []
|
|
170
|
+
|
|
171
|
+
while isinstance(ring, (PolynomialRing_generic, MPolynomialRing_base)):
|
|
172
|
+
intermediate_rings.append(ring)
|
|
173
|
+
v = ring.variable_names()
|
|
174
|
+
variables.extend(reversed(v))
|
|
175
|
+
ring = ring.base_ring()
|
|
176
|
+
self._intermediate_rings = intermediate_rings
|
|
177
|
+
variables.reverse()
|
|
178
|
+
for i, a in enumerate(variables):
|
|
179
|
+
if a in variables[:i]:
|
|
180
|
+
for index in itertools.count():
|
|
181
|
+
b = a + str(index)
|
|
182
|
+
if b not in variables: # not just variables[:i]!
|
|
183
|
+
break
|
|
184
|
+
variables[i] = b
|
|
185
|
+
if isinstance(domain, MPolynomialRing_base):
|
|
186
|
+
codomain = PolynomialRing(ring, variables, len(variables))
|
|
187
|
+
else:
|
|
188
|
+
codomain = PolynomialRing(ring, variables)
|
|
189
|
+
|
|
190
|
+
hom = Homset(domain, codomain, base=ring, check=False)
|
|
191
|
+
Morphism.__init__(self, hom)
|
|
192
|
+
self._repr_type_str = 'Flattening'
|
|
193
|
+
|
|
194
|
+
def _call_(self, p):
|
|
195
|
+
r"""
|
|
196
|
+
Evaluate a flattening morphism.
|
|
197
|
+
|
|
198
|
+
EXAMPLES::
|
|
199
|
+
|
|
200
|
+
sage: R = QQ['a','b','c']['x','y','z']
|
|
201
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
202
|
+
sage: h = FlatteningMorphism(R)('2*a*x + b*z'); h
|
|
203
|
+
2*a*x + b*z
|
|
204
|
+
sage: h.parent()
|
|
205
|
+
Multivariate Polynomial Ring in a, b, c, x, y, z over Rational Field
|
|
206
|
+
|
|
207
|
+
TESTS::
|
|
208
|
+
|
|
209
|
+
sage: R = QQ['x']['y']['s','t']
|
|
210
|
+
sage: p = R('s*x + y*t + x^2*s + 1 + t')
|
|
211
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
212
|
+
sage: f = FlatteningMorphism(R)
|
|
213
|
+
sage: f._call_(p)
|
|
214
|
+
x^2*s + x*s + y*t + t + 1
|
|
215
|
+
"""
|
|
216
|
+
# If we are just specializing a univariate polynomial, then
|
|
217
|
+
# the flattening morphism is the identity
|
|
218
|
+
if self.codomain().ngens() == 1:
|
|
219
|
+
return p
|
|
220
|
+
|
|
221
|
+
p = {(): p}
|
|
222
|
+
|
|
223
|
+
for ring in self._intermediate_rings:
|
|
224
|
+
new_p = {}
|
|
225
|
+
if isinstance(ring, PolynomialRing_generic):
|
|
226
|
+
for mon, pp in p.items():
|
|
227
|
+
assert pp.parent() is ring
|
|
228
|
+
for i, j in pp.monomial_coefficients().items():
|
|
229
|
+
new_p[(i,) + (mon)] = j
|
|
230
|
+
elif isinstance(ring, MPolynomialRing_base):
|
|
231
|
+
for mon, pp in p.items():
|
|
232
|
+
assert pp.parent() is ring
|
|
233
|
+
for mmon, q in pp.monomial_coefficients().items():
|
|
234
|
+
new_p[tuple(mmon) + mon] = q
|
|
235
|
+
else:
|
|
236
|
+
raise RuntimeError
|
|
237
|
+
p = new_p
|
|
238
|
+
|
|
239
|
+
return self.codomain()(p, check=False)
|
|
240
|
+
|
|
241
|
+
@cached_method
|
|
242
|
+
def section(self):
|
|
243
|
+
"""
|
|
244
|
+
Inverse of this flattening morphism.
|
|
245
|
+
|
|
246
|
+
EXAMPLES::
|
|
247
|
+
|
|
248
|
+
sage: R = QQ['a','b','c']['x','y','z']
|
|
249
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
250
|
+
sage: h = FlatteningMorphism(R)
|
|
251
|
+
sage: h.section()
|
|
252
|
+
Unflattening morphism:
|
|
253
|
+
From: Multivariate Polynomial Ring in a, b, c, x, y, z over Rational Field
|
|
254
|
+
To: Multivariate Polynomial Ring in x, y, z
|
|
255
|
+
over Multivariate Polynomial Ring in a, b, c over Rational Field
|
|
256
|
+
|
|
257
|
+
::
|
|
258
|
+
|
|
259
|
+
sage: R = ZZ['a']['b']['c']
|
|
260
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
261
|
+
sage: FlatteningMorphism(R).section()
|
|
262
|
+
Unflattening morphism:
|
|
263
|
+
From: Multivariate Polynomial Ring in a, b, c over Integer Ring
|
|
264
|
+
To: Univariate Polynomial Ring in c over Univariate Polynomial Ring in b
|
|
265
|
+
over Univariate Polynomial Ring in a over Integer Ring
|
|
266
|
+
"""
|
|
267
|
+
return UnflatteningMorphism(self.codomain(), self.domain())
|
|
268
|
+
|
|
269
|
+
def inverse(self):
|
|
270
|
+
"""
|
|
271
|
+
Return the inverse of this flattening morphism.
|
|
272
|
+
|
|
273
|
+
This is the same as calling :meth:`section`.
|
|
274
|
+
|
|
275
|
+
EXAMPLES::
|
|
276
|
+
|
|
277
|
+
sage: f = QQ['x,y']['u,v'].flattening_morphism()
|
|
278
|
+
sage: f.inverse()
|
|
279
|
+
Unflattening morphism:
|
|
280
|
+
From: Multivariate Polynomial Ring in x, y, u, v over Rational Field
|
|
281
|
+
To: Multivariate Polynomial Ring in u, v
|
|
282
|
+
over Multivariate Polynomial Ring in x, y over Rational Field
|
|
283
|
+
"""
|
|
284
|
+
return self.section()
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
class UnflatteningMorphism(Morphism):
|
|
288
|
+
r"""
|
|
289
|
+
Inverses for :class:`FlatteningMorphism`.
|
|
290
|
+
|
|
291
|
+
EXAMPLES::
|
|
292
|
+
|
|
293
|
+
sage: R = QQ['c','x','y','z']
|
|
294
|
+
sage: S = QQ['c']['x','y','z']
|
|
295
|
+
sage: from sage.rings.polynomial.flatten import UnflatteningMorphism
|
|
296
|
+
sage: f = UnflatteningMorphism(R, S)
|
|
297
|
+
sage: g = f(R('x^2 + c*y^2 - z^2'));g
|
|
298
|
+
x^2 + c*y^2 - z^2
|
|
299
|
+
sage: g.parent()
|
|
300
|
+
Multivariate Polynomial Ring in x, y, z
|
|
301
|
+
over Univariate Polynomial Ring in c over Rational Field
|
|
302
|
+
|
|
303
|
+
::
|
|
304
|
+
|
|
305
|
+
sage: R = QQ['a','b', 'x','y']
|
|
306
|
+
sage: S = QQ['a','b']['x','y']
|
|
307
|
+
sage: from sage.rings.polynomial.flatten import UnflatteningMorphism
|
|
308
|
+
sage: UnflatteningMorphism(R, S)
|
|
309
|
+
Unflattening morphism:
|
|
310
|
+
From: Multivariate Polynomial Ring in a, b, x, y over Rational Field
|
|
311
|
+
To: Multivariate Polynomial Ring in x, y
|
|
312
|
+
over Multivariate Polynomial Ring in a, b over Rational Field
|
|
313
|
+
"""
|
|
314
|
+
|
|
315
|
+
def __init__(self, domain, codomain):
|
|
316
|
+
"""
|
|
317
|
+
The Python constructor.
|
|
318
|
+
|
|
319
|
+
EXAMPLES::
|
|
320
|
+
|
|
321
|
+
sage: R = QQ['x']['y']['s','t']['X']
|
|
322
|
+
sage: p = R.random_element()
|
|
323
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
324
|
+
sage: f = FlatteningMorphism(R)
|
|
325
|
+
sage: g = f.section()
|
|
326
|
+
sage: g(f(p)) == p
|
|
327
|
+
True
|
|
328
|
+
|
|
329
|
+
::
|
|
330
|
+
|
|
331
|
+
sage: R = QQ['a','b','x','y']
|
|
332
|
+
sage: S = ZZ['a','b']['x','z']
|
|
333
|
+
sage: from sage.rings.polynomial.flatten import UnflatteningMorphism
|
|
334
|
+
sage: UnflatteningMorphism(R, S)
|
|
335
|
+
Traceback (most recent call last):
|
|
336
|
+
...
|
|
337
|
+
ValueError: rings must have same base ring
|
|
338
|
+
|
|
339
|
+
::
|
|
340
|
+
|
|
341
|
+
sage: R = QQ['a','b','x','y']
|
|
342
|
+
sage: S = QQ['a','b']['x','z','w']
|
|
343
|
+
sage: from sage.rings.polynomial.flatten import UnflatteningMorphism
|
|
344
|
+
sage: UnflatteningMorphism(R, S)
|
|
345
|
+
Traceback (most recent call last):
|
|
346
|
+
...
|
|
347
|
+
ValueError: rings must have the same number of variables
|
|
348
|
+
"""
|
|
349
|
+
if not isinstance(domain, MPolynomialRing_base):
|
|
350
|
+
raise ValueError("domain should be a multivariate polynomial ring")
|
|
351
|
+
if not isinstance(codomain, (PolynomialRing_generic, MPolynomialRing_base)):
|
|
352
|
+
raise ValueError("codomain should be a polynomial ring")
|
|
353
|
+
|
|
354
|
+
ring = codomain
|
|
355
|
+
intermediate_rings = []
|
|
356
|
+
|
|
357
|
+
while True:
|
|
358
|
+
is_polynomial_ring = isinstance(ring, PolynomialRing_generic)
|
|
359
|
+
if not (is_polynomial_ring or isinstance(ring, MPolynomialRing_base)):
|
|
360
|
+
break
|
|
361
|
+
intermediate_rings.append((ring, is_polynomial_ring))
|
|
362
|
+
ring = ring.base_ring()
|
|
363
|
+
|
|
364
|
+
if domain.base_ring() != intermediate_rings[-1][0].base_ring():
|
|
365
|
+
raise ValueError("rings must have same base ring")
|
|
366
|
+
if domain.ngens() != sum([R.ngens() for R, _ in intermediate_rings]):
|
|
367
|
+
raise ValueError("rings must have the same number of variables")
|
|
368
|
+
|
|
369
|
+
self._intermediate_rings = intermediate_rings
|
|
370
|
+
|
|
371
|
+
hom = Homset(domain, codomain, base=ring, check=False)
|
|
372
|
+
Morphism.__init__(self, hom)
|
|
373
|
+
self._repr_type_str = 'Unflattening'
|
|
374
|
+
|
|
375
|
+
def _call_(self, p):
|
|
376
|
+
"""
|
|
377
|
+
Evaluate an unflattening morphism.
|
|
378
|
+
|
|
379
|
+
TESTS::
|
|
380
|
+
|
|
381
|
+
sage: from sage.rings.polynomial.flatten import FlatteningMorphism
|
|
382
|
+
sage: rings = [ZZ['x']['y']['a,b,c']]
|
|
383
|
+
sage: rings += [GF(4)['x','y']['a','b']] # needs sage.rings.finite_rings
|
|
384
|
+
sage: rings += [AA['x']['a','b']['y'], QQbar['a1','a2']['t']['X','Y']] # needs sage.rings.number_field
|
|
385
|
+
sage: for R in rings: # needs sage.modules
|
|
386
|
+
....: f = FlatteningMorphism(R)
|
|
387
|
+
....: g = f.section()
|
|
388
|
+
....: for _ in range(10):
|
|
389
|
+
....: p = R.random_element()
|
|
390
|
+
....: assert p == g(f(p))
|
|
391
|
+
....: z = R.zero()
|
|
392
|
+
....: assert z == g(f(z))
|
|
393
|
+
"""
|
|
394
|
+
index = [0]
|
|
395
|
+
for R, _ in reversed(self._intermediate_rings):
|
|
396
|
+
index.append(index[-1] + len(R.gens()))
|
|
397
|
+
newpol = [{} for _ in self._intermediate_rings]
|
|
398
|
+
expo = sorted(p.exponents(), key=lambda e: tuple(reversed(e)))
|
|
399
|
+
for i in range(len(expo)):
|
|
400
|
+
cur_exp = expo[i]
|
|
401
|
+
for l in range(len(self._intermediate_rings)):
|
|
402
|
+
R, univariate = self._intermediate_rings[-1 - l]
|
|
403
|
+
idx = index[l + 1]
|
|
404
|
+
sub_exp = (cur_exp[index[l]] if univariate
|
|
405
|
+
else cur_exp[index[l]:idx])
|
|
406
|
+
if l == 0:
|
|
407
|
+
newpol[l][sub_exp] = p[cur_exp]
|
|
408
|
+
else:
|
|
409
|
+
newpol[l][sub_exp] = newpol[l - 1]
|
|
410
|
+
newpol[l - 1] = {}
|
|
411
|
+
if (i == len(expo) - 1 or expo[i + 1][idx:] != cur_exp[idx:]):
|
|
412
|
+
newpol[l] = R(newpol[l], check=False)
|
|
413
|
+
else:
|
|
414
|
+
break
|
|
415
|
+
return R(newpol[-1], check=False)
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
class SpecializationMorphism(Morphism):
|
|
419
|
+
r"""
|
|
420
|
+
Morphisms to specialize parameters in (stacked) polynomial rings.
|
|
421
|
+
|
|
422
|
+
EXAMPLES::
|
|
423
|
+
|
|
424
|
+
sage: R.<c> = PolynomialRing(QQ)
|
|
425
|
+
sage: S.<x,y,z> = PolynomialRing(R)
|
|
426
|
+
sage: D = dict({c:1})
|
|
427
|
+
sage: from sage.rings.polynomial.flatten import SpecializationMorphism
|
|
428
|
+
sage: f = SpecializationMorphism(S, D)
|
|
429
|
+
sage: g = f(x^2 + c*y^2 - z^2); g
|
|
430
|
+
x^2 + y^2 - z^2
|
|
431
|
+
sage: g.parent()
|
|
432
|
+
Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
433
|
+
|
|
434
|
+
::
|
|
435
|
+
|
|
436
|
+
sage: R.<c> = PolynomialRing(QQ)
|
|
437
|
+
sage: S.<z> = PolynomialRing(R)
|
|
438
|
+
sage: from sage.rings.polynomial.flatten import SpecializationMorphism
|
|
439
|
+
sage: xi = SpecializationMorphism(S, {c:0}); xi
|
|
440
|
+
Specialization morphism:
|
|
441
|
+
From: Univariate Polynomial Ring in z
|
|
442
|
+
over Univariate Polynomial Ring in c over Rational Field
|
|
443
|
+
To: Univariate Polynomial Ring in z over Rational Field
|
|
444
|
+
sage: xi(z^2+c)
|
|
445
|
+
z^2
|
|
446
|
+
|
|
447
|
+
::
|
|
448
|
+
|
|
449
|
+
sage: R1.<u,v> = PolynomialRing(QQ)
|
|
450
|
+
sage: R2.<a,b,c> = PolynomialRing(R1)
|
|
451
|
+
sage: S.<x,y,z> = PolynomialRing(R2)
|
|
452
|
+
sage: D = dict({a:1, b:2, x:0, u:1})
|
|
453
|
+
sage: from sage.rings.polynomial.flatten import SpecializationMorphism
|
|
454
|
+
sage: xi = SpecializationMorphism(S, D); xi
|
|
455
|
+
Specialization morphism:
|
|
456
|
+
From: Multivariate Polynomial Ring in x, y, z
|
|
457
|
+
over Multivariate Polynomial Ring in a, b, c
|
|
458
|
+
over Multivariate Polynomial Ring in u, v over Rational Field
|
|
459
|
+
To: Multivariate Polynomial Ring in y, z over Univariate Polynomial Ring in c
|
|
460
|
+
over Univariate Polynomial Ring in v over Rational Field
|
|
461
|
+
sage: xi(a*(x*z+y^2)*u+b*v*u*(x*z+y^2)*y^2*c+c*y^2*z^2)
|
|
462
|
+
2*v*c*y^4 + c*y^2*z^2 + y^2
|
|
463
|
+
"""
|
|
464
|
+
|
|
465
|
+
def __init__(self, domain, D):
|
|
466
|
+
"""
|
|
467
|
+
The Python constructor.
|
|
468
|
+
|
|
469
|
+
EXAMPLES::
|
|
470
|
+
|
|
471
|
+
sage: S.<x,y> = PolynomialRing(QQ)
|
|
472
|
+
sage: D = dict({x:1})
|
|
473
|
+
sage: from sage.rings.polynomial.flatten import SpecializationMorphism
|
|
474
|
+
sage: phi = SpecializationMorphism(S, D); phi
|
|
475
|
+
Specialization morphism:
|
|
476
|
+
From: Multivariate Polynomial Ring in x, y over Rational Field
|
|
477
|
+
To: Univariate Polynomial Ring in y over Rational Field
|
|
478
|
+
sage: phi(x^2 + y^2)
|
|
479
|
+
y^2 + 1
|
|
480
|
+
|
|
481
|
+
::
|
|
482
|
+
|
|
483
|
+
sage: R.<a,b,c> = PolynomialRing(ZZ)
|
|
484
|
+
sage: S.<x,y,z> = PolynomialRing(R)
|
|
485
|
+
sage: from sage.rings.polynomial.flatten import SpecializationMorphism
|
|
486
|
+
sage: xi = SpecializationMorphism(S, {a:1/2})
|
|
487
|
+
Traceback (most recent call last):
|
|
488
|
+
...
|
|
489
|
+
TypeError: no conversion of this rational to integer
|
|
490
|
+
|
|
491
|
+
The following was fixed in :issue:`23811`::
|
|
492
|
+
|
|
493
|
+
sage: R.<c> = RR[]
|
|
494
|
+
sage: P.<z> = AffineSpace(R, 1)
|
|
495
|
+
sage: H = End(P)
|
|
496
|
+
sage: f = H([z^2 + c])
|
|
497
|
+
sage: f.specialization({c:1}) # needs sage.modules
|
|
498
|
+
Scheme endomorphism of
|
|
499
|
+
Affine Space of dimension 1 over Real Field with 53 bits of precision
|
|
500
|
+
Defn: Defined on coordinates by sending (z) to
|
|
501
|
+
(z^2 + 1.00000000000000)
|
|
502
|
+
"""
|
|
503
|
+
if not isinstance(domain, (PolynomialRing_generic, MPolynomialRing_base)):
|
|
504
|
+
raise TypeError("domain should be a polynomial ring")
|
|
505
|
+
|
|
506
|
+
# use only the generators that are in the stack somewhere,
|
|
507
|
+
# and ignore the rest
|
|
508
|
+
all_gens = domain.gens_dict_recursive()
|
|
509
|
+
new_D = {}
|
|
510
|
+
for gen in D:
|
|
511
|
+
if str(gen) in all_gens:
|
|
512
|
+
new_D[gen] = D[gen]
|
|
513
|
+
D = new_D
|
|
514
|
+
|
|
515
|
+
# _sub_specialization is a specialization morphism (recursive)
|
|
516
|
+
# which is applied to the base Fraction field, or None if it's
|
|
517
|
+
# any other base ring
|
|
518
|
+
|
|
519
|
+
self._sub_specialization = None
|
|
520
|
+
|
|
521
|
+
# We use this composition where "flat" is a flattened
|
|
522
|
+
# polynomial ring.
|
|
523
|
+
#
|
|
524
|
+
# phi D psi
|
|
525
|
+
# domain → flat → flat → R
|
|
526
|
+
# │ │ │
|
|
527
|
+
# └─────────┴───────────────┘
|
|
528
|
+
# _flattening_morph _eval_morph
|
|
529
|
+
# = phi = psi ∘ D
|
|
530
|
+
|
|
531
|
+
phi = FlatteningMorphism(domain)
|
|
532
|
+
flat = phi.codomain()
|
|
533
|
+
base = flat.base_ring()
|
|
534
|
+
|
|
535
|
+
# Change domain of D to "flat" and ensure that the values lie
|
|
536
|
+
# in the base ring.
|
|
537
|
+
D = {phi(k): base(D[k]) for k in D}
|
|
538
|
+
|
|
539
|
+
# Construct unflattened codomain R
|
|
540
|
+
new_vars = []
|
|
541
|
+
R = domain
|
|
542
|
+
while isinstance(R, (PolynomialRing_generic,
|
|
543
|
+
MPolynomialRing_base,
|
|
544
|
+
FractionField_generic)):
|
|
545
|
+
if isinstance(R, FractionField_generic):
|
|
546
|
+
# We've hit base_ring, so set _sub_specialization and exit the loop
|
|
547
|
+
field_over = R.base()
|
|
548
|
+
applicable_vars = {key: val for key, val in D.items()
|
|
549
|
+
if key not in flat.gens()}
|
|
550
|
+
# If there are any variables in D to set in _sub_specialization
|
|
551
|
+
if applicable_vars:
|
|
552
|
+
# Coerce the generators to be in the right ring
|
|
553
|
+
# This un-does changing the domain of D to be in the flat base ring
|
|
554
|
+
tmp = {}
|
|
555
|
+
for var, val in applicable_vars.items():
|
|
556
|
+
for gstr, gen in field_over.gens_dict_recursive().items():
|
|
557
|
+
if str(var) == gstr:
|
|
558
|
+
tmp[gen] = val
|
|
559
|
+
break
|
|
560
|
+
else:
|
|
561
|
+
# Should have been caught earlier
|
|
562
|
+
raise NameError("argument " + str(var) + " is not a generator anywhere in the polynomial tower")
|
|
563
|
+
applicable_vars = tmp
|
|
564
|
+
self._sub_specialization = FractionSpecializationMorphism(R, applicable_vars)
|
|
565
|
+
break
|
|
566
|
+
# We're still in the polynomials, so keep track of the tower
|
|
567
|
+
old = R.gens()
|
|
568
|
+
new = [t for t in old if t not in D]
|
|
569
|
+
force_multivariate = ((len(old) == 1) and isinstance(R, MPolynomialRing_base))
|
|
570
|
+
new_vars.append((new, force_multivariate, old))
|
|
571
|
+
R = R.base_ring()
|
|
572
|
+
|
|
573
|
+
if self._sub_specialization:
|
|
574
|
+
# The sub_specialization range will be different
|
|
575
|
+
# if it applied some variables from D
|
|
576
|
+
R = self._sub_specialization.codomain().fraction_field()
|
|
577
|
+
|
|
578
|
+
# Construct unflattening map psi (only defined on the variables
|
|
579
|
+
# of "flat" which are not involved in D)
|
|
580
|
+
psi = dict()
|
|
581
|
+
# Reconstruct the proper domain of this morphism
|
|
582
|
+
# based on the sub_specialization domains
|
|
583
|
+
new_domain = R
|
|
584
|
+
for new, force_multivariate, old in reversed(new_vars):
|
|
585
|
+
if self._sub_specialization:
|
|
586
|
+
if force_multivariate:
|
|
587
|
+
new_domain = PolynomialRing(new_domain, old, len(old))
|
|
588
|
+
else:
|
|
589
|
+
new_domain = PolynomialRing(new_domain, old)
|
|
590
|
+
if not new:
|
|
591
|
+
continue
|
|
592
|
+
var_names = [str(var) for var in new]
|
|
593
|
+
if force_multivariate:
|
|
594
|
+
R = PolynomialRing(R, var_names, len(var_names))
|
|
595
|
+
else:
|
|
596
|
+
R = PolynomialRing(R, var_names)
|
|
597
|
+
# Map variables in "new" to R
|
|
598
|
+
psi.update(zip([phi(w) for w in new], R.gens()))
|
|
599
|
+
|
|
600
|
+
# Fix domain of eval_morph
|
|
601
|
+
# (note: phi's domain is correct)
|
|
602
|
+
if self._sub_specialization:
|
|
603
|
+
phi_prime = FlatteningMorphism(new_domain)
|
|
604
|
+
flat_old = flat
|
|
605
|
+
flat = phi_prime.codomain()
|
|
606
|
+
base_prime = flat.base_ring()
|
|
607
|
+
D = {phi(k): base_prime(D[k]) for k in D}
|
|
608
|
+
else:
|
|
609
|
+
# The bottom of our tower has not changed
|
|
610
|
+
def flat_old(x):
|
|
611
|
+
return x
|
|
612
|
+
|
|
613
|
+
# Compose D with psi
|
|
614
|
+
vals = []
|
|
615
|
+
for t in flat.gens():
|
|
616
|
+
if t in D:
|
|
617
|
+
vals.append(R.coerce(D[t]))
|
|
618
|
+
else:
|
|
619
|
+
# Make sure keys are in the old domain
|
|
620
|
+
# or else they won't match exactly
|
|
621
|
+
vals.append(psi[flat_old(t)])
|
|
622
|
+
|
|
623
|
+
self._flattening_morph = phi
|
|
624
|
+
self._eval_morph = flat.hom(vals, R)
|
|
625
|
+
self._repr_type_str = 'Specialization'
|
|
626
|
+
Morphism.__init__(self, domain, R)
|
|
627
|
+
|
|
628
|
+
def _call_(self, p):
|
|
629
|
+
"""
|
|
630
|
+
Evaluate a specialization morphism.
|
|
631
|
+
|
|
632
|
+
EXAMPLES::
|
|
633
|
+
|
|
634
|
+
sage: R.<a,b,c> = PolynomialRing(ZZ)
|
|
635
|
+
sage: S.<x,y,z> = PolynomialRing(R)
|
|
636
|
+
sage: D = dict({a:1, b:2, c:3})
|
|
637
|
+
sage: from sage.rings.polynomial.flatten import SpecializationMorphism
|
|
638
|
+
sage: xi = SpecializationMorphism(S, D)
|
|
639
|
+
sage: xi(a*x + b*y + c*z)
|
|
640
|
+
x + 2*y + 3*z
|
|
641
|
+
"""
|
|
642
|
+
flat = self._flattening_morph(p)
|
|
643
|
+
if self._sub_specialization is not None:
|
|
644
|
+
# The base_ring should be a fraction field, so
|
|
645
|
+
# apply _sub_specialization to each coefficient
|
|
646
|
+
# in the flattened polynomial
|
|
647
|
+
tmp = {}
|
|
648
|
+
for exponent, coefficient in flat.monomial_coefficients().items():
|
|
649
|
+
# Fix the type of exponent from (a,) to a
|
|
650
|
+
# (necessary for R(tmp) later)
|
|
651
|
+
if isinstance(exponent, ETuple) and len(exponent) == 1:
|
|
652
|
+
exponent = exponent[0]
|
|
653
|
+
# Coefficient should be a fraction
|
|
654
|
+
tmp[exponent] = self._sub_specialization._call_(coefficient)
|
|
655
|
+
# tmp's parent should be the same construction as flat
|
|
656
|
+
# but over _sub_specialization's codomain
|
|
657
|
+
ring_constructor = flat.parent().construction()[0]
|
|
658
|
+
fraction_type = self._sub_specialization.codomain()
|
|
659
|
+
R = ring_constructor(fraction_type)
|
|
660
|
+
flat = R(tmp)
|
|
661
|
+
return self._eval_morph(flat)
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
class FractionSpecializationMorphism(Morphism):
|
|
665
|
+
"""
|
|
666
|
+
A specialization morphism for fraction fields over (stacked) polynomial rings
|
|
667
|
+
"""
|
|
668
|
+
def __init__(self, domain, D):
|
|
669
|
+
"""
|
|
670
|
+
Initialize the morphism with a domain and dictionary of specializations.
|
|
671
|
+
|
|
672
|
+
EXAMPLES::
|
|
673
|
+
|
|
674
|
+
sage: R.<a,c> = QQ[]
|
|
675
|
+
sage: S.<x,y> = R[]
|
|
676
|
+
sage: from sage.rings.polynomial.flatten import FractionSpecializationMorphism
|
|
677
|
+
sage: phi = FractionSpecializationMorphism(Frac(S), {c:3})
|
|
678
|
+
sage: phi
|
|
679
|
+
Fraction Specialization morphism:
|
|
680
|
+
From: Fraction Field of Multivariate Polynomial Ring in x, y
|
|
681
|
+
over Multivariate Polynomial Ring in a, c over Rational Field
|
|
682
|
+
To: Fraction Field of Multivariate Polynomial Ring in x, y
|
|
683
|
+
over Univariate Polynomial Ring in a over Rational Field
|
|
684
|
+
"""
|
|
685
|
+
if not isinstance(domain, FractionField_generic):
|
|
686
|
+
raise TypeError("domain must be a fraction field")
|
|
687
|
+
self._specialization = SpecializationMorphism(domain.base(), D)
|
|
688
|
+
self._repr_type_str = 'Fraction Specialization'
|
|
689
|
+
Morphism.__init__(self, domain, self._specialization.codomain().fraction_field())
|
|
690
|
+
|
|
691
|
+
def _call_(self, p):
|
|
692
|
+
"""
|
|
693
|
+
Evaluate a fraction specialization morphism.
|
|
694
|
+
|
|
695
|
+
EXAMPLES::
|
|
696
|
+
|
|
697
|
+
sage: R.<a,b,c> = QQ[]
|
|
698
|
+
sage: S.<x,y,z> = R[]
|
|
699
|
+
sage: from sage.rings.polynomial.flatten import FractionSpecializationMorphism
|
|
700
|
+
sage: phi = FractionSpecializationMorphism(Frac(S), {a:3, b:2, c:-2})
|
|
701
|
+
sage: spec = phi((a*x + b*y) / (c*z))
|
|
702
|
+
sage: spec
|
|
703
|
+
(3*x + 2*y)/(-2*z)
|
|
704
|
+
sage: spec.parent()
|
|
705
|
+
Fraction Field of Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
706
|
+
"""
|
|
707
|
+
if not isinstance(p, FractionFieldElement):
|
|
708
|
+
raise TypeError("p must be a fraction field element")
|
|
709
|
+
numerator = self._specialization._call_(p.numerator())
|
|
710
|
+
denominator = self._specialization._call_(p.denominator())
|
|
711
|
+
return numerator / denominator
|