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,117 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Few functions from ``bitset_base.pxd`` that are not inlined.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# ***************************************************************************
|
|
7
|
+
# Copyright (C) 2008 Robert Bradshaw <robertwb@math.washington.edu>
|
|
8
|
+
#
|
|
9
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
10
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
11
|
+
# the License, or (at your option) any later version.
|
|
12
|
+
# https://www.gnu.org/licenses/
|
|
13
|
+
# ***************************************************************************
|
|
14
|
+
|
|
15
|
+
cdef char* bitset_chars(char* s, fused_bitset_t bits, char zero=c'0', char one=c'1') noexcept:
|
|
16
|
+
"""
|
|
17
|
+
Return a string representation of the bitset in s, using zero for
|
|
18
|
+
the character representing the items not in the bitset and one for
|
|
19
|
+
the character representing the items in the bitset.
|
|
20
|
+
|
|
21
|
+
The string is both stored in s and returned. If s is NULL, then a
|
|
22
|
+
new string is allocated.
|
|
23
|
+
"""
|
|
24
|
+
cdef mp_bitcnt_t i
|
|
25
|
+
if s == NULL:
|
|
26
|
+
s = <char *>sig_malloc(bits.size + 1)
|
|
27
|
+
for i in range(bits.size):
|
|
28
|
+
s[i] = one if bitset_in(bits, i) else zero
|
|
29
|
+
s[bits.size] = 0
|
|
30
|
+
return s
|
|
31
|
+
|
|
32
|
+
cdef int bitset_from_char(bitset_t bits, char* s, char zero=c'0', char one=c'1') except -1:
|
|
33
|
+
"""
|
|
34
|
+
Initialize a bitset with a set derived from the C string s, where one
|
|
35
|
+
represents the character indicating set membership.
|
|
36
|
+
"""
|
|
37
|
+
bitset_init(bits, strlen(s))
|
|
38
|
+
cdef mp_bitcnt_t i
|
|
39
|
+
for i in range(bits.size):
|
|
40
|
+
bitset_set_to(bits, i, s[i] == one)
|
|
41
|
+
return 0
|
|
42
|
+
|
|
43
|
+
cdef int bitset_from_str(bitset_t bits, object s, char zero=c'0', char one=c'1') except -1:
|
|
44
|
+
"""
|
|
45
|
+
Initialize a bitset with a set derived from the Python str s, where one
|
|
46
|
+
represents the character indicating set membership.
|
|
47
|
+
"""
|
|
48
|
+
cdef bytes b = str_to_bytes(s)
|
|
49
|
+
return bitset_from_char(bits, b, zero, one)
|
|
50
|
+
|
|
51
|
+
cdef bitset_string(fused_bitset_t bits):
|
|
52
|
+
"""
|
|
53
|
+
Return a python string representing the bitset.
|
|
54
|
+
"""
|
|
55
|
+
return bytes_to_str(bitset_bytes(bits))
|
|
56
|
+
|
|
57
|
+
cdef bitset_bytes(fused_bitset_t bits):
|
|
58
|
+
"""
|
|
59
|
+
Return a python bytes string representing the bitset.
|
|
60
|
+
|
|
61
|
+
On Python 2 this is equivalent to bitset_string.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
cdef char* s = bitset_chars(NULL, bits)
|
|
65
|
+
cdef object py_s
|
|
66
|
+
py_s = s
|
|
67
|
+
sig_free(s)
|
|
68
|
+
return py_s
|
|
69
|
+
|
|
70
|
+
cdef list bitset_list(fused_bitset_t bits):
|
|
71
|
+
"""
|
|
72
|
+
Return a list of elements in the bitset.
|
|
73
|
+
"""
|
|
74
|
+
cdef list elts = []
|
|
75
|
+
cdef long elt = bitset_first(bits)
|
|
76
|
+
while elt >= 0:
|
|
77
|
+
elts.append(elt)
|
|
78
|
+
elt = bitset_next(bits, elt + 1)
|
|
79
|
+
return elts
|
|
80
|
+
|
|
81
|
+
cdef bitset_pickle(bitset_t bs):
|
|
82
|
+
"""
|
|
83
|
+
Convert ``bs`` to a reasonably compact Python structure.
|
|
84
|
+
|
|
85
|
+
Useful for pickling objects using bitsets as internal data structure.
|
|
86
|
+
To ensure this works on 32-bit and 64-bit machines, the size of a long
|
|
87
|
+
is stored too.
|
|
88
|
+
"""
|
|
89
|
+
version = 0
|
|
90
|
+
data = []
|
|
91
|
+
for i in range(bs.limbs):
|
|
92
|
+
data.append(bs.bits[i])
|
|
93
|
+
return (version, bs.size, bs.limbs, sizeof(unsigned long), tuple(data))
|
|
94
|
+
|
|
95
|
+
cdef bitset_unpickle(bitset_t bs, tuple input):
|
|
96
|
+
"""
|
|
97
|
+
Convert the data into a bitset.
|
|
98
|
+
|
|
99
|
+
Companion of ``bitset_pickle()``. Assumption: ``bs`` has been initialized.
|
|
100
|
+
"""
|
|
101
|
+
version, size, limbs, longsize, data = input
|
|
102
|
+
if version != 0:
|
|
103
|
+
raise TypeError("bitset was saved with newer version of Sage. Please upgrade.")
|
|
104
|
+
if bs.size != size:
|
|
105
|
+
bitset_realloc(bs, size)
|
|
106
|
+
if sizeof(unsigned long) == longsize and bs.limbs == limbs:
|
|
107
|
+
for i in range(bs.limbs):
|
|
108
|
+
bs.bits[i] = data[i]
|
|
109
|
+
else:
|
|
110
|
+
storage = 8 * longsize # number of elements encoded in one limb
|
|
111
|
+
adder = 0
|
|
112
|
+
bitset_clear(bs)
|
|
113
|
+
for i in range(limbs):
|
|
114
|
+
for j in range(storage):
|
|
115
|
+
if (data[i] >> j) & 1:
|
|
116
|
+
bitset_add(bs, <mp_bitcnt_t>(j + adder))
|
|
117
|
+
adder += storage
|
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
/* sage_setup: distribution = sagemath-categories
|
|
2
|
+
*/
|
|
3
|
+
#ifndef SAGE_BITSET_INTRINSICS
|
|
4
|
+
#define SAGE_BITSET_INTRINSICS
|
|
5
|
+
|
|
6
|
+
#include "gmp.h"
|
|
7
|
+
#include <stdio.h>
|
|
8
|
+
|
|
9
|
+
#if __POPCNT__ || __BMI__
|
|
10
|
+
#include <immintrin.h>
|
|
11
|
+
#endif
|
|
12
|
+
|
|
13
|
+
#if __AVX2__
|
|
14
|
+
#include <immintrin.h>
|
|
15
|
+
#elif __AVX__
|
|
16
|
+
#include <immintrin.h>
|
|
17
|
+
#include <emmintrin.h>
|
|
18
|
+
#elif __SSE4_1__
|
|
19
|
+
#include <emmintrin.h>
|
|
20
|
+
#include <smmintrin.h>
|
|
21
|
+
#endif
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
// This file contains functions of ``bitset_base.pxd``
|
|
25
|
+
// that can be optimized using intrinsics.
|
|
26
|
+
|
|
27
|
+
const mp_bitcnt_t LIMB_SIZE = sizeof(mp_limb_t);
|
|
28
|
+
|
|
29
|
+
#if __AVX__
|
|
30
|
+
const mp_bitcnt_t ALIGNMENT = 32;
|
|
31
|
+
#elif __SSE4_1__
|
|
32
|
+
const mp_bitcnt_t ALIGNMENT = 16;
|
|
33
|
+
#else
|
|
34
|
+
const mp_bitcnt_t ALIGNMENT = sizeof(mp_limb_t);
|
|
35
|
+
#endif
|
|
36
|
+
|
|
37
|
+
// We assume that ``GMP_LIMB_BITS`` is a divisor of 64
|
|
38
|
+
#define LIMBS_PER_64 64/GMP_LIMB_BITS
|
|
39
|
+
|
|
40
|
+
static inline mp_bitcnt_t _set_non_zero(mp_limb_t* bits, mp_bitcnt_t* non_zero_chunks, mp_bitcnt_t limbs){
|
|
41
|
+
/*
|
|
42
|
+
Set the non zero positions of ``bits``.
|
|
43
|
+
|
|
44
|
+
Return the number of non zero chunks.
|
|
45
|
+
|
|
46
|
+
.. WARNING::
|
|
47
|
+
|
|
48
|
+
It is assumed that ``bits`` is overaligned
|
|
49
|
+
according to ``ALIGNMENT`` and its length is a multiple
|
|
50
|
+
of ``ALIGNMENT``.
|
|
51
|
+
*/
|
|
52
|
+
mp_bitcnt_t i;
|
|
53
|
+
mp_bitcnt_t pos = 0;
|
|
54
|
+
#if __AVX__
|
|
55
|
+
for(i = 0; i < limbs; i +=4*LIMBS_PER_64){
|
|
56
|
+
__m256i A = _mm256_load_si256((const __m256i*)&bits[i]);
|
|
57
|
+
if (!_mm256_testz_si256(A, A)){
|
|
58
|
+
non_zero_chunks[pos] = i;
|
|
59
|
+
pos++;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
#elif __SSE4_1__
|
|
63
|
+
for(i = 0; i < limbs; i +=2*LIMBS_PER_64){
|
|
64
|
+
__m128i A = _mm_load_si128((const __m128i*)&bits[i]);
|
|
65
|
+
if (!_mm_testz_si128(A, A)){
|
|
66
|
+
non_zero_chunks[pos] = i;
|
|
67
|
+
pos++;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
#else
|
|
71
|
+
for(i = 0; i < limbs; i++){
|
|
72
|
+
if (bits[i]){
|
|
73
|
+
non_zero_chunks[pos] = i;
|
|
74
|
+
pos++;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
#endif
|
|
78
|
+
return pos;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/*
|
|
82
|
+
#############################################################################
|
|
83
|
+
# Bitset Comparison
|
|
84
|
+
#############################################################################
|
|
85
|
+
*/
|
|
86
|
+
|
|
87
|
+
enum cmpop_t {EQUAL, SUBSET, DISJOINT};
|
|
88
|
+
|
|
89
|
+
static inline int _bitset_isempty(mp_limb_t* bits, mp_bitcnt_t limbs){
|
|
90
|
+
/*
|
|
91
|
+
Test whether ``bits`` is empty. Return ``True`` (i.e., ``1``) if the set is
|
|
92
|
+
empty, ``False`` (i.e., ``0``) otherwise.
|
|
93
|
+
*/
|
|
94
|
+
// First check lowest limb
|
|
95
|
+
if (bits[0])
|
|
96
|
+
return 0;
|
|
97
|
+
if (limbs == 1)
|
|
98
|
+
return 1;
|
|
99
|
+
// Compare bits to itself shifted by 1 limb. If these compare equal,
|
|
100
|
+
// all limbs must be 0.
|
|
101
|
+
return mpn_cmp(bits+1, bits, limbs-1) == 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
#if __AVX__
|
|
105
|
+
static inline int cmp_on_chunk(__m256i A, __m256i B, enum cmpop_t cmpop ){
|
|
106
|
+
/*
|
|
107
|
+
Test ``A cmpop B``,
|
|
108
|
+
|
|
109
|
+
where ``cmpop`` is one of ``EQUAL``, ``SUBSET``, ``DISJOINT``.
|
|
110
|
+
*/
|
|
111
|
+
if (cmpop == EQUAL)
|
|
112
|
+
return _mm256_testc_si256(A, B) && _mm256_testc_si256(B, A);
|
|
113
|
+
if (cmpop == SUBSET)
|
|
114
|
+
return _mm256_testc_si256(B, A); // Need to be opposite order!
|
|
115
|
+
// ``cmpop == DISJOINT``
|
|
116
|
+
return _mm256_testz_si256(A, B);
|
|
117
|
+
}
|
|
118
|
+
#elif __SSE4_1__
|
|
119
|
+
static inline int cmp_on_chunk(__m128i A, __m128i B, enum cmpop_t cmpop){
|
|
120
|
+
/*
|
|
121
|
+
Test ``A cmpop B``,
|
|
122
|
+
|
|
123
|
+
where ``cmpop`` is one of ``EQUAL``, ``SUBSET``, ``DISJOINT``.
|
|
124
|
+
*/
|
|
125
|
+
if (cmpop == EQUAL)
|
|
126
|
+
return _mm_testc_si128(A, B) && _mm_testc_si128(B, A);
|
|
127
|
+
if (cmpop == SUBSET)
|
|
128
|
+
return _mm_testc_si128(B, A); // Need to be opposite order!
|
|
129
|
+
// ``cmpop == DISJOINT``
|
|
130
|
+
return _mm_testz_si128(A, B);
|
|
131
|
+
}
|
|
132
|
+
#endif
|
|
133
|
+
|
|
134
|
+
static inline int cmp_on_limb(mp_limb_t A, mp_limb_t B, enum cmpop_t cmpop){
|
|
135
|
+
/*
|
|
136
|
+
Test ``A cmpop B``,
|
|
137
|
+
|
|
138
|
+
where ``cmpop`` is one of ``EQUAL``, ``SUBSET``, ``DISJOINT``.
|
|
139
|
+
*/
|
|
140
|
+
if (cmpop == EQUAL)
|
|
141
|
+
return A == B;
|
|
142
|
+
if (cmpop == SUBSET)
|
|
143
|
+
return !(A & ~B);
|
|
144
|
+
// ``cmpop == DISJOINT``
|
|
145
|
+
return !(A & B);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
static inline int cmp_with_mpn(mp_limb_t* a, mp_limb_t* b, mp_bitcnt_t limbs, enum cmpop_t cmpop){
|
|
149
|
+
/*
|
|
150
|
+
Test ``a cmpop b``,
|
|
151
|
+
|
|
152
|
+
where ``cmpop`` is one of ``EQUAL``, ``SUBSET``, ``DISJOINT``.
|
|
153
|
+
|
|
154
|
+
Use gmp if possible.
|
|
155
|
+
*/
|
|
156
|
+
if (cmpop == EQUAL)
|
|
157
|
+
return mpn_cmp(a, b, limbs) == 0;
|
|
158
|
+
mp_bitcnt_t i;
|
|
159
|
+
for(i = 0; i < limbs; i++){
|
|
160
|
+
if (!cmp_on_limb(a[i], b[i], cmpop))
|
|
161
|
+
return 0;
|
|
162
|
+
}
|
|
163
|
+
return 1;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
static inline int _bitset_cmp(mp_limb_t* a, mp_limb_t* b, mp_bitcnt_t limbs, enum cmpop_t cmpop){
|
|
167
|
+
/*
|
|
168
|
+
Test ``a cmpop b``,
|
|
169
|
+
|
|
170
|
+
where ``cmpop`` is one of ``EQUAL``, ``SUBSET``, ``DISJOINT``.
|
|
171
|
+
*/
|
|
172
|
+
#if __AVX__
|
|
173
|
+
mp_bitcnt_t i;
|
|
174
|
+
for(i = 0; i + (4*LIMBS_PER_64 - 1) < limbs; i += 4*LIMBS_PER_64){
|
|
175
|
+
__m256i A = _mm256_loadu_si256((const __m256i*)&a[i]);
|
|
176
|
+
__m256i B = _mm256_loadu_si256((const __m256i*)&b[i]);
|
|
177
|
+
if (!cmp_on_chunk(A, B, cmpop))
|
|
178
|
+
return 0;
|
|
179
|
+
}
|
|
180
|
+
for(; i < limbs; i++){
|
|
181
|
+
if (!cmp_on_limb(a[i], b[i], cmpop))
|
|
182
|
+
return 0;
|
|
183
|
+
}
|
|
184
|
+
return 1;
|
|
185
|
+
#elif __SSE4_1__
|
|
186
|
+
mp_bitcnt_t i;
|
|
187
|
+
for(i = 0; i + (2*LIMBS_PER_64 - 1) < limbs; i += 2*LIMBS_PER_64){
|
|
188
|
+
__m128i A = _mm_loadu_si128((const __m128i*)&a[i]);
|
|
189
|
+
__m128i B = _mm_loadu_si128((const __m128i*)&b[i]);
|
|
190
|
+
if (!cmp_on_chunk(A, B, cmpop))
|
|
191
|
+
return 0;
|
|
192
|
+
}
|
|
193
|
+
for(; i < limbs; i++){
|
|
194
|
+
if (!cmp_on_limb(a[i], b[i], cmpop))
|
|
195
|
+
return 0;
|
|
196
|
+
}
|
|
197
|
+
return 1;
|
|
198
|
+
#else
|
|
199
|
+
return cmp_with_mpn(a, b, limbs, cmpop);
|
|
200
|
+
#endif
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
static inline int _sparse_bitset_cmp(mp_limb_t* a, mp_bitcnt_t* a_non_zero_chunks, mp_bitcnt_t a_n_non_zero_chunks, mp_limb_t* b, enum cmpop_t cmpop){
|
|
204
|
+
/*
|
|
205
|
+
Test ``a cmpop b``,
|
|
206
|
+
|
|
207
|
+
where ``cmpop`` is one of ``SUBSET``, ``DISJOINT``.
|
|
208
|
+
|
|
209
|
+
Only the non zero chunks of ``a`` are checked.
|
|
210
|
+
|
|
211
|
+
.. WARNING::
|
|
212
|
+
|
|
213
|
+
It is assumed that ``a`` and ``b`` are overaligned
|
|
214
|
+
according to ``ALIGNMENT`` and their length are a multiple
|
|
215
|
+
of ``ALIGNMENT``.
|
|
216
|
+
*/
|
|
217
|
+
|
|
218
|
+
// For checking equality, it does not suffice to check only
|
|
219
|
+
// the nonzero chunks of ``a``.
|
|
220
|
+
assert(cmpop != EQUAL);
|
|
221
|
+
mp_bitcnt_t i,j;
|
|
222
|
+
for(j = 0; j < a_n_non_zero_chunks; j++){
|
|
223
|
+
i = a_non_zero_chunks[j];
|
|
224
|
+
#if __AVX__
|
|
225
|
+
__m256i A = _mm256_load_si256((const __m256i*)&a[i]);
|
|
226
|
+
__m256i B = _mm256_load_si256((const __m256i*)&b[i]);
|
|
227
|
+
if (!cmp_on_chunk(A, B, cmpop))
|
|
228
|
+
return 0;
|
|
229
|
+
|
|
230
|
+
#elif __SSE4_1__
|
|
231
|
+
__m128i A = _mm_load_si128((const __m128i*)&a[i]);
|
|
232
|
+
__m128i B = _mm_load_si128((const __m128i*)&b[i]);
|
|
233
|
+
if (!cmp_on_chunk(A, B, cmpop))
|
|
234
|
+
return 0;
|
|
235
|
+
#else
|
|
236
|
+
if (!cmp_on_limb(a[i], b[i], cmpop))
|
|
237
|
+
return 0;
|
|
238
|
+
#endif
|
|
239
|
+
}
|
|
240
|
+
return 1;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/*
|
|
244
|
+
#############################################################################
|
|
245
|
+
# Bitset Searching
|
|
246
|
+
#############################################################################
|
|
247
|
+
*/
|
|
248
|
+
|
|
249
|
+
static inline long _bitset_first_in_limb_nonzero(mp_limb_t limb){
|
|
250
|
+
/*
|
|
251
|
+
Given a nonzero limb of a bitset, return the index of the first
|
|
252
|
+
nonzero bit.
|
|
253
|
+
*/
|
|
254
|
+
#if (__BMI__) && (GMP_LIMB_BITS == 64) && (INTPTR_MAX == INT64_MAX)
|
|
255
|
+
// If available we use intrinsics trailing zero count.
|
|
256
|
+
// Also we check that ``mp_bitcnt_t`` is in fact 8 bytes long
|
|
257
|
+
// and the architecture is 64-bit.
|
|
258
|
+
return _tzcnt_u64(limb);
|
|
259
|
+
#else
|
|
260
|
+
return mpn_scan1(&limb, 0);
|
|
261
|
+
#endif
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
static inline long _bitset_first_in_limb(mp_limb_t limb){
|
|
265
|
+
/*
|
|
266
|
+
Given a limb of a bitset, return the index of the first nonzero
|
|
267
|
+
bit. If there are no bits set in the limb, return -1.
|
|
268
|
+
*/
|
|
269
|
+
if (limb == 0)
|
|
270
|
+
return -1;
|
|
271
|
+
return _bitset_first_in_limb_nonzero(limb);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
static inline long _bitset_len(mp_limb_t* bits, mp_bitcnt_t limbs){
|
|
275
|
+
/*
|
|
276
|
+
Calculate the number of items in the set (i.e., the number of nonzero bits).
|
|
277
|
+
*/
|
|
278
|
+
#if (__POPCNT__) && (GMP_LIMB_BITS == 64) && (INTPTR_MAX == INT64_MAX)
|
|
279
|
+
// If available we use intrinsics popcount.
|
|
280
|
+
// Also we check that ``mp_bitcnt_t`` is in fact 8 bytes long
|
|
281
|
+
// and the architecture is 64-bit.
|
|
282
|
+
mp_bitcnt_t i;
|
|
283
|
+
uint64_t count = 0;
|
|
284
|
+
for (i=0; i<limbs; i++){
|
|
285
|
+
count += _mm_popcnt_u64(bits[i]);
|
|
286
|
+
}
|
|
287
|
+
return count;
|
|
288
|
+
#else
|
|
289
|
+
return mpn_popcount(bits, limbs);
|
|
290
|
+
#endif
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/*
|
|
294
|
+
#############################################################################
|
|
295
|
+
# Bitset Arithmetic
|
|
296
|
+
#############################################################################
|
|
297
|
+
*/
|
|
298
|
+
|
|
299
|
+
enum operation_t {AND, OR, ANDNOT, XOR};
|
|
300
|
+
|
|
301
|
+
#if __AVX2__
|
|
302
|
+
static inline __m256i operation_on_chunk(__m256i A, __m256i B, enum operation_t operation){
|
|
303
|
+
/*
|
|
304
|
+
Return ``A operation B``,
|
|
305
|
+
|
|
306
|
+
where ``operation`` is one of ``AND``, ``OR``,
|
|
307
|
+
``ANDNOT``, ``XOR``.
|
|
308
|
+
*/
|
|
309
|
+
if (operation == AND)
|
|
310
|
+
return _mm256_and_si256(A, B);
|
|
311
|
+
if (operation == OR)
|
|
312
|
+
return _mm256_or_si256(A, B);
|
|
313
|
+
if (operation == ANDNOT)
|
|
314
|
+
return _mm256_andnot_si256(B, A);
|
|
315
|
+
// ``operation == XOR``
|
|
316
|
+
return _mm256_xor_si256(A, B);
|
|
317
|
+
}
|
|
318
|
+
#elif __SSE4_1__
|
|
319
|
+
static inline __m128i operation_on_chunk(__m128i A, __m128i B, enum operation_t operation){
|
|
320
|
+
/*
|
|
321
|
+
Return ``A operation B``,
|
|
322
|
+
|
|
323
|
+
where ``operation`` is one of ``AND``, ``OR``,
|
|
324
|
+
``ANDNOT``, ``XOR``.
|
|
325
|
+
*/
|
|
326
|
+
if (operation == AND)
|
|
327
|
+
return _mm_and_si128(A, B);
|
|
328
|
+
if (operation == OR)
|
|
329
|
+
return _mm_or_si128(A, B);
|
|
330
|
+
if (operation == ANDNOT)
|
|
331
|
+
return _mm_andnot_si128(B, A);
|
|
332
|
+
// ``operation == XOR``
|
|
333
|
+
return _mm_xor_si128(A, B);
|
|
334
|
+
}
|
|
335
|
+
#endif
|
|
336
|
+
|
|
337
|
+
static inline mp_limb_t operation_on_limb(mp_limb_t A, mp_limb_t B, enum operation_t operation){
|
|
338
|
+
/*
|
|
339
|
+
Return ``A operation B``,
|
|
340
|
+
|
|
341
|
+
where ``operation`` is one of ``AND``, ``OR``,
|
|
342
|
+
``ANDNOT``, ``XOR``.
|
|
343
|
+
*/
|
|
344
|
+
if (operation == AND)
|
|
345
|
+
return A & B;
|
|
346
|
+
if (operation == OR)
|
|
347
|
+
return A | B;
|
|
348
|
+
if (operation == ANDNOT)
|
|
349
|
+
return A & ~B;
|
|
350
|
+
// ``operation == XOR``
|
|
351
|
+
return A ^ B;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
static inline void mpn_operation(mp_limb_t* dst, mp_limb_t* a, mp_limb_t* b, mp_bitcnt_t limbs, enum operation_t operation){
|
|
355
|
+
/*
|
|
356
|
+
Set ``dst`` to ``a operation b``,
|
|
357
|
+
|
|
358
|
+
where ``operation`` is one of ``AND``, ``OR``,
|
|
359
|
+
``ANDNOT``, ``XOR``.
|
|
360
|
+
|
|
361
|
+
Use gmp.
|
|
362
|
+
*/
|
|
363
|
+
if (operation == AND)
|
|
364
|
+
mpn_and_n(dst, a, b, limbs);
|
|
365
|
+
if (operation == OR)
|
|
366
|
+
mpn_ior_n(dst, a, b, limbs);
|
|
367
|
+
if (operation == ANDNOT)
|
|
368
|
+
mpn_andn_n(dst, a, b, limbs);
|
|
369
|
+
if (operation == XOR)
|
|
370
|
+
mpn_xor_n(dst, a, b, limbs);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
static inline void _bitset_operation(mp_limb_t* dst, mp_limb_t* a, mp_limb_t* b, mp_bitcnt_t limbs, enum operation_t operation){
|
|
374
|
+
/*
|
|
375
|
+
Set ``dst`` to ``a operation b``,
|
|
376
|
+
|
|
377
|
+
where ``operation`` is one of ``AND``, ``OR``,
|
|
378
|
+
``ANDNOT``, ``XOR``.
|
|
379
|
+
*/
|
|
380
|
+
#if __AVX2__
|
|
381
|
+
mp_bitcnt_t i;
|
|
382
|
+
for(i = 0; i + (4*LIMBS_PER_64 - 1) < limbs; i +=4*LIMBS_PER_64){
|
|
383
|
+
__m256i A = _mm256_loadu_si256((const __m256i*)&a[i]);
|
|
384
|
+
__m256i B = _mm256_loadu_si256((const __m256i*)&b[i]);
|
|
385
|
+
__m256i D = operation_on_chunk(A, B, operation);
|
|
386
|
+
_mm256_storeu_si256((__m256i*)&dst[i], D);
|
|
387
|
+
}
|
|
388
|
+
for(; i < limbs; i++){
|
|
389
|
+
dst[i] = operation_on_limb(a[i], b[i], operation);
|
|
390
|
+
}
|
|
391
|
+
#elif __SSE4_1__
|
|
392
|
+
mp_bitcnt_t i;
|
|
393
|
+
for(i = 0; i + (2*LIMBS_PER_64 - 1) < limbs; i +=2*LIMBS_PER_64){
|
|
394
|
+
__m128i A = _mm_loadu_si128((const __m128i*)&a[i]);
|
|
395
|
+
__m128i B = _mm_loadu_si128((const __m128i*)&b[i]);
|
|
396
|
+
__m128i D = operation_on_chunk(A, B, operation);
|
|
397
|
+
_mm_storeu_si128((__m128i*)&dst[i], D);
|
|
398
|
+
}
|
|
399
|
+
for(; i < limbs; i++){
|
|
400
|
+
dst[i] = operation_on_limb(a[i], b[i], operation);
|
|
401
|
+
}
|
|
402
|
+
#else
|
|
403
|
+
mpn_operation(dst, a, b, limbs, operation);
|
|
404
|
+
#endif
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/*
|
|
408
|
+
#############################################################################
|
|
409
|
+
# Bitset Arithmetic for sparse bitsets.
|
|
410
|
+
#############################################################################
|
|
411
|
+
*/
|
|
412
|
+
|
|
413
|
+
static inline mp_bitcnt_t _sparse_bitset_operation(mp_limb_t* dst, mp_bitcnt_t* dst_non_zero_chunks, mp_limb_t* a, mp_limb_t* b, mp_bitcnt_t limbs, enum operation_t operation){
|
|
414
|
+
/*
|
|
415
|
+
Set ``dst`` to ``a operation b``,
|
|
416
|
+
|
|
417
|
+
where ``operation`` is one of ``AND``, ``OR``,
|
|
418
|
+
``ANDNOT``, ``XOR``.
|
|
419
|
+
|
|
420
|
+
Set dst_non_zero_chunks according to the non zero chunks of dst.
|
|
421
|
+
|
|
422
|
+
Return the number of non zero chunks.
|
|
423
|
+
|
|
424
|
+
.. WARNING::
|
|
425
|
+
|
|
426
|
+
It is assumed that ``a``, ``b``, ``dst`` are overaligned
|
|
427
|
+
according to ``ALIGNMENT`` and their length are a multiple
|
|
428
|
+
of ``ALIGNMENT``.
|
|
429
|
+
*/
|
|
430
|
+
mp_bitcnt_t i;
|
|
431
|
+
mp_bitcnt_t pos = 0;
|
|
432
|
+
#if __AVX2__
|
|
433
|
+
for(i = 0; i < limbs; i +=4*LIMBS_PER_64){
|
|
434
|
+
__m256i A = _mm256_load_si256((const __m256i*)&a[i]);
|
|
435
|
+
__m256i B = _mm256_load_si256((const __m256i*)&b[i]);
|
|
436
|
+
__m256i D = operation_on_chunk(A, B, operation);
|
|
437
|
+
_mm256_store_si256((__m256i*)&dst[i], D);
|
|
438
|
+
if (!cmp_on_chunk(D, D, DISJOINT)){
|
|
439
|
+
dst_non_zero_chunks[pos] = i;
|
|
440
|
+
pos++;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
#elif __AVX__
|
|
444
|
+
// In this case we can only perform the
|
|
445
|
+
// operation on 128 bits each.
|
|
446
|
+
// However, chunks are of size 256 bits,
|
|
447
|
+
// because comparison can be performed on this
|
|
448
|
+
// size.
|
|
449
|
+
for(i = 0; i < limbs; i +=4*LIMBS_PER_64){
|
|
450
|
+
__m128i A1 = _mm_load_si128((const __m128i*)&a[i]);
|
|
451
|
+
__m128i B1 = _mm_load_si128((const __m128i*)&b[i]);
|
|
452
|
+
__m128i D1 = operation_on_chunk(A1, B1, operation);
|
|
453
|
+
_mm_store_si128((__m128i*)&dst[i], D1);
|
|
454
|
+
__m128i A2 = _mm_load_si128((const __m128i*)&a[i+2*LIMBS_PER_64]);
|
|
455
|
+
__m128i B2 = _mm_load_si128((const __m128i*)&b[i+2*LIMBS_PER_64]);
|
|
456
|
+
__m128i D2 = operation_on_chunk(A2, B2, operation);
|
|
457
|
+
_mm_store_si128((__m128i*)&dst[i+2*LIMBS_PER_64], D2);
|
|
458
|
+
|
|
459
|
+
if (!_mm_testz_si128(D1, D1) || !_mm_testz_si128(D2, D2)){
|
|
460
|
+
dst_non_zero_chunks[pos] = i;
|
|
461
|
+
pos++;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
#elif __SSE4_1__
|
|
465
|
+
for(i = 0; i < limbs; i +=2*LIMBS_PER_64){
|
|
466
|
+
__m128i A = _mm_load_si128((const __m128i*)&a[i]);
|
|
467
|
+
__m128i B = _mm_load_si128((const __m128i*)&b[i]);
|
|
468
|
+
__m128i D = operation_on_chunk(A, B, operation);
|
|
469
|
+
_mm_store_si128((__m128i*)&dst[i], D);
|
|
470
|
+
if (!cmp_on_chunk(D, D, DISJOINT)){
|
|
471
|
+
dst_non_zero_chunks[pos] = i;
|
|
472
|
+
pos++;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
#else
|
|
476
|
+
for(i = 0; i < limbs; i++){
|
|
477
|
+
dst[i] = operation_on_limb(a[i], b[i], operation);
|
|
478
|
+
if (dst[i]){
|
|
479
|
+
dst_non_zero_chunks[pos] = i;
|
|
480
|
+
pos++;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
#endif
|
|
484
|
+
return pos;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
#endif
|
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
cpdef int iaxpy(a, dict X, dict Y, bint remove_zeros=*, bint factor_on_left=*) except -1
|
|
3
|
+
cpdef dict axpy(a, dict X, dict Y, bint factor_on_left=*)
|
|
4
|
+
cpdef dict negate(dict D)
|
|
5
|
+
cpdef dict scal(a, dict D, bint factor_on_left=*)
|
|
6
|
+
cpdef dict add(dict D, dict D2)
|
|
7
|
+
cpdef dict sum(dict_iter)
|
|
8
|
+
cpdef dict linear_combination(dict_factor_iter, bint factor_on_left=*)
|
|
9
|
+
cpdef dict sum_of_monomials(monomials, scalar)
|
|
10
|
+
cpdef dict sum_of_terms(index_coeff_pairs)
|
|
11
|
+
cdef dict remove_zeros(dict D)
|
|
12
|
+
cpdef dict convert_remove_zeroes(dict D, R)
|