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,979 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Quotient Ring Elements
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- William Stein
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
# ****************************************************************************
|
|
11
|
+
# Copyright (C) 2005 William Stein <wstein@gmail.com>
|
|
12
|
+
#
|
|
13
|
+
# This program is free software: you can redistribute it and/or modify
|
|
14
|
+
# it under the terms of the GNU General Public License as published by
|
|
15
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
16
|
+
# (at your option) any later version.
|
|
17
|
+
# https://www.gnu.org/licenses/
|
|
18
|
+
# ****************************************************************************
|
|
19
|
+
|
|
20
|
+
from sage.structure.element import RingElement
|
|
21
|
+
from sage.structure.richcmp import richcmp, rich_to_bool
|
|
22
|
+
|
|
23
|
+
try:
|
|
24
|
+
from sage.features import FeatureNotPresentError
|
|
25
|
+
except ImportError:
|
|
26
|
+
class FeatureNotPresentError(BaseException):
|
|
27
|
+
pass
|
|
28
|
+
|
|
29
|
+
try:
|
|
30
|
+
from sage.interfaces.singular import singular as singular_default
|
|
31
|
+
except (ImportError, FeatureNotPresentError):
|
|
32
|
+
singular_default = None
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class QuotientRingElement(RingElement):
|
|
36
|
+
"""
|
|
37
|
+
An element of a quotient ring `R/I`.
|
|
38
|
+
|
|
39
|
+
INPUT:
|
|
40
|
+
|
|
41
|
+
- ``parent`` -- the ring `R/I`
|
|
42
|
+
|
|
43
|
+
- ``rep`` -- a representative of the element in `R`; this is used
|
|
44
|
+
as the internal representation of the element
|
|
45
|
+
|
|
46
|
+
- ``reduce`` -- boolean (default: ``True``); if ``True``, then the
|
|
47
|
+
internal representation of the element is ``rep`` reduced modulo
|
|
48
|
+
the ideal `I`
|
|
49
|
+
|
|
50
|
+
EXAMPLES::
|
|
51
|
+
|
|
52
|
+
sage: R.<x> = PolynomialRing(ZZ)
|
|
53
|
+
sage: S.<xbar> = R.quo((4 + 3*x + x^2, 1 + x^2)); S
|
|
54
|
+
Quotient of Univariate Polynomial Ring in x over Integer Ring
|
|
55
|
+
by the ideal (x^2 + 3*x + 4, x^2 + 1)
|
|
56
|
+
sage: v = S.gens(); v
|
|
57
|
+
(xbar,)
|
|
58
|
+
|
|
59
|
+
::
|
|
60
|
+
|
|
61
|
+
sage: loads(v[0].dumps()) == v[0]
|
|
62
|
+
True
|
|
63
|
+
|
|
64
|
+
::
|
|
65
|
+
|
|
66
|
+
sage: R.<x,y> = PolynomialRing(QQ, 2)
|
|
67
|
+
sage: S = R.quo(x^2 + y^2); S
|
|
68
|
+
Quotient of Multivariate Polynomial Ring in x, y over Rational Field
|
|
69
|
+
by the ideal (x^2 + y^2)
|
|
70
|
+
sage: S.gens() # needs sage.libs.singular
|
|
71
|
+
(xbar, ybar)
|
|
72
|
+
|
|
73
|
+
We name each of the generators.
|
|
74
|
+
|
|
75
|
+
::
|
|
76
|
+
|
|
77
|
+
sage: # needs sage.libs.singular
|
|
78
|
+
sage: S.<a,b> = R.quotient(x^2 + y^2)
|
|
79
|
+
sage: a
|
|
80
|
+
a
|
|
81
|
+
sage: b
|
|
82
|
+
b
|
|
83
|
+
sage: a^2 + b^2 == 0
|
|
84
|
+
True
|
|
85
|
+
sage: b.lift()
|
|
86
|
+
y
|
|
87
|
+
sage: (a^3 + b^2).lift()
|
|
88
|
+
-x*y^2 + y^2
|
|
89
|
+
"""
|
|
90
|
+
def __init__(self, parent, rep, reduce=True):
|
|
91
|
+
"""
|
|
92
|
+
An element of a quotient ring `R/I`. See
|
|
93
|
+
``QuotientRingElement`` for full documentation.
|
|
94
|
+
|
|
95
|
+
EXAMPLES::
|
|
96
|
+
|
|
97
|
+
sage: R.<x> = PolynomialRing(ZZ)
|
|
98
|
+
sage: S.<xbar> = R.quo((4 + 3*x + x^2, 1 + x^2)); S
|
|
99
|
+
Quotient of Univariate Polynomial Ring in x over Integer Ring
|
|
100
|
+
by the ideal (x^2 + 3*x + 4, x^2 + 1)
|
|
101
|
+
sage: v = S.gens(); v
|
|
102
|
+
(xbar,)
|
|
103
|
+
"""
|
|
104
|
+
RingElement.__init__(self, parent)
|
|
105
|
+
self.__rep = rep
|
|
106
|
+
if reduce:
|
|
107
|
+
self._reduce_()
|
|
108
|
+
|
|
109
|
+
def _reduce_(self):
|
|
110
|
+
"""
|
|
111
|
+
Reduce the element modulo the defining ideal of the quotient
|
|
112
|
+
ring. This internal method replaces the cached representative
|
|
113
|
+
by one in reduced form.
|
|
114
|
+
|
|
115
|
+
(Note that this has nothing to do with pickling.)
|
|
116
|
+
|
|
117
|
+
TESTS::
|
|
118
|
+
|
|
119
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
120
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
121
|
+
sage: a._reduce_() # needs sage.libs.singular
|
|
122
|
+
sage: a._QuotientRingElement__rep # needs sage.libs.singular
|
|
123
|
+
x
|
|
124
|
+
"""
|
|
125
|
+
I = self.parent().defining_ideal()
|
|
126
|
+
self.__rep = I.reduce(self.__rep)
|
|
127
|
+
|
|
128
|
+
def lift(self):
|
|
129
|
+
"""
|
|
130
|
+
If ``self`` is an element of `R/I`, then return ``self`` as an
|
|
131
|
+
element of `R`.
|
|
132
|
+
|
|
133
|
+
EXAMPLES::
|
|
134
|
+
|
|
135
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
136
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
137
|
+
sage: a.lift() # needs sage.libs.singular
|
|
138
|
+
x
|
|
139
|
+
sage: (3/5*(a + a^2 + b^2)).lift() # needs sage.libs.singular
|
|
140
|
+
3/5*x
|
|
141
|
+
"""
|
|
142
|
+
return self.__rep
|
|
143
|
+
|
|
144
|
+
def __bool__(self):
|
|
145
|
+
"""
|
|
146
|
+
Return ``True`` if quotient ring element is nonzero in the
|
|
147
|
+
quotient ring `R/I`, by determining whether the element
|
|
148
|
+
is in `I`.
|
|
149
|
+
|
|
150
|
+
EXAMPLES::
|
|
151
|
+
|
|
152
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
153
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
154
|
+
sage: bool(a) # indirect doctest # needs sage.libs.singular
|
|
155
|
+
True
|
|
156
|
+
sage: bool(S(0)) # needs sage.libs.singular
|
|
157
|
+
False
|
|
158
|
+
|
|
159
|
+
TESTS::
|
|
160
|
+
|
|
161
|
+
sage: bool(a - a) # needs sage.libs.singular
|
|
162
|
+
False
|
|
163
|
+
"""
|
|
164
|
+
return self.__rep not in self.parent().defining_ideal()
|
|
165
|
+
|
|
166
|
+
def is_unit(self):
|
|
167
|
+
"""
|
|
168
|
+
Return ``True`` if ``self`` is a unit in the quotient ring.
|
|
169
|
+
|
|
170
|
+
EXAMPLES::
|
|
171
|
+
|
|
172
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(1 - x*y); type(a) # needs sage.libs.singular
|
|
173
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
174
|
+
sage: a*b # needs sage.libs.singular
|
|
175
|
+
1
|
|
176
|
+
sage: S(2).is_unit() # needs sage.libs.singular
|
|
177
|
+
True
|
|
178
|
+
|
|
179
|
+
Check that :issue:`29469` is fixed::
|
|
180
|
+
|
|
181
|
+
sage: a.is_unit() # needs sage.libs.singular
|
|
182
|
+
True
|
|
183
|
+
sage: (a+b).is_unit() # needs sage.libs.singular
|
|
184
|
+
False
|
|
185
|
+
"""
|
|
186
|
+
if self.__rep.is_unit():
|
|
187
|
+
return True
|
|
188
|
+
from sage.categories.fields import Fields
|
|
189
|
+
if self.parent() in Fields():
|
|
190
|
+
return not self.is_zero()
|
|
191
|
+
try:
|
|
192
|
+
self.__invert__()
|
|
193
|
+
return True
|
|
194
|
+
except ArithmeticError:
|
|
195
|
+
return False
|
|
196
|
+
raise NotImplementedError
|
|
197
|
+
|
|
198
|
+
def _repr_(self):
|
|
199
|
+
"""
|
|
200
|
+
String representation.
|
|
201
|
+
|
|
202
|
+
TESTS::
|
|
203
|
+
|
|
204
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
205
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
206
|
+
sage: a-2*a*b # indirect doctest # needs sage.libs.singular
|
|
207
|
+
-2*a*b + a
|
|
208
|
+
|
|
209
|
+
In :issue:`11068`, the case of quotient rings without
|
|
210
|
+
assigned names has been covered as well::
|
|
211
|
+
|
|
212
|
+
sage: # needs sage.libs.singular
|
|
213
|
+
sage: S = SteenrodAlgebra(2)
|
|
214
|
+
sage: I = S * [S.0 + S.1] * S
|
|
215
|
+
sage: Q = S.quo(I)
|
|
216
|
+
sage: Q.0
|
|
217
|
+
Sq(1)
|
|
218
|
+
"""
|
|
219
|
+
from sage.structure.parent_gens import localvars
|
|
220
|
+
P = self.parent()
|
|
221
|
+
R = P.cover_ring()
|
|
222
|
+
# We print by temporarily (and safely!) changing the variable
|
|
223
|
+
# names of the covering structure R to those of P.
|
|
224
|
+
# These names get changed back, since we're using "with".
|
|
225
|
+
# However, it may occur that no variable names are assigned.
|
|
226
|
+
# That holds, in particular, if there are infinitely many
|
|
227
|
+
# generators, as for Steenrod algebras.
|
|
228
|
+
try:
|
|
229
|
+
P.variable_names()
|
|
230
|
+
except ValueError:
|
|
231
|
+
return str(self.__rep)
|
|
232
|
+
with localvars(R, P.variable_names(), normalize=False):
|
|
233
|
+
return str(self.__rep)
|
|
234
|
+
|
|
235
|
+
def _latex_(self):
|
|
236
|
+
"""
|
|
237
|
+
Return the LaTeX representation as a string.
|
|
238
|
+
|
|
239
|
+
EXAMPLES::
|
|
240
|
+
|
|
241
|
+
sage: R = PolynomialRing(QQ, 'a, b, c')
|
|
242
|
+
sage: a = R.gen(0)
|
|
243
|
+
sage: I = R.ideal(a**2 + a + 1)
|
|
244
|
+
sage: S = R.quotient(I, names=R.variable_names())
|
|
245
|
+
sage: a = S.gen(0) # needs sage.libs.singular
|
|
246
|
+
sage: latex(a)
|
|
247
|
+
a
|
|
248
|
+
"""
|
|
249
|
+
from sage.structure.parent_gens import localvars
|
|
250
|
+
P = self.parent()
|
|
251
|
+
R = P.cover_ring()
|
|
252
|
+
# see _repr_ above for the idea
|
|
253
|
+
try:
|
|
254
|
+
P.variable_names()
|
|
255
|
+
except ValueError:
|
|
256
|
+
return self.__rep._latex_()
|
|
257
|
+
with localvars(R, P.variable_names(), normalize=False):
|
|
258
|
+
return self.__rep._latex_()
|
|
259
|
+
|
|
260
|
+
def __pari__(self):
|
|
261
|
+
"""
|
|
262
|
+
The Pari representation of this quotient element.
|
|
263
|
+
|
|
264
|
+
Since Pari does not support quotients by non-principal ideals,
|
|
265
|
+
this function will raise an error in that case.
|
|
266
|
+
|
|
267
|
+
EXAMPLES::
|
|
268
|
+
|
|
269
|
+
sage: R.<x,y> = QQ[]
|
|
270
|
+
sage: I = R.ideal(x^3, y^3)
|
|
271
|
+
sage: S.<xb,yb> = R.quo(I) # needs sage.libs.singular
|
|
272
|
+
sage: pari(xb) # needs sage.libs.pari sage.libs.singular
|
|
273
|
+
Traceback (most recent call last):
|
|
274
|
+
...
|
|
275
|
+
ValueError: Pari does not support quotients by non-principal ideals
|
|
276
|
+
|
|
277
|
+
Note that the quotient does work in the case that the ideal is principal::
|
|
278
|
+
|
|
279
|
+
sage: I = R.ideal(x^3 + y^3)
|
|
280
|
+
sage: S.<xb,yb> = R.quo(I) # needs sage.libs.singular
|
|
281
|
+
sage: pari(xb)^4 # needs sage.libs.pari sage.libs.singular
|
|
282
|
+
Mod(-y^3*x, x^3 + y^3)
|
|
283
|
+
sage: pari(yb)^4 # needs sage.libs.pari sage.libs.singular
|
|
284
|
+
Mod(y^4, x^3 + y^3)
|
|
285
|
+
"""
|
|
286
|
+
gens = self.parent().defining_ideal().gens()
|
|
287
|
+
if len(gens) != 1:
|
|
288
|
+
raise ValueError("Pari does not support quotients by non-principal ideals")
|
|
289
|
+
return self.__rep.__pari__().Mod(gens[0])
|
|
290
|
+
|
|
291
|
+
def _add_(self, right):
|
|
292
|
+
"""
|
|
293
|
+
Add quotient ring element ``self`` to another quotient ring
|
|
294
|
+
element, ``right``. If the quotient is `R/I`, the addition is
|
|
295
|
+
carried out in `R` and then reduced to `R/I`.
|
|
296
|
+
|
|
297
|
+
EXAMPLES::
|
|
298
|
+
|
|
299
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
300
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
301
|
+
sage: a + b # needs sage.libs.singular
|
|
302
|
+
a + b
|
|
303
|
+
|
|
304
|
+
TESTS::
|
|
305
|
+
|
|
306
|
+
sage: a._add_(b) # needs sage.libs.singular
|
|
307
|
+
a + b
|
|
308
|
+
"""
|
|
309
|
+
return self.__class__(self.parent(), self.__rep + right.__rep)
|
|
310
|
+
|
|
311
|
+
def _sub_(self, right):
|
|
312
|
+
"""
|
|
313
|
+
Subtract quotient ring element ``right`` from quotient ring
|
|
314
|
+
element ``self``. If the quotient is `R/I`, the subtraction is
|
|
315
|
+
carried out in `R` and then reduced to `R/I`.
|
|
316
|
+
|
|
317
|
+
EXAMPLES::
|
|
318
|
+
|
|
319
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
320
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
321
|
+
sage: a - b # needs sage.libs.singular
|
|
322
|
+
a - b
|
|
323
|
+
|
|
324
|
+
TESTS::
|
|
325
|
+
|
|
326
|
+
sage: a._sub_(b) # needs sage.libs.singular
|
|
327
|
+
a - b
|
|
328
|
+
"""
|
|
329
|
+
return self.__class__(self.parent(), self.__rep - right.__rep)
|
|
330
|
+
|
|
331
|
+
def _mul_(self, right):
|
|
332
|
+
"""
|
|
333
|
+
Multiply quotient ring element ``self`` by another quotient ring
|
|
334
|
+
element, ``right``. If the quotient is `R/I`, the multiplication is
|
|
335
|
+
carried out in `R` and then reduced to `R/I`.
|
|
336
|
+
|
|
337
|
+
EXAMPLES::
|
|
338
|
+
|
|
339
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
340
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
341
|
+
sage: a * b # needs sage.libs.singular
|
|
342
|
+
a*b
|
|
343
|
+
|
|
344
|
+
TESTS::
|
|
345
|
+
|
|
346
|
+
sage: a._mul_(b) # needs sage.libs.singular
|
|
347
|
+
a*b
|
|
348
|
+
sage: a._mul_(a) # needs sage.libs.singular
|
|
349
|
+
-b^2
|
|
350
|
+
"""
|
|
351
|
+
return self.__class__(self.parent(), self.__rep * right.__rep)
|
|
352
|
+
|
|
353
|
+
def _div_(self, right):
|
|
354
|
+
"""
|
|
355
|
+
Divide quotient ring element ``self`` by another quotient ring
|
|
356
|
+
element, ``right``. If the quotient is `R/I`, the division is
|
|
357
|
+
carried out in `R` and then reduced to `R/I`.
|
|
358
|
+
|
|
359
|
+
EXAMPLES::
|
|
360
|
+
|
|
361
|
+
sage: R.<x,y> = QQ[]
|
|
362
|
+
sage: I = R.ideal([x^2 + 1, y^3 - 2])
|
|
363
|
+
sage: S.<i,cuberoot> = R.quotient(I) # needs sage.libs.singular
|
|
364
|
+
sage: 1/(1+i) # needs sage.libs.singular
|
|
365
|
+
-1/2*i + 1/2
|
|
366
|
+
|
|
367
|
+
Confirm via symbolic computation::
|
|
368
|
+
|
|
369
|
+
sage: 1/(1+sqrt(-1)) # needs sage.symbolic
|
|
370
|
+
-1/2*I + 1/2
|
|
371
|
+
|
|
372
|
+
Another more complicated quotient::
|
|
373
|
+
|
|
374
|
+
sage: b = 1/(i+cuberoot); b # needs sage.libs.singular
|
|
375
|
+
1/5*i*cuberoot^2 - 2/5*i*cuberoot + 2/5*cuberoot^2 - 1/5*i + 1/5*cuberoot - 2/5
|
|
376
|
+
sage: b*(i+cuberoot) # needs sage.libs.singular
|
|
377
|
+
1
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
Another really easy example::
|
|
381
|
+
|
|
382
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
383
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
384
|
+
sage: a / S(2) # needs sage.libs.singular
|
|
385
|
+
1/2*a
|
|
386
|
+
sage: (a*b)._div_(b) # needs sage.libs.singular
|
|
387
|
+
a
|
|
388
|
+
|
|
389
|
+
An example in which we try to divide in a ring that is not a
|
|
390
|
+
field::
|
|
391
|
+
|
|
392
|
+
sage: R.<x,y> = QQ[]
|
|
393
|
+
sage: I = R.ideal([x^2 - 1, y^3 - 2])
|
|
394
|
+
sage: S.<a,cuberoot> = R.quotient(I) # needs sage.libs.singular
|
|
395
|
+
sage: 1/cuberoot # needs sage.libs.singular
|
|
396
|
+
1/2*cuberoot^2
|
|
397
|
+
sage: 1/a # needs sage.libs.singular
|
|
398
|
+
a
|
|
399
|
+
|
|
400
|
+
Check that :issue:`13670` is fixed (i.e. that the error message
|
|
401
|
+
actually describes what happens when the result of division is not defined)::
|
|
402
|
+
|
|
403
|
+
sage: R.<x1,x2> = QQ[]
|
|
404
|
+
sage: S = R.quotient_ring( R.ideal(x2**2 + x1 - 2, x1**2 - 1) )
|
|
405
|
+
sage: 1 / S(x1 + x2) # needs sage.libs.singular
|
|
406
|
+
Traceback (most recent call last):
|
|
407
|
+
...
|
|
408
|
+
ArithmeticError: Division failed. The numerator is not a multiple of the denominator.
|
|
409
|
+
|
|
410
|
+
An example over a polynomial ring over a polynomial ring,
|
|
411
|
+
which doesn't work (yet; obviously, this could be made to work
|
|
412
|
+
by converting to a single polynomial quotient ring
|
|
413
|
+
internally)::
|
|
414
|
+
|
|
415
|
+
sage: R.<x> = QQ[]
|
|
416
|
+
sage: S.<y,z> = R[]
|
|
417
|
+
sage: Z.<ybar,zbar> = S.quotient([y^2 - 2, z^2 - 3]) # needs sage.libs.singular
|
|
418
|
+
Traceback (most recent call last):
|
|
419
|
+
...
|
|
420
|
+
TypeError: Can only reduce polynomials over fields.
|
|
421
|
+
"""
|
|
422
|
+
# Special case: if self==0 (and right is nonzero), just return self.
|
|
423
|
+
if not self:
|
|
424
|
+
if not right:
|
|
425
|
+
raise ZeroDivisionError
|
|
426
|
+
return self
|
|
427
|
+
|
|
428
|
+
# We are computing L/R modulo the ideal.
|
|
429
|
+
(L, R) = (self.__rep, right.__rep)
|
|
430
|
+
P = self.parent()
|
|
431
|
+
I = P.defining_ideal()
|
|
432
|
+
|
|
433
|
+
if not hasattr(I, 'groebner_basis'):
|
|
434
|
+
# Try something very naive -- somebody will improve this
|
|
435
|
+
# in the future.
|
|
436
|
+
try:
|
|
437
|
+
return L * R.inverse_mod(I)
|
|
438
|
+
except NotImplementedError:
|
|
439
|
+
if R.is_unit():
|
|
440
|
+
return L * ~R
|
|
441
|
+
else:
|
|
442
|
+
raise
|
|
443
|
+
|
|
444
|
+
# Now the parent is a polynomial ring, so we have an algorithm
|
|
445
|
+
# at our disposal.
|
|
446
|
+
|
|
447
|
+
# Our algorithm is to write L in terms of R and a Groebner
|
|
448
|
+
# basis for the defining ideal. We compute a Groebner basis
|
|
449
|
+
# here explicitly purely for efficiency reasons, since it
|
|
450
|
+
# makes the implicit Groebner basis computation of [R]+B
|
|
451
|
+
# that is done in the lift command below faster.
|
|
452
|
+
|
|
453
|
+
B = I.groebner_basis()
|
|
454
|
+
try:
|
|
455
|
+
XY = L.lift((R,) + tuple(B))
|
|
456
|
+
except ValueError:
|
|
457
|
+
raise ArithmeticError("Division failed. The numerator is not "
|
|
458
|
+
"a multiple of the denominator.")
|
|
459
|
+
return P(XY[0])
|
|
460
|
+
|
|
461
|
+
def _im_gens_(self, codomain, im_gens, base_map=None):
|
|
462
|
+
"""
|
|
463
|
+
Return the image of ``self`` in ``codomain`` under the map
|
|
464
|
+
that sends ``self.parent().gens()`` to ``im_gens``.
|
|
465
|
+
|
|
466
|
+
INPUT:
|
|
467
|
+
|
|
468
|
+
- ``codomain`` -- a ring
|
|
469
|
+
|
|
470
|
+
- ``im_gens`` -- tuple of elements `f(x)` in ``codomain``,
|
|
471
|
+
one for each `x` in ``self.parent().gens()``, that define
|
|
472
|
+
a homomorphism `f` from ``self.parent()`` to ``codomain``
|
|
473
|
+
|
|
474
|
+
OUTPUT:
|
|
475
|
+
|
|
476
|
+
The image of ``self`` in ``codomain`` under the above
|
|
477
|
+
homomorphism `f`.
|
|
478
|
+
|
|
479
|
+
EXAMPLES:
|
|
480
|
+
|
|
481
|
+
Ring homomorphisms whose domain is the fraction field of a
|
|
482
|
+
quotient ring work correctly (see :issue:`16135`)::
|
|
483
|
+
|
|
484
|
+
sage: # needs sage.libs.singular
|
|
485
|
+
sage: R.<x, y> = QQ[]
|
|
486
|
+
sage: K = R.quotient(x^2 - y^3).fraction_field()
|
|
487
|
+
sage: L.<t> = FunctionField(QQ)
|
|
488
|
+
sage: f = K.hom((t^3, t^2))
|
|
489
|
+
sage: list(map(f, K.gens()))
|
|
490
|
+
[t^3, t^2]
|
|
491
|
+
sage: xbar, ybar = K.gens()
|
|
492
|
+
sage: f(1/ybar)
|
|
493
|
+
1/t^2
|
|
494
|
+
sage: f(xbar/ybar)
|
|
495
|
+
t
|
|
496
|
+
"""
|
|
497
|
+
return self.lift()._im_gens_(codomain, im_gens, base_map=base_map)
|
|
498
|
+
|
|
499
|
+
def __int__(self):
|
|
500
|
+
"""
|
|
501
|
+
Try to convert ``self`` (an element of `R/I`) to an integer by
|
|
502
|
+
converting its lift in `R` to an integer. Return a TypeError
|
|
503
|
+
if no such conversion can be found.
|
|
504
|
+
|
|
505
|
+
EXAMPLES::
|
|
506
|
+
|
|
507
|
+
sage: # needs sage.libs.singular
|
|
508
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a)
|
|
509
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
510
|
+
sage: int(S(-3)) # indirect doctest
|
|
511
|
+
-3
|
|
512
|
+
sage: type(int(S(-3)))
|
|
513
|
+
<... 'int'>
|
|
514
|
+
sage: int(a)
|
|
515
|
+
Traceback (most recent call last):
|
|
516
|
+
...
|
|
517
|
+
TypeError: unable to convert non-constant polynomial x to <class 'int'>
|
|
518
|
+
"""
|
|
519
|
+
return int(self.lift())
|
|
520
|
+
|
|
521
|
+
def _integer_(self, Z):
|
|
522
|
+
"""
|
|
523
|
+
EXAMPLES::
|
|
524
|
+
|
|
525
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
526
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
527
|
+
sage: ZZ(S(-3)) # needs sage.libs.singular
|
|
528
|
+
-3
|
|
529
|
+
|
|
530
|
+
TESTS::
|
|
531
|
+
|
|
532
|
+
sage: type(ZZ(S(-3))) # needs sage.libs.singular
|
|
533
|
+
<class 'sage.rings.integer.Integer'>
|
|
534
|
+
"""
|
|
535
|
+
return Z(self.lift())
|
|
536
|
+
|
|
537
|
+
def _rational_(self):
|
|
538
|
+
"""
|
|
539
|
+
EXAMPLES::
|
|
540
|
+
|
|
541
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
542
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
543
|
+
sage: QQ(S(-2/3)) # needs sage.libs.singular
|
|
544
|
+
-2/3
|
|
545
|
+
|
|
546
|
+
TESTS::
|
|
547
|
+
|
|
548
|
+
sage: type(S(-2/3)._rational_()) # needs sage.libs.singular
|
|
549
|
+
<class 'sage.rings.rational.Rational'>
|
|
550
|
+
"""
|
|
551
|
+
from sage.rings.rational_field import QQ
|
|
552
|
+
return QQ(self.lift())
|
|
553
|
+
|
|
554
|
+
def __neg__(self):
|
|
555
|
+
"""
|
|
556
|
+
EXAMPLES::
|
|
557
|
+
|
|
558
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
559
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
560
|
+
sage: -a # indirect doctest # needs sage.libs.singular
|
|
561
|
+
-a
|
|
562
|
+
sage: -(a+b) # needs sage.libs.singular
|
|
563
|
+
-a - b
|
|
564
|
+
"""
|
|
565
|
+
return self.__class__(self.parent(), -self.__rep)
|
|
566
|
+
|
|
567
|
+
def __pos__(self):
|
|
568
|
+
"""
|
|
569
|
+
TESTS::
|
|
570
|
+
|
|
571
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
572
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
573
|
+
sage: (a+b).__pos__() # needs sage.libs.singular
|
|
574
|
+
a + b
|
|
575
|
+
sage: c = a+b; c.__pos__() is c # needs sage.libs.singular
|
|
576
|
+
True
|
|
577
|
+
"""
|
|
578
|
+
return self
|
|
579
|
+
|
|
580
|
+
def __invert__(self):
|
|
581
|
+
"""
|
|
582
|
+
EXAMPLES::
|
|
583
|
+
|
|
584
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
585
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
586
|
+
sage: ~S(2/3) # needs sage.libs.singular
|
|
587
|
+
3/2
|
|
588
|
+
|
|
589
|
+
TESTS::
|
|
590
|
+
|
|
591
|
+
sage: S(2/3).__invert__() # needs sage.libs.singular
|
|
592
|
+
3/2
|
|
593
|
+
|
|
594
|
+
Note that a is not invertible as an element of R::
|
|
595
|
+
|
|
596
|
+
sage: a.__invert__() # needs sage.libs.singular
|
|
597
|
+
Traceback (most recent call last):
|
|
598
|
+
...
|
|
599
|
+
ArithmeticError: element is non-invertible
|
|
600
|
+
"""
|
|
601
|
+
try:
|
|
602
|
+
inv = self.__rep.inverse_mod(self.parent().defining_ideal())
|
|
603
|
+
except NotImplementedError:
|
|
604
|
+
return self.parent().one()/self
|
|
605
|
+
return self.__class__(self.parent(), inv)
|
|
606
|
+
|
|
607
|
+
def __float__(self):
|
|
608
|
+
"""
|
|
609
|
+
EXAMPLES::
|
|
610
|
+
|
|
611
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
612
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
613
|
+
sage: float(S(2/3)) # needs sage.libs.singular
|
|
614
|
+
0.6666666666666666
|
|
615
|
+
sage: float(a) # needs sage.libs.singular
|
|
616
|
+
Traceback (most recent call last):
|
|
617
|
+
...
|
|
618
|
+
TypeError: unable to convert non-constant polynomial x to <class 'float'>
|
|
619
|
+
"""
|
|
620
|
+
return float(self.lift())
|
|
621
|
+
|
|
622
|
+
def __hash__(self):
|
|
623
|
+
r"""
|
|
624
|
+
TESTS::
|
|
625
|
+
|
|
626
|
+
sage: # needs sage.libs.singular
|
|
627
|
+
sage: R.<x,y> = QQ[]
|
|
628
|
+
sage: S.<a,b> = R.quo(x^2 + y^2)
|
|
629
|
+
sage: c = a*a + b
|
|
630
|
+
sage: hash(a) != hash(b)
|
|
631
|
+
True
|
|
632
|
+
"""
|
|
633
|
+
return hash(self.__rep)
|
|
634
|
+
|
|
635
|
+
def _richcmp_(self, other, op):
|
|
636
|
+
"""
|
|
637
|
+
EXAMPLES::
|
|
638
|
+
|
|
639
|
+
sage: # needs sage.libs.singular
|
|
640
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a)
|
|
641
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
642
|
+
sage: a > b # indirect doctest
|
|
643
|
+
True
|
|
644
|
+
sage: b > a
|
|
645
|
+
False
|
|
646
|
+
sage: a == loads(dumps(a))
|
|
647
|
+
True
|
|
648
|
+
|
|
649
|
+
TESTS::
|
|
650
|
+
|
|
651
|
+
sage: a == (a+1-1) # needs sage.libs.singular
|
|
652
|
+
True
|
|
653
|
+
sage: a > b # needs sage.libs.singular
|
|
654
|
+
True
|
|
655
|
+
|
|
656
|
+
See :issue:`7797`::
|
|
657
|
+
|
|
658
|
+
sage: # needs sage.combinat sage.libs.singular sage.modules
|
|
659
|
+
sage: F.<x,y,z> = FreeAlgebra(QQ, implementation='letterplace')
|
|
660
|
+
sage: I = F * [x*y + y*z, x^2 + x*y - y*x - y^2] * F
|
|
661
|
+
sage: Q = F.quo(I)
|
|
662
|
+
sage: Q.0^4 # indirect doctest
|
|
663
|
+
ybar*zbar*zbar*xbar + ybar*zbar*zbar*ybar + ybar*zbar*zbar*zbar
|
|
664
|
+
|
|
665
|
+
The issue from :issue:`8005` was most likely fixed as part of
|
|
666
|
+
:issue:`9138`::
|
|
667
|
+
|
|
668
|
+
sage: # needs sage.libs.singular
|
|
669
|
+
sage: F = GF(5)
|
|
670
|
+
sage: R.<x,y> = F[]
|
|
671
|
+
sage: I = Ideal(R, [x, y])
|
|
672
|
+
sage: S.<x1,y1> = QuotientRing(R, I)
|
|
673
|
+
sage: x1^4
|
|
674
|
+
0
|
|
675
|
+
"""
|
|
676
|
+
# A containment test is not implemented for univariate polynomial
|
|
677
|
+
# ideals. There are cases in which one would not like to add
|
|
678
|
+
# elements of different degrees. The whole quotient stuff relies
|
|
679
|
+
# in I.reduce(x) returning a normal form of x with respect to I.
|
|
680
|
+
# Hence, we will not use more than that.
|
|
681
|
+
|
|
682
|
+
# Since we have to compute normal forms anyway, it makes sense
|
|
683
|
+
# to use it for comparison in the case of an inequality as well.
|
|
684
|
+
if self.__rep == other.__rep:
|
|
685
|
+
# Use a shortpath, so that we avoid expensive reductions
|
|
686
|
+
return rich_to_bool(op, 0)
|
|
687
|
+
I = self.parent().defining_ideal()
|
|
688
|
+
return richcmp(I.reduce(self.__rep), I.reduce(other.__rep), op)
|
|
689
|
+
|
|
690
|
+
def lt(self):
|
|
691
|
+
"""
|
|
692
|
+
Return the leading term of this quotient ring element.
|
|
693
|
+
|
|
694
|
+
EXAMPLES::
|
|
695
|
+
|
|
696
|
+
sage: # needs sage.libs.singular
|
|
697
|
+
sage: R.<x,y,z> = PolynomialRing(GF(7), 3, order='lex')
|
|
698
|
+
sage: I = sage.rings.ideal.FieldIdeal(R)
|
|
699
|
+
sage: Q = R.quo(I)
|
|
700
|
+
sage: f = Q(z*y + 2*x)
|
|
701
|
+
sage: f.lt()
|
|
702
|
+
2*xbar
|
|
703
|
+
|
|
704
|
+
TESTS::
|
|
705
|
+
|
|
706
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
707
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
708
|
+
sage: (a + 3*a*b + b).lt() # needs sage.libs.singular
|
|
709
|
+
3*a*b
|
|
710
|
+
"""
|
|
711
|
+
return self.__class__(self.parent(), self.__rep.lt())
|
|
712
|
+
|
|
713
|
+
def lm(self):
|
|
714
|
+
"""
|
|
715
|
+
Return the leading monomial of this quotient ring element.
|
|
716
|
+
|
|
717
|
+
EXAMPLES::
|
|
718
|
+
|
|
719
|
+
sage: # needs sage.libs.singular
|
|
720
|
+
sage: R.<x,y,z> = PolynomialRing(GF(7), 3, order='lex')
|
|
721
|
+
sage: I = sage.rings.ideal.FieldIdeal(R)
|
|
722
|
+
sage: Q = R.quo(I)
|
|
723
|
+
sage: f = Q(z*y + 2*x)
|
|
724
|
+
sage: f.lm()
|
|
725
|
+
xbar
|
|
726
|
+
|
|
727
|
+
TESTS::
|
|
728
|
+
|
|
729
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
730
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
731
|
+
sage: (a+3*a*b+b).lm() # needs sage.libs.singular
|
|
732
|
+
a*b
|
|
733
|
+
"""
|
|
734
|
+
return self.__class__(self.parent(), self.__rep.lm())
|
|
735
|
+
|
|
736
|
+
def lc(self):
|
|
737
|
+
"""
|
|
738
|
+
Return the leading coefficient of this quotient ring element.
|
|
739
|
+
|
|
740
|
+
EXAMPLES::
|
|
741
|
+
|
|
742
|
+
sage: # needs sage.libs.singular
|
|
743
|
+
sage: R.<x,y,z> = PolynomialRing(GF(7), 3, order='lex')
|
|
744
|
+
sage: I = sage.rings.ideal.FieldIdeal(R)
|
|
745
|
+
sage: Q = R.quo(I)
|
|
746
|
+
sage: f = Q(z*y + 2*x)
|
|
747
|
+
sage: f.lc()
|
|
748
|
+
2
|
|
749
|
+
|
|
750
|
+
TESTS::
|
|
751
|
+
|
|
752
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
|
|
753
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
754
|
+
sage: (a + 3*a*b + b).lc() # needs sage.libs.singular
|
|
755
|
+
3
|
|
756
|
+
"""
|
|
757
|
+
return self.__rep.lc()
|
|
758
|
+
|
|
759
|
+
def variables(self):
|
|
760
|
+
"""
|
|
761
|
+
Return all variables occurring in ``self``.
|
|
762
|
+
|
|
763
|
+
OUTPUT:
|
|
764
|
+
|
|
765
|
+
A tuple of linear monomials, one for each variable occurring
|
|
766
|
+
in ``self``.
|
|
767
|
+
|
|
768
|
+
EXAMPLES::
|
|
769
|
+
|
|
770
|
+
sage: # needs sage.libs.singular
|
|
771
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a)
|
|
772
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
773
|
+
sage: a.variables()
|
|
774
|
+
(a,)
|
|
775
|
+
sage: b.variables()
|
|
776
|
+
(b,)
|
|
777
|
+
sage: s = a^2 + b^2 + 1; s
|
|
778
|
+
1
|
|
779
|
+
sage: s.variables()
|
|
780
|
+
()
|
|
781
|
+
sage: (a + b).variables()
|
|
782
|
+
(a, b)
|
|
783
|
+
"""
|
|
784
|
+
return tuple(self.__class__(self.parent(), v) for v in self.__rep.variables())
|
|
785
|
+
|
|
786
|
+
def monomials(self):
|
|
787
|
+
"""
|
|
788
|
+
Return the monomials in ``self``.
|
|
789
|
+
|
|
790
|
+
OUTPUT: list of monomials
|
|
791
|
+
|
|
792
|
+
EXAMPLES::
|
|
793
|
+
|
|
794
|
+
sage: # needs sage.libs.singular
|
|
795
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a)
|
|
796
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
797
|
+
sage: a.monomials()
|
|
798
|
+
[a]
|
|
799
|
+
sage: (a + a*b).monomials()
|
|
800
|
+
[a*b, a]
|
|
801
|
+
sage: R.zero().monomials()
|
|
802
|
+
[]
|
|
803
|
+
"""
|
|
804
|
+
return [self.__class__(self.parent(), m) for m in self.__rep.monomials()]
|
|
805
|
+
|
|
806
|
+
def _singular_(self, singular=None):
|
|
807
|
+
"""
|
|
808
|
+
Return Singular representation of ``self``.
|
|
809
|
+
|
|
810
|
+
INPUT:
|
|
811
|
+
|
|
812
|
+
- ``singular`` -- a non-standard interpreter may be provided
|
|
813
|
+
|
|
814
|
+
EXAMPLES::
|
|
815
|
+
|
|
816
|
+
sage: # needs sage.libs.singular
|
|
817
|
+
sage: P.<x,y> = PolynomialRing(GF(2), 2)
|
|
818
|
+
sage: I = sage.rings.ideal.FieldIdeal(P)
|
|
819
|
+
sage: Q = P.quo(I)
|
|
820
|
+
sage: Q._singular_()
|
|
821
|
+
polynomial ring, over a field, global ordering
|
|
822
|
+
// coefficients: ZZ/2...
|
|
823
|
+
// number of vars : 2
|
|
824
|
+
// block 1 : ordering dp
|
|
825
|
+
// : names x y
|
|
826
|
+
// block 2 : ordering C
|
|
827
|
+
// quotient ring from ideal
|
|
828
|
+
_[1]=x2+x
|
|
829
|
+
_[2]=y2+y
|
|
830
|
+
sage: xbar = Q(x); xbar
|
|
831
|
+
xbar
|
|
832
|
+
sage: xbar._singular_()
|
|
833
|
+
x
|
|
834
|
+
sage: Q(xbar._singular_()) # a round-trip
|
|
835
|
+
xbar
|
|
836
|
+
|
|
837
|
+
TESTS::
|
|
838
|
+
|
|
839
|
+
sage: # needs sage.libs.singular
|
|
840
|
+
sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a)
|
|
841
|
+
<class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
|
|
842
|
+
sage: (a - 2/3*b)._singular_()
|
|
843
|
+
x-2/3*y
|
|
844
|
+
sage: S((a - 2/3*b)._singular_())
|
|
845
|
+
a - 2/3*b
|
|
846
|
+
"""
|
|
847
|
+
if singular is None:
|
|
848
|
+
singular = singular_default
|
|
849
|
+
if singular is None:
|
|
850
|
+
raise ImportError("could not import singular")
|
|
851
|
+
return self.__rep._singular_(singular)
|
|
852
|
+
|
|
853
|
+
def _magma_init_(self, magma):
|
|
854
|
+
"""
|
|
855
|
+
Return the Magma representation of this quotient ring element.
|
|
856
|
+
|
|
857
|
+
EXAMPLES::
|
|
858
|
+
|
|
859
|
+
sage: # needs sage.libs.singular
|
|
860
|
+
sage: P.<x,y> = PolynomialRing(GF(2))
|
|
861
|
+
sage: Q = P.quotient(sage.rings.ideal.FieldIdeal(P))
|
|
862
|
+
sage: xbar, ybar = Q.gens()
|
|
863
|
+
sage: magma(xbar) # optional - magma
|
|
864
|
+
x
|
|
865
|
+
sage: xbar._magma_init_(magma) # optional - magma
|
|
866
|
+
'_sage_[...]!_sage_ref...'
|
|
867
|
+
"""
|
|
868
|
+
g = magma(self.__rep)
|
|
869
|
+
R = magma(self.parent())
|
|
870
|
+
return '{}!{}'.format(R.name(), g._ref())
|
|
871
|
+
|
|
872
|
+
def _macaulay2_(self, macaulay2=None):
|
|
873
|
+
"""
|
|
874
|
+
The Macaulay2 element corresponding to this polynomial.
|
|
875
|
+
|
|
876
|
+
EXAMPLES::
|
|
877
|
+
|
|
878
|
+
sage: # needs sage.libs.singular
|
|
879
|
+
sage: R.<x,y> = PolynomialRing(GF(7), 2)
|
|
880
|
+
sage: Q = R.quotient([x^2 - y])
|
|
881
|
+
sage: x, y = Q.gens()
|
|
882
|
+
sage: f = (x^3 + 2*y^2*x)^7; f
|
|
883
|
+
2*xbar*ybar^17 + xbar*ybar^10
|
|
884
|
+
sage: mf = macaulay2(f); mf # optional - macaulay2
|
|
885
|
+
17 10
|
|
886
|
+
2x*y + x*y
|
|
887
|
+
sage: mf.sage() # optional - macaulay2
|
|
888
|
+
2*x*y^17 + x*y^10
|
|
889
|
+
sage: mf.sage() == f # optional - macaulay2
|
|
890
|
+
True
|
|
891
|
+
sage: Q(mf) # optional - macaulay2
|
|
892
|
+
2*xbar*ybar^17 + xbar*ybar^10
|
|
893
|
+
|
|
894
|
+
In Macaulay2, the variable names for a quotient ring are inherited from
|
|
895
|
+
the variable names of the ambient ring. This is in contrast to Sage's
|
|
896
|
+
default behaviour in which the variable names for the quotient ring are
|
|
897
|
+
obtained by appending ``bar`` to the variable names of the ambient
|
|
898
|
+
ring. This can be controlled using the ``names`` argument of the
|
|
899
|
+
``quotient`` method.
|
|
900
|
+
|
|
901
|
+
::
|
|
902
|
+
|
|
903
|
+
sage: # needs sage.libs.singular
|
|
904
|
+
sage: R.<x,y> = PolynomialRing(GF(7), 2)
|
|
905
|
+
sage: Q = R.quotient([x^2 - y], names=R.gens())
|
|
906
|
+
sage: x, y = Q.gens()
|
|
907
|
+
sage: f = (x^3 + 2*y^2*x)^7; f
|
|
908
|
+
2*x*y^17 + x*y^10
|
|
909
|
+
sage: macaulay2(f) # optional - macaulay2
|
|
910
|
+
17 10
|
|
911
|
+
2x*y + x*y
|
|
912
|
+
sage: _.sage() # optional - macaulay2
|
|
913
|
+
2*x*y^17 + x*y^10
|
|
914
|
+
|
|
915
|
+
TESTS:
|
|
916
|
+
|
|
917
|
+
Check that changing the currently defined global variables (`x`, `y`,
|
|
918
|
+
...) in Macaulay2 does not affect the result of this conversion::
|
|
919
|
+
|
|
920
|
+
sage: # needs sage.libs.singular
|
|
921
|
+
sage: R.<x,y> = PolynomialRing(GF(7), 2)
|
|
922
|
+
sage: Q = R.quotient([x^2 - y], names=R.gens())
|
|
923
|
+
sage: x, y = Q.gens()
|
|
924
|
+
sage: f = (x^3 + 2*y^2*x)^7
|
|
925
|
+
sage: macaulay2(f) # optional - macaulay2
|
|
926
|
+
17 10
|
|
927
|
+
2x*y + x*y
|
|
928
|
+
sage: macaulay2.use(R.quotient([x, y])) # optional - macaulay2
|
|
929
|
+
sage: macaulay2(f) # optional - macaulay2
|
|
930
|
+
17 10
|
|
931
|
+
2x*y + x*y
|
|
932
|
+
"""
|
|
933
|
+
if macaulay2 is None:
|
|
934
|
+
from sage.interfaces.macaulay2 import macaulay2 as m2_default
|
|
935
|
+
macaulay2 = m2_default
|
|
936
|
+
m2_parent = self.parent()._macaulay2_(macaulay2)
|
|
937
|
+
macaulay2.use(m2_parent)
|
|
938
|
+
return macaulay2.substitute(repr(self.lift()), m2_parent)
|
|
939
|
+
|
|
940
|
+
def reduce(self, G):
|
|
941
|
+
r"""
|
|
942
|
+
Reduce this quotient ring element by a set of quotient ring
|
|
943
|
+
elements ``G``.
|
|
944
|
+
|
|
945
|
+
INPUT:
|
|
946
|
+
|
|
947
|
+
- ``G`` -- list of quotient ring elements
|
|
948
|
+
|
|
949
|
+
.. WARNING::
|
|
950
|
+
|
|
951
|
+
This method is not guaranteed to return unique minimal results.
|
|
952
|
+
For quotients of polynomial rings, use
|
|
953
|
+
:meth:`~sage.rings.polynomial.multi_polynomial_ideal.MPolynomialIdeal.reduce`
|
|
954
|
+
on the ideal generated by ``G``, instead.
|
|
955
|
+
|
|
956
|
+
EXAMPLES::
|
|
957
|
+
|
|
958
|
+
sage: # needs sage.libs.singular
|
|
959
|
+
sage: P.<a,b,c,d,e> = PolynomialRing(GF(2), 5, order='lex')
|
|
960
|
+
sage: I1 = ideal([a*b + c*d + 1, a*c*e + d*e,
|
|
961
|
+
....: a*b*e + c*e, b*c + c*d*e + 1])
|
|
962
|
+
sage: Q = P.quotient(sage.rings.ideal.FieldIdeal(P))
|
|
963
|
+
sage: I2 = ideal([Q(f) for f in I1.gens()])
|
|
964
|
+
sage: f = Q((a*b + c*d + 1)^2 + e)
|
|
965
|
+
sage: f.reduce(I2.gens())
|
|
966
|
+
ebar
|
|
967
|
+
|
|
968
|
+
Notice that the result above is not minimal::
|
|
969
|
+
|
|
970
|
+
sage: I2.reduce(f) # needs sage.libs.singular
|
|
971
|
+
0
|
|
972
|
+
"""
|
|
973
|
+
try:
|
|
974
|
+
G = [f.lift() for f in G]
|
|
975
|
+
except TypeError:
|
|
976
|
+
pass
|
|
977
|
+
# reduction w.r.t. the defining ideal is performed in the
|
|
978
|
+
# constructor
|
|
979
|
+
return self.__class__(self.parent(), self.__rep.reduce(G))
|