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,469 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Basic Linear Algebra Subroutines on dictionaries
|
|
4
|
+
|
|
5
|
+
This module provides functions for "level 1 basic linear algebra
|
|
6
|
+
subroutines" on sparse vectors represented as dictionaries. The API is
|
|
7
|
+
inspired from the standard BLAS API
|
|
8
|
+
:wikipedia:`Basic_Linear_Algebra_Subprograms`, but does not try to
|
|
9
|
+
follow it exactly.
|
|
10
|
+
|
|
11
|
+
For ``a, b, ...`` hashable objects, the dictionary ``{a: 2, b:3, ...}``
|
|
12
|
+
represents the formal linear combination `2 \cdot a + 3 \cdot b + \cdots`.
|
|
13
|
+
The values of the dictionary should all lie in the same parent `K`. For
|
|
14
|
+
simplicity, we call this formal linear combination a vector, as the
|
|
15
|
+
typical use case is `K` being a field. However the routines here can
|
|
16
|
+
be used with a ring `K` to represent free module elements, or a
|
|
17
|
+
semiring like `\NN` to represent elements of a commutative monoid, or
|
|
18
|
+
even just an additive semigroup. Of course not all operations are
|
|
19
|
+
meaningful in those cases. We are also assuming that ``-1 * x = -x``
|
|
20
|
+
and ``bool(x) == bool(-x)`` for all ``x`` in `K`.
|
|
21
|
+
|
|
22
|
+
Unless stated otherwise, all values `v` in the dictionaries should be
|
|
23
|
+
nonzero (as tested with `bool(v)`).
|
|
24
|
+
|
|
25
|
+
This is mostly used by :class:`CombinatorialFreeModule`.
|
|
26
|
+
"""
|
|
27
|
+
# ***************************************************************************
|
|
28
|
+
# Copyright (C) 2010 Christian Stump <christian.stump@univie.ac.at>
|
|
29
|
+
# 2016 Travis Scrimshaw <tscrimsh@umn.edu>
|
|
30
|
+
# 2016 Nicolas M. Thiéry <nthiery at users.sf.net>
|
|
31
|
+
#
|
|
32
|
+
# This program is free software: you can redistribute it and/or modify
|
|
33
|
+
# it under the terms of the GNU General Public License as published by
|
|
34
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
35
|
+
# (at your option) any later version.
|
|
36
|
+
# https://www.gnu.org/licenses/
|
|
37
|
+
# ***************************************************************************
|
|
38
|
+
|
|
39
|
+
cpdef int iaxpy(a, dict X, dict Y, bint remove_zeros=True, bint factor_on_left=True) except -1:
|
|
40
|
+
r"""
|
|
41
|
+
Mutate `Y` to represent `a X + Y`.
|
|
42
|
+
|
|
43
|
+
INPUT:
|
|
44
|
+
|
|
45
|
+
- ``a`` -- element of a parent `K` or `±1`
|
|
46
|
+
- ``X``, ``Y`` -- dictionaries representing a vector `X` over `K`
|
|
47
|
+
- ``remove_zeros`` -- boolean (default: ``True``); whether to
|
|
48
|
+
remove the keys whose values are zero after the addition has
|
|
49
|
+
been performed
|
|
50
|
+
- ``factor_on_left`` -- boolean (default: ``False``);
|
|
51
|
+
whether to compute `a X + Y` or `X a + Y`
|
|
52
|
+
|
|
53
|
+
OUTPUT:
|
|
54
|
+
|
|
55
|
+
``0`` when successful and ``-1`` on error. This is done because
|
|
56
|
+
returning an ``int`` is faster than a (Python) ``None``.
|
|
57
|
+
|
|
58
|
+
``Y`` has been mutated to represent the vector `a \cdot X + Y`.
|
|
59
|
+
If ``remove_zeros=True`` (and the input have no zero values
|
|
60
|
+
themselves), then the output is guaranteed to have no zero
|
|
61
|
+
values. Otherwise some zero values may be left in the output.
|
|
62
|
+
Which ones is voluntarily left undefined. Use this in cases
|
|
63
|
+
where you want to postpone clearing until the end of a long
|
|
64
|
+
series of operations.
|
|
65
|
+
|
|
66
|
+
The parent `K` should support addition unless `a = -1`, negation
|
|
67
|
+
if `a = -1`, and multiplication if `a \neq ±1`. We are also
|
|
68
|
+
assuming that ``-1 * x = -x`` and ``bool(x) == bool(-x)`` in `K`.
|
|
69
|
+
|
|
70
|
+
See :mod:`sage.data_structures.blas_dict` for an overview.
|
|
71
|
+
|
|
72
|
+
EXAMPLES::
|
|
73
|
+
|
|
74
|
+
sage: import sage.data_structures.blas_dict as blas
|
|
75
|
+
sage: X = {0: -1, 1: 1}
|
|
76
|
+
sage: Y = {0: 1, 1: 1}
|
|
77
|
+
|
|
78
|
+
Computing `X+Y`::
|
|
79
|
+
|
|
80
|
+
sage: blas.iaxpy(1, X, Y)
|
|
81
|
+
0
|
|
82
|
+
sage: Y
|
|
83
|
+
{1: 2}
|
|
84
|
+
|
|
85
|
+
Reseting `Y` and computing `-X+Y`::
|
|
86
|
+
|
|
87
|
+
sage: Y = {0: 1, 1: 1}
|
|
88
|
+
sage: blas.iaxpy(-1, X, Y)
|
|
89
|
+
0
|
|
90
|
+
sage: Y
|
|
91
|
+
{0: 2}
|
|
92
|
+
|
|
93
|
+
Reseting `Y` and computing `2X+Y`::
|
|
94
|
+
|
|
95
|
+
sage: Y = {0: 1, 1: 1}
|
|
96
|
+
sage: blas.iaxpy(2, X, Y)
|
|
97
|
+
0
|
|
98
|
+
sage: Y
|
|
99
|
+
{0: -1, 1: 3}
|
|
100
|
+
|
|
101
|
+
Reseting `Y` and computing `-X+Y` without removing zeros::
|
|
102
|
+
|
|
103
|
+
sage: Y = {0: 1, 1: 1}
|
|
104
|
+
sage: blas.iaxpy(-1, X, Y, remove_zeros=False)
|
|
105
|
+
0
|
|
106
|
+
sage: Y
|
|
107
|
+
{0: 2, 1: 0}
|
|
108
|
+
"""
|
|
109
|
+
cdef int flag = 0
|
|
110
|
+
if a == 1:
|
|
111
|
+
flag = 1
|
|
112
|
+
elif a == -1:
|
|
113
|
+
flag = -1
|
|
114
|
+
elif not a:
|
|
115
|
+
return 0
|
|
116
|
+
for key, value in X.items():
|
|
117
|
+
if flag == -1:
|
|
118
|
+
if key in Y:
|
|
119
|
+
Y[key] -= value
|
|
120
|
+
else:
|
|
121
|
+
Y[key] = -value
|
|
122
|
+
continue # no need to check for zero
|
|
123
|
+
else:
|
|
124
|
+
if flag != 1:
|
|
125
|
+
# If we had the guarantee that `a` is in the base
|
|
126
|
+
# ring, we could use a._mul_(value), as suggested in
|
|
127
|
+
# the documentation of sage.structure.element. However
|
|
128
|
+
# we want to support elements that can act on values
|
|
129
|
+
# in the base ring as well
|
|
130
|
+
if factor_on_left:
|
|
131
|
+
value = a*value
|
|
132
|
+
else:
|
|
133
|
+
value = value*a
|
|
134
|
+
if not value:
|
|
135
|
+
continue # a is a zero divisor
|
|
136
|
+
# assert value
|
|
137
|
+
if key in Y:
|
|
138
|
+
Y[key] += value
|
|
139
|
+
else:
|
|
140
|
+
Y[key] = value
|
|
141
|
+
continue # no need to check for zero
|
|
142
|
+
if remove_zeros and not Y[key]:
|
|
143
|
+
del Y[key]
|
|
144
|
+
return 0
|
|
145
|
+
|
|
146
|
+
cpdef dict axpy(a, dict X, dict Y, bint factor_on_left=True):
|
|
147
|
+
"""
|
|
148
|
+
Return `a X + Y`.
|
|
149
|
+
|
|
150
|
+
All input dictionaries are supposed to have values in the same
|
|
151
|
+
base ring `K` and have no nonzero values.
|
|
152
|
+
|
|
153
|
+
INPUT:
|
|
154
|
+
|
|
155
|
+
- ``a`` -- an element of `K` or `±1`
|
|
156
|
+
- ``X``, ``Y`` -- dictionaries representing respectively vectors `X` and `Y`
|
|
157
|
+
- ``factor_on_left`` -- boolean (default: ``False``);
|
|
158
|
+
whether to compute `a X + Y` or `X a + Y`
|
|
159
|
+
|
|
160
|
+
EXAMPLES::
|
|
161
|
+
|
|
162
|
+
sage: import sage.data_structures.blas_dict as blas
|
|
163
|
+
sage: Y = {0: 1, 1: 1}
|
|
164
|
+
sage: X = {0: -1, 1: 1}
|
|
165
|
+
|
|
166
|
+
Computing `X + Y`::
|
|
167
|
+
|
|
168
|
+
sage: blas.axpy(1, X, Y)
|
|
169
|
+
{1: 2}
|
|
170
|
+
|
|
171
|
+
`X` and `Y` are not mutated:
|
|
172
|
+
|
|
173
|
+
sage: X, Y
|
|
174
|
+
({0: -1, 1: 1}, {0: 1, 1: 1})
|
|
175
|
+
|
|
176
|
+
Computing `-X + Y`::
|
|
177
|
+
|
|
178
|
+
sage: blas.axpy(-1, X, Y)
|
|
179
|
+
{0: 2}
|
|
180
|
+
|
|
181
|
+
Computing `2X + Y`::
|
|
182
|
+
|
|
183
|
+
sage: blas.axpy(2, X, Y)
|
|
184
|
+
{0: -1, 1: 3}
|
|
185
|
+
|
|
186
|
+
Testing the special cases of empty dictionaries::
|
|
187
|
+
|
|
188
|
+
sage: Y = {}
|
|
189
|
+
sage: Z = blas.axpy(2, X, Y)
|
|
190
|
+
sage: Z is Y
|
|
191
|
+
False
|
|
192
|
+
sage: X, Y
|
|
193
|
+
({0: -1, 1: 1}, {})
|
|
194
|
+
|
|
195
|
+
sage: Z = blas.axpy(2, Y, X)
|
|
196
|
+
sage: Z is X
|
|
197
|
+
True
|
|
198
|
+
sage: X, Y
|
|
199
|
+
({0: -1, 1: 1}, {})
|
|
200
|
+
"""
|
|
201
|
+
if X:
|
|
202
|
+
Y = Y.copy()
|
|
203
|
+
iaxpy(a, X, Y, True, factor_on_left)
|
|
204
|
+
return Y
|
|
205
|
+
|
|
206
|
+
cpdef dict negate(dict D):
|
|
207
|
+
r"""
|
|
208
|
+
Return a dictionary representing the vector `-X`.
|
|
209
|
+
|
|
210
|
+
INPUT:
|
|
211
|
+
|
|
212
|
+
- ``X`` -- dictionary representing a vector `X`
|
|
213
|
+
|
|
214
|
+
EXAMPLES::
|
|
215
|
+
|
|
216
|
+
sage: import sage.data_structures.blas_dict as blas
|
|
217
|
+
sage: D1 = {0: 1, 1: 1}
|
|
218
|
+
sage: blas.negate(D1)
|
|
219
|
+
{0: -1, 1: -1}
|
|
220
|
+
"""
|
|
221
|
+
return {key: -value for key, value in D.items()}
|
|
222
|
+
|
|
223
|
+
cpdef dict scal(a, dict D, bint factor_on_left=True):
|
|
224
|
+
r"""
|
|
225
|
+
Return a dictionary representing the vector `a*X`.
|
|
226
|
+
|
|
227
|
+
INPUT:
|
|
228
|
+
|
|
229
|
+
- ``a`` -- an element of the base ring `K`
|
|
230
|
+
- ``X`` -- dictionary representing a vector `X`
|
|
231
|
+
|
|
232
|
+
EXAMPLES::
|
|
233
|
+
|
|
234
|
+
sage: import sage.data_structures.blas_dict as blas
|
|
235
|
+
sage: R = IntegerModRing(12) # a ring with zero divisors
|
|
236
|
+
sage: D = {0: R(1), 1: R(2), 2: R(4)}
|
|
237
|
+
sage: blas.scal(R(3), D)
|
|
238
|
+
{0: 3, 1: 6}
|
|
239
|
+
"""
|
|
240
|
+
# We could use a dict comprehension like for negate, but care
|
|
241
|
+
# needs to be taken to remove products that cancel out.
|
|
242
|
+
# So for now we just delegate to axpy.
|
|
243
|
+
return axpy(a, D, {}, factor_on_left=factor_on_left)
|
|
244
|
+
|
|
245
|
+
cpdef dict add(dict D, dict D2):
|
|
246
|
+
r"""
|
|
247
|
+
Return the pointwise addition of dictionaries ``D`` and ``D2``.
|
|
248
|
+
|
|
249
|
+
INPUT:
|
|
250
|
+
|
|
251
|
+
- ``D``, ``D2`` -- dictionaries whose values are in a common ring
|
|
252
|
+
and all values are nonzero
|
|
253
|
+
|
|
254
|
+
EXAMPLES::
|
|
255
|
+
|
|
256
|
+
sage: import sage.data_structures.blas_dict as blas
|
|
257
|
+
sage: D = {0: 1, 1: 1}
|
|
258
|
+
sage: D2 = {0: -1, 1: 1}
|
|
259
|
+
sage: blas.add(D, D2)
|
|
260
|
+
{1: 2}
|
|
261
|
+
|
|
262
|
+
`D` and `D2` are left unchanged::
|
|
263
|
+
|
|
264
|
+
sage: D, D2
|
|
265
|
+
({0: 1, 1: 1}, {0: -1, 1: 1})
|
|
266
|
+
"""
|
|
267
|
+
# Optimization: swap the two dicts to ensure D is the largest
|
|
268
|
+
if len(D) < len(D2):
|
|
269
|
+
D, D2 = D2, D
|
|
270
|
+
return axpy(1, D2, D)
|
|
271
|
+
|
|
272
|
+
cpdef dict sum(dict_iter):
|
|
273
|
+
r"""
|
|
274
|
+
Return the pointwise addition of dictionaries with coefficients.
|
|
275
|
+
|
|
276
|
+
INPUT:
|
|
277
|
+
|
|
278
|
+
- ``dict_iter`` -- iterator of dictionaries whose values are in
|
|
279
|
+
a common ring and all values are nonzero
|
|
280
|
+
|
|
281
|
+
OUTPUT:
|
|
282
|
+
|
|
283
|
+
- a dictionary containing all keys of the dictionaries in ``dict_list``
|
|
284
|
+
with values being the sum of the values in the different dictionaries
|
|
285
|
+
(keys with zero value are omitted)
|
|
286
|
+
|
|
287
|
+
EXAMPLES::
|
|
288
|
+
|
|
289
|
+
sage: import sage.data_structures.blas_dict as blas
|
|
290
|
+
sage: D = {0: 1, 1: 1}; D
|
|
291
|
+
{0: 1, 1: 1}
|
|
292
|
+
sage: blas.sum(D for x in range(5))
|
|
293
|
+
{0: 5, 1: 5}
|
|
294
|
+
|
|
295
|
+
sage: D1 = {0: 1, 1: 1}; D2 = {0: -1, 1: 1}
|
|
296
|
+
sage: blas.sum([D1, D2])
|
|
297
|
+
{1: 2}
|
|
298
|
+
|
|
299
|
+
sage: blas.sum([{}, {}, D1, D2, {}])
|
|
300
|
+
{1: 2}
|
|
301
|
+
"""
|
|
302
|
+
cdef dict result = {}
|
|
303
|
+
cdef D
|
|
304
|
+
|
|
305
|
+
for D in dict_iter:
|
|
306
|
+
if result:
|
|
307
|
+
iaxpy(1, D, result, remove_zeros=False)
|
|
308
|
+
elif D:
|
|
309
|
+
result = D.copy()
|
|
310
|
+
|
|
311
|
+
return remove_zeros(result)
|
|
312
|
+
|
|
313
|
+
cpdef dict linear_combination(dict_factor_iter, bint factor_on_left=True):
|
|
314
|
+
r"""
|
|
315
|
+
Return the pointwise addition of dictionaries with coefficients.
|
|
316
|
+
|
|
317
|
+
INPUT:
|
|
318
|
+
|
|
319
|
+
- ``dict_factor_iter`` -- iterator of pairs ``D``, ``coeff``, where
|
|
320
|
+
|
|
321
|
+
* the ``D``'s are dictionaries with values in a common ring
|
|
322
|
+
* the ``coeff``'s are coefficients in this ring
|
|
323
|
+
|
|
324
|
+
- ``factor_on_left`` -- boolean (default: ``True``); if ``True``,
|
|
325
|
+
the coefficients are multiplied on the left, otherwise they are
|
|
326
|
+
multiplied on the right
|
|
327
|
+
|
|
328
|
+
OUTPUT:
|
|
329
|
+
|
|
330
|
+
- a dictionary containing all keys of dictionaries in ``dict_list``
|
|
331
|
+
with values being the sum of the values in the different
|
|
332
|
+
dictionaries and each one first multiplied by the given factor
|
|
333
|
+
(keys with zero value are omitted)
|
|
334
|
+
|
|
335
|
+
EXAMPLES::
|
|
336
|
+
|
|
337
|
+
sage: import sage.data_structures.blas_dict as blas
|
|
338
|
+
sage: D = { 0:1, 1:1 }; D
|
|
339
|
+
{0: 1, 1: 1}
|
|
340
|
+
sage: blas.linear_combination( (D,i) for i in range(5) )
|
|
341
|
+
{0: 10, 1: 10}
|
|
342
|
+
sage: blas.linear_combination( [(D,1), (D,-1)] )
|
|
343
|
+
{}
|
|
344
|
+
|
|
345
|
+
Check right multiplication with coefficients in a noncommutative ring::
|
|
346
|
+
|
|
347
|
+
sage: # needs sage.combinat sage.groups sage.modules
|
|
348
|
+
sage: SGA = SymmetricGroupAlgebra(QQ, 3)
|
|
349
|
+
sage: s1 = SGA([2, 1, 3]) # (1 2)
|
|
350
|
+
sage: s2 = SGA([3, 1, 2]) # (1 3)
|
|
351
|
+
sage: D1 = {0: s1}
|
|
352
|
+
sage: blas.linear_combination([(D1, s2)], factor_on_left=False) # s1 * s2
|
|
353
|
+
{0: [1, 3, 2]}
|
|
354
|
+
|
|
355
|
+
Check left multiplication with coefficients in a noncommutative ring::
|
|
356
|
+
|
|
357
|
+
sage: # needs sage.combinat sage.groups sage.modules
|
|
358
|
+
sage: blas.linear_combination([(D1, s2)], factor_on_left=True) # s2 * s1
|
|
359
|
+
{0: [3, 2, 1]}
|
|
360
|
+
"""
|
|
361
|
+
cdef dict result = {}
|
|
362
|
+
cdef dict D
|
|
363
|
+
|
|
364
|
+
for D, a in dict_factor_iter:
|
|
365
|
+
if not a: # We multiply by 0, so nothing to do
|
|
366
|
+
continue
|
|
367
|
+
if not result and a == 1:
|
|
368
|
+
result = D.copy()
|
|
369
|
+
else:
|
|
370
|
+
iaxpy(a, D, result, remove_zeros=False,
|
|
371
|
+
factor_on_left=factor_on_left)
|
|
372
|
+
|
|
373
|
+
return remove_zeros(result)
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
cpdef dict sum_of_monomials(monomials, scalar):
|
|
377
|
+
r"""
|
|
378
|
+
Return the pointwise addition of ``monomials``.
|
|
379
|
+
|
|
380
|
+
INPUT:
|
|
381
|
+
|
|
382
|
+
- ``monomials`` -- list (or iterable) of indices representing the monomials
|
|
383
|
+
- ``scalar`` -- the scalar for each monomial
|
|
384
|
+
|
|
385
|
+
EXAMPLES::
|
|
386
|
+
|
|
387
|
+
sage: import sage.data_structures.blas_dict as blas
|
|
388
|
+
sage: blas.sum_of_monomials(['a', 'a', 'b', 'b', 'b'], 1)
|
|
389
|
+
{'a': 2, 'b': 3}
|
|
390
|
+
sage: blas.sum_of_monomials(['a', 'a', 'b', 'b', 'b'], 2)
|
|
391
|
+
{'a': 4, 'b': 6}
|
|
392
|
+
sage: blas.sum_of_monomials(['a', 'a', 'b', 'b', 'b'], GF(3).one())
|
|
393
|
+
{'a': 2}
|
|
394
|
+
"""
|
|
395
|
+
cdef dict result = {}
|
|
396
|
+
cdef object m
|
|
397
|
+
for m in monomials:
|
|
398
|
+
if m in result:
|
|
399
|
+
result[m] += scalar
|
|
400
|
+
else:
|
|
401
|
+
result[m] = scalar
|
|
402
|
+
return remove_zeros(result)
|
|
403
|
+
|
|
404
|
+
cpdef dict sum_of_terms(index_coeff_pairs):
|
|
405
|
+
r"""
|
|
406
|
+
Return the linear combination of a monomial scaled by a coefficient.
|
|
407
|
+
|
|
408
|
+
INPUT:
|
|
409
|
+
|
|
410
|
+
- ``index_coeff_pairs`` -- list (or iterable) of pairs ``(index, coeff)``
|
|
411
|
+
|
|
412
|
+
EXAMPLES::
|
|
413
|
+
|
|
414
|
+
sage: import sage.data_structures.blas_dict as blas
|
|
415
|
+
sage: blas.sum_of_terms([('a', 5), ('b', 3), ('a', -4)])
|
|
416
|
+
{'a': 1, 'b': 3}
|
|
417
|
+
sage: blas.sum_of_terms([('a', 5), ('b', 3), ('a', -5)])
|
|
418
|
+
{'b': 3}
|
|
419
|
+
sage: blas.sum_of_terms([('a', 5), ('b', GF(2).one()),
|
|
420
|
+
....: ('a', -5), ('b', GF(2).one())])
|
|
421
|
+
{}
|
|
422
|
+
"""
|
|
423
|
+
cdef dict result = {}
|
|
424
|
+
cdef object index, coeff
|
|
425
|
+
for index, coeff in index_coeff_pairs:
|
|
426
|
+
if index in result:
|
|
427
|
+
result[index] += coeff
|
|
428
|
+
else:
|
|
429
|
+
result[index] = coeff
|
|
430
|
+
return remove_zeros(result)
|
|
431
|
+
|
|
432
|
+
cdef dict remove_zeros(dict D):
|
|
433
|
+
"""
|
|
434
|
+
Remove all keys whose value is zero from ``D``.
|
|
435
|
+
"""
|
|
436
|
+
cdef list for_removal
|
|
437
|
+
cdef object index
|
|
438
|
+
for_removal = [index for index in D if not D[index]]
|
|
439
|
+
for index in for_removal:
|
|
440
|
+
del D[index]
|
|
441
|
+
return D
|
|
442
|
+
|
|
443
|
+
cpdef dict convert_remove_zeroes(dict D, R):
|
|
444
|
+
"""
|
|
445
|
+
Remove all keys whose value is zero from ``D``
|
|
446
|
+
after coercing into the ring ``R``.
|
|
447
|
+
|
|
448
|
+
.. WARNING::
|
|
449
|
+
|
|
450
|
+
This modifies the input ``D``.
|
|
451
|
+
|
|
452
|
+
EXAMPLES::
|
|
453
|
+
|
|
454
|
+
sage: from sage.data_structures.blas_dict import convert_remove_zeroes
|
|
455
|
+
sage: d = {1: -2, 2: -4, 3: -3}
|
|
456
|
+
sage: convert_remove_zeroes(d, GF(2))
|
|
457
|
+
{3: 1}
|
|
458
|
+
"""
|
|
459
|
+
cdef list for_removal = []
|
|
460
|
+
cdef object index, val
|
|
461
|
+
for index in D:
|
|
462
|
+
val = R(D[index])
|
|
463
|
+
if val:
|
|
464
|
+
D[index] = val
|
|
465
|
+
else:
|
|
466
|
+
for_removal.append(index)
|
|
467
|
+
for index in for_removal:
|
|
468
|
+
del D[index]
|
|
469
|
+
return D
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
cimport cython
|
|
3
|
+
|
|
4
|
+
cdef struct pair_s:
|
|
5
|
+
size_t first
|
|
6
|
+
size_t second
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@cython.final
|
|
10
|
+
cdef class ListOfPairs:
|
|
11
|
+
cdef pair_s** _lists
|
|
12
|
+
cdef size_t length
|
|
13
|
+
|
|
14
|
+
cdef inline int enlarge(self) except -1
|
|
15
|
+
cdef inline int add(self, size_t first, size_t second) except -1
|
|
16
|
+
cdef inline pair_s* get(self, size_t index) except NULL
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
A data structure to store lists of integer pairs of large size.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# ****************************************************************************
|
|
7
|
+
# Copyright (C) 2022 Jonathan Kliem <jonathan.kliem@gmail.com>
|
|
8
|
+
#
|
|
9
|
+
# This program is free software: you can redistribute it and/or modify
|
|
10
|
+
# it under the terms of the GNU General Public License as published by
|
|
11
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
12
|
+
# (at your option) any later version.
|
|
13
|
+
# https://www.gnu.org/licenses/
|
|
14
|
+
# ****************************************************************************
|
|
15
|
+
|
|
16
|
+
from cysignals.memory cimport check_reallocarray, check_allocarray, sig_free
|
|
17
|
+
from sage.rings.integer cimport smallInteger
|
|
18
|
+
|
|
19
|
+
# Should be a power of two.
|
|
20
|
+
# Should be neither exposed nor modified.
|
|
21
|
+
cdef size_t length_per_list = 16348
|
|
22
|
+
|
|
23
|
+
cdef class ListOfPairs:
|
|
24
|
+
def __dealloc__(self):
|
|
25
|
+
cdef size_t n_lists = self.length // length_per_list
|
|
26
|
+
cdef size_t i
|
|
27
|
+
for i in range(n_lists):
|
|
28
|
+
sig_free(self._lists[i])
|
|
29
|
+
sig_free(self._lists)
|
|
30
|
+
|
|
31
|
+
cdef inline int enlarge(self) except -1:
|
|
32
|
+
"""
|
|
33
|
+
Increase size of list by one.
|
|
34
|
+
"""
|
|
35
|
+
if self.length % length_per_list:
|
|
36
|
+
self.length += 1
|
|
37
|
+
return 0
|
|
38
|
+
|
|
39
|
+
cdef size_t n_lists = self.length // length_per_list
|
|
40
|
+
self._lists = <pair_s**> check_reallocarray(self._lists, n_lists + 1, sizeof(pair_s*))
|
|
41
|
+
self._lists[n_lists] = <pair_s*> check_allocarray(length_per_list, sizeof(pair_s))
|
|
42
|
+
self.length += 1
|
|
43
|
+
|
|
44
|
+
cdef inline pair_s* get(self, size_t index) except NULL:
|
|
45
|
+
"""
|
|
46
|
+
Return a pointer to a pair of the list corresponding to the ``index``.
|
|
47
|
+
"""
|
|
48
|
+
if not (0 <= index < self.length):
|
|
49
|
+
raise IndexError
|
|
50
|
+
|
|
51
|
+
cdef size_t list_index = index // length_per_list
|
|
52
|
+
cdef size_t index_in_list = index - list_index * length_per_list
|
|
53
|
+
|
|
54
|
+
return &self._lists[list_index][index_in_list]
|
|
55
|
+
|
|
56
|
+
def __getitem__(self, size_t index):
|
|
57
|
+
r"""
|
|
58
|
+
Get item of specified index.
|
|
59
|
+
|
|
60
|
+
EXAMPLES::
|
|
61
|
+
|
|
62
|
+
sage: from sage.data_structures.list_of_pairs import ListOfPairs
|
|
63
|
+
sage: l = ListOfPairs()
|
|
64
|
+
sage: l[0] = [1, 5]
|
|
65
|
+
sage: l[0]
|
|
66
|
+
(1, 5)
|
|
67
|
+
sage: l[1]
|
|
68
|
+
Traceback (most recent call last):
|
|
69
|
+
...
|
|
70
|
+
IndexError
|
|
71
|
+
sage: l[-1]
|
|
72
|
+
Traceback (most recent call last):
|
|
73
|
+
...
|
|
74
|
+
OverflowError: can't convert negative value to size_t
|
|
75
|
+
"""
|
|
76
|
+
cdef pair_s* pair = self.get(index)
|
|
77
|
+
return (smallInteger(pair.first), smallInteger(pair.second))
|
|
78
|
+
|
|
79
|
+
def __setitem__(self, size_t index, value):
|
|
80
|
+
r"""
|
|
81
|
+
Set item of specified index.
|
|
82
|
+
|
|
83
|
+
Allows increasing the size of the list by at most 1.
|
|
84
|
+
|
|
85
|
+
EXAMPLES::
|
|
86
|
+
|
|
87
|
+
sage: from sage.data_structures.list_of_pairs import ListOfPairs
|
|
88
|
+
sage: l = ListOfPairs()
|
|
89
|
+
sage: l[0] = (2, 1)
|
|
90
|
+
sage: l[1] = (1, 2)
|
|
91
|
+
sage: l[0]
|
|
92
|
+
(2, 1)
|
|
93
|
+
sage: l[1]
|
|
94
|
+
(1, 2)
|
|
95
|
+
sage: l[10] = (5, 3)
|
|
96
|
+
Traceback (most recent call last):
|
|
97
|
+
...
|
|
98
|
+
IndexError
|
|
99
|
+
sage: l[2] = 2
|
|
100
|
+
Traceback (most recent call last):
|
|
101
|
+
...
|
|
102
|
+
TypeError: 'sage.rings.integer.Integer' object is not iterable
|
|
103
|
+
"""
|
|
104
|
+
cdef size_t first, second
|
|
105
|
+
(first, second) = value
|
|
106
|
+
|
|
107
|
+
if index == self.length:
|
|
108
|
+
self.add(first, second)
|
|
109
|
+
return
|
|
110
|
+
|
|
111
|
+
cdef pair_s* pair_pt = self.get(index)
|
|
112
|
+
pair_pt.first = first
|
|
113
|
+
pair_pt.second = second
|
|
114
|
+
|
|
115
|
+
cdef inline int add(self, size_t first, size_t second) except -1:
|
|
116
|
+
"""
|
|
117
|
+
Add a pair to the list.
|
|
118
|
+
"""
|
|
119
|
+
self.enlarge()
|
|
120
|
+
cdef pair_s* last = self.get(self.length - 1)
|
|
121
|
+
last.first = first
|
|
122
|
+
last.second = second
|