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
|
Binary file
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Ring homomorphisms from a polynomial ring to another ring
|
|
4
|
+
|
|
5
|
+
This module currently implements the canonical ring homomorphism from
|
|
6
|
+
`A[x]` to `B[x]` induced by a ring homomorphism from `A` to `B`.
|
|
7
|
+
|
|
8
|
+
.. TODO::
|
|
9
|
+
|
|
10
|
+
Implement homomorphisms from `A[x]` to an arbitrary ring `R`,
|
|
11
|
+
given by a ring homomorphism from `A` to `R` and the image of `x`
|
|
12
|
+
in `R`.
|
|
13
|
+
|
|
14
|
+
AUTHORS:
|
|
15
|
+
|
|
16
|
+
- Peter Bruin (March 2014): initial version
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from sage.rings.morphism cimport RingHomomorphism_from_base
|
|
20
|
+
from sage.structure.element cimport Element
|
|
21
|
+
|
|
22
|
+
cdef class PolynomialRingHomomorphism_from_base(RingHomomorphism_from_base):
|
|
23
|
+
"""
|
|
24
|
+
The canonical ring homomorphism from `R[x]` to `S[x]` induced by a
|
|
25
|
+
ring homomorphism from `R` to `S`.
|
|
26
|
+
|
|
27
|
+
EXAMPLES::
|
|
28
|
+
|
|
29
|
+
sage: QQ['x'].coerce_map_from(ZZ['x'])
|
|
30
|
+
Ring morphism:
|
|
31
|
+
From: Univariate Polynomial Ring in x over Integer Ring
|
|
32
|
+
To: Univariate Polynomial Ring in x over Rational Field
|
|
33
|
+
Defn: Induced from base ring by
|
|
34
|
+
Natural morphism:
|
|
35
|
+
From: Integer Ring
|
|
36
|
+
To: Rational Field
|
|
37
|
+
"""
|
|
38
|
+
cpdef Element _call_(self, x):
|
|
39
|
+
"""
|
|
40
|
+
Evaluate the homomorphism ``self`` at ``x``.
|
|
41
|
+
|
|
42
|
+
TESTS::
|
|
43
|
+
|
|
44
|
+
sage: from sage.rings.polynomial.polynomial_ring_homomorphism import PolynomialRingHomomorphism_from_base
|
|
45
|
+
sage: R.<x> = ZZ[]
|
|
46
|
+
sage: S = QQ['x']
|
|
47
|
+
sage: f = ZZ.hom(QQ)
|
|
48
|
+
sage: F = PolynomialRingHomomorphism_from_base(R.Hom(S), f)
|
|
49
|
+
sage: F(2*x)
|
|
50
|
+
2*x
|
|
51
|
+
|
|
52
|
+
sage: A = PolynomialRing(QQ, 'x', sparse=True)
|
|
53
|
+
sage: B = PolynomialRing(RR, 'x', sparse=True)
|
|
54
|
+
sage: g = QQ.hom(RR)
|
|
55
|
+
sage: G = PolynomialRingHomomorphism_from_base(A.Hom(B), g)
|
|
56
|
+
sage: G(A.gen()^1000000)
|
|
57
|
+
1.0...*x^1000000
|
|
58
|
+
"""
|
|
59
|
+
P = self.codomain()
|
|
60
|
+
f = self.underlying_map()
|
|
61
|
+
if P.is_sparse():
|
|
62
|
+
return P({a: f(b) for a, b in x.monomial_coefficients().items()})
|
|
63
|
+
else:
|
|
64
|
+
return P([f(b) for b in x])
|
|
65
|
+
|
|
66
|
+
cpdef Element _call_with_args(self, x, args=(), kwds={}):
|
|
67
|
+
"""
|
|
68
|
+
Evaluate ``self`` at ``x`` with additional (keyword) arguments.
|
|
69
|
+
|
|
70
|
+
TESTS::
|
|
71
|
+
|
|
72
|
+
sage: from sage.rings.polynomial.polynomial_ring_homomorphism import PolynomialRingHomomorphism_from_base
|
|
73
|
+
sage: R.<x> = ZZ[]
|
|
74
|
+
sage: S = GF(5)['x']
|
|
75
|
+
sage: f = ZZ.hom(GF(5))
|
|
76
|
+
sage: F = PolynomialRingHomomorphism_from_base(R.Hom(S), f)
|
|
77
|
+
sage: F(2 * x, check=True)
|
|
78
|
+
2*x
|
|
79
|
+
|
|
80
|
+
sage: # needs sage.rings.finite_rings
|
|
81
|
+
sage: k = GF(49, 'z')
|
|
82
|
+
sage: A = PolynomialRing(GF(7), 'x', sparse=True)
|
|
83
|
+
sage: B = PolynomialRing(k, 'x', sparse=True)
|
|
84
|
+
sage: g = GF(7).hom(k)
|
|
85
|
+
sage: G = PolynomialRingHomomorphism_from_base(A.Hom(B), g)
|
|
86
|
+
sage: G(A.gen()^1000000, True, construct=False)
|
|
87
|
+
x^1000000
|
|
88
|
+
"""
|
|
89
|
+
P = self.codomain()
|
|
90
|
+
f = self.underlying_map()
|
|
91
|
+
if P.is_sparse():
|
|
92
|
+
return P({a: f(b) for a, b in x.monomial_coefficients().items()},
|
|
93
|
+
*args, **kwds)
|
|
94
|
+
else:
|
|
95
|
+
return P([f(b) for b in x], *args, **kwds)
|
|
96
|
+
|
|
97
|
+
def is_injective(self):
|
|
98
|
+
r"""
|
|
99
|
+
Return whether this morphism is injective.
|
|
100
|
+
|
|
101
|
+
EXAMPLES::
|
|
102
|
+
|
|
103
|
+
sage: R.<x> = ZZ[]
|
|
104
|
+
sage: S.<x> = QQ[]
|
|
105
|
+
sage: R.hom(S).is_injective()
|
|
106
|
+
True
|
|
107
|
+
"""
|
|
108
|
+
return self.underlying_map().is_injective()
|
|
109
|
+
|
|
110
|
+
def is_surjective(self):
|
|
111
|
+
r"""
|
|
112
|
+
Return whether this morphism is surjective.
|
|
113
|
+
|
|
114
|
+
EXAMPLES::
|
|
115
|
+
|
|
116
|
+
sage: R.<x> = ZZ[]
|
|
117
|
+
sage: S.<x> = Zmod(2)[]
|
|
118
|
+
sage: R.hom(S).is_surjective()
|
|
119
|
+
True
|
|
120
|
+
"""
|
|
121
|
+
return self.underlying_map().is_surjective()
|
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Polynomial Interfaces to Singular
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Martin Albrecht <malb@informatik.uni-bremen.de> (2006-04-21)
|
|
8
|
+
- Robert Bradshaw: Re-factor to avoid multiple inheritance vs. Cython (2007-09)
|
|
9
|
+
- Syed Ahmad Lavasani: Added function field to _singular_init_ (2011-12-16);
|
|
10
|
+
Added non-prime finite fields to _singular_init_ (2012-1-22)
|
|
11
|
+
|
|
12
|
+
TESTS::
|
|
13
|
+
|
|
14
|
+
sage: R = PolynomialRing(GF(2**8,'a'), 10, 'x', order='invlex') # needs sage.rings.finite_rings
|
|
15
|
+
sage: R == loads(dumps(R)) # needs sage.rings.finite_rings
|
|
16
|
+
True
|
|
17
|
+
sage: P.<a,b> = PolynomialRing(GF(7), 2)
|
|
18
|
+
sage: f = (a^3 + 2*b^2*a)^7; f
|
|
19
|
+
a^21 + 2*a^7*b^14
|
|
20
|
+
"""
|
|
21
|
+
#################################################################
|
|
22
|
+
#
|
|
23
|
+
# Sage: Open Source Mathematical Software
|
|
24
|
+
#
|
|
25
|
+
# Copyright (C) 2006 William Stein <wstein@gmail.com>
|
|
26
|
+
#
|
|
27
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
28
|
+
#
|
|
29
|
+
# This code is distributed in the hope that it will be useful,
|
|
30
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
31
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
32
|
+
# General Public License for more details.
|
|
33
|
+
#
|
|
34
|
+
# The full text of the GPL is available at:
|
|
35
|
+
#
|
|
36
|
+
# http://www.gnu.org/licenses/
|
|
37
|
+
#
|
|
38
|
+
######################################################################
|
|
39
|
+
|
|
40
|
+
import sage.rings.fraction_field
|
|
41
|
+
import sage.rings.abc
|
|
42
|
+
|
|
43
|
+
from sage.rings.rational_field import RationalField
|
|
44
|
+
from sage.rings.function_field.function_field_rational import RationalFunctionField
|
|
45
|
+
from sage.rings.finite_rings.finite_field_base import FiniteField
|
|
46
|
+
from sage.rings.integer_ring import ZZ
|
|
47
|
+
from sage.rings.number_field.number_field_base import NumberField
|
|
48
|
+
|
|
49
|
+
import sage.rings.finite_rings.finite_field_constructor
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _do_singular_init_(singular, base_ring, char, _vars, order):
|
|
53
|
+
r"""
|
|
54
|
+
Implementation of :meth:`PolynomialRing_singular_repr._singular_init_`.
|
|
55
|
+
|
|
56
|
+
This code was extracted from :class:`PolynomialRing_singular_repr`
|
|
57
|
+
to make it callable from other places, in particular
|
|
58
|
+
:class:`MPolynomialRing_libsingular`.
|
|
59
|
+
|
|
60
|
+
TESTS::
|
|
61
|
+
|
|
62
|
+
sage: from sage.rings.polynomial.polynomial_singular_interface import _do_singular_init_
|
|
63
|
+
sage: _do_singular_init_(singular, ZZ, 0, 'X', 'dp') # needs sage.libs.singular
|
|
64
|
+
(polynomial ring, over a domain, global ordering
|
|
65
|
+
// coefficients: ZZ...
|
|
66
|
+
// number of vars : 1
|
|
67
|
+
// block 1 : ordering dp
|
|
68
|
+
// : names X
|
|
69
|
+
// block 2 : ordering C,
|
|
70
|
+
None)
|
|
71
|
+
"""
|
|
72
|
+
if singular is None:
|
|
73
|
+
from sage.interfaces.singular import singular
|
|
74
|
+
|
|
75
|
+
make_ring = lambda s: singular.ring(s, _vars, order=order)
|
|
76
|
+
|
|
77
|
+
if base_ring is ZZ:
|
|
78
|
+
return make_ring("(ZZ)"), None
|
|
79
|
+
|
|
80
|
+
if isinstance(base_ring, sage.rings.rational_field.RationalField):
|
|
81
|
+
return make_ring("(QQ)"), None
|
|
82
|
+
|
|
83
|
+
elif isinstance(base_ring, sage.rings.abc.RealField):
|
|
84
|
+
# singular converts to bits from base_10 in mpr_complex.cc by:
|
|
85
|
+
# size_t bits = 1 + (size_t) ((float)digits * 3.5);
|
|
86
|
+
precision = base_ring.precision()
|
|
87
|
+
digits = (2*precision + 4) // 7
|
|
88
|
+
return make_ring(f"(real,{digits},0)"), None
|
|
89
|
+
|
|
90
|
+
elif isinstance(base_ring, sage.rings.abc.ComplexField):
|
|
91
|
+
# singular converts to bits from base_10 in mpr_complex.cc by:
|
|
92
|
+
# size_t bits = 1 + (size_t) ((float)digits * 3.5);
|
|
93
|
+
precision = base_ring.precision()
|
|
94
|
+
digits = (2*precision + 4) // 7
|
|
95
|
+
return make_ring(f"(complex,{digits},0,I)"), None
|
|
96
|
+
|
|
97
|
+
elif isinstance(base_ring, sage.rings.abc.RealDoubleField):
|
|
98
|
+
# singular converts to bits from base_10 in mpr_complex.cc by:
|
|
99
|
+
# size_t bits = 1 + (size_t) ((float)digits * 3.5);
|
|
100
|
+
return make_ring("(real,15,0)"), None
|
|
101
|
+
|
|
102
|
+
elif isinstance(base_ring, sage.rings.abc.ComplexDoubleField):
|
|
103
|
+
# singular converts to bits from base_10 in mpr_complex.cc by:
|
|
104
|
+
# size_t bits = 1 + (size_t) ((float)digits * 3.5);
|
|
105
|
+
return make_ring("(complex,15,0,I)"), None
|
|
106
|
+
|
|
107
|
+
elif isinstance(base_ring, sage.rings.abc.IntegerModRing):
|
|
108
|
+
char = base_ring.characteristic()
|
|
109
|
+
if isinstance(base_ring, FiniteField) and char <= 2147483647:
|
|
110
|
+
return make_ring(str(char)), None
|
|
111
|
+
if char.is_power_of(2):
|
|
112
|
+
return make_ring(f"(integer,2,{char.nbits()-1})"), None
|
|
113
|
+
return make_ring(f"(integer,{char})"), None
|
|
114
|
+
|
|
115
|
+
elif isinstance(base_ring, FiniteField):
|
|
116
|
+
# not the prime field!
|
|
117
|
+
gen = str(base_ring.gen())
|
|
118
|
+
R = make_ring(f"({char},{gen})")
|
|
119
|
+
|
|
120
|
+
minpoly = str(base_ring.modulus()).replace("x",gen).replace(" ","")
|
|
121
|
+
if singular.eval('minpoly') != f"({minpoly})":
|
|
122
|
+
singular.eval(f"minpoly={minpoly}")
|
|
123
|
+
minpoly = singular.eval('minpoly')[1:-1]
|
|
124
|
+
|
|
125
|
+
return R, minpoly
|
|
126
|
+
|
|
127
|
+
elif isinstance(base_ring, NumberField) and base_ring.is_absolute():
|
|
128
|
+
# not the rationals!
|
|
129
|
+
gen = str(base_ring.gen())
|
|
130
|
+
poly = base_ring.polynomial()
|
|
131
|
+
poly_gen = str(poly.parent().gen())
|
|
132
|
+
poly_str = str(poly).replace(poly_gen,gen)
|
|
133
|
+
R = make_ring(f"({char},{gen})")
|
|
134
|
+
|
|
135
|
+
minpoly = poly_str.replace(" ","")
|
|
136
|
+
if singular.eval('minpoly') != f"({minpoly})":
|
|
137
|
+
singular.eval(f"minpoly={minpoly}")
|
|
138
|
+
minpoly = singular.eval('minpoly')[1:-1]
|
|
139
|
+
|
|
140
|
+
return R, minpoly
|
|
141
|
+
|
|
142
|
+
elif isinstance(base_ring, sage.rings.fraction_field.FractionField_generic):
|
|
143
|
+
if base_ring.ngens() == 1:
|
|
144
|
+
gens = str(base_ring.gen())
|
|
145
|
+
else:
|
|
146
|
+
gens = str(base_ring.gens())
|
|
147
|
+
|
|
148
|
+
B = base_ring.base_ring()
|
|
149
|
+
base_char = base_ring.characteristic()
|
|
150
|
+
|
|
151
|
+
if B.is_prime_field() or B is ZZ:
|
|
152
|
+
return make_ring(f"({base_char},{gens})"), None
|
|
153
|
+
|
|
154
|
+
if isinstance(B, FiniteField) and B.characteristic() <= 2147483647:
|
|
155
|
+
ext_gen = str(B.gen())
|
|
156
|
+
_vars = '(' + ext_gen + ', ' + _vars[1:]
|
|
157
|
+
|
|
158
|
+
R = make_ring(f"({base_char},{gens})")
|
|
159
|
+
|
|
160
|
+
base_ring.__minpoly = (str(B.modulus()).replace("x",ext_gen)).replace(" ","")
|
|
161
|
+
singular.eval('setring ' + R._name)
|
|
162
|
+
|
|
163
|
+
from sage.misc.stopgap import stopgap
|
|
164
|
+
stopgap("Denominators of fraction field elements are sometimes dropped without warning.", 17696)
|
|
165
|
+
|
|
166
|
+
return singular(f"std(ideal({base_ring.__minpoly}))", type='qring'), None
|
|
167
|
+
|
|
168
|
+
elif isinstance(base_ring, RationalFunctionField) \
|
|
169
|
+
and base_ring.constant_field().is_prime_field():
|
|
170
|
+
gen = str(base_ring.gen())
|
|
171
|
+
return make_ring(f"({base_ring.characteristic()},{gen})"), None
|
|
172
|
+
|
|
173
|
+
raise TypeError("no conversion to a Singular ring defined")
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class PolynomialRing_singular_repr:
|
|
177
|
+
"""
|
|
178
|
+
Implement methods to convert polynomial rings to Singular.
|
|
179
|
+
|
|
180
|
+
This class is a base class for all univariate and multivariate
|
|
181
|
+
polynomial rings which support conversion from and to Singular
|
|
182
|
+
rings.
|
|
183
|
+
"""
|
|
184
|
+
def _singular_(self, singular=None):
|
|
185
|
+
r"""
|
|
186
|
+
Return a Singular ring for this polynomial ring.
|
|
187
|
+
|
|
188
|
+
Currently `\QQ`, `{\rm GF}(p), {\rm GF}(p^n)`, `\CC`, `\RR`, `\ZZ` and
|
|
189
|
+
`\ZZ/n\ZZ` are supported.
|
|
190
|
+
|
|
191
|
+
INPUT:
|
|
192
|
+
|
|
193
|
+
- ``singular`` -- Singular instance
|
|
194
|
+
|
|
195
|
+
OUTPUT: Singular ring matching this ring
|
|
196
|
+
|
|
197
|
+
EXAMPLES::
|
|
198
|
+
|
|
199
|
+
sage: R.<x,y> = PolynomialRing(CC) # needs sage.rings.real_mpfr
|
|
200
|
+
sage: singular(R) # needs sage.libs.singular sage.rings.real_mpfr
|
|
201
|
+
polynomial ring, over a field, global ordering
|
|
202
|
+
// coefficients: real[I](complex:15 digits, additional 0 digits)/(I^2+1)...
|
|
203
|
+
// number of vars : 2
|
|
204
|
+
// block 1 : ordering dp
|
|
205
|
+
// : names x y
|
|
206
|
+
// block 2 : ordering C
|
|
207
|
+
|
|
208
|
+
sage: R.<x,y> = PolynomialRing(RealField(100)) # needs sage.rings.real_mpfr
|
|
209
|
+
sage: singular(R) # needs sage.libs.singular sage.rings.real_mpfr
|
|
210
|
+
polynomial ring, over a field, global ordering
|
|
211
|
+
// coefficients: Float()...
|
|
212
|
+
// number of vars : 2
|
|
213
|
+
// block 1 : ordering dp
|
|
214
|
+
// : names x y
|
|
215
|
+
// block 2 : ordering C
|
|
216
|
+
|
|
217
|
+
sage: w = polygen(ZZ, 'w')
|
|
218
|
+
sage: R.<x> = PolynomialRing(NumberField(w^2 + 1, 's')) # needs sage.rings.number_field
|
|
219
|
+
sage: singular(R) # needs sage.libs.singular sage.rings.number_field
|
|
220
|
+
polynomial ring, over a field, global ordering
|
|
221
|
+
// coefficients: QQ[s]/(s^2+1)...
|
|
222
|
+
// number of vars : 1
|
|
223
|
+
// block 1 : ordering lp
|
|
224
|
+
// : names x
|
|
225
|
+
// block 2 : ordering C
|
|
226
|
+
|
|
227
|
+
sage: R = PolynomialRing(GF(127), 'x', implementation='singular') # needs sage.libs.singular
|
|
228
|
+
sage: singular(R) # needs sage.libs.singular
|
|
229
|
+
polynomial ring, over a field, global ordering
|
|
230
|
+
// coefficients: ZZ/127...
|
|
231
|
+
// number of vars : 1
|
|
232
|
+
// block 1 : ordering dp
|
|
233
|
+
// : names x
|
|
234
|
+
// block 2 : ordering C
|
|
235
|
+
|
|
236
|
+
sage: R = PolynomialRing(QQ, 'x', implementation='singular') # needs sage.libs.singular
|
|
237
|
+
sage: singular(R) # needs sage.libs.singular
|
|
238
|
+
polynomial ring, over a field, global ordering
|
|
239
|
+
// coefficients: QQ...
|
|
240
|
+
// number of vars : 1
|
|
241
|
+
// block 1 : ordering dp
|
|
242
|
+
// : names x
|
|
243
|
+
// block 2 : ordering C
|
|
244
|
+
|
|
245
|
+
sage: R = PolynomialRing(QQ,'x')
|
|
246
|
+
sage: singular(R) # needs sage.libs.singular
|
|
247
|
+
polynomial ring, over a field, global ordering
|
|
248
|
+
// coefficients: QQ...
|
|
249
|
+
// number of vars : 1
|
|
250
|
+
// block 1 : ordering lp
|
|
251
|
+
// : names x
|
|
252
|
+
// block 2 : ordering C
|
|
253
|
+
|
|
254
|
+
sage: R = PolynomialRing(GF(127), 'x')
|
|
255
|
+
sage: singular(R) # needs sage.libs.singular
|
|
256
|
+
polynomial ring, over a field, global ordering
|
|
257
|
+
// coefficients: ZZ/127...
|
|
258
|
+
// number of vars : 1
|
|
259
|
+
// block 1 : ordering lp
|
|
260
|
+
// : names x
|
|
261
|
+
// block 2 : ordering C
|
|
262
|
+
|
|
263
|
+
sage: R = Frac(ZZ['a,b'])['x,y'] # needs sage.libs.singular
|
|
264
|
+
sage: singular(R) # needs sage.libs.singular
|
|
265
|
+
polynomial ring, over a field, global ordering
|
|
266
|
+
// coefficients: QQ(a, b)...
|
|
267
|
+
// number of vars : 2
|
|
268
|
+
// block 1 : ordering dp
|
|
269
|
+
// : names x y
|
|
270
|
+
// block 2 : ordering C
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
sage: R = IntegerModRing(1024)['x,y']
|
|
274
|
+
sage: singular(R) # needs sage.libs.singular
|
|
275
|
+
polynomial ring, over a ring (with zero-divisors), global ordering
|
|
276
|
+
// coefficients: ZZ/(2^10)...
|
|
277
|
+
// number of vars : 2
|
|
278
|
+
// block 1 : ordering dp
|
|
279
|
+
// : names x y
|
|
280
|
+
// block 2 : ordering C
|
|
281
|
+
|
|
282
|
+
sage: R = IntegerModRing(15)['x,y']
|
|
283
|
+
sage: singular(R) # needs sage.libs.singular
|
|
284
|
+
polynomial ring, over a ring (with zero-divisors), global ordering
|
|
285
|
+
// coefficients: ZZ/(15)...
|
|
286
|
+
// number of vars : 2
|
|
287
|
+
// block 1 : ordering dp
|
|
288
|
+
// : names x y
|
|
289
|
+
// block 2 : ordering C
|
|
290
|
+
|
|
291
|
+
sage: R = ZZ['x,y']
|
|
292
|
+
sage: singular(R) # needs sage.libs.singular
|
|
293
|
+
polynomial ring, over a domain, global ordering
|
|
294
|
+
// coefficients: ZZ...
|
|
295
|
+
// number of vars : 2
|
|
296
|
+
// block 1 : ordering dp
|
|
297
|
+
// : names x y
|
|
298
|
+
// block 2 : ordering C
|
|
299
|
+
|
|
300
|
+
sage: R = ZZ['x']
|
|
301
|
+
sage: singular(R) # needs sage.libs.singular
|
|
302
|
+
polynomial ring, over a domain, global ordering
|
|
303
|
+
// coefficients: ZZ...
|
|
304
|
+
// number of vars : 1
|
|
305
|
+
// block 1 : ordering lp
|
|
306
|
+
// : names x
|
|
307
|
+
// block 2 : ordering C
|
|
308
|
+
|
|
309
|
+
sage: # needs sage.rings.finite_rings
|
|
310
|
+
sage: k.<a> = FiniteField(25)
|
|
311
|
+
sage: R = k['x']
|
|
312
|
+
sage: K = R.fraction_field()
|
|
313
|
+
sage: S = K['y']
|
|
314
|
+
sage: singular(S) # needs sage.libs.singular
|
|
315
|
+
polynomial ring, over a field, global ordering
|
|
316
|
+
// coefficients: ZZ/5(x)...
|
|
317
|
+
// number of vars : 2
|
|
318
|
+
// block 1 : ordering lp
|
|
319
|
+
// : names a y
|
|
320
|
+
// block 2 : ordering C
|
|
321
|
+
// quotient ring from ideal
|
|
322
|
+
_[1]=a2-a+2
|
|
323
|
+
|
|
324
|
+
.. warning::
|
|
325
|
+
|
|
326
|
+
- If the base ring is a finite extension field or a number field
|
|
327
|
+
the ring will not only be returned but also be set as the current
|
|
328
|
+
ring in Singular.
|
|
329
|
+
- Singular represents precision of floating point numbers base 10
|
|
330
|
+
while Sage represents floating point precision base 2.
|
|
331
|
+
"""
|
|
332
|
+
if singular is None:
|
|
333
|
+
from sage.interfaces.singular import singular
|
|
334
|
+
try:
|
|
335
|
+
R = self.__singular
|
|
336
|
+
if singular is not None and R.parent() is not singular:
|
|
337
|
+
raise ValueError
|
|
338
|
+
elif singular is None:
|
|
339
|
+
from sage.interfaces.singular import singular
|
|
340
|
+
R._check_valid()
|
|
341
|
+
if self.base_ring() is ZZ or self.base_ring().is_prime_field():
|
|
342
|
+
return R
|
|
343
|
+
if isinstance(self.base_ring(), FiniteField) or \
|
|
344
|
+
(isinstance(self.base_ring(), NumberField) and self.base_ring().is_absolute()):
|
|
345
|
+
R.set_ring() # sorry for that, but needed for minpoly
|
|
346
|
+
if singular.eval('minpoly') != f"({self.__minpoly})":
|
|
347
|
+
singular.eval(f"minpoly={self.__minpoly}")
|
|
348
|
+
self.__minpoly = singular.eval('minpoly')[1:-1]
|
|
349
|
+
return R
|
|
350
|
+
except (AttributeError, ValueError):
|
|
351
|
+
return self._singular_init_(singular)
|
|
352
|
+
|
|
353
|
+
def _singular_init_(self, singular=None):
|
|
354
|
+
"""
|
|
355
|
+
Return a newly created Singular ring matching this ring.
|
|
356
|
+
|
|
357
|
+
EXAMPLES::
|
|
358
|
+
|
|
359
|
+
sage: PolynomialRing(QQ,'u_ba')._singular_init_() # needs sage.libs.singular
|
|
360
|
+
polynomial ring, over a field, global ordering
|
|
361
|
+
// coefficients: QQ...
|
|
362
|
+
// number of vars : 1
|
|
363
|
+
// block 1 : ordering lp
|
|
364
|
+
// : names u_ba
|
|
365
|
+
// block 2 : ordering C
|
|
366
|
+
"""
|
|
367
|
+
if not can_convert_to_singular(self):
|
|
368
|
+
raise TypeError("no conversion of this ring to a Singular ring defined")
|
|
369
|
+
|
|
370
|
+
if self.ngens() == 1:
|
|
371
|
+
_vars = f'({self.gen()})'
|
|
372
|
+
if "*" in _vars: # 1.000...000*x
|
|
373
|
+
_vars = _vars.split("*")[1]
|
|
374
|
+
order = 'lp'
|
|
375
|
+
else:
|
|
376
|
+
_vars = str(self.gens())
|
|
377
|
+
order = self.term_order().singular_str()
|
|
378
|
+
|
|
379
|
+
if singular is None:
|
|
380
|
+
from sage.interfaces.singular import singular
|
|
381
|
+
|
|
382
|
+
self.__singular, self.__minpoly = _do_singular_init_(singular, self.base_ring(), self.characteristic(), _vars, order)
|
|
383
|
+
|
|
384
|
+
return self.__singular
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
def can_convert_to_singular(R):
|
|
388
|
+
"""
|
|
389
|
+
Return ``True`` if this ring's base field or ring can be
|
|
390
|
+
represented in Singular, and the polynomial ring has at
|
|
391
|
+
least one generator.
|
|
392
|
+
|
|
393
|
+
The following base rings are supported: finite fields,
|
|
394
|
+
rationals, number fields, and real and complex fields.
|
|
395
|
+
|
|
396
|
+
EXAMPLES::
|
|
397
|
+
|
|
398
|
+
sage: from sage.rings.polynomial.polynomial_singular_interface import can_convert_to_singular
|
|
399
|
+
sage: can_convert_to_singular(PolynomialRing(QQ, names=['x']))
|
|
400
|
+
True
|
|
401
|
+
sage: can_convert_to_singular(PolynomialRing(ZZ, names=['x']))
|
|
402
|
+
True
|
|
403
|
+
|
|
404
|
+
sage: can_convert_to_singular(PolynomialRing(QQ, names=[]))
|
|
405
|
+
False
|
|
406
|
+
|
|
407
|
+
TESTS:
|
|
408
|
+
|
|
409
|
+
Avoid non absolute number fields (see :issue:`23535`)::
|
|
410
|
+
|
|
411
|
+
sage: x = polygen(ZZ, 'x')
|
|
412
|
+
sage: K.<a,b> = NumberField([x^2 - 2, x^2 - 5]) # needs sage.rings.number_field
|
|
413
|
+
sage: can_convert_to_singular(K['s,t']) # needs sage.rings.number_field
|
|
414
|
+
False
|
|
415
|
+
|
|
416
|
+
Check for :issue:`33319`::
|
|
417
|
+
|
|
418
|
+
sage: # needs sage.rings.finite_rings
|
|
419
|
+
sage: R.<x,y> = GF((2^31-1)^3)[]
|
|
420
|
+
sage: R._has_singular
|
|
421
|
+
True
|
|
422
|
+
sage: R.<x,y> = GF((2^31+11)^2)[]
|
|
423
|
+
sage: R._has_singular
|
|
424
|
+
False
|
|
425
|
+
sage: R.<x,y> = GF(10^20 - 11)[]
|
|
426
|
+
sage: R._has_singular
|
|
427
|
+
True
|
|
428
|
+
|
|
429
|
+
sage: R.<x,y> = Zmod(10^20 + 1)[]
|
|
430
|
+
sage: R._has_singular
|
|
431
|
+
True
|
|
432
|
+
|
|
433
|
+
Check that :issue:`39106` is fixed::
|
|
434
|
+
|
|
435
|
+
sage: # needs lrcalc_python sage.combinat sage.modules
|
|
436
|
+
sage: s = SymmetricFunctions(QQ).s()
|
|
437
|
+
sage: R.<x> = PolynomialRing(s.fraction_field())
|
|
438
|
+
sage: can_convert_to_singular(R)
|
|
439
|
+
False
|
|
440
|
+
sage: R.<x, y> = PolynomialRing(s.fraction_field())
|
|
441
|
+
sage: can_convert_to_singular(R)
|
|
442
|
+
False
|
|
443
|
+
"""
|
|
444
|
+
from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_base
|
|
445
|
+
from sage.rings.polynomial.polynomial_ring import PolynomialRing_general
|
|
446
|
+
|
|
447
|
+
if R.ngens() == 0:
|
|
448
|
+
return False
|
|
449
|
+
|
|
450
|
+
base_ring = R.base_ring()
|
|
451
|
+
if (base_ring is ZZ
|
|
452
|
+
or isinstance(base_ring, (RationalField,
|
|
453
|
+
sage.rings.abc.IntegerModRing,
|
|
454
|
+
sage.rings.abc.RealField, sage.rings.abc.ComplexField,
|
|
455
|
+
sage.rings.abc.RealDoubleField, sage.rings.abc.ComplexDoubleField))):
|
|
456
|
+
return True
|
|
457
|
+
if isinstance(base_ring, FiniteField):
|
|
458
|
+
return base_ring.characteristic() <= 2147483647
|
|
459
|
+
if isinstance(base_ring, NumberField):
|
|
460
|
+
return base_ring.is_absolute()
|
|
461
|
+
if (isinstance(base_ring, sage.rings.fraction_field.FractionField_generic)
|
|
462
|
+
and isinstance(base_ring.base(), (PolynomialRing_general, MPolynomialRing_base))):
|
|
463
|
+
B = base_ring.base_ring()
|
|
464
|
+
return (B.is_prime_field() or B is ZZ
|
|
465
|
+
or (isinstance(B, FiniteField) and B.characteristic() <= 2147483647))
|
|
466
|
+
if isinstance(base_ring, RationalFunctionField):
|
|
467
|
+
return base_ring.constant_field().is_prime_field()
|
|
468
|
+
return False
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
class Polynomial_singular_repr:
|
|
472
|
+
"""
|
|
473
|
+
Implement coercion of polynomials to Singular polynomials.
|
|
474
|
+
|
|
475
|
+
This class is a base class for all (univariate and multivariate)
|
|
476
|
+
polynomial classes which support conversion from and to
|
|
477
|
+
Singular polynomials.
|
|
478
|
+
|
|
479
|
+
Due to the incompatibility of Python extension classes and multiple inheritance,
|
|
480
|
+
this just defers to module-level functions.
|
|
481
|
+
"""
|
|
482
|
+
def _singular_(self, singular=None):
|
|
483
|
+
if singular is None:
|
|
484
|
+
from sage.interfaces.singular import singular
|
|
485
|
+
return _singular_func(self, singular)
|
|
486
|
+
|
|
487
|
+
def _singular_init_func(self, singular=None):
|
|
488
|
+
if singular is None:
|
|
489
|
+
from sage.interfaces.singular import singular
|
|
490
|
+
return _singular_init_func(self, singular)
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
def _singular_func(self, singular=None):
|
|
494
|
+
"""
|
|
495
|
+
Return Singular polynomial matching this polynomial.
|
|
496
|
+
|
|
497
|
+
INPUT:
|
|
498
|
+
|
|
499
|
+
- ``singular`` -- Singular instance to use
|
|
500
|
+
|
|
501
|
+
EXAMPLES::
|
|
502
|
+
|
|
503
|
+
sage: # needs sage.libs.singular
|
|
504
|
+
sage: P.<a,b> = PolynomialRing(GF(7), 2)
|
|
505
|
+
sage: f = (a^3 + 2*b^2*a)^7; f
|
|
506
|
+
a^21 + 2*a^7*b^14
|
|
507
|
+
sage: h = f._singular_(); h
|
|
508
|
+
a^21+2*a^7*b^14
|
|
509
|
+
sage: P(h)
|
|
510
|
+
a^21 + 2*a^7*b^14
|
|
511
|
+
sage: P(h^20) == f^20
|
|
512
|
+
True
|
|
513
|
+
|
|
514
|
+
sage: # needs sage.libs.singular
|
|
515
|
+
sage: R.<x> = PolynomialRing(GF(7))
|
|
516
|
+
sage: f = (x^3 + 2*x^2*x)^7
|
|
517
|
+
sage: f
|
|
518
|
+
3*x^21
|
|
519
|
+
sage: h = f._singular_(); h
|
|
520
|
+
3*x^21
|
|
521
|
+
sage: R(h)
|
|
522
|
+
3*x^21
|
|
523
|
+
sage: R(h^20) == f^20
|
|
524
|
+
True
|
|
525
|
+
"""
|
|
526
|
+
if singular is None:
|
|
527
|
+
from sage.interfaces.singular import singular
|
|
528
|
+
self.parent()._singular_(singular).set_ring() # this is expensive
|
|
529
|
+
try:
|
|
530
|
+
self.__singular._check_valid()
|
|
531
|
+
if self.__singular.parent() is singular:
|
|
532
|
+
return self.__singular
|
|
533
|
+
except (AttributeError, ValueError):
|
|
534
|
+
pass
|
|
535
|
+
return _singular_init_func(self, singular)
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
def _singular_init_func(self, singular=None):
|
|
539
|
+
"""
|
|
540
|
+
Return corresponding Singular polynomial but enforce that a new
|
|
541
|
+
instance is created in the Singular interpreter.
|
|
542
|
+
|
|
543
|
+
Use ``self._singular_()`` instead.
|
|
544
|
+
"""
|
|
545
|
+
if singular is None:
|
|
546
|
+
from sage.interfaces.singular import singular
|
|
547
|
+
self.parent()._singular_(singular).set_ring() # this is expensive
|
|
548
|
+
self.__singular = singular(str(self))
|
|
549
|
+
return self.__singular
|