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
|
Binary file
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
from sage.libs.gmp.types cimport mpz_t, mpz_srcptr
|
|
3
|
+
from sage.structure.sage_object cimport SageObject
|
|
4
|
+
from sage.rings.integer cimport Integer
|
|
5
|
+
|
|
6
|
+
cdef class PowComputer_class(SageObject):
|
|
7
|
+
cdef Integer prime
|
|
8
|
+
cdef Integer p2 # floor(p/2)
|
|
9
|
+
cdef bint in_field
|
|
10
|
+
cdef int _allocated
|
|
11
|
+
cdef public object _prec_type
|
|
12
|
+
|
|
13
|
+
cdef long ram_prec_cap # = prec_cap * e
|
|
14
|
+
|
|
15
|
+
# the following constants should be set by the subclasses
|
|
16
|
+
# the absolute degree of the p-adic ring
|
|
17
|
+
cdef long deg
|
|
18
|
+
# the absolute ramification index of the p-adic ring
|
|
19
|
+
cdef long e
|
|
20
|
+
# the absolute residual degree of the p-adic ring
|
|
21
|
+
cdef long f
|
|
22
|
+
|
|
23
|
+
cdef unsigned long cache_limit
|
|
24
|
+
cdef unsigned long prec_cap
|
|
25
|
+
|
|
26
|
+
cdef Integer pow_Integer(self, long n)
|
|
27
|
+
cdef mpz_srcptr pow_mpz_t_top(self) noexcept
|
|
28
|
+
cdef mpz_srcptr pow_mpz_t_tmp(self, long n) except NULL
|
|
29
|
+
cdef mpz_t temp_m
|
|
30
|
+
|
|
31
|
+
cdef class PowComputer_base(PowComputer_class):
|
|
32
|
+
cdef mpz_t* small_powers
|
|
33
|
+
cdef mpz_t top_power
|
|
34
|
+
cdef mpz_t powhelper_oneunit
|
|
35
|
+
cdef mpz_t powhelper_teichdiff
|
|
36
|
+
cdef mpz_t shift_rem
|
|
37
|
+
cdef mpz_t aliasing
|
|
38
|
+
cdef object __weakref__
|
|
@@ -0,0 +1,671 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
# distutils: extra_compile_args = -std=c++11
|
|
3
|
+
# distutils: libraries = gmp M_LIBRARIES
|
|
4
|
+
# distutils: language = c++
|
|
5
|
+
"""
|
|
6
|
+
PowComputer
|
|
7
|
+
|
|
8
|
+
A class for computing and caching powers of the same integer.
|
|
9
|
+
|
|
10
|
+
This class is designed to be used as a field of `p`-adic rings and
|
|
11
|
+
fields. Since elements of `p`-adic rings and fields need to use powers
|
|
12
|
+
of p over and over, this class precomputes and stores powers of p.
|
|
13
|
+
There is no reason that the base has to be prime however.
|
|
14
|
+
|
|
15
|
+
EXAMPLES::
|
|
16
|
+
|
|
17
|
+
sage: X = PowComputer(3, 4, 10)
|
|
18
|
+
sage: X(3)
|
|
19
|
+
27
|
|
20
|
+
sage: X(10) == 3^10
|
|
21
|
+
True
|
|
22
|
+
|
|
23
|
+
AUTHORS:
|
|
24
|
+
|
|
25
|
+
- David Roe
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
#*****************************************************************************
|
|
29
|
+
# Copyright (C) 2007-2013 David Roe <roed.math@gmail.com>
|
|
30
|
+
# William Stein <wstein@gmail.com>
|
|
31
|
+
#
|
|
32
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
33
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
34
|
+
# the License, or (at your option) any later version.
|
|
35
|
+
#
|
|
36
|
+
# https://www.gnu.org/licenses/
|
|
37
|
+
#*****************************************************************************
|
|
38
|
+
|
|
39
|
+
import weakref
|
|
40
|
+
from cysignals.memory cimport sig_malloc, sig_free
|
|
41
|
+
from cysignals.signals cimport sig_on, sig_off
|
|
42
|
+
|
|
43
|
+
from sage.rings.infinity import infinity
|
|
44
|
+
from sage.libs.gmp.mpz cimport *
|
|
45
|
+
from sage.structure.richcmp cimport richcmp_not_equal, richcmp
|
|
46
|
+
from cpython.object cimport Py_EQ, Py_NE
|
|
47
|
+
|
|
48
|
+
from sage.ext.stdsage cimport PY_NEW
|
|
49
|
+
|
|
50
|
+
cdef long maxpreccap = (1L << (sizeof(long) * 8 - 2)) - 1
|
|
51
|
+
|
|
52
|
+
cdef class PowComputer_class(SageObject):
|
|
53
|
+
def __cinit__(self, Integer prime, long cache_limit, long prec_cap, long ram_prec_cap, bint in_field, poly=None, shift_seed=None):
|
|
54
|
+
"""
|
|
55
|
+
Memory allocation.
|
|
56
|
+
|
|
57
|
+
EXAMPLES::
|
|
58
|
+
|
|
59
|
+
sage: PC = PowComputer(3, 5, 10)
|
|
60
|
+
sage: PC.pow_Integer_Integer(2)
|
|
61
|
+
9
|
|
62
|
+
"""
|
|
63
|
+
sig_on()
|
|
64
|
+
mpz_init(self.temp_m)
|
|
65
|
+
sig_off()
|
|
66
|
+
self._allocated = 1
|
|
67
|
+
|
|
68
|
+
def __init__(self, Integer prime, long cache_limit, long prec_cap, long ram_prec_cap, bint in_field, poly=None, shift_seed=None):
|
|
69
|
+
"""
|
|
70
|
+
Initialize ``self``.
|
|
71
|
+
|
|
72
|
+
INPUT:
|
|
73
|
+
|
|
74
|
+
- ``prime`` -- the prime that is the base of the exponentials
|
|
75
|
+
stored in this ``pow_computer``
|
|
76
|
+
|
|
77
|
+
- ``cache_limit`` -- how high to cache powers of prime
|
|
78
|
+
|
|
79
|
+
- ``prec_cap`` -- data stored for `p`-adic elements using this
|
|
80
|
+
``pow_computer`` (so they have C-level access to fields
|
|
81
|
+
common to all elements of the same parent)
|
|
82
|
+
|
|
83
|
+
- ``ram_prec_cap`` -- prec_cap * e
|
|
84
|
+
|
|
85
|
+
- ``in_field`` -- same idea as prec_cap
|
|
86
|
+
|
|
87
|
+
- ``poly`` -- same idea as prec_cap
|
|
88
|
+
|
|
89
|
+
- ``shift_seed`` -- same idea as prec_cap
|
|
90
|
+
|
|
91
|
+
EXAMPLES::
|
|
92
|
+
|
|
93
|
+
sage: PC = PowComputer(3, 5, 10)
|
|
94
|
+
sage: PC.pow_Integer_Integer(2)
|
|
95
|
+
9
|
|
96
|
+
"""
|
|
97
|
+
self.prime = prime
|
|
98
|
+
self.p2 = prime // 2
|
|
99
|
+
self.in_field = in_field
|
|
100
|
+
self.cache_limit = cache_limit
|
|
101
|
+
self.prec_cap = prec_cap
|
|
102
|
+
self.ram_prec_cap = ram_prec_cap
|
|
103
|
+
|
|
104
|
+
def __richcmp__(self, other, int op):
|
|
105
|
+
"""
|
|
106
|
+
Compare ``self`` to ``other``.
|
|
107
|
+
|
|
108
|
+
EXAMPLES::
|
|
109
|
+
|
|
110
|
+
sage: P = PowComputer(3, 4, 9)
|
|
111
|
+
sage: P == 7
|
|
112
|
+
False
|
|
113
|
+
sage: Q = PowComputer(3, 6, 9)
|
|
114
|
+
sage: P == Q
|
|
115
|
+
False
|
|
116
|
+
sage: Q = PowComputer(3, 4, 9)
|
|
117
|
+
sage: P == Q
|
|
118
|
+
True
|
|
119
|
+
sage: P is Q
|
|
120
|
+
True
|
|
121
|
+
"""
|
|
122
|
+
if not isinstance(other, PowComputer_class):
|
|
123
|
+
if op in [Py_EQ, Py_NE]:
|
|
124
|
+
return (op == Py_NE)
|
|
125
|
+
return NotImplemented
|
|
126
|
+
|
|
127
|
+
cdef PowComputer_class s = self
|
|
128
|
+
cdef PowComputer_class o = other
|
|
129
|
+
|
|
130
|
+
lx = s.prime
|
|
131
|
+
rx = o.prime
|
|
132
|
+
if lx != rx:
|
|
133
|
+
return richcmp_not_equal(lx, rx, op)
|
|
134
|
+
|
|
135
|
+
lx = s.prec_cap
|
|
136
|
+
rx = o.prec_cap
|
|
137
|
+
if lx != rx:
|
|
138
|
+
return richcmp_not_equal(lx, rx, op)
|
|
139
|
+
|
|
140
|
+
lx = s.cache_limit
|
|
141
|
+
rx = o.cache_limit
|
|
142
|
+
if lx != rx:
|
|
143
|
+
return richcmp_not_equal(lx, rx, op)
|
|
144
|
+
|
|
145
|
+
return richcmp(s.in_field, o.in_field, op)
|
|
146
|
+
|
|
147
|
+
cdef Integer pow_Integer(self, long n):
|
|
148
|
+
"""
|
|
149
|
+
Return ``self.prime^n``.
|
|
150
|
+
|
|
151
|
+
EXAMPLES::
|
|
152
|
+
|
|
153
|
+
sage: PC = PowComputer(3, 5, 10)
|
|
154
|
+
sage: PC.pow_Integer_Integer(2) # indirect doctest
|
|
155
|
+
9
|
|
156
|
+
"""
|
|
157
|
+
cdef Integer ans = PY_NEW(Integer)
|
|
158
|
+
mpz_set(ans.value, self.pow_mpz_t_tmp(n))
|
|
159
|
+
return ans
|
|
160
|
+
|
|
161
|
+
def pow_Integer_Integer(self, n):
|
|
162
|
+
"""
|
|
163
|
+
Test the ``pow_Integer`` function.
|
|
164
|
+
|
|
165
|
+
EXAMPLES::
|
|
166
|
+
|
|
167
|
+
sage: PC = PowComputer(3, 5, 10)
|
|
168
|
+
sage: PC.pow_Integer_Integer(4)
|
|
169
|
+
81
|
|
170
|
+
sage: PC.pow_Integer_Integer(6)
|
|
171
|
+
729
|
|
172
|
+
sage: PC.pow_Integer_Integer(0)
|
|
173
|
+
1
|
|
174
|
+
sage: PC.pow_Integer_Integer(10)
|
|
175
|
+
59049
|
|
176
|
+
|
|
177
|
+
sage: # needs sage.libs.ntl
|
|
178
|
+
sage: PC = PowComputer_ext_maker(3, 5, 10, 20, False, ntl.ZZ_pX([-3,0,1], 3^10), 'big','e',ntl.ZZ_pX([1],3^10))
|
|
179
|
+
sage: PC.pow_Integer_Integer(4)
|
|
180
|
+
81
|
|
181
|
+
sage: PC.pow_Integer_Integer(6)
|
|
182
|
+
729
|
|
183
|
+
sage: PC.pow_Integer_Integer(0)
|
|
184
|
+
1
|
|
185
|
+
sage: PC.pow_Integer_Integer(10)
|
|
186
|
+
59049
|
|
187
|
+
"""
|
|
188
|
+
cdef Integer _n = Integer(n)
|
|
189
|
+
if _n < 0:
|
|
190
|
+
if mpz_fits_ulong_p((<Integer>-_n).value) == 0:
|
|
191
|
+
raise ValueError("result too big")
|
|
192
|
+
return ~self.pow_Integer(mpz_get_ui((<Integer>-_n).value))
|
|
193
|
+
else:
|
|
194
|
+
if mpz_fits_ulong_p(_n.value) == 0:
|
|
195
|
+
raise ValueError("result too big")
|
|
196
|
+
return self.pow_Integer(mpz_get_ui(_n.value))
|
|
197
|
+
|
|
198
|
+
cdef mpz_srcptr pow_mpz_t_tmp(self, long n) except NULL:
|
|
199
|
+
"""
|
|
200
|
+
Provides fast access to an ``mpz_srcptr`` pointing to self.prime^n.
|
|
201
|
+
|
|
202
|
+
The location pointed to depends on the underlying
|
|
203
|
+
representation. In no circumstances should you mpz_clear the
|
|
204
|
+
result. The value pointed to may be an internal temporary
|
|
205
|
+
variable for the class. In particular, you should not try to
|
|
206
|
+
refer to the results of two pow_mpz_t_tmp calls at the same
|
|
207
|
+
time, because the second call may overwrite the memory pointed
|
|
208
|
+
to by the first.
|
|
209
|
+
|
|
210
|
+
See pow_mpz_t_tmp_demo for an example of this phenomenon.
|
|
211
|
+
"""
|
|
212
|
+
# READ THE DOCSTRING
|
|
213
|
+
raise NotImplementedError
|
|
214
|
+
|
|
215
|
+
def _pow_mpz_t_tmp_demo(self, m, n):
|
|
216
|
+
"""
|
|
217
|
+
This function demonstrates a danger in using pow_mpz_t_tmp.
|
|
218
|
+
|
|
219
|
+
EXAMPLES::
|
|
220
|
+
|
|
221
|
+
sage: PC = PowComputer(5, 5, 10)
|
|
222
|
+
|
|
223
|
+
When you call pow_mpz_t_tmp with an input that is not stored
|
|
224
|
+
(ie n > self.cache_limit and n != self.prec_cap),
|
|
225
|
+
it stores the result in self.temp_m and returns a pointer
|
|
226
|
+
to that mpz_t. So if you try to use the results of two
|
|
227
|
+
calls at once, things will break. ::
|
|
228
|
+
|
|
229
|
+
sage: PC._pow_mpz_t_tmp_demo(6, 8) # 244140625 on some architectures and 152587890625 on others: random
|
|
230
|
+
244140625
|
|
231
|
+
sage: 5^6*5^8
|
|
232
|
+
6103515625
|
|
233
|
+
sage: 5^6*5^6
|
|
234
|
+
244140625
|
|
235
|
+
|
|
236
|
+
Note that this does not occur if you try a stored value,
|
|
237
|
+
because the result of one of the calls points to that
|
|
238
|
+
stored value. ::
|
|
239
|
+
|
|
240
|
+
sage: PC._pow_mpz_t_tmp_demo(6, 10)
|
|
241
|
+
152587890625
|
|
242
|
+
sage: 5^6*5^10
|
|
243
|
+
152587890625
|
|
244
|
+
"""
|
|
245
|
+
m = Integer(m)
|
|
246
|
+
n = Integer(n)
|
|
247
|
+
if m < 0 or n < 0:
|
|
248
|
+
raise ValueError("m, n must be nonnegative")
|
|
249
|
+
cdef Integer ans = PY_NEW(Integer)
|
|
250
|
+
mpz_mul(ans.value, self.pow_mpz_t_tmp(mpz_get_ui((<Integer>m).value)), self.pow_mpz_t_tmp(mpz_get_ui((<Integer>n).value)))
|
|
251
|
+
return ans
|
|
252
|
+
|
|
253
|
+
def _pow_mpz_t_tmp_test(self, n):
|
|
254
|
+
"""
|
|
255
|
+
Test the ``pow_mpz_t_tmp`` function.
|
|
256
|
+
|
|
257
|
+
EXAMPLES::
|
|
258
|
+
|
|
259
|
+
sage: PC = PowComputer(3, 5, 10)
|
|
260
|
+
sage: PC._pow_mpz_t_tmp_test(4)
|
|
261
|
+
81
|
|
262
|
+
sage: PC._pow_mpz_t_tmp_test(6)
|
|
263
|
+
729
|
|
264
|
+
sage: PC._pow_mpz_t_tmp_test(0)
|
|
265
|
+
1
|
|
266
|
+
sage: PC._pow_mpz_t_tmp_test(10)
|
|
267
|
+
59049
|
|
268
|
+
|
|
269
|
+
sage: # needs sage.libs.ntl
|
|
270
|
+
sage: PC = PowComputer_ext_maker(3, 5, 10, 20, False, ntl.ZZ_pX([-3,0,1], 3^10), 'big','e',ntl.ZZ_pX([1],3^10))
|
|
271
|
+
sage: PC._pow_mpz_t_tmp_test(4)
|
|
272
|
+
81
|
|
273
|
+
sage: PC._pow_mpz_t_tmp_test(6)
|
|
274
|
+
729
|
|
275
|
+
sage: PC._pow_mpz_t_tmp_test(0)
|
|
276
|
+
1
|
|
277
|
+
sage: PC._pow_mpz_t_tmp_test(10)
|
|
278
|
+
59049
|
|
279
|
+
"""
|
|
280
|
+
cdef Integer _n = Integer(n)
|
|
281
|
+
cdef Integer ans = PY_NEW(Integer)
|
|
282
|
+
mpz_set(ans.value, self.pow_mpz_t_tmp(mpz_get_si(_n.value)))
|
|
283
|
+
return ans
|
|
284
|
+
|
|
285
|
+
cdef mpz_srcptr pow_mpz_t_top(self) noexcept:
|
|
286
|
+
"""
|
|
287
|
+
Return a pointer to ``self.prime^self.prec_cap`` as an ``mpz_srcptr``.
|
|
288
|
+
|
|
289
|
+
EXAMPLES::
|
|
290
|
+
|
|
291
|
+
sage: PC = PowComputer(3, 5, 10)
|
|
292
|
+
sage: PC._pow_mpz_t_top_test() # indirect doctest
|
|
293
|
+
59049
|
|
294
|
+
"""
|
|
295
|
+
raise NotImplementedError
|
|
296
|
+
|
|
297
|
+
def _pow_mpz_t_top_test(self):
|
|
298
|
+
"""
|
|
299
|
+
Test the ``pow_mpz_t_top`` function.
|
|
300
|
+
|
|
301
|
+
EXAMPLES::
|
|
302
|
+
|
|
303
|
+
sage: PC = PowComputer(3, 5, 10)
|
|
304
|
+
sage: PC._pow_mpz_t_top_test()
|
|
305
|
+
59049
|
|
306
|
+
|
|
307
|
+
sage: # needs sage.libs.ntl
|
|
308
|
+
sage: PC = PowComputer_ext_maker(3, 5, 10, 20, False, ntl.ZZ_pX([-3,0,1], 3^10), 'big','e',ntl.ZZ_pX([1],3^10))
|
|
309
|
+
sage: PC._pow_mpz_t_top_test()
|
|
310
|
+
59049
|
|
311
|
+
"""
|
|
312
|
+
cdef Integer ans = PY_NEW(Integer)
|
|
313
|
+
mpz_set(ans.value, self.pow_mpz_t_top())
|
|
314
|
+
return ans
|
|
315
|
+
|
|
316
|
+
def _repr_(self):
|
|
317
|
+
"""
|
|
318
|
+
Return a string representation of ``self``.
|
|
319
|
+
|
|
320
|
+
EXAMPLES::
|
|
321
|
+
|
|
322
|
+
sage: PC = PowComputer(3, 5, 10); PC
|
|
323
|
+
PowComputer for 3
|
|
324
|
+
"""
|
|
325
|
+
return "PowComputer for %s" % (self.prime)
|
|
326
|
+
|
|
327
|
+
def _prime(self):
|
|
328
|
+
"""
|
|
329
|
+
Return the base that the ``PowComputer`` is exponentiating.
|
|
330
|
+
|
|
331
|
+
EXAMPLES::
|
|
332
|
+
|
|
333
|
+
sage: P = PowComputer(6, 10, 15)
|
|
334
|
+
sage: P._prime()
|
|
335
|
+
6
|
|
336
|
+
"""
|
|
337
|
+
return self.prime
|
|
338
|
+
|
|
339
|
+
def _in_field(self):
|
|
340
|
+
"""
|
|
341
|
+
Return whether or not ``self`` is attached to a field.
|
|
342
|
+
|
|
343
|
+
EXAMPLES::
|
|
344
|
+
|
|
345
|
+
sage: P = PowComputer(3, 5, 10)
|
|
346
|
+
sage: P._in_field()
|
|
347
|
+
False
|
|
348
|
+
"""
|
|
349
|
+
return self.in_field
|
|
350
|
+
|
|
351
|
+
def _cache_limit(self):
|
|
352
|
+
"""
|
|
353
|
+
Return the limit to which powers of prime are computed.
|
|
354
|
+
|
|
355
|
+
EXAMPLES::
|
|
356
|
+
|
|
357
|
+
sage: P = PowComputer(3, 5, 10)
|
|
358
|
+
sage: P._cache_limit()
|
|
359
|
+
5
|
|
360
|
+
"""
|
|
361
|
+
cdef Integer ans
|
|
362
|
+
ans = PY_NEW(Integer)
|
|
363
|
+
mpz_set_ui(ans.value, self.cache_limit)
|
|
364
|
+
return ans
|
|
365
|
+
|
|
366
|
+
def _prec_cap(self):
|
|
367
|
+
"""
|
|
368
|
+
Return ``prec_cap``, a single value that for which
|
|
369
|
+
``self._prime()^prec_cap`` is stored.
|
|
370
|
+
|
|
371
|
+
EXAMPLES::
|
|
372
|
+
|
|
373
|
+
sage: P = PowComputer(3, 5, 10)
|
|
374
|
+
sage: P._prec_cap()
|
|
375
|
+
10
|
|
376
|
+
"""
|
|
377
|
+
cdef Integer ans
|
|
378
|
+
ans = PY_NEW(Integer)
|
|
379
|
+
mpz_set_ui(ans.value, self.prec_cap)
|
|
380
|
+
return ans
|
|
381
|
+
|
|
382
|
+
def _top_power(self):
|
|
383
|
+
"""
|
|
384
|
+
Return ``self._prime()^self._prec_cap()``.
|
|
385
|
+
|
|
386
|
+
EXAMPLES::
|
|
387
|
+
|
|
388
|
+
sage: P = PowComputer(3, 4, 6)
|
|
389
|
+
sage: P._top_power()
|
|
390
|
+
729
|
|
391
|
+
"""
|
|
392
|
+
cdef Integer ans
|
|
393
|
+
ans = PY_NEW(Integer)
|
|
394
|
+
mpz_set(ans.value, self.pow_mpz_t_top())
|
|
395
|
+
return ans
|
|
396
|
+
|
|
397
|
+
def __call__(self, n):
|
|
398
|
+
"""
|
|
399
|
+
Return ``self.prime^n``.
|
|
400
|
+
|
|
401
|
+
EXAMPLES::
|
|
402
|
+
|
|
403
|
+
sage: P = PowComputer(3, 4, 6)
|
|
404
|
+
sage: P(3)
|
|
405
|
+
27
|
|
406
|
+
sage: P(6)
|
|
407
|
+
729
|
|
408
|
+
sage: P(5)
|
|
409
|
+
243
|
|
410
|
+
sage: P(7)
|
|
411
|
+
2187
|
|
412
|
+
sage: P(0)
|
|
413
|
+
1
|
|
414
|
+
sage: P(-2)
|
|
415
|
+
1/9
|
|
416
|
+
"""
|
|
417
|
+
cdef Integer _n
|
|
418
|
+
if n is infinity:
|
|
419
|
+
return Integer(0)
|
|
420
|
+
if not isinstance(n, Integer):
|
|
421
|
+
_n = Integer(n)
|
|
422
|
+
else:
|
|
423
|
+
_n = <Integer>n
|
|
424
|
+
if mpz_fits_slong_p(_n.value) == 0:
|
|
425
|
+
raise ValueError("n too big")
|
|
426
|
+
if _n < 0:
|
|
427
|
+
return ~self.pow_Integer(-mpz_get_si(_n.value))
|
|
428
|
+
else:
|
|
429
|
+
return self.pow_Integer(mpz_get_ui(_n.value))
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
cdef class PowComputer_base(PowComputer_class):
|
|
433
|
+
def __cinit__(self, Integer prime, long cache_limit, long prec_cap, long ram_prec_cap, bint in_field, poly=None, shift_seed=None):
|
|
434
|
+
"""
|
|
435
|
+
Allocate a ``PowComputer_base``.
|
|
436
|
+
|
|
437
|
+
EXAMPLES::
|
|
438
|
+
|
|
439
|
+
sage: PC = PowComputer(5, 7, 10)
|
|
440
|
+
sage: PC(3)
|
|
441
|
+
125
|
|
442
|
+
"""
|
|
443
|
+
cdef Py_ssize_t i
|
|
444
|
+
|
|
445
|
+
sig_on()
|
|
446
|
+
try:
|
|
447
|
+
self.small_powers = <mpz_t *>sig_malloc(sizeof(mpz_t) * (cache_limit + 1))
|
|
448
|
+
if self.small_powers == NULL:
|
|
449
|
+
raise MemoryError("out of memory allocating power storing")
|
|
450
|
+
try:
|
|
451
|
+
mpz_init(self.top_power)
|
|
452
|
+
try:
|
|
453
|
+
mpz_init(self.powhelper_oneunit)
|
|
454
|
+
try:
|
|
455
|
+
mpz_init(self.powhelper_teichdiff)
|
|
456
|
+
try:
|
|
457
|
+
mpz_init(self.shift_rem)
|
|
458
|
+
try:
|
|
459
|
+
mpz_init(self.aliasing)
|
|
460
|
+
try:
|
|
461
|
+
for i in range(cache_limit + 1):
|
|
462
|
+
try:
|
|
463
|
+
mpz_init(self.small_powers[i])
|
|
464
|
+
except BaseException:
|
|
465
|
+
while i:
|
|
466
|
+
i-=1
|
|
467
|
+
mpz_clear(self.small_powers[i])
|
|
468
|
+
raise
|
|
469
|
+
except BaseException:
|
|
470
|
+
mpz_clear(self.aliasing)
|
|
471
|
+
raise
|
|
472
|
+
except BaseException:
|
|
473
|
+
mpz_clear(self.shift_rem)
|
|
474
|
+
raise
|
|
475
|
+
except BaseException:
|
|
476
|
+
mpz_clear(self.powhelper_teichdiff)
|
|
477
|
+
raise
|
|
478
|
+
except BaseException:
|
|
479
|
+
mpz_clear(self.powhelper_oneunit)
|
|
480
|
+
raise
|
|
481
|
+
except BaseException:
|
|
482
|
+
mpz_clear(self.top_power)
|
|
483
|
+
raise
|
|
484
|
+
except BaseException:
|
|
485
|
+
sig_free(self.small_powers)
|
|
486
|
+
raise
|
|
487
|
+
finally:
|
|
488
|
+
sig_off()
|
|
489
|
+
|
|
490
|
+
self._allocated = 2
|
|
491
|
+
|
|
492
|
+
def __init__(self, Integer prime, long cache_limit, long prec_cap, long ram_prec_cap, bint in_field, poly=None, shift_seed=None):
|
|
493
|
+
"""
|
|
494
|
+
Initialization.
|
|
495
|
+
|
|
496
|
+
TESTS::
|
|
497
|
+
|
|
498
|
+
sage: PC = PowComputer(5, 7, 10)
|
|
499
|
+
sage: PC(3)
|
|
500
|
+
125
|
|
501
|
+
"""
|
|
502
|
+
PowComputer_class.__init__(self, prime, cache_limit, prec_cap, ram_prec_cap, in_field, poly, shift_seed)
|
|
503
|
+
|
|
504
|
+
cdef Py_ssize_t i
|
|
505
|
+
|
|
506
|
+
mpz_set_ui(self.small_powers[0], 1)
|
|
507
|
+
if cache_limit > 0:
|
|
508
|
+
mpz_set(self.small_powers[1], prime.value)
|
|
509
|
+
for i in range(2, cache_limit + 1):
|
|
510
|
+
mpz_mul(self.small_powers[i], self.small_powers[i - 1], prime.value)
|
|
511
|
+
sig_on()
|
|
512
|
+
mpz_pow_ui(self.top_power, prime.value, prec_cap)
|
|
513
|
+
sig_off()
|
|
514
|
+
self.deg = 1
|
|
515
|
+
self.e = 1
|
|
516
|
+
self.f = 1
|
|
517
|
+
self.ram_prec_cap = prec_cap
|
|
518
|
+
|
|
519
|
+
def __dealloc__(self):
|
|
520
|
+
"""
|
|
521
|
+
Deletion.
|
|
522
|
+
|
|
523
|
+
EXAMPLES::
|
|
524
|
+
|
|
525
|
+
sage: P = PowComputer(5, 7, 10)
|
|
526
|
+
sage: del P
|
|
527
|
+
sage: PowComputer(5, 7, 10)
|
|
528
|
+
PowComputer for 5
|
|
529
|
+
"""
|
|
530
|
+
cdef Py_ssize_t i
|
|
531
|
+
|
|
532
|
+
if self._allocated >= 2:
|
|
533
|
+
for i in range(self.cache_limit + 1):
|
|
534
|
+
mpz_clear(self.small_powers[i])
|
|
535
|
+
mpz_clear(self.top_power)
|
|
536
|
+
mpz_clear(self.powhelper_oneunit)
|
|
537
|
+
mpz_clear(self.powhelper_teichdiff)
|
|
538
|
+
mpz_clear(self.shift_rem)
|
|
539
|
+
mpz_clear(self.aliasing)
|
|
540
|
+
mpz_clear(self.temp_m)
|
|
541
|
+
sig_free(self.small_powers)
|
|
542
|
+
|
|
543
|
+
def __reduce__(self):
|
|
544
|
+
"""
|
|
545
|
+
Pickling.
|
|
546
|
+
|
|
547
|
+
EXAMPLES::
|
|
548
|
+
|
|
549
|
+
sage: P = PowComputer(5, 7, 10)
|
|
550
|
+
sage: R = loads(dumps(P))
|
|
551
|
+
sage: P == R
|
|
552
|
+
True
|
|
553
|
+
"""
|
|
554
|
+
return PowComputer, (self.prime, self.cache_limit, self.prec_cap, self.in_field)
|
|
555
|
+
|
|
556
|
+
cdef mpz_srcptr pow_mpz_t_top(self) noexcept:
|
|
557
|
+
"""
|
|
558
|
+
Return a pointer to ``self.prime^self.prec_cap`` as an ``mpz_srcptr``.
|
|
559
|
+
|
|
560
|
+
EXAMPLES::
|
|
561
|
+
|
|
562
|
+
sage: PC = PowComputer(3, 5, 10)
|
|
563
|
+
sage: PC._pow_mpz_t_top_test() # indirect doctest
|
|
564
|
+
59049
|
|
565
|
+
"""
|
|
566
|
+
return self.top_power
|
|
567
|
+
|
|
568
|
+
cdef mpz_srcptr pow_mpz_t_tmp(self, long n) except NULL:
|
|
569
|
+
"""
|
|
570
|
+
Compute ``self.prime^n``.
|
|
571
|
+
|
|
572
|
+
EXAMPLES::
|
|
573
|
+
|
|
574
|
+
sage: PC = PowComputer(3, 5, 10)
|
|
575
|
+
sage: PC._pow_mpz_t_tmp_test(4)
|
|
576
|
+
81
|
|
577
|
+
sage: PC._pow_mpz_t_tmp_test(-1)
|
|
578
|
+
Traceback (most recent call last):
|
|
579
|
+
...
|
|
580
|
+
ValueError: n must be nonnegative
|
|
581
|
+
"""
|
|
582
|
+
if n < 0:
|
|
583
|
+
raise ValueError("n must be nonnegative")
|
|
584
|
+
if n <= self.cache_limit:
|
|
585
|
+
return self.small_powers[n]
|
|
586
|
+
if n == self.prec_cap:
|
|
587
|
+
return self.top_power
|
|
588
|
+
# n may exceed self.prec_cap. Very large values can, however, lead to
|
|
589
|
+
# out-of-memory situations in the following computation. This
|
|
590
|
+
# sig_on()/sig_off() prevents sage from crashing in such cases.
|
|
591
|
+
# It does not have a significant impact on performance. For small
|
|
592
|
+
# values of n the powers are taken from self.small_powers, for large
|
|
593
|
+
# values, the computation dominates the cost of the sig_on()/sig_off().
|
|
594
|
+
sig_on()
|
|
595
|
+
mpz_pow_ui(self.temp_m, self.prime.value, n)
|
|
596
|
+
sig_off()
|
|
597
|
+
return self.temp_m
|
|
598
|
+
|
|
599
|
+
pow_comp_cache = {}
|
|
600
|
+
cdef PowComputer_base PowComputer_c(Integer m, Integer cache_limit, Integer prec_cap, in_field, prec_type=None):
|
|
601
|
+
"""
|
|
602
|
+
Return a ``PowComputer``.
|
|
603
|
+
|
|
604
|
+
EXAMPLES::
|
|
605
|
+
|
|
606
|
+
sage: PC = PowComputer(3, 5, 10) # indirect doctest
|
|
607
|
+
sage: PC(4)
|
|
608
|
+
81
|
|
609
|
+
"""
|
|
610
|
+
if cache_limit < 0:
|
|
611
|
+
raise ValueError("cache_limit must be nonnegative")
|
|
612
|
+
if prec_cap < 0:
|
|
613
|
+
raise ValueError("prec_cap must be nonnegative")
|
|
614
|
+
if mpz_cmp_si((<Integer>prec_cap).value, maxpreccap) >= 0:
|
|
615
|
+
raise ValueError("cannot create p-adic parents with precision cap larger than (1 << (sizeof(long)*8 - 2))")
|
|
616
|
+
|
|
617
|
+
key = (m, cache_limit, prec_cap, in_field, prec_type)
|
|
618
|
+
if key in pow_comp_cache:
|
|
619
|
+
PC = pow_comp_cache[key]()
|
|
620
|
+
if PC is not None:
|
|
621
|
+
return PC
|
|
622
|
+
if prec_type == 'capped-rel':
|
|
623
|
+
from sage.rings.padics.padic_capped_relative_element import PowComputer_ as PC_class
|
|
624
|
+
elif prec_type == 'capped-abs':
|
|
625
|
+
from sage.rings.padics.padic_capped_absolute_element import PowComputer_ as PC_class
|
|
626
|
+
elif prec_type == 'fixed-mod':
|
|
627
|
+
from sage.rings.padics.padic_fixed_mod_element import PowComputer_ as PC_class
|
|
628
|
+
elif prec_type == 'floating-point':
|
|
629
|
+
from sage.rings.padics.padic_floating_point_element import PowComputer_ as PC_class
|
|
630
|
+
else:
|
|
631
|
+
PC_class = PowComputer_base
|
|
632
|
+
PC = PC_class(m, mpz_get_ui(cache_limit.value), mpz_get_ui(prec_cap.value), mpz_get_ui(prec_cap.value), in_field)
|
|
633
|
+
pow_comp_cache[key] = weakref.ref(PC)
|
|
634
|
+
return PC
|
|
635
|
+
|
|
636
|
+
|
|
637
|
+
# To speed up the creation of PowComputers with the same m, we might eventually want to copy over data from an existing PowComputer.
|
|
638
|
+
|
|
639
|
+
def PowComputer(m, cache_limit, prec_cap, in_field=False, prec_type=None):
|
|
640
|
+
r"""
|
|
641
|
+
Return a ``PowComputer`` that caches the values `1, m, m^2, \ldots, m^{C}`,
|
|
642
|
+
where `C` is ``cache_limit``.
|
|
643
|
+
|
|
644
|
+
Once you create a ``PowComputer``, merely call it to get values out.
|
|
645
|
+
|
|
646
|
+
You can input any integer, even if it's outside of the precomputed range.
|
|
647
|
+
|
|
648
|
+
INPUT:
|
|
649
|
+
|
|
650
|
+
- ``m`` -- integer; the base that you want to exponentiate
|
|
651
|
+
- ``cache_limit`` -- positive integer; that you want to cache powers up to
|
|
652
|
+
|
|
653
|
+
EXAMPLES::
|
|
654
|
+
|
|
655
|
+
sage: PC = PowComputer(3, 5, 10)
|
|
656
|
+
sage: PC
|
|
657
|
+
PowComputer for 3
|
|
658
|
+
sage: PC(4)
|
|
659
|
+
81
|
|
660
|
+
sage: PC(6)
|
|
661
|
+
729
|
|
662
|
+
sage: PC(-1)
|
|
663
|
+
1/3
|
|
664
|
+
"""
|
|
665
|
+
if not isinstance(m, Integer):
|
|
666
|
+
m = Integer(m)
|
|
667
|
+
if not isinstance(cache_limit, Integer):
|
|
668
|
+
cache_limit = Integer(cache_limit)
|
|
669
|
+
if not isinstance(prec_cap, Integer):
|
|
670
|
+
prec_cap = Integer(prec_cap)
|
|
671
|
+
return PowComputer_c(m, cache_limit, prec_cap, in_field, prec_type)
|