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,669 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
# sage.doctest: needs sage.libs.singular
|
|
3
|
+
r"""
|
|
4
|
+
Symmetric Reduction of Infinite Polynomials
|
|
5
|
+
|
|
6
|
+
:class:`~sage.rings.polynomial.symmetric_reduction.SymmetricReductionStrategy`
|
|
7
|
+
provides a framework for efficient symmetric reduction of Infinite
|
|
8
|
+
Polynomials, see :mod:`~sage.rings.polynomial.infinite_polynomial_element`.
|
|
9
|
+
|
|
10
|
+
AUTHORS:
|
|
11
|
+
|
|
12
|
+
- Simon King <simon.king@nuigalway.ie>
|
|
13
|
+
|
|
14
|
+
THEORY:
|
|
15
|
+
|
|
16
|
+
According to M. Aschenbrenner and C. Hillar [AB2007]_, Symmetric
|
|
17
|
+
Reduction of an element `p` of an Infinite Polynomial Ring `X` by some
|
|
18
|
+
other element `q` means the following:
|
|
19
|
+
|
|
20
|
+
1. Let `M` and `N` be the leading terms of `p` and `q`.
|
|
21
|
+
2. Test whether there is a permutation `P` that does not
|
|
22
|
+
diminish the variable indices occurring in `N`
|
|
23
|
+
and preserves their order, so that there is some term
|
|
24
|
+
`T\in X` with `T N^P = M`. If there is no such permutation,
|
|
25
|
+
return `p`.
|
|
26
|
+
3. Replace `p` by `p-T q^P` and continue with step 1.
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
When reducing one polynomial `p` with respect to a list `L` of other
|
|
30
|
+
polynomials, there usually is a choice of order on which the
|
|
31
|
+
efficiency crucially depends. Also it helps to modify the polynomials
|
|
32
|
+
on the list in order to simplify the basic reduction steps.
|
|
33
|
+
|
|
34
|
+
The preparation of `L` may be expensive. Hence, if the same list is
|
|
35
|
+
used many times then it is reasonable to perform the preparation only
|
|
36
|
+
once. This is the background of
|
|
37
|
+
:class:`~sage.rings.polynomial.symmetric_reduction.SymmetricReductionStrategy`.
|
|
38
|
+
|
|
39
|
+
Our current strategy is to keep the number of terms in the polynomials
|
|
40
|
+
as small as possible. For this, we sort `L` by increasing number of
|
|
41
|
+
terms. If several elements of `L` allow for a reduction of `p`, we
|
|
42
|
+
choose the one with the smallest number of terms. Later on, it should
|
|
43
|
+
be possible to implement further strategies for choice.
|
|
44
|
+
|
|
45
|
+
When adding a new polynomial `q` to `L`, we first reduce `q` with
|
|
46
|
+
respect to `L`. Then, we test heuristically whether it is possible to
|
|
47
|
+
reduce the number of terms of the elements of `L` by reduction modulo
|
|
48
|
+
`q`. That way, we see best chances to keep the number of terms in
|
|
49
|
+
intermediate reduction steps relatively small.
|
|
50
|
+
|
|
51
|
+
EXAMPLES:
|
|
52
|
+
|
|
53
|
+
First, we create an infinite polynomial ring and one of its elements::
|
|
54
|
+
|
|
55
|
+
sage: X.<x,y> = InfinitePolynomialRing(QQ)
|
|
56
|
+
sage: p = y[1]*y[3] + y[1]^2*x[3]
|
|
57
|
+
|
|
58
|
+
We want to symmetrically reduce it by another polynomial. So, we put
|
|
59
|
+
this other polynomial into a list and create a Symmetric Reduction
|
|
60
|
+
Strategy object::
|
|
61
|
+
|
|
62
|
+
sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
|
|
63
|
+
sage: S = SymmetricReductionStrategy(X, [y[2]^2*x[1]])
|
|
64
|
+
sage: S
|
|
65
|
+
Symmetric Reduction Strategy in
|
|
66
|
+
Infinite polynomial ring in x, y over Rational Field, modulo
|
|
67
|
+
x_1*y_2^2
|
|
68
|
+
sage: S.reduce(p)
|
|
69
|
+
x_3*y_1^2 + y_3*y_1
|
|
70
|
+
|
|
71
|
+
The preceding is correct, since any permutation that turns
|
|
72
|
+
``y[2]^2*x[1]`` into a factor of ``y[1]^2*x[3]`` interchanges the
|
|
73
|
+
variable indices 1 and 2 -- which is not allowed in a symmetric
|
|
74
|
+
reduction. However, reduction by ``y[1]^2*x[2]`` works, since one can
|
|
75
|
+
change variable index 1 into 2 and 2 into 3. So, we add this to
|
|
76
|
+
``S``::
|
|
77
|
+
|
|
78
|
+
sage: S.add_generator(y[1]^2*x[2])
|
|
79
|
+
sage: S
|
|
80
|
+
Symmetric Reduction Strategy in
|
|
81
|
+
Infinite polynomial ring in x, y over Rational Field, modulo
|
|
82
|
+
x_2*y_1^2,
|
|
83
|
+
x_1*y_2^2
|
|
84
|
+
sage: S.reduce(p) # needs sage.combinat
|
|
85
|
+
y_3*y_1
|
|
86
|
+
|
|
87
|
+
The next example shows that tail reduction is not done, unless it is
|
|
88
|
+
explicitly advised::
|
|
89
|
+
|
|
90
|
+
sage: S.reduce(x[3] + 2*x[2]*y[1]^2 + 3*y[2]^2*x[1]) # needs sage.combinat
|
|
91
|
+
x_3 + 2*x_2*y_1^2 + 3*x_1*y_2^2
|
|
92
|
+
sage: S.tailreduce(x[3] + 2*x[2]*y[1]^2 + 3*y[2]^2*x[1]) # needs sage.combinat
|
|
93
|
+
x_3
|
|
94
|
+
|
|
95
|
+
However, it is possible to ask for tailreduction already when the
|
|
96
|
+
Symmetric Reduction Strategy is created::
|
|
97
|
+
|
|
98
|
+
sage: S2 = SymmetricReductionStrategy(X, [y[2]^2*x[1],y[1]^2*x[2]], tailreduce=True)
|
|
99
|
+
sage: S2
|
|
100
|
+
Symmetric Reduction Strategy in
|
|
101
|
+
Infinite polynomial ring in x, y over Rational Field, modulo
|
|
102
|
+
x_2*y_1^2,
|
|
103
|
+
x_1*y_2^2
|
|
104
|
+
with tailreduction
|
|
105
|
+
sage: S2.reduce(x[3] + 2*x[2]*y[1]^2 + 3*y[2]^2*x[1]) # needs sage.combinat
|
|
106
|
+
x_3
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
# ****************************************************************************
|
|
110
|
+
# Copyright (C) 2009 Simon King <king@mathematik.nuigalway.ie>
|
|
111
|
+
#
|
|
112
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
113
|
+
#
|
|
114
|
+
# This code is distributed in the hope that it will be useful,
|
|
115
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
116
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
117
|
+
# General Public License for more details.
|
|
118
|
+
#
|
|
119
|
+
# The full text of the GPL is available at:
|
|
120
|
+
#
|
|
121
|
+
# https://www.gnu.org/licenses/
|
|
122
|
+
# ****************************************************************************
|
|
123
|
+
import sys
|
|
124
|
+
from sage.structure.richcmp cimport richcmp, Py_NE, Py_EQ
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
cdef class SymmetricReductionStrategy:
|
|
128
|
+
"""
|
|
129
|
+
A framework for efficient symmetric reduction of InfinitePolynomial, see
|
|
130
|
+
:mod:`~sage.rings.polynomial.infinite_polynomial_element`.
|
|
131
|
+
|
|
132
|
+
INPUT:
|
|
133
|
+
|
|
134
|
+
- ``Parent`` -- an Infinite Polynomial Ring, see
|
|
135
|
+
:mod:`~sage.rings.polynomial.infinite_polynomial_element`
|
|
136
|
+
- ``L`` -- list (default: the empty list); list of elements of ``Parent``
|
|
137
|
+
with respect to which will be reduced
|
|
138
|
+
- ``good_input`` -- boolean (default: ``None``); if this optional parameter
|
|
139
|
+
is true, it is assumed that each element of ``L`` is symmetrically
|
|
140
|
+
reduced with respect to the previous elements of ``L``
|
|
141
|
+
|
|
142
|
+
EXAMPLES::
|
|
143
|
+
|
|
144
|
+
sage: X.<y> = InfinitePolynomialRing(QQ)
|
|
145
|
+
sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
|
|
146
|
+
sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], good_input=True)
|
|
147
|
+
sage: S.reduce(y[3] + 2*y[2]*y[1]^2 + 3*y[2]^2*y[1])
|
|
148
|
+
y_3 + 3*y_2^2*y_1 + 2*y_2*y_1^2
|
|
149
|
+
sage: S.tailreduce(y[3] + 2*y[2]*y[1]^2 + 3*y[2]^2*y[1]) # needs sage.combinat
|
|
150
|
+
y_3
|
|
151
|
+
"""
|
|
152
|
+
def __init__(self, Parent, L=None, tailreduce=False, good_input=None):
|
|
153
|
+
"""
|
|
154
|
+
EXAMPLES::
|
|
155
|
+
|
|
156
|
+
sage: X.<y> = InfinitePolynomialRing(QQ)
|
|
157
|
+
sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
|
|
158
|
+
sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], good_input=True)
|
|
159
|
+
sage: S == loads(dumps(S))
|
|
160
|
+
True
|
|
161
|
+
"""
|
|
162
|
+
self._parent = Parent
|
|
163
|
+
if hasattr(Parent, '_P'):
|
|
164
|
+
self._R = Parent._P
|
|
165
|
+
else:
|
|
166
|
+
self._R = None
|
|
167
|
+
self._lm = []
|
|
168
|
+
self._lengths = []
|
|
169
|
+
self._min_lm = None
|
|
170
|
+
self._tail = int(tailreduce)
|
|
171
|
+
if not (L is None):
|
|
172
|
+
for p in L:
|
|
173
|
+
self.add_generator(p, good_input=good_input)
|
|
174
|
+
|
|
175
|
+
def __getinitargs__(self):
|
|
176
|
+
r"""
|
|
177
|
+
Used for pickling.
|
|
178
|
+
|
|
179
|
+
EXAMPLES::
|
|
180
|
+
|
|
181
|
+
sage: X.<y> = InfinitePolynomialRing(QQ)
|
|
182
|
+
sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
|
|
183
|
+
sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], good_input=True)
|
|
184
|
+
sage: S.__getinitargs__()
|
|
185
|
+
(Infinite polynomial ring in y over Rational Field, [], 0, None)
|
|
186
|
+
"""
|
|
187
|
+
return (self._parent, [], self._tail, None)
|
|
188
|
+
|
|
189
|
+
def __getstate__(self):
|
|
190
|
+
r"""
|
|
191
|
+
Used for pickling.
|
|
192
|
+
|
|
193
|
+
EXAMPLES::
|
|
194
|
+
|
|
195
|
+
sage: X.<y> = InfinitePolynomialRing(QQ)
|
|
196
|
+
sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
|
|
197
|
+
sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], good_input=True)
|
|
198
|
+
sage: S.__getstate__()
|
|
199
|
+
([y_2*y_1^2, y_2^2*y_1], [1, 1], y_2*y_1^2, 0, Infinite polynomial ring in y over Rational Field)
|
|
200
|
+
"""
|
|
201
|
+
# Apparently, for pickling it is needed to update self._lm and
|
|
202
|
+
# self._min_lm before calling dumps...
|
|
203
|
+
R = self._parent
|
|
204
|
+
self._lm = [R(x) for x in self._lm] # I have no idea why -- but it seems needed
|
|
205
|
+
|
|
206
|
+
self._min_lm = R(self._min_lm)
|
|
207
|
+
return (self._lm, self._lengths, self._min_lm,
|
|
208
|
+
self._tail, self._parent)
|
|
209
|
+
|
|
210
|
+
def __setstate__(self, L): # (lm, lengths, min_lm, tail)
|
|
211
|
+
r"""
|
|
212
|
+
Used for pickling.
|
|
213
|
+
|
|
214
|
+
EXAMPLES::
|
|
215
|
+
|
|
216
|
+
sage: X.<y> = InfinitePolynomialRing(QQ)
|
|
217
|
+
sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
|
|
218
|
+
sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], good_input=True)
|
|
219
|
+
sage: S == loads(dumps(S)) # indirect doctest
|
|
220
|
+
True
|
|
221
|
+
"""
|
|
222
|
+
self._lm = L[0]
|
|
223
|
+
self._lengths = L[1]
|
|
224
|
+
self._min_lm = L[2]
|
|
225
|
+
self._tail = L[3]
|
|
226
|
+
self._parent = L[4]
|
|
227
|
+
if hasattr(self._parent, '_P'):
|
|
228
|
+
self._R = self._parent._P
|
|
229
|
+
else:
|
|
230
|
+
self._R = None
|
|
231
|
+
|
|
232
|
+
def __richcmp__(self, other, op):
|
|
233
|
+
r"""
|
|
234
|
+
Standard comparison function.
|
|
235
|
+
|
|
236
|
+
EXAMPLES::
|
|
237
|
+
|
|
238
|
+
sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
|
|
239
|
+
sage: X.<x,y> = InfinitePolynomialRing(QQ)
|
|
240
|
+
sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], tailreduce=True)
|
|
241
|
+
sage: S == 17
|
|
242
|
+
False
|
|
243
|
+
sage: S == SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], tailreduce=False)
|
|
244
|
+
False
|
|
245
|
+
sage: S == SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], tailreduce=True)
|
|
246
|
+
True
|
|
247
|
+
"""
|
|
248
|
+
if not isinstance(other, SymmetricReductionStrategy):
|
|
249
|
+
if op in [Py_NE, Py_EQ]:
|
|
250
|
+
return (op == Py_NE)
|
|
251
|
+
else:
|
|
252
|
+
return NotImplemented
|
|
253
|
+
cdef SymmetricReductionStrategy left = self
|
|
254
|
+
cdef SymmetricReductionStrategy right = other
|
|
255
|
+
return richcmp((left._parent, left._lm, left._tail),
|
|
256
|
+
(right._parent, right._lm, right._tail), op)
|
|
257
|
+
|
|
258
|
+
def gens(self) -> tuple:
|
|
259
|
+
"""
|
|
260
|
+
Return the tuple of Infinite Polynomials modulo which ``self`` reduces.
|
|
261
|
+
|
|
262
|
+
EXAMPLES::
|
|
263
|
+
|
|
264
|
+
sage: X.<y> = InfinitePolynomialRing(QQ)
|
|
265
|
+
sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
|
|
266
|
+
sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]])
|
|
267
|
+
sage: S
|
|
268
|
+
Symmetric Reduction Strategy in
|
|
269
|
+
Infinite polynomial ring in y over Rational Field, modulo
|
|
270
|
+
y_2*y_1^2,
|
|
271
|
+
y_2^2*y_1
|
|
272
|
+
sage: S.gens()
|
|
273
|
+
(y_2*y_1^2, y_2^2*y_1)
|
|
274
|
+
"""
|
|
275
|
+
return tuple(self._lm)
|
|
276
|
+
|
|
277
|
+
def setgens(self, L):
|
|
278
|
+
"""
|
|
279
|
+
Define the list of Infinite Polynomials modulo which ``self`` reduces.
|
|
280
|
+
|
|
281
|
+
INPUT:
|
|
282
|
+
|
|
283
|
+
- ``L`` -- list of elements of the underlying infinite polynomial ring
|
|
284
|
+
|
|
285
|
+
.. NOTE::
|
|
286
|
+
|
|
287
|
+
It is not tested if ``L`` is a good input. That method simply
|
|
288
|
+
assigns a *copy* of ``L`` to the generators of ``self``.
|
|
289
|
+
|
|
290
|
+
EXAMPLES::
|
|
291
|
+
|
|
292
|
+
sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
|
|
293
|
+
sage: X.<y> = InfinitePolynomialRing(QQ)
|
|
294
|
+
sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]])
|
|
295
|
+
sage: R = SymmetricReductionStrategy(X)
|
|
296
|
+
sage: R.setgens(S.gens())
|
|
297
|
+
sage: R
|
|
298
|
+
Symmetric Reduction Strategy in
|
|
299
|
+
Infinite polynomial ring in y over Rational Field, modulo
|
|
300
|
+
y_2*y_1^2,
|
|
301
|
+
y_2^2*y_1
|
|
302
|
+
sage: R.gens() is S.gens()
|
|
303
|
+
False
|
|
304
|
+
sage: R.gens() == S.gens()
|
|
305
|
+
True
|
|
306
|
+
"""
|
|
307
|
+
self._lm = [X for X in L]
|
|
308
|
+
|
|
309
|
+
def reset(self):
|
|
310
|
+
"""
|
|
311
|
+
Remove all polynomials from ``self``.
|
|
312
|
+
|
|
313
|
+
EXAMPLES::
|
|
314
|
+
|
|
315
|
+
sage: X.<y> = InfinitePolynomialRing(QQ)
|
|
316
|
+
sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
|
|
317
|
+
sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]])
|
|
318
|
+
sage: S
|
|
319
|
+
Symmetric Reduction Strategy in
|
|
320
|
+
Infinite polynomial ring in y over Rational Field, modulo
|
|
321
|
+
y_2*y_1^2,
|
|
322
|
+
y_2^2*y_1
|
|
323
|
+
sage: S.reset()
|
|
324
|
+
sage: S
|
|
325
|
+
Symmetric Reduction Strategy in Infinite polynomial ring in y over Rational Field
|
|
326
|
+
"""
|
|
327
|
+
self._lm = []
|
|
328
|
+
self._lengths = []
|
|
329
|
+
self._min_lm = None
|
|
330
|
+
|
|
331
|
+
def __repr__(self):
|
|
332
|
+
"""
|
|
333
|
+
String representation of ``self``.
|
|
334
|
+
|
|
335
|
+
EXAMPLES::
|
|
336
|
+
|
|
337
|
+
sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
|
|
338
|
+
sage: X.<x,y> = InfinitePolynomialRing(QQ)
|
|
339
|
+
sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1], y[1]^2*y[2]], tailreduce=True)
|
|
340
|
+
sage: S # indirect doctest
|
|
341
|
+
Symmetric Reduction Strategy in Infinite polynomial ring in x, y over Rational Field, modulo
|
|
342
|
+
y_2*y_1^2,
|
|
343
|
+
y_2^2*y_1
|
|
344
|
+
with tailreduction
|
|
345
|
+
"""
|
|
346
|
+
s = "Symmetric Reduction Strategy in %s" % self._parent
|
|
347
|
+
if self._lm:
|
|
348
|
+
s += ", modulo\n %s" % (',\n '.join(str(X) for X in self._lm))
|
|
349
|
+
if self._tail:
|
|
350
|
+
s += '\nwith tailreduction'
|
|
351
|
+
return s
|
|
352
|
+
|
|
353
|
+
def __call__(self, p):
|
|
354
|
+
"""
|
|
355
|
+
INPUT:
|
|
356
|
+
|
|
357
|
+
A polynomial or an infinite polynomial.
|
|
358
|
+
|
|
359
|
+
OUTPUT: a polynomial whose parent ring allows for coercion of any
|
|
360
|
+
generator of ``self``
|
|
361
|
+
|
|
362
|
+
EXAMPLES::
|
|
363
|
+
|
|
364
|
+
sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
|
|
365
|
+
sage: X.<x,y> = InfinitePolynomialRing(QQ, implementation='sparse')
|
|
366
|
+
sage: a, b = y[2]^2*y[1], y[1]^2*y[2]
|
|
367
|
+
sage: p = y[3]*x[2]*x[1]
|
|
368
|
+
sage: S = SymmetricReductionStrategy(X, [a,b])
|
|
369
|
+
sage: p._p.parent().has_coerce_map_from(a._p.parent())
|
|
370
|
+
False
|
|
371
|
+
sage: q = S(p)
|
|
372
|
+
sage: q.parent().has_coerce_map_from(a._p.parent())
|
|
373
|
+
True
|
|
374
|
+
sage: S(p) == S(p._p)
|
|
375
|
+
True
|
|
376
|
+
"""
|
|
377
|
+
if hasattr(p, '_p'):
|
|
378
|
+
p = p._p
|
|
379
|
+
if self._R is None:
|
|
380
|
+
self._R = p.parent()
|
|
381
|
+
if hasattr(self._parent, '_P'):
|
|
382
|
+
self._parent._P = self._R
|
|
383
|
+
return p
|
|
384
|
+
if self._R.has_coerce_map_from(p.parent()):
|
|
385
|
+
return self._R(p)
|
|
386
|
+
if p.parent().has_coerce_map_from(self._R):
|
|
387
|
+
self._R = p.parent()
|
|
388
|
+
if hasattr(self._parent, '_P'):
|
|
389
|
+
self._parent._P = self._R
|
|
390
|
+
return p
|
|
391
|
+
# now we really need to work...
|
|
392
|
+
R = self._R
|
|
393
|
+
VarList = list(set(list(R.variable_names()) + list(p.parent().variable_names())))
|
|
394
|
+
VarList.sort(key=self._parent.varname_key, reverse=True)
|
|
395
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
396
|
+
self._R = PolynomialRing(self._parent.base_ring(), VarList,
|
|
397
|
+
order=self._parent._order)
|
|
398
|
+
if hasattr(self._parent, '_P'):
|
|
399
|
+
self._parent._P = self._R
|
|
400
|
+
return self._R(p)
|
|
401
|
+
|
|
402
|
+
def add_generator(self, p, good_input=None):
|
|
403
|
+
"""
|
|
404
|
+
Add another polynomial to ``self``.
|
|
405
|
+
|
|
406
|
+
INPUT:
|
|
407
|
+
|
|
408
|
+
- ``p`` -- an element of the underlying infinite polynomial ring
|
|
409
|
+
- ``good_input`` -- boolean (default: ``None``); if ``True``, it is
|
|
410
|
+
assumed that ``p`` is reduced with respect to ``self``. Otherwise,
|
|
411
|
+
this reduction will be done first (which may cost some time).
|
|
412
|
+
|
|
413
|
+
.. NOTE::
|
|
414
|
+
|
|
415
|
+
Previously added polynomials may be modified. All input is
|
|
416
|
+
prepared in view of an efficient symmetric reduction.
|
|
417
|
+
|
|
418
|
+
EXAMPLES::
|
|
419
|
+
|
|
420
|
+
sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
|
|
421
|
+
sage: X.<x,y> = InfinitePolynomialRing(QQ)
|
|
422
|
+
sage: S = SymmetricReductionStrategy(X)
|
|
423
|
+
sage: S
|
|
424
|
+
Symmetric Reduction Strategy in
|
|
425
|
+
Infinite polynomial ring in x, y over Rational Field
|
|
426
|
+
sage: S.add_generator(y[3] + y[1]*(x[3]+x[1]))
|
|
427
|
+
sage: S
|
|
428
|
+
Symmetric Reduction Strategy in
|
|
429
|
+
Infinite polynomial ring in x, y over Rational Field, modulo
|
|
430
|
+
x_3*y_1 + x_1*y_1 + y_3
|
|
431
|
+
|
|
432
|
+
Note that the first added polynomial will be simplified when
|
|
433
|
+
adding a suitable second polynomial::
|
|
434
|
+
|
|
435
|
+
sage: S.add_generator(x[2] + x[1]) # needs sage.combinat
|
|
436
|
+
sage: S # needs sage.combinat
|
|
437
|
+
Symmetric Reduction Strategy in
|
|
438
|
+
Infinite polynomial ring in x, y over Rational Field, modulo
|
|
439
|
+
y_3,
|
|
440
|
+
x_2 + x_1
|
|
441
|
+
|
|
442
|
+
By default, reduction is applied to any newly added
|
|
443
|
+
polynomial. This can be avoided by specifying the optional
|
|
444
|
+
parameter 'good_input'::
|
|
445
|
+
|
|
446
|
+
sage: # needs sage.combinat
|
|
447
|
+
sage: S.add_generator(y[2] + y[1]*x[2])
|
|
448
|
+
sage: S
|
|
449
|
+
Symmetric Reduction Strategy in
|
|
450
|
+
Infinite polynomial ring in x, y over Rational Field, modulo
|
|
451
|
+
y_3,
|
|
452
|
+
x_1*y_1 - y_2,
|
|
453
|
+
x_2 + x_1
|
|
454
|
+
sage: S.reduce(x[3] + x[2])
|
|
455
|
+
-2*x_1
|
|
456
|
+
sage: S.add_generator(x[3] + x[2], good_input=True)
|
|
457
|
+
sage: S
|
|
458
|
+
Symmetric Reduction Strategy in
|
|
459
|
+
Infinite polynomial ring in x, y over Rational Field, modulo
|
|
460
|
+
y_3,
|
|
461
|
+
x_3 + x_2,
|
|
462
|
+
x_1*y_1 - y_2,
|
|
463
|
+
x_2 + x_1
|
|
464
|
+
|
|
465
|
+
In the previous example, ``x[3] + x[2]`` is added without
|
|
466
|
+
being reduced to zero.
|
|
467
|
+
"""
|
|
468
|
+
from sage.rings.polynomial.infinite_polynomial_element import InfinitePolynomial
|
|
469
|
+
p = InfinitePolynomial(self._parent, self(p))
|
|
470
|
+
cdef SymmetricReductionStrategy tmpStrategy
|
|
471
|
+
if good_input is None:
|
|
472
|
+
p = self.reduce(p)
|
|
473
|
+
if p._p == 0:
|
|
474
|
+
return
|
|
475
|
+
cdef int i = 0
|
|
476
|
+
cdef int l = len(self._lm)
|
|
477
|
+
cdef int newLength = len(p._p.coefficients())
|
|
478
|
+
p = p / p.lc()
|
|
479
|
+
if (self._min_lm is None) or (p.lm() < self._min_lm):
|
|
480
|
+
self._min_lm = p.lm()
|
|
481
|
+
while i < l and self._lengths[i] < newLength:
|
|
482
|
+
i += 1
|
|
483
|
+
self._lm.insert(i, p)
|
|
484
|
+
self._lengths.insert(i, newLength)
|
|
485
|
+
# return
|
|
486
|
+
i += 1
|
|
487
|
+
l += 1
|
|
488
|
+
if i < l:
|
|
489
|
+
tmpStrategy = SymmetricReductionStrategy(self._parent, [p],
|
|
490
|
+
tailreduce=False,
|
|
491
|
+
good_input=True)
|
|
492
|
+
else:
|
|
493
|
+
return
|
|
494
|
+
cdef int j
|
|
495
|
+
while i < l:
|
|
496
|
+
q = tmpStrategy.reduce(self._lm[i].lm()) + tmpStrategy.reduce(self._lm[i].tail())
|
|
497
|
+
if q._p == 0:
|
|
498
|
+
self._lm.pop(i)
|
|
499
|
+
self._lengths.pop(i)
|
|
500
|
+
l -= 1
|
|
501
|
+
i -= 1
|
|
502
|
+
else:
|
|
503
|
+
q_len = len(q._p.coefficients())
|
|
504
|
+
if q_len < self._lengths[i]:
|
|
505
|
+
self._lm.pop(i)
|
|
506
|
+
self._lengths.pop(i)
|
|
507
|
+
j = 0
|
|
508
|
+
while j < i and self._lengths[j] < q_len:
|
|
509
|
+
j += 1
|
|
510
|
+
self._lm.insert(j, q)
|
|
511
|
+
self._lengths.insert(j, q_len)
|
|
512
|
+
i += 1
|
|
513
|
+
|
|
514
|
+
def reduce(self, p, notail=False, report=None):
|
|
515
|
+
"""
|
|
516
|
+
Symmetric reduction of an infinite polynomial.
|
|
517
|
+
|
|
518
|
+
INPUT:
|
|
519
|
+
|
|
520
|
+
- ``p`` -- an element of the underlying infinite polynomial ring
|
|
521
|
+
- ``notail`` -- boolean (default: ``False``); if ``True``, tail reduction
|
|
522
|
+
is avoided (but there is no guarantee that there will be no tail
|
|
523
|
+
reduction at all)
|
|
524
|
+
- ``report`` -- object (default: ``None``); if not ``None``, print
|
|
525
|
+
information on the progress of the computation
|
|
526
|
+
|
|
527
|
+
OUTPUT: reduction of ``p`` with respect to ``self``
|
|
528
|
+
|
|
529
|
+
.. NOTE::
|
|
530
|
+
|
|
531
|
+
If tail reduction shall be forced, use :meth:`tailreduce`.
|
|
532
|
+
|
|
533
|
+
EXAMPLES::
|
|
534
|
+
|
|
535
|
+
sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
|
|
536
|
+
sage: X.<x,y> = InfinitePolynomialRing(QQ)
|
|
537
|
+
sage: S = SymmetricReductionStrategy(X, [y[3]], tailreduce=True)
|
|
538
|
+
sage: S.reduce(y[4]*x[1] + y[1]*x[4])
|
|
539
|
+
x_4*y_1
|
|
540
|
+
sage: S.reduce(y[4]*x[1] + y[1]*x[4], notail=True)
|
|
541
|
+
x_4*y_1 + x_1*y_4
|
|
542
|
+
|
|
543
|
+
Last, we demonstrate the ``report`` option::
|
|
544
|
+
|
|
545
|
+
sage: S = SymmetricReductionStrategy(X, [x[2] + y[1],
|
|
546
|
+
....: x[2]*y[3] + x[1]*y[2] + y[4],
|
|
547
|
+
....: y[3] + y[2]])
|
|
548
|
+
sage: S
|
|
549
|
+
Symmetric Reduction Strategy in
|
|
550
|
+
Infinite polynomial ring in x, y over Rational Field, modulo
|
|
551
|
+
y_3 + y_2,
|
|
552
|
+
x_2 + y_1,
|
|
553
|
+
x_1*y_2 + y_4 - y_3*y_1
|
|
554
|
+
sage: S.reduce(x[3] + x[1]*y[3] + x[1]*y[1], report=True)
|
|
555
|
+
:::>
|
|
556
|
+
x_1*y_1 + y_4 - y_3*y_1 - y_1
|
|
557
|
+
|
|
558
|
+
Each ':' indicates that one reduction of the leading monomial
|
|
559
|
+
was performed. Eventually, the '>' indicates that the
|
|
560
|
+
computation is finished.
|
|
561
|
+
"""
|
|
562
|
+
from sage.rings.polynomial.infinite_polynomial_element import InfinitePolynomial
|
|
563
|
+
cdef list lml = self._lm
|
|
564
|
+
if not lml:
|
|
565
|
+
if report is not None:
|
|
566
|
+
print('>')
|
|
567
|
+
return p
|
|
568
|
+
if p.lm() < self._min_lm:
|
|
569
|
+
if report is not None:
|
|
570
|
+
print('>')
|
|
571
|
+
return p
|
|
572
|
+
cdef list REDUCTOR
|
|
573
|
+
while True:
|
|
574
|
+
REDUCTOR = []
|
|
575
|
+
for q in lml:
|
|
576
|
+
c, P, _ = q.symmetric_cancellation_order(p)
|
|
577
|
+
if c is not None and c <= 0:
|
|
578
|
+
REDUCTOR = [self(q ** P)]
|
|
579
|
+
break
|
|
580
|
+
if not REDUCTOR:
|
|
581
|
+
new_p = p
|
|
582
|
+
break
|
|
583
|
+
p = self(p) # now this is a usual polynomial
|
|
584
|
+
R = self._R
|
|
585
|
+
if hasattr(p, 'reduce'):
|
|
586
|
+
new_p = InfinitePolynomial(self._parent,
|
|
587
|
+
p.reduce([R(X) for X in REDUCTOR]))
|
|
588
|
+
else:
|
|
589
|
+
new_p = InfinitePolynomial(self._parent, p % (REDUCTOR * R))
|
|
590
|
+
if report is not None:
|
|
591
|
+
sys.stdout.write(':')
|
|
592
|
+
sys.stdout.flush()
|
|
593
|
+
if (new_p._p == p) or (new_p._p == 0):
|
|
594
|
+
break
|
|
595
|
+
p = new_p # now this is an infinite polynomial
|
|
596
|
+
p = new_p
|
|
597
|
+
if (not self._tail) or notail or (p._p == 0):
|
|
598
|
+
if report is not None:
|
|
599
|
+
print('>')
|
|
600
|
+
return p
|
|
601
|
+
# there remains to perform tail reduction
|
|
602
|
+
REM = p.lt()
|
|
603
|
+
p = p.tail()
|
|
604
|
+
p = self.tailreduce(p, report=report)
|
|
605
|
+
if report is not None:
|
|
606
|
+
print('>')
|
|
607
|
+
return p + REM
|
|
608
|
+
|
|
609
|
+
def tailreduce(self, p, report=None):
|
|
610
|
+
"""
|
|
611
|
+
Symmetric reduction of an infinite polynomial, with forced tail reduction.
|
|
612
|
+
|
|
613
|
+
INPUT:
|
|
614
|
+
|
|
615
|
+
- ``p`` -- an element of the underlying infinite polynomial ring
|
|
616
|
+
- ``report`` -- object (default: ``None``); if not ``None``, print
|
|
617
|
+
information on the progress of the computation
|
|
618
|
+
|
|
619
|
+
OUTPUT:
|
|
620
|
+
|
|
621
|
+
Reduction (including the non-leading elements) of ``p`` with respect to ``self``.
|
|
622
|
+
|
|
623
|
+
EXAMPLES::
|
|
624
|
+
|
|
625
|
+
sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
|
|
626
|
+
sage: X.<x,y> = InfinitePolynomialRing(QQ)
|
|
627
|
+
sage: S = SymmetricReductionStrategy(X, [y[3]])
|
|
628
|
+
sage: S.reduce(y[4]*x[1] + y[1]*x[4])
|
|
629
|
+
x_4*y_1 + x_1*y_4
|
|
630
|
+
sage: S.tailreduce(y[4]*x[1] + y[1]*x[4]) # needs sage.combinat
|
|
631
|
+
x_4*y_1
|
|
632
|
+
|
|
633
|
+
Last, we demonstrate the 'report' option::
|
|
634
|
+
|
|
635
|
+
sage: S = SymmetricReductionStrategy(X, [x[2] + y[1],
|
|
636
|
+
....: x[2]*x[3] + x[1]*y[2] + y[4],
|
|
637
|
+
....: y[3] + y[2]])
|
|
638
|
+
sage: S
|
|
639
|
+
Symmetric Reduction Strategy in
|
|
640
|
+
Infinite polynomial ring in x, y over Rational Field, modulo
|
|
641
|
+
y_3 + y_2,
|
|
642
|
+
x_2 + y_1,
|
|
643
|
+
x_1*y_2 + y_4 + y_1^2
|
|
644
|
+
sage: S.tailreduce(x[3] + x[1]*y[3] + x[1]*y[1], report=True) # needs sage.combinat
|
|
645
|
+
T[3]:::>
|
|
646
|
+
T[3]:>
|
|
647
|
+
x_1*y_1 - y_2 + y_1^2 - y_1
|
|
648
|
+
|
|
649
|
+
The protocol means the following.
|
|
650
|
+
* 'T[3]' means that we currently do tail reduction for a polynomial
|
|
651
|
+
with three terms.
|
|
652
|
+
* ':::>' means that there were three reductions of leading terms.
|
|
653
|
+
* The tail of the result of the preceding reduction still has three
|
|
654
|
+
terms. One reduction of leading terms was possible, and then the
|
|
655
|
+
final result was obtained.
|
|
656
|
+
"""
|
|
657
|
+
if not self._lm:
|
|
658
|
+
return p
|
|
659
|
+
OUT = p.parent()(0)
|
|
660
|
+
while p._p != 0:
|
|
661
|
+
if report is not None:
|
|
662
|
+
sys.stdout.write('T[%d]' % len(p._p.coefficients()))
|
|
663
|
+
sys.stdout.flush()
|
|
664
|
+
p = self.reduce(p, notail=True, report=report)
|
|
665
|
+
OUT = OUT + p.lt()
|
|
666
|
+
p = p.tail()
|
|
667
|
+
if p.lm() < self._min_lm:
|
|
668
|
+
return OUT + p
|
|
669
|
+
return OUT
|