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,590 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
# sage.doctest: needs sage.libs.singular sage.modules (because all doctests need laurent_polynomial_mpair, Groebner bases)
|
|
3
|
+
r"""
|
|
4
|
+
Ideals in Laurent polynomial rings.
|
|
5
|
+
|
|
6
|
+
For `R` a commutative ring, ideals in the Laurent polynomial ring
|
|
7
|
+
`R[x_1^{\pm 1}, x_2^{\pm 1}, \ldots, x_n^{\pm 1}]` are implemented as
|
|
8
|
+
ideals in the ordinary polynomial ring `R[x_1, \ldots, x_n]` which are
|
|
9
|
+
saturated with respect to the ideal `(x_1 \cdots x_n)`.
|
|
10
|
+
|
|
11
|
+
AUTHORS:
|
|
12
|
+
|
|
13
|
+
- Kiran S. Kedlaya (2020): initial implementation
|
|
14
|
+
"""
|
|
15
|
+
# ****************************************************************************
|
|
16
|
+
# Copyright (C) 2020 Kiran S. Kedlaya <kedlaya@ucsd.edu>
|
|
17
|
+
#
|
|
18
|
+
# This program is free software: you can redistribute it and/or modify
|
|
19
|
+
# it under the terms of the GNU General Public License as published by
|
|
20
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
21
|
+
# (at your option) any later version.
|
|
22
|
+
# https://www.gnu.org/licenses/
|
|
23
|
+
# ****************************************************************************
|
|
24
|
+
|
|
25
|
+
from sage.rings.ideal import Ideal_generic
|
|
26
|
+
from sage.rings.polynomial.laurent_polynomial_ring import LaurentPolynomialRing_univariate
|
|
27
|
+
from sage.structure.richcmp import op_EQ, op_NE, op_LT, op_LE, op_GT, op_GE
|
|
28
|
+
from sage.arith.misc import GCD
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class LaurentPolynomialIdeal( Ideal_generic ):
|
|
32
|
+
def __init__(self, ring, gens, coerce=True, hint=None):
|
|
33
|
+
r"""
|
|
34
|
+
Create an ideal in a Laurent polynomial ring.
|
|
35
|
+
|
|
36
|
+
To compute structural properties of an ideal in the Laurent polynomial ring
|
|
37
|
+
`R[x_1^{\pm},\ldots,x_n^{\pm}]`, we form the corresponding ideal in the
|
|
38
|
+
associated ordinary polynomial ring `R[x_1,\ldots,x_n]` which is saturated
|
|
39
|
+
with respect to the ideal `(x_1 \cdots x_n)`. Since computing the saturation
|
|
40
|
+
can be expensive, we employ some strategies to reduce the need for it.
|
|
41
|
+
|
|
42
|
+
- We only create the polynomial ideal as needed.
|
|
43
|
+
|
|
44
|
+
- For some operations, we try some superficial tests first. E.g., for
|
|
45
|
+
comparisons, we first look directly at generators.
|
|
46
|
+
- The attribute ``hint`` is a lower bound on the associated polynomial ideal.
|
|
47
|
+
Hints are automatically forwarded by certain creation operations (such as
|
|
48
|
+
sums and base extensions), and can be manually forwarded in other cases.
|
|
49
|
+
|
|
50
|
+
INPUT:
|
|
51
|
+
|
|
52
|
+
- ``ring`` -- the ring the ideal is defined in
|
|
53
|
+
- ``gens`` -- list of generators for the ideal
|
|
54
|
+
- ``coerce`` -- whether or not to coerce elements into ``ring``
|
|
55
|
+
- ``hint`` -- an ideal in the associated polynomial ring (optional; see above)
|
|
56
|
+
|
|
57
|
+
EXAMPLES::
|
|
58
|
+
|
|
59
|
+
sage: R.<x,y> = LaurentPolynomialRing(IntegerRing(), 2, order='lex')
|
|
60
|
+
sage: R.ideal([x, y])
|
|
61
|
+
Ideal (x, y) of Multivariate Laurent Polynomial Ring in x, y
|
|
62
|
+
over Integer Ring
|
|
63
|
+
sage: R.<x0,x1> = LaurentPolynomialRing(GF(3), 2)
|
|
64
|
+
sage: R.ideal([x0^2, x1^-3])
|
|
65
|
+
Ideal (x0^2, x1^-3) of Multivariate Laurent Polynomial Ring in x0, x1
|
|
66
|
+
over Finite Field of size 3
|
|
67
|
+
|
|
68
|
+
sage: P.<x,y> = LaurentPolynomialRing(QQ, 2)
|
|
69
|
+
sage: I = P.ideal([~x + ~y - 1])
|
|
70
|
+
sage: print(I)
|
|
71
|
+
Ideal (-1 + y^-1 + x^-1) of
|
|
72
|
+
Multivariate Laurent Polynomial Ring in x, y over Rational Field
|
|
73
|
+
sage: I.is_zero()
|
|
74
|
+
False
|
|
75
|
+
sage: (x^(-2) + x^(-1)*y^(-1) - x^(-1)) in I
|
|
76
|
+
True
|
|
77
|
+
|
|
78
|
+
sage: P.<x,y,z> = LaurentPolynomialRing(QQ, 3)
|
|
79
|
+
sage: I1 = P.ideal([x*y*z + x*y + 2*y^2, x + z])
|
|
80
|
+
sage: I2 = P.ideal([x*y*z + x*y + 2*y^2 + x + z, x + z])
|
|
81
|
+
sage: I1 == I2
|
|
82
|
+
True
|
|
83
|
+
sage: I3 = P.ideal([x*y*z + x*y + 2*y^2 + x + z, x + z, y])
|
|
84
|
+
sage: I1 < I3
|
|
85
|
+
True
|
|
86
|
+
sage: I1.minimal_associated_primes()
|
|
87
|
+
(Ideal (-1/2*z^2 + y - 1/2*z, x + z) of Multivariate
|
|
88
|
+
Laurent Polynomial Ring in x, y, z over Rational Field,)
|
|
89
|
+
|
|
90
|
+
sage: K.<z> = CyclotomicField(4) # needs sage.rings.number_field
|
|
91
|
+
sage: J = I1.base_extend(K) # needs sage.rings.number_field
|
|
92
|
+
sage: J.base_ring() # needs sage.rings.number_field
|
|
93
|
+
Cyclotomic Field of order 4 and degree 2
|
|
94
|
+
"""
|
|
95
|
+
Ideal_generic.__init__(self, ring, gens, coerce=coerce)
|
|
96
|
+
self._poly_ring = ring.polynomial_ring()
|
|
97
|
+
self._poly_ideal = None # Create only as needed
|
|
98
|
+
self._saturated = False
|
|
99
|
+
if hint is None:
|
|
100
|
+
self._hint = self._poly_ring.zero_ideal()
|
|
101
|
+
else:
|
|
102
|
+
self._hint = hint.change_ring(self._poly_ring)
|
|
103
|
+
|
|
104
|
+
def set_hint(self, hint):
|
|
105
|
+
"""
|
|
106
|
+
Set the hint of this ideal.
|
|
107
|
+
|
|
108
|
+
The hint is an ideal of the associated polynomial ring, which is
|
|
109
|
+
assumed to be contained in the associated ideal. It is used internally
|
|
110
|
+
to speed up computation of the associated ideal in some cases;
|
|
111
|
+
normally the end user will have no need to work with it directly.
|
|
112
|
+
|
|
113
|
+
EXAMPLES::
|
|
114
|
+
|
|
115
|
+
sage: P.<x,y,z> = LaurentPolynomialRing(QQ, 3)
|
|
116
|
+
sage: I = P.ideal([x^2*y + 3*x*y^2])
|
|
117
|
+
sage: I.hint()
|
|
118
|
+
Ideal (0) of Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
119
|
+
sage: I.set_hint(P.polynomial_ring().ideal([x + 3*y]))
|
|
120
|
+
sage: I.hint()
|
|
121
|
+
Ideal (x + 3*y) of Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
122
|
+
"""
|
|
123
|
+
self._hint = hint
|
|
124
|
+
|
|
125
|
+
def hint(self):
|
|
126
|
+
"""
|
|
127
|
+
Return the hint of this ideal.
|
|
128
|
+
|
|
129
|
+
The hint is an ideal of the associated polynomial ring, which is
|
|
130
|
+
assumed to be contained in the associated ideal. It is used internally
|
|
131
|
+
to speed up computation of the associated ideal in some cases;
|
|
132
|
+
normally the end user will have no need to work with it directly.
|
|
133
|
+
|
|
134
|
+
EXAMPLES::
|
|
135
|
+
|
|
136
|
+
sage: P.<x,y,z> = LaurentPolynomialRing(QQ, 3)
|
|
137
|
+
sage: I = P.ideal([x^2*y + 3*x*y^2])
|
|
138
|
+
sage: I.hint()
|
|
139
|
+
Ideal (0) of Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
140
|
+
"""
|
|
141
|
+
return self._hint
|
|
142
|
+
|
|
143
|
+
# Comparisons, using the associated polynomial ideal.
|
|
144
|
+
def _richcmp_(self, right_r, op):
|
|
145
|
+
r"""
|
|
146
|
+
Comparison of ``self`` and ``right_r``.
|
|
147
|
+
|
|
148
|
+
When testing equality, we first check generators to save time.
|
|
149
|
+
|
|
150
|
+
When testing ideal containment, we do not saturate the smaller ideal.
|
|
151
|
+
|
|
152
|
+
EXAMPLES::
|
|
153
|
+
|
|
154
|
+
sage: P.<x,y,z> = LaurentPolynomialRing(QQ, 3)
|
|
155
|
+
sage: I1 = P.ideal([x*y*z+x*y+2*y^2, x+z])
|
|
156
|
+
sage: I2 = P.ideal([x*y*z+x*y+2*y^2+x+z, x+z])
|
|
157
|
+
sage: I1 == I2
|
|
158
|
+
True
|
|
159
|
+
sage: I1 != I2
|
|
160
|
+
False
|
|
161
|
+
sage: I3 = P.ideal([x*y*z+x*y+2*y^2+x+z, x+z, y])
|
|
162
|
+
sage: I1 <= I3
|
|
163
|
+
True
|
|
164
|
+
sage: I3 >= I1
|
|
165
|
+
True
|
|
166
|
+
sage: I1 < I3
|
|
167
|
+
True
|
|
168
|
+
sage: I3 > I1
|
|
169
|
+
True
|
|
170
|
+
"""
|
|
171
|
+
if op in (op_EQ, op_NE):
|
|
172
|
+
if set(self.gens()) == set(right_r.gens()): # Early abort
|
|
173
|
+
return (op == op_EQ)
|
|
174
|
+
return ((self.polynomial_ideal() == right_r.polynomial_ideal()) == (op == op_EQ))
|
|
175
|
+
elif op == op_LE:
|
|
176
|
+
if all(f in right_r.gens() for f in self.gens()): # Early abort
|
|
177
|
+
return True
|
|
178
|
+
return self.polynomial_ideal(saturate=False) <= right_r.polynomial_ideal()
|
|
179
|
+
elif op == op_GE:
|
|
180
|
+
return right_r._richcmp_(self, op_LE)
|
|
181
|
+
elif op == op_LT:
|
|
182
|
+
return self._richcmp_(right_r, op_LE) and self._richcmp_(right_r, op_NE)
|
|
183
|
+
elif op == op_GT:
|
|
184
|
+
return right_r._richcmp_(self, op_LE) and right_r._richcmp_(self, op_NE)
|
|
185
|
+
else:
|
|
186
|
+
raise ValueError("invalid comparison")
|
|
187
|
+
|
|
188
|
+
def __contains__(self, f):
|
|
189
|
+
"""
|
|
190
|
+
Implement containment testing (in) for Laurent polynomial ideals.
|
|
191
|
+
|
|
192
|
+
EXAMPLES::
|
|
193
|
+
|
|
194
|
+
sage: P.<x,y> = LaurentPolynomialRing(QQ, 2)
|
|
195
|
+
sage: I = P.ideal([x^2*y + 3*x*y^2])
|
|
196
|
+
sage: x + 3*y in I
|
|
197
|
+
True
|
|
198
|
+
|
|
199
|
+
This also works in the univariate case::
|
|
200
|
+
|
|
201
|
+
sage: P.<x> = LaurentPolynomialRing(QQ)
|
|
202
|
+
sage: I = P.ideal([x^2 + 3*x])
|
|
203
|
+
sage: 1 + 3*x^-1 in I
|
|
204
|
+
True
|
|
205
|
+
"""
|
|
206
|
+
if not f or f in self.gens():
|
|
207
|
+
return True
|
|
208
|
+
f = self.ring()(f)
|
|
209
|
+
if isinstance(self.ring(), LaurentPolynomialRing_univariate):
|
|
210
|
+
g = f.__reduce__()[1][1]
|
|
211
|
+
else:
|
|
212
|
+
g = f.__reduce__()[1][0]
|
|
213
|
+
return (g in self.polynomial_ideal())
|
|
214
|
+
|
|
215
|
+
def gens_reduced(self) -> tuple:
|
|
216
|
+
"""
|
|
217
|
+
Return a reduced system of generators.
|
|
218
|
+
|
|
219
|
+
EXAMPLES::
|
|
220
|
+
|
|
221
|
+
sage: P.<x,y> = LaurentPolynomialRing(QQ)
|
|
222
|
+
sage: J = P.ideal([x^2 - y^-2, x * y^3 + 2 * y^2+ y])
|
|
223
|
+
sage: J.gens_reduced()
|
|
224
|
+
(x + 6*y + 5, 3*y^2 + 4*y + 1)
|
|
225
|
+
"""
|
|
226
|
+
R = self.ring()
|
|
227
|
+
J = self.polynomial_ideal()
|
|
228
|
+
return tuple([R(p) for p in J.gens()])
|
|
229
|
+
|
|
230
|
+
# Operations on ideals
|
|
231
|
+
|
|
232
|
+
def change_ring(self, R, hint=None):
|
|
233
|
+
"""
|
|
234
|
+
Coerce an ideal into a new ring.
|
|
235
|
+
|
|
236
|
+
This operation does not forward hints, but a new hint can be
|
|
237
|
+
specified manually.
|
|
238
|
+
|
|
239
|
+
EXAMPLES::
|
|
240
|
+
|
|
241
|
+
sage: P.<x,y> = LaurentPolynomialRing(QQ, 2)
|
|
242
|
+
sage: I = P.ideal([x + y])
|
|
243
|
+
sage: Q.<x,y,z> = LaurentPolynomialRing(QQ, 3)
|
|
244
|
+
sage: I.change_ring(Q)
|
|
245
|
+
Ideal (x + y) of Multivariate Laurent Polynomial Ring in x, y, z
|
|
246
|
+
over Rational Field
|
|
247
|
+
"""
|
|
248
|
+
return R.ideal(self.gens(), hint=hint)
|
|
249
|
+
|
|
250
|
+
def base_extend(self, F):
|
|
251
|
+
"""
|
|
252
|
+
Form the base extension of ``self`` to the base ring ``F``.
|
|
253
|
+
|
|
254
|
+
This operation forwards hints.
|
|
255
|
+
|
|
256
|
+
EXAMPLES::
|
|
257
|
+
|
|
258
|
+
sage: P.<x,y> = LaurentPolynomialRing(QQ, 2)
|
|
259
|
+
sage: I = P.ideal([x + y])
|
|
260
|
+
sage: K.<z> = CyclotomicField(3) # needs sage.rings.number_field
|
|
261
|
+
sage: I.base_extend(K) # needs sage.rings.number_field
|
|
262
|
+
Ideal (x + y) of Multivariate Laurent Polynomial Ring in x, y
|
|
263
|
+
over Cyclotomic Field of order 3 and degree 2
|
|
264
|
+
"""
|
|
265
|
+
ring = self.ring()
|
|
266
|
+
return self.change_ring(ring.change_ring(F), hint=self._hint)
|
|
267
|
+
|
|
268
|
+
def apply_map(self, f, new_ring=None, new_base_ring=None, apply_to_hint=None):
|
|
269
|
+
"""
|
|
270
|
+
Return the new ideal obtained by applying ``f`` to each generator.
|
|
271
|
+
|
|
272
|
+
By default, this does not forward hints. To do so, set ``apply_to_hint``
|
|
273
|
+
to specify a function to apply to generators of ``hint``.
|
|
274
|
+
|
|
275
|
+
EXAMPLES::
|
|
276
|
+
|
|
277
|
+
sage: P.<x,y> = LaurentPolynomialRing(QQ, 2)
|
|
278
|
+
sage: I = P.ideal([x + 1, y - 1])
|
|
279
|
+
sage: I.apply_map(lambda z: z + 2)
|
|
280
|
+
Ideal (x + 3, y + 1) of Multivariate Laurent Polynomial Ring in x, y
|
|
281
|
+
over Rational Field
|
|
282
|
+
sage: K.<i> = CyclotomicField(4) # needs sage.rings.number_field
|
|
283
|
+
sage: I.apply_map(lambda z: z + 2, new_base_ring=K) # needs sage.rings.number_field
|
|
284
|
+
Ideal (x + 3, y + 1) of Multivariate Laurent Polynomial Ring in x, y
|
|
285
|
+
over Cyclotomic Field of order 4 and degree 2
|
|
286
|
+
"""
|
|
287
|
+
ring = self.ring()
|
|
288
|
+
if new_ring is not None:
|
|
289
|
+
R = new_ring
|
|
290
|
+
elif new_base_ring is not None:
|
|
291
|
+
R = ring.change_ring(new_base_ring)
|
|
292
|
+
else:
|
|
293
|
+
R = ring
|
|
294
|
+
if apply_to_hint:
|
|
295
|
+
hint = self._poly_ring.ideal([apply_to_hint(x) for x in self._hint.gens()])
|
|
296
|
+
else:
|
|
297
|
+
hint = None
|
|
298
|
+
return R.ideal(tuple(f(x) for x in self.gens()), hint=hint)
|
|
299
|
+
|
|
300
|
+
def apply_coeff_map(self, f, new_base_ring=None, forward_hint=True):
|
|
301
|
+
"""
|
|
302
|
+
Apply a function to coefficients.
|
|
303
|
+
|
|
304
|
+
This operation forwards hints by default.
|
|
305
|
+
|
|
306
|
+
EXAMPLES::
|
|
307
|
+
|
|
308
|
+
sage: # needs sage.rings.number_field
|
|
309
|
+
sage: K.<z> = CyclotomicField(3)
|
|
310
|
+
sage: P.<x,y> = LaurentPolynomialRing(K, 2)
|
|
311
|
+
sage: I = P.ideal([x + z, y - z])
|
|
312
|
+
sage: h = K.hom([z^2])
|
|
313
|
+
sage: I.apply_coeff_map(h)
|
|
314
|
+
Ideal (x - z - 1, y + z + 1) of Multivariate Laurent Polynomial Ring
|
|
315
|
+
in x, y over Cyclotomic Field of order 3 and degree 2
|
|
316
|
+
sage: K1.<z1> = CyclotomicField(12)
|
|
317
|
+
sage: h1 = K.hom([z1^4])
|
|
318
|
+
sage: I.apply_coeff_map(h1, new_base_ring=K1)
|
|
319
|
+
Ideal (x + z1^2 - 1, y - z1^2 + 1) of Multivariate Laurent Polynomial Ring
|
|
320
|
+
in x, y over Cyclotomic Field of order 12 and degree 4
|
|
321
|
+
"""
|
|
322
|
+
ring = self.ring()
|
|
323
|
+
if new_base_ring is None:
|
|
324
|
+
R = ring
|
|
325
|
+
else:
|
|
326
|
+
R = ring.change_ring(new_base_ring)
|
|
327
|
+
if forward_hint:
|
|
328
|
+
apply_to_hint = lambda x,f=f: x.map_coefficients(f)
|
|
329
|
+
else:
|
|
330
|
+
apply_to_hint = None
|
|
331
|
+
return self.apply_map(lambda x,f=f:
|
|
332
|
+
x.map_coefficients(f, new_base_ring=new_base_ring),
|
|
333
|
+
new_ring=R, apply_to_hint=apply_to_hint)
|
|
334
|
+
|
|
335
|
+
def toric_coordinate_change(self, M, forward_hint=True):
|
|
336
|
+
"""
|
|
337
|
+
Compute the toric change of coordinates defined by the integer matrix ``M``.
|
|
338
|
+
|
|
339
|
+
This operation forwards hints by default.
|
|
340
|
+
|
|
341
|
+
EXAMPLES::
|
|
342
|
+
|
|
343
|
+
sage: # needs sage.rings.number_field
|
|
344
|
+
sage: K.<z> = CyclotomicField(3)
|
|
345
|
+
sage: P.<x,y> = LaurentPolynomialRing(K, 2)
|
|
346
|
+
sage: I = P.ideal([x + 1, y - 1])
|
|
347
|
+
sage: M = Matrix([[2,1], [1,-3]])
|
|
348
|
+
sage: I.toric_coordinate_change(M)
|
|
349
|
+
Ideal (x^2*y + 1, -1 + x*y^-3) of Multivariate Laurent Polynomial Ring
|
|
350
|
+
in x, y over Cyclotomic Field of order 3 and degree 2
|
|
351
|
+
"""
|
|
352
|
+
if forward_hint:
|
|
353
|
+
R = self.ring()
|
|
354
|
+
apply_to_hint = lambda x, M=M, R=R: R(x).toric_coordinate_change(M).monomial_reduction()[0]
|
|
355
|
+
else:
|
|
356
|
+
apply_to_hint = None
|
|
357
|
+
return self.apply_map(lambda x, M=M: x.toric_coordinate_change(M),
|
|
358
|
+
apply_to_hint=apply_to_hint)
|
|
359
|
+
|
|
360
|
+
def __add__(self, other):
|
|
361
|
+
"""
|
|
362
|
+
Return the sum of two ideals in the same ring.
|
|
363
|
+
|
|
364
|
+
Currently this operation does not support coercion.
|
|
365
|
+
|
|
366
|
+
This operation forwards hints.
|
|
367
|
+
|
|
368
|
+
EXAMPLES::
|
|
369
|
+
|
|
370
|
+
sage: P.<x,y> = LaurentPolynomialRing(QQ, 2)
|
|
371
|
+
sage: I = P.ideal([x+y])
|
|
372
|
+
sage: J = P.ideal([y+1])
|
|
373
|
+
sage: (I+J).groebner_basis()
|
|
374
|
+
(x - 1, y + 1)
|
|
375
|
+
"""
|
|
376
|
+
ring = self.ring()
|
|
377
|
+
ring2 = other.ring()
|
|
378
|
+
if ring != ring2:
|
|
379
|
+
return ValueError("ambient rings are not equal")
|
|
380
|
+
hint = self._hint
|
|
381
|
+
if hint.is_zero():
|
|
382
|
+
hint = other._hint
|
|
383
|
+
elif not other._hint.is_zero():
|
|
384
|
+
hint += other._hint
|
|
385
|
+
return ring.ideal(self.gens() + other.gens(), hint=hint)
|
|
386
|
+
|
|
387
|
+
def normalize_gens(self):
|
|
388
|
+
"""
|
|
389
|
+
Redefine the ideal with a normalized set of generators.
|
|
390
|
+
|
|
391
|
+
For two ideals returned by this function, equality testing can be done
|
|
392
|
+
by comparing generators.
|
|
393
|
+
|
|
394
|
+
This operation forwards hints.
|
|
395
|
+
|
|
396
|
+
EXAMPLES::
|
|
397
|
+
|
|
398
|
+
sage: P.<x,y> = LaurentPolynomialRing(QQ, 2)
|
|
399
|
+
sage: I = P.ideal([~x+y])
|
|
400
|
+
sage: J = P.ideal([y+1])
|
|
401
|
+
sage: I + J
|
|
402
|
+
Ideal (y + x^-1, y + 1) of Multivariate Laurent Polynomial Ring
|
|
403
|
+
in x, y over Rational Field
|
|
404
|
+
sage: (I + J).normalize_gens()
|
|
405
|
+
Ideal (x - 1, y + 1) of Multivariate Laurent Polynomial Ring
|
|
406
|
+
in x, y over Rational Field
|
|
407
|
+
"""
|
|
408
|
+
return self.ring().ideal(self.groebner_basis(), hint=self._hint)
|
|
409
|
+
|
|
410
|
+
# Structural queries and properties
|
|
411
|
+
|
|
412
|
+
def polynomial_ideal(self, saturate=True):
|
|
413
|
+
"""
|
|
414
|
+
Return the associated polynomial ideal.
|
|
415
|
+
|
|
416
|
+
By default, the ideal is saturated with respect to the product of the
|
|
417
|
+
polynomial ring generators; this is necessary for testing equality and inclusion.
|
|
418
|
+
As saturation can be quite time-consuming, it can be disabled by setting
|
|
419
|
+
``saturate=False``; however, the result will then depend not just on the original ideal
|
|
420
|
+
but also on the choice of generators.
|
|
421
|
+
|
|
422
|
+
EXAMPLES::
|
|
423
|
+
|
|
424
|
+
sage: P.<x,y> = LaurentPolynomialRing(QQ, 2)
|
|
425
|
+
sage: I = P.ideal([x^2*y + 3*x*y^2])
|
|
426
|
+
sage: I.polynomial_ideal()
|
|
427
|
+
Ideal (x + 3*y) of Multivariate Polynomial Ring in x, y over Rational Field
|
|
428
|
+
sage: P.<t> = LaurentPolynomialRing(QQ)
|
|
429
|
+
sage: J = P.ideal(t^2 - t^-1)
|
|
430
|
+
sage: J.polynomial_ideal()
|
|
431
|
+
Principal ideal (t^3 - 1) of Univariate Polynomial Ring in t over Rational Field
|
|
432
|
+
sage: J = P.ideal([t^2 - t^-1, t + t^-1])
|
|
433
|
+
sage: J.polynomial_ideal()
|
|
434
|
+
Principal ideal (1) of Univariate Polynomial Ring in t over Rational Field
|
|
435
|
+
sage: J = P.ideal([t^2 - t^-1, t - t^-1])
|
|
436
|
+
sage: J.polynomial_ideal()
|
|
437
|
+
Principal ideal (t - 1) of Univariate Polynomial Ring in t over Rational Field
|
|
438
|
+
"""
|
|
439
|
+
P = self.ring()
|
|
440
|
+
Q = self._poly_ring
|
|
441
|
+
if isinstance(self.ring(), LaurentPolynomialRing_univariate):
|
|
442
|
+
a = [Q(p.polynomial_construction()[0]) for p in self.gens()]
|
|
443
|
+
if P.base_ring().is_field():
|
|
444
|
+
a = GCD(a)
|
|
445
|
+
return Q.ideal(a)
|
|
446
|
+
if self._poly_ideal is not None and (self._saturated or not saturate):
|
|
447
|
+
return self._poly_ideal
|
|
448
|
+
gens = self.gens()
|
|
449
|
+
if len(gens) == 0:
|
|
450
|
+
id = Q.ideal([])
|
|
451
|
+
self._poly_ideal = id
|
|
452
|
+
self._hint = id
|
|
453
|
+
self._saturated = True
|
|
454
|
+
return id
|
|
455
|
+
l2 = [f.__reduce__()[1][0] for f in gens]
|
|
456
|
+
hint = self._hint
|
|
457
|
+
l2 += list(hint.groebner_basis())
|
|
458
|
+
I = Q.ideal(l2)
|
|
459
|
+
if not saturate:
|
|
460
|
+
self._poly_ideal = I
|
|
461
|
+
self._hint = I
|
|
462
|
+
return Q.ideal(l2)
|
|
463
|
+
n = P.ngens()
|
|
464
|
+
I = I.saturation(Q.ideal([Q.monomial(*((1,) * n))]))[0]
|
|
465
|
+
self._poly_ideal = I
|
|
466
|
+
self._hint = I
|
|
467
|
+
self._saturated = True
|
|
468
|
+
return I
|
|
469
|
+
|
|
470
|
+
def groebner_basis(self, saturate=True):
|
|
471
|
+
"""
|
|
472
|
+
Return the reduced Groebner basis for the specified term order.
|
|
473
|
+
|
|
474
|
+
EXAMPLES::
|
|
475
|
+
|
|
476
|
+
sage: P.<x,y> = LaurentPolynomialRing(QQ, 2)
|
|
477
|
+
sage: I = P.ideal([x + y])
|
|
478
|
+
sage: J = P.ideal([y + 1])
|
|
479
|
+
sage: (I + J).groebner_basis()
|
|
480
|
+
(x - 1, y + 1)
|
|
481
|
+
"""
|
|
482
|
+
l = self.polynomial_ideal(saturate=saturate).groebner_basis()
|
|
483
|
+
return tuple(self.ring()(x) for x in l)
|
|
484
|
+
|
|
485
|
+
def is_one(self):
|
|
486
|
+
"""
|
|
487
|
+
Determine whether or not ``self`` is the unit ideal.
|
|
488
|
+
|
|
489
|
+
This requires saturation of the polynomial ideal.
|
|
490
|
+
|
|
491
|
+
EXAMPLES::
|
|
492
|
+
|
|
493
|
+
sage: P.<x,y> = LaurentPolynomialRing(QQ, 2)
|
|
494
|
+
sage: I = P.ideal([~x + ~y - 1, x + y])
|
|
495
|
+
sage: I.is_one()
|
|
496
|
+
True
|
|
497
|
+
"""
|
|
498
|
+
return self.polynomial_ideal().is_one()
|
|
499
|
+
|
|
500
|
+
def is_binomial(self, groebner_basis=False):
|
|
501
|
+
"""
|
|
502
|
+
Determine whether every generator of ``self`` is a binomial.
|
|
503
|
+
|
|
504
|
+
If ``groebner_basis`` is True, this becomes intrinsic (for a choice of
|
|
505
|
+
term order).
|
|
506
|
+
|
|
507
|
+
EXAMPLES::
|
|
508
|
+
|
|
509
|
+
sage: P.<x,y> = LaurentPolynomialRing(QQ, 2)
|
|
510
|
+
sage: I = P.ideal([x + y])
|
|
511
|
+
sage: I.is_binomial()
|
|
512
|
+
True
|
|
513
|
+
"""
|
|
514
|
+
if groebner_basis:
|
|
515
|
+
l = self.groebner_basis()
|
|
516
|
+
else:
|
|
517
|
+
l = self.gens()
|
|
518
|
+
return all(not f or f.number_of_terms() == 2 for f in l)
|
|
519
|
+
|
|
520
|
+
def associated_primes(self):
|
|
521
|
+
"""
|
|
522
|
+
Return associated primes of this ideal.
|
|
523
|
+
|
|
524
|
+
These are computed from the polynomial ideal, but it is not necessary to
|
|
525
|
+
saturate. Instead, we omit primes containing any polynomial generator.
|
|
526
|
+
|
|
527
|
+
EXAMPLES::
|
|
528
|
+
|
|
529
|
+
sage: P.<x,y,z> = LaurentPolynomialRing(QQ, 3)
|
|
530
|
+
sage: p = z^2 + 1; q = z^3 + 2
|
|
531
|
+
sage: I = P.ideal((p*q^2, y - z^2))
|
|
532
|
+
sage: tuple(sorted(I.associated_primes(), key=str))
|
|
533
|
+
(Ideal (y + 1, z^2 + 1) of
|
|
534
|
+
Multivariate Laurent Polynomial Ring in x, y, z over Rational Field,
|
|
535
|
+
Ideal (z^2 - y, y*z + 2, y^2 + 2*z) of
|
|
536
|
+
Multivariate Laurent Polynomial Ring in x, y, z over Rational Field)
|
|
537
|
+
"""
|
|
538
|
+
l = self.polynomial_ideal(saturate=False).associated_primes()
|
|
539
|
+
l2 = [self.ring().ideal(I.gens(), hint=I) for I in l]
|
|
540
|
+
return tuple(I for I in l2 if not I.is_one())
|
|
541
|
+
|
|
542
|
+
def minimal_associated_primes(self, saturate=False):
|
|
543
|
+
"""
|
|
544
|
+
Return minimal associated primes of this ideal.
|
|
545
|
+
|
|
546
|
+
These are computed from the polynomial ideal, but it is not necessary to
|
|
547
|
+
saturate. Instead, we omit primes containing any polynomial generator.
|
|
548
|
+
|
|
549
|
+
EXAMPLES::
|
|
550
|
+
|
|
551
|
+
sage: P.<x,y,z> = LaurentPolynomialRing(QQ, 3)
|
|
552
|
+
sage: p = z^2 + 1; q = z^3 + 2
|
|
553
|
+
sage: I = P.ideal((p*q^2, y - z^2))
|
|
554
|
+
sage: tuple(sorted(I.minimal_associated_primes(), key=str))
|
|
555
|
+
(Ideal (z^2 + 1, -z^2 + y) of
|
|
556
|
+
Multivariate Laurent Polynomial Ring in x, y, z over Rational Field,
|
|
557
|
+
Ideal (z^3 + 2, -z^2 + y) of
|
|
558
|
+
Multivariate Laurent Polynomial Ring in x, y, z over Rational Field)
|
|
559
|
+
"""
|
|
560
|
+
l = self.polynomial_ideal(saturate=saturate).minimal_associated_primes()
|
|
561
|
+
l2 = [self.ring().ideal(I.gens(), hint=I) for I in l]
|
|
562
|
+
return tuple(I for I in l2 if not I.is_one())
|
|
563
|
+
|
|
564
|
+
def radical(self):
|
|
565
|
+
"""
|
|
566
|
+
Return the radical of this ideal.
|
|
567
|
+
|
|
568
|
+
EXAMPLES::
|
|
569
|
+
|
|
570
|
+
sage: P.<x,y,z> = LaurentPolynomialRing(QQ, 3)
|
|
571
|
+
sage: I = P.ideal(((x+1)^2, (y+1)^3, ((x+1)*z)^4 + (y+1)^3 + 10*(x+1)^2))
|
|
572
|
+
sage: I.radical()
|
|
573
|
+
Ideal (y + 1, x + 1) of Multivariate Laurent Polynomial Ring in x, y, z
|
|
574
|
+
over Rational Field
|
|
575
|
+
"""
|
|
576
|
+
J = self.polynomial_ideal().radical()
|
|
577
|
+
return self.ring().ideal(J.gens())
|
|
578
|
+
|
|
579
|
+
def dimension(self):
|
|
580
|
+
"""
|
|
581
|
+
Return the dimension of this ideal.
|
|
582
|
+
|
|
583
|
+
EXAMPLES::
|
|
584
|
+
|
|
585
|
+
sage: P.<x,y,z> = LaurentPolynomialRing(QQ, 3)
|
|
586
|
+
sage: I = P.ideal(((x+1)^2, (y+1)^3, ((x+1)*z)^4 + (y+1)^3 + 10*(x+1)^2))
|
|
587
|
+
sage: I.dimension()
|
|
588
|
+
1
|
|
589
|
+
"""
|
|
590
|
+
return self.polynomial_ideal().dimension()
|