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,59 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
from sage.misc.binary_tree import BinaryTree
|
|
3
|
+
from sage.misc.binary_tree cimport BinaryTree
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
cdef class generic_pd
|
|
7
|
+
|
|
8
|
+
cdef class CompiledPolynomialFunction:
|
|
9
|
+
cdef generic_pd _dag
|
|
10
|
+
cdef object _coeffs
|
|
11
|
+
|
|
12
|
+
cdef object _parse_structure(CompiledPolynomialFunction)
|
|
13
|
+
cdef generic_pd _get_gap(CompiledPolynomialFunction, BinaryTree, int)
|
|
14
|
+
cdef void _fill_gaps_binary(CompiledPolynomialFunction, BinaryTree) noexcept
|
|
15
|
+
cdef object eval(CompiledPolynomialFunction, object)
|
|
16
|
+
|
|
17
|
+
cdef class generic_pd:
|
|
18
|
+
cdef object value
|
|
19
|
+
cdef int refs, hits
|
|
20
|
+
cdef int label
|
|
21
|
+
cdef int eval(self, vars, coeffs) except -2
|
|
22
|
+
cdef generic_pd nodummies(generic_pd)
|
|
23
|
+
cdef void reset(self) noexcept
|
|
24
|
+
|
|
25
|
+
cdef class dummy_pd(generic_pd):
|
|
26
|
+
cdef generic_pd link
|
|
27
|
+
cdef void fill(dummy_pd self, generic_pd link) noexcept
|
|
28
|
+
|
|
29
|
+
cdef class var_pd(generic_pd):
|
|
30
|
+
cdef int index
|
|
31
|
+
|
|
32
|
+
cdef class univar_pd(generic_pd):
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
cdef class coeff_pd(generic_pd):
|
|
36
|
+
cdef int index
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
cdef class unary_pd(generic_pd):
|
|
40
|
+
cdef generic_pd operand
|
|
41
|
+
|
|
42
|
+
cdef class sqr_pd(unary_pd):
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
cdef class pow_pd(unary_pd):
|
|
46
|
+
cdef object exponent
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
cdef class binary_pd(generic_pd):
|
|
50
|
+
cdef generic_pd left, right
|
|
51
|
+
|
|
52
|
+
cdef class add_pd(binary_pd):
|
|
53
|
+
pass
|
|
54
|
+
|
|
55
|
+
cdef class mul_pd(binary_pd):
|
|
56
|
+
pass
|
|
57
|
+
|
|
58
|
+
cdef class abc_pd(binary_pd):
|
|
59
|
+
cdef int index
|
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Polynomial Compilers
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Tom Boothby, initial design & implementation
|
|
8
|
+
- Robert Bradshaw, bug fixes / suggested & assisted with significant design improvements
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
################################################################################
|
|
12
|
+
# Copyright (C) 2007 Tom Boothby <boothby@u.washington.edu>
|
|
13
|
+
#
|
|
14
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
15
|
+
#
|
|
16
|
+
# https://www.gnu.org/licenses/
|
|
17
|
+
################################################################################
|
|
18
|
+
|
|
19
|
+
from sage.misc.binary_tree cimport BinaryTree
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
cdef class CompiledPolynomialFunction:
|
|
23
|
+
"""
|
|
24
|
+
Build a reasonably optimized directed acyclic graph representation
|
|
25
|
+
for a given polynomial. A ``CompiledPolynomialFunction`` is callable from
|
|
26
|
+
python, though it is a little faster to call the eval function from
|
|
27
|
+
pyrex.
|
|
28
|
+
|
|
29
|
+
This class is not intended to be called by a user, rather, it is
|
|
30
|
+
intended to improve the performance of immutable polynomial objects.
|
|
31
|
+
|
|
32
|
+
.. TODO::
|
|
33
|
+
|
|
34
|
+
- Recursive calling
|
|
35
|
+
- Faster casting of coefficients / argument
|
|
36
|
+
- Multivariate polynomials
|
|
37
|
+
- Cython implementation of Pippenger's Algorithm that doesn't
|
|
38
|
+
depend heavily upon dicts.
|
|
39
|
+
- Computation of parameter sequence suggested by Pippenger
|
|
40
|
+
- Univariate exponentiation can use Brauer's method to improve
|
|
41
|
+
extremely sparse polynomials of very high degree
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(self, coeffs, algorithm='binary'):
|
|
45
|
+
"""
|
|
46
|
+
Compiles a polynomial into an evaluation DAG representation which
|
|
47
|
+
is at least as optimal as using Horner's Rule. For polynomials
|
|
48
|
+
which have a relatively large number of zero coefficients, the
|
|
49
|
+
improvement over Horner's Rule grows significantly.
|
|
50
|
+
|
|
51
|
+
Here is a rough description of the algorithm. Actual
|
|
52
|
+
implementation differs slightly, for sake of speed. Specifically,
|
|
53
|
+
steps 1 and 3 are done at the same time.
|
|
54
|
+
|
|
55
|
+
Step 1: Collect Coefficient Gaps.
|
|
56
|
+
Scan through coefficient list, and record the lengths of
|
|
57
|
+
sequences of zero coefficients. This corresponds to
|
|
58
|
+
collapsing Horner's Form into a reduced representation.
|
|
59
|
+
For example, ::
|
|
60
|
+
|
|
61
|
+
x^8 + x^4 + x^2 + 1
|
|
62
|
+
= ((((((((1)*x + 0)*x+0)*x+0)*x+1)*x+0)*x+0)*x+1)*x+0)*x+1
|
|
63
|
+
= ((((1)*x^4 + 1)*x^2 + 1)*x^2 + 1
|
|
64
|
+
|
|
65
|
+
gives a list of "gaps": [2,4]
|
|
66
|
+
|
|
67
|
+
Step 2: Fill in Gap Structure.
|
|
68
|
+
Given the list of gaps, find a reasonable sequence of
|
|
69
|
+
of multiplications / squarings of x that will result in
|
|
70
|
+
the computation of all desired exponents. Record this
|
|
71
|
+
sequence of steps as an evaluation DAG, and retain
|
|
72
|
+
references to the nodes representing the desired
|
|
73
|
+
exponents. For the example above, we would have::
|
|
74
|
+
|
|
75
|
+
x^2 = x*x
|
|
76
|
+
x^4 = (x^2) * (x^2)
|
|
77
|
+
|
|
78
|
+
Step 3: Construct Evaluation Dag.
|
|
79
|
+
Rescan the coefficient list, and build an evaluation DAG
|
|
80
|
+
representation for the reduced Horner Form as above.
|
|
81
|
+
Whenever a sequence of zeros is encountered, multiply by
|
|
82
|
+
the appropriate "gap" node. Retain a reference to the
|
|
83
|
+
result node.
|
|
84
|
+
|
|
85
|
+
Implementation considerations:
|
|
86
|
+
|
|
87
|
+
* By combining steps 1 and 3, we greatly improve the speed of
|
|
88
|
+
this construction, but some complexity is introduced. The
|
|
89
|
+
solution to this is that "dummy" nodes are created to represent
|
|
90
|
+
the desired gaps. As the structure of the gaps is filled in,
|
|
91
|
+
these dummies get references to usable DAG nodes. After all gaps
|
|
92
|
+
are filled in, we strip out dummy nodes, and are left with a
|
|
93
|
+
complete representation of our polynomial.
|
|
94
|
+
|
|
95
|
+
* The "binary" algorithm (currently the only algorithm; others are
|
|
96
|
+
forthcoming) requires the gaps to considered in order, and adds
|
|
97
|
+
additional dummies as it goes. Hence, the gaps are put into a
|
|
98
|
+
binary tree.
|
|
99
|
+
"""
|
|
100
|
+
cdef generic_pd max_gap, dag
|
|
101
|
+
cdef BinaryTree gaps
|
|
102
|
+
|
|
103
|
+
self._coeffs = coeffs
|
|
104
|
+
gaps, dag = self._parse_structure()
|
|
105
|
+
max_gap = <generic_pd>(gaps.get_max())
|
|
106
|
+
if max_gap.label > 1:
|
|
107
|
+
if algorithm == 'binary':
|
|
108
|
+
self._fill_gaps_binary(gaps)
|
|
109
|
+
elif algorithm == 'pippenger':
|
|
110
|
+
raise NotImplementedError("Implementation of Pippenger's Algorithm is not ready for prime time.")
|
|
111
|
+
else:
|
|
112
|
+
raise RuntimeError("Method '%s' not supported.")
|
|
113
|
+
|
|
114
|
+
self._dag = dag.nodummies()
|
|
115
|
+
|
|
116
|
+
def __repr__(self):
|
|
117
|
+
return "CompiledPolynomialFunction(%s)" % self._dag
|
|
118
|
+
|
|
119
|
+
def __call__(self, x):
|
|
120
|
+
return self.eval(x)
|
|
121
|
+
|
|
122
|
+
cdef object eval(CompiledPolynomialFunction self, object x):
|
|
123
|
+
cdef object temp
|
|
124
|
+
try:
|
|
125
|
+
pd_eval(self._dag, x, self._coeffs) #see further down
|
|
126
|
+
temp = self._dag.value #for an explanation
|
|
127
|
+
pd_clean(self._dag) #of these 3 lines
|
|
128
|
+
return temp
|
|
129
|
+
except TypeError as msg:
|
|
130
|
+
self._dag.reset()
|
|
131
|
+
raise TypeError(msg)
|
|
132
|
+
|
|
133
|
+
cdef object _parse_structure(CompiledPolynomialFunction self):
|
|
134
|
+
"""
|
|
135
|
+
Loop through the coefficients of the polynomial, and collect
|
|
136
|
+
coefficient gap widths. Meanwhile, construct the evaluation
|
|
137
|
+
DAG; inserting dummy nodes wherever there are gaps of width
|
|
138
|
+
greater than 1.
|
|
139
|
+
|
|
140
|
+
Return the resultant head DAG node, and a binary tree
|
|
141
|
+
containing the dummy nodes.
|
|
142
|
+
"""
|
|
143
|
+
cdef BinaryTree gaps
|
|
144
|
+
cdef int d
|
|
145
|
+
cdef generic_pd s
|
|
146
|
+
|
|
147
|
+
s = univar_pd()
|
|
148
|
+
gaps = BinaryTree()
|
|
149
|
+
gaps.insert(1, s)
|
|
150
|
+
|
|
151
|
+
d = len(self._coeffs)-1
|
|
152
|
+
|
|
153
|
+
s = coeff_pd(d)
|
|
154
|
+
gap_width = 0
|
|
155
|
+
|
|
156
|
+
d -= 1
|
|
157
|
+
while d > 0:
|
|
158
|
+
gap_width += 1
|
|
159
|
+
if self._coeffs[d]:
|
|
160
|
+
s = abc_pd(s, self._get_gap(gaps, gap_width), d)
|
|
161
|
+
gap_width = 0
|
|
162
|
+
d-=1
|
|
163
|
+
|
|
164
|
+
gap_width += 1
|
|
165
|
+
if self._coeffs[0]:
|
|
166
|
+
s = abc_pd(s, self._get_gap(gaps, gap_width), 0)
|
|
167
|
+
else:
|
|
168
|
+
s = mul_pd(s, self._get_gap(gaps, gap_width))
|
|
169
|
+
|
|
170
|
+
return gaps, s
|
|
171
|
+
|
|
172
|
+
cdef generic_pd _get_gap(CompiledPolynomialFunction self, BinaryTree gaps, int gap):
|
|
173
|
+
"""
|
|
174
|
+
Find an entry in the BinaryTree gaps, identified by the int gap.
|
|
175
|
+
If such an entry does not exist, create it and put it in the tree.
|
|
176
|
+
"""
|
|
177
|
+
|
|
178
|
+
cdef generic_pd g
|
|
179
|
+
g = gaps.get(gap)
|
|
180
|
+
if g is not None:
|
|
181
|
+
return g
|
|
182
|
+
else:
|
|
183
|
+
g = dummy_pd(gap)
|
|
184
|
+
gaps.insert(gap,g)
|
|
185
|
+
return g
|
|
186
|
+
|
|
187
|
+
cdef void _fill_gaps_binary(CompiledPolynomialFunction self, BinaryTree gaps) noexcept:
|
|
188
|
+
"""
|
|
189
|
+
The desired gaps come in a tree, filled with dummy nodes (with the
|
|
190
|
+
exception of the var node, which is not a dummy). The nodes are
|
|
191
|
+
labeled with their width. When we refer to multiplication or
|
|
192
|
+
squaring nodes, we give the current dummy node a usable dag of the
|
|
193
|
+
appropriate type, which treats the nodes being operated on as
|
|
194
|
+
argument. That is, if we want to multiply nodes A and B, and
|
|
195
|
+
give the result to M, we would call ::
|
|
196
|
+
|
|
197
|
+
M.fill(mul_pd(A,B))
|
|
198
|
+
|
|
199
|
+
and refer to this operation as ::
|
|
200
|
+
|
|
201
|
+
M = A*B
|
|
202
|
+
|
|
203
|
+
Sometimes we want a node that isn't in the tree. In that case, we
|
|
204
|
+
create a new dummy node, and put it into the tree. The phrase
|
|
205
|
+
"get the node for..." means that we obtain one with the _get_gap
|
|
206
|
+
method, which may create a new node.
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
Fill in the gaps with the following algorithm:
|
|
210
|
+
|
|
211
|
+
| Step 1:
|
|
212
|
+
| Remove max node from the tree, denote its width m.
|
|
213
|
+
| If m == 1, halt.
|
|
214
|
+
|
|
|
215
|
+
| Step 2:
|
|
216
|
+
| If m is even, check if m/2 is already in our tree.
|
|
217
|
+
| If yes, square the node corresponding to m/2, and go to step 1.
|
|
218
|
+
|
|
|
219
|
+
| Step 3:
|
|
220
|
+
| Peek at the next-largest, and denote its width n.
|
|
221
|
+
| Write m = qn+r.
|
|
222
|
+
| If r != 0, get the node R, whose gap-width is r.
|
|
223
|
+
| Also, get the node QN, whose width is qn.
|
|
224
|
+
| Then, set M = R*QN and go to step 1.
|
|
225
|
+
| If r == 0, we have two cases:
|
|
226
|
+
| q is even:
|
|
227
|
+
| get/create the node for q/n, denote it T.
|
|
228
|
+
| Set M = T**2 and go to step 1.
|
|
229
|
+
| q is odd:
|
|
230
|
+
| get/create the node for (Q-1)*N, denote it T.
|
|
231
|
+
| Set M = T*N and go to step 1.
|
|
232
|
+
|
|
233
|
+
The r == 0 case in step 3 is equivalent to binary exponentiation.
|
|
234
|
+
"""
|
|
235
|
+
cdef int m,n,k,r,half
|
|
236
|
+
cdef generic_pd T,N,H
|
|
237
|
+
cdef dummy_pd M
|
|
238
|
+
T = gaps.pop_max()
|
|
239
|
+
while T is not None:
|
|
240
|
+
N = gaps.get_max()
|
|
241
|
+
if N is None:
|
|
242
|
+
return
|
|
243
|
+
else:
|
|
244
|
+
M = <dummy_pd>T
|
|
245
|
+
m = M.label
|
|
246
|
+
n = N.label
|
|
247
|
+
k = m / n
|
|
248
|
+
r = m % n
|
|
249
|
+
half = m / 2
|
|
250
|
+
|
|
251
|
+
found = False
|
|
252
|
+
if m % 2 == 0 and n >= half:
|
|
253
|
+
H = gaps.get(half)
|
|
254
|
+
if H is not None:
|
|
255
|
+
M.fill(sqr_pd(H))
|
|
256
|
+
found = True
|
|
257
|
+
|
|
258
|
+
if not found:
|
|
259
|
+
if r > 0:
|
|
260
|
+
M.fill(mul_pd(self._get_gap(gaps, n*k), self._get_gap(gaps, r)))
|
|
261
|
+
elif k % 2 == 0:
|
|
262
|
+
M.fill(sqr_pd(self._get_gap(gaps, n*k/2)))
|
|
263
|
+
else:
|
|
264
|
+
M.fill(mul_pd(self._get_gap(gaps, n*(k-1)), N))
|
|
265
|
+
|
|
266
|
+
T = gaps.pop_max()
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
########################################################
|
|
270
|
+
#
|
|
271
|
+
# Polynomial DAG Code
|
|
272
|
+
#
|
|
273
|
+
# An "evaluation DAG" is a rather generic concept. What
|
|
274
|
+
# follows is a set of DAG classes which are suitable for
|
|
275
|
+
# evaluating polynomials in Horner's form, and very
|
|
276
|
+
# little else. Let's call them polydags from here down.
|
|
277
|
+
# DAG in all-caps is a whole graph. However,
|
|
278
|
+
# polydag or pd := polynomial DAG node
|
|
279
|
+
#
|
|
280
|
+
# 5 operations, and 3 types of constants are implemented:
|
|
281
|
+
#
|
|
282
|
+
# univar_pd: a variable of a univariate polynomial.
|
|
283
|
+
# var_pd: a variable of a multivariate polynomial.
|
|
284
|
+
# parametrized by an index number.
|
|
285
|
+
# const_pd: a coefficient of a polynomial. Also
|
|
286
|
+
# parametrized by an index number.
|
|
287
|
+
#
|
|
288
|
+
# unary operations:
|
|
289
|
+
#
|
|
290
|
+
# sqr_pd: takes another polydag as an argument, squares
|
|
291
|
+
# by multiplying argument's value by itself.
|
|
292
|
+
# pow_pd: takes another polydag, and an int, as arguments.
|
|
293
|
+
# exponentiates with the ** operator.
|
|
294
|
+
#
|
|
295
|
+
# binary operations:
|
|
296
|
+
#
|
|
297
|
+
# add_pd: adds values of two other polydags.
|
|
298
|
+
# mul_pd: like add_pd, but we with multiplication
|
|
299
|
+
# abc_pd: not technically binary, but it only depends
|
|
300
|
+
# upon two other polydags, so it fits into the
|
|
301
|
+
# class structure this way. Multiplies the
|
|
302
|
+
# values of two other polydags, and adds the
|
|
303
|
+
# coefficient corresponding to the given index.
|
|
304
|
+
#
|
|
305
|
+
# Polydag structure:
|
|
306
|
+
# properties:
|
|
307
|
+
# value: some python object. Should be None before
|
|
308
|
+
# and after the DAG is evaluated.
|
|
309
|
+
# refs: number of polydag nodes that reference self
|
|
310
|
+
# hits: number of times, during current computation,
|
|
311
|
+
# that self.value has been accessed
|
|
312
|
+
# label: used to identify nodes from the outside.
|
|
313
|
+
# specifically, when they're in a binary tree.
|
|
314
|
+
#
|
|
315
|
+
# methods:
|
|
316
|
+
# eval: runs the computation for which the node is
|
|
317
|
+
# intended, and stores the result in self.value.
|
|
318
|
+
# Takes 2 python objects as arguments. The first
|
|
319
|
+
# is the value of the variable, for univariate
|
|
320
|
+
# polynomials, or a tuple of values for multi-
|
|
321
|
+
# variate. The second is the list of coefficients.
|
|
322
|
+
# The reason for taking the list of coefficients,
|
|
323
|
+
# rather than holding references to them, is that
|
|
324
|
+
# we can implement recursive calling at some later
|
|
325
|
+
# date.
|
|
326
|
+
# nodummies: recursively evict dummies, replacing them
|
|
327
|
+
# with the non-dummy nodes that they
|
|
328
|
+
# reference.
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
# These inline functions are called wherever a node gets
|
|
332
|
+
# evaluated. First, pd_eval is called to ensure that the
|
|
333
|
+
# target DAG node will have its .value property set. It
|
|
334
|
+
# serves two purposes:
|
|
335
|
+
# 1) Count the number of times this node has been asked
|
|
336
|
+
# for its value.
|
|
337
|
+
# 2) Call the node's eval() function if and only if it
|
|
338
|
+
# has not been called yet. These functions are
|
|
339
|
+
# inlined to prevent excessive function calls.
|
|
340
|
+
# Then, pd_clean is called. It checks to see if all of
|
|
341
|
+
# the polydag's dependents have phoned in, and resets
|
|
342
|
+
# self.value to None if they have. Thus, we don't hold
|
|
343
|
+
# on to intermediate values any longer than we have to.
|
|
344
|
+
|
|
345
|
+
cdef inline int pd_eval(generic_pd pd, object vars, object coeffs) except -2:
|
|
346
|
+
if pd.value is None:
|
|
347
|
+
pd.eval(vars, coeffs)
|
|
348
|
+
pd.hits += 1
|
|
349
|
+
|
|
350
|
+
cdef inline void pd_clean(generic_pd pd) noexcept:
|
|
351
|
+
if pd.hits >= pd.refs:
|
|
352
|
+
pd.value = None
|
|
353
|
+
pd.hits = 0
|
|
354
|
+
|
|
355
|
+
cdef class generic_pd:
|
|
356
|
+
def __init__(generic_pd self):
|
|
357
|
+
self.value = None
|
|
358
|
+
self.hits = 0
|
|
359
|
+
self.refs = 0
|
|
360
|
+
self.label = -1
|
|
361
|
+
|
|
362
|
+
cdef int eval(generic_pd self, object vars, object coeffs) except -2:
|
|
363
|
+
raise NotImplementedError
|
|
364
|
+
|
|
365
|
+
cdef generic_pd nodummies(generic_pd self):
|
|
366
|
+
return self
|
|
367
|
+
|
|
368
|
+
cdef void reset(generic_pd self) noexcept:
|
|
369
|
+
self.hits = 0
|
|
370
|
+
self.value = None
|
|
371
|
+
|
|
372
|
+
cdef class dummy_pd(generic_pd):
|
|
373
|
+
def __init__(dummy_pd self, int label):
|
|
374
|
+
self.label = label
|
|
375
|
+
|
|
376
|
+
cdef void fill(dummy_pd self, generic_pd link) noexcept:
|
|
377
|
+
self.link = link
|
|
378
|
+
|
|
379
|
+
cdef generic_pd nodummies(dummy_pd self):
|
|
380
|
+
#sorry guys, this is my stop
|
|
381
|
+
self.link.refs = self.refs
|
|
382
|
+
return self.link.nodummies()
|
|
383
|
+
|
|
384
|
+
cdef class var_pd(generic_pd):
|
|
385
|
+
def __init__(var_pd self, int index):
|
|
386
|
+
generic_pd.__init__(self)
|
|
387
|
+
self.index = index
|
|
388
|
+
cdef int eval(var_pd self, object vars, object coeffs) except -2:
|
|
389
|
+
self.value = vars[self.index]
|
|
390
|
+
|
|
391
|
+
def __repr__(self):
|
|
392
|
+
return "x[%s]" % (self.index)
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
cdef class univar_pd(generic_pd):
|
|
396
|
+
def __init__(univar_pd self):
|
|
397
|
+
generic_pd.__init__(self)
|
|
398
|
+
self.label = 1
|
|
399
|
+
cdef int eval(univar_pd self, object var, object coeffs) except -2:
|
|
400
|
+
self.value = var
|
|
401
|
+
|
|
402
|
+
def __repr__(self):
|
|
403
|
+
return "x"
|
|
404
|
+
|
|
405
|
+
cdef class coeff_pd(generic_pd):
|
|
406
|
+
def __init__(coeff_pd self, int index):
|
|
407
|
+
generic_pd.__init__(self)
|
|
408
|
+
self.index = index
|
|
409
|
+
cdef int eval(coeff_pd self, object vars, object coeffs) except -2:
|
|
410
|
+
self.value = coeffs[self.index]
|
|
411
|
+
|
|
412
|
+
def __repr__(self):
|
|
413
|
+
return "a%s" % (self.index)
|
|
414
|
+
|
|
415
|
+
cdef void reset(self) noexcept:
|
|
416
|
+
pass
|
|
417
|
+
|
|
418
|
+
cdef class unary_pd(generic_pd):
|
|
419
|
+
def __init__(unary_pd self, generic_pd operand):
|
|
420
|
+
generic_pd.__init__(self)
|
|
421
|
+
self.operand = operand
|
|
422
|
+
self.operand.refs += 1
|
|
423
|
+
|
|
424
|
+
cdef generic_pd nodummies(self):
|
|
425
|
+
self.operand = self.operand.nodummies()
|
|
426
|
+
return self
|
|
427
|
+
|
|
428
|
+
cdef void reset(self) noexcept:
|
|
429
|
+
generic_pd.reset(self)
|
|
430
|
+
self.operand.reset()
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
cdef class sqr_pd(unary_pd):
|
|
434
|
+
cdef int eval(sqr_pd self, object vars, object coeffs) except -2:
|
|
435
|
+
pd_eval(self.operand, vars, coeffs)
|
|
436
|
+
self.value = self.operand.value * self.operand.value
|
|
437
|
+
pd_clean(self.operand)
|
|
438
|
+
|
|
439
|
+
def __repr__(self):
|
|
440
|
+
return "(%s)^2" % (self.operand)
|
|
441
|
+
|
|
442
|
+
cdef class pow_pd(unary_pd):
|
|
443
|
+
def __init__(unary_pd self, generic_pd base, object exponent):
|
|
444
|
+
unary_pd.__init__(self, base)
|
|
445
|
+
self.exponent = exponent
|
|
446
|
+
|
|
447
|
+
cdef int eval(pow_pd self, object vars, object coeffs) except -2:
|
|
448
|
+
pd_eval(self.operand, vars, coeffs)
|
|
449
|
+
self.value = self.operand.value ** self.exponent
|
|
450
|
+
pd_clean(self.operand)
|
|
451
|
+
|
|
452
|
+
def __repr__(self):
|
|
453
|
+
return "(%s^%s)" % (self.left, self.exponent)
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
cdef class binary_pd(generic_pd):
|
|
457
|
+
def __init__(binary_pd self, generic_pd left, generic_pd right):
|
|
458
|
+
generic_pd.__init__(self)
|
|
459
|
+
self.left = left
|
|
460
|
+
self.right = right
|
|
461
|
+
self.left.refs+= 1
|
|
462
|
+
self.right.refs+= 1
|
|
463
|
+
|
|
464
|
+
cdef generic_pd nodummies(self):
|
|
465
|
+
self.left = self.left.nodummies()
|
|
466
|
+
self.right = self.right.nodummies()
|
|
467
|
+
return self
|
|
468
|
+
|
|
469
|
+
cdef void reset(self) noexcept:
|
|
470
|
+
generic_pd.reset(self)
|
|
471
|
+
self.left.reset()
|
|
472
|
+
self.right.reset()
|
|
473
|
+
|
|
474
|
+
cdef class add_pd(binary_pd):
|
|
475
|
+
cdef int eval(add_pd self, object vars, object coeffs) except -2:
|
|
476
|
+
pd_eval(self.left, vars, coeffs)
|
|
477
|
+
pd_eval(self.right, vars, coeffs)
|
|
478
|
+
self.value = self.left.value + self.right.value
|
|
479
|
+
pd_clean(self.left)
|
|
480
|
+
pd_clean(self.right)
|
|
481
|
+
|
|
482
|
+
def __repr__(self):
|
|
483
|
+
return "(%s+%s)" % (self.left, self.right)
|
|
484
|
+
|
|
485
|
+
cdef class mul_pd(binary_pd):
|
|
486
|
+
cdef int eval(mul_pd self, object vars, object coeffs) except -2:
|
|
487
|
+
pd_eval(self.left, vars, coeffs)
|
|
488
|
+
pd_eval(self.right, vars, coeffs)
|
|
489
|
+
self.value = self.left.value * self.right.value
|
|
490
|
+
pd_clean(self.left)
|
|
491
|
+
pd_clean(self.right)
|
|
492
|
+
|
|
493
|
+
def __repr__(self):
|
|
494
|
+
return "(%s*%s)" % (self.left, self.right)
|
|
495
|
+
|
|
496
|
+
cdef class abc_pd(binary_pd):
|
|
497
|
+
def __init__(abc_pd self, generic_pd left, generic_pd right, int index):
|
|
498
|
+
binary_pd.__init__(self, left, right)
|
|
499
|
+
self.index = index
|
|
500
|
+
|
|
501
|
+
def __repr__(self):
|
|
502
|
+
return "(%s*%s+a%s)" % (self.left, self.right, self.index)
|
|
503
|
+
|
|
504
|
+
cdef int eval(abc_pd self, object vars, object coeffs) except -2:
|
|
505
|
+
pd_eval(self.left, vars, coeffs)
|
|
506
|
+
pd_eval(self.right, vars, coeffs)
|
|
507
|
+
self.value = self.left.value * self.right.value + coeffs[self.index]
|
|
508
|
+
pd_clean(self.left)
|
|
509
|
+
pd_clean(self.right)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
from sage.structure.element import Element
|
|
3
|
+
from sage.structure.element cimport Element, CommutativeAlgebraElement, ModuleElement
|
|
4
|
+
from sage.structure.parent cimport Parent
|
|
5
|
+
from sage.rings.integer cimport Integer
|
|
6
|
+
from sage.rings.polynomial.commutative_polynomial cimport CommutativePolynomial
|
|
7
|
+
from sage.rings.polynomial.polynomial_compiled cimport CompiledPolynomialFunction
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
cdef class Polynomial(CommutativePolynomial):
|
|
11
|
+
cdef Polynomial _new_generic(self, list coeffs)
|
|
12
|
+
cdef char _is_gen
|
|
13
|
+
cdef CompiledPolynomialFunction _compiled
|
|
14
|
+
cpdef Polynomial truncate(self, long n)
|
|
15
|
+
cpdef Polynomial inverse_series_trunc(self, long prec)
|
|
16
|
+
cdef long _hash_c(self) except -1
|
|
17
|
+
cpdef constant_coefficient(self)
|
|
18
|
+
cpdef Polynomial _new_constant_poly(self, a, Parent P)
|
|
19
|
+
cpdef list list(self, bint copy=*)
|
|
20
|
+
cpdef _mul_generic(self, right)
|
|
21
|
+
cdef _square_generic(self)
|
|
22
|
+
|
|
23
|
+
cpdef bint is_zero(self) except -1
|
|
24
|
+
cpdef bint is_one(self) except -1
|
|
25
|
+
cpdef bint is_term(self) except -1
|
|
26
|
+
|
|
27
|
+
cpdef dict _mpoly_dict_recursive(self, tuple variables=*, base_ring=*)
|
|
28
|
+
|
|
29
|
+
cpdef _add_(self, other)
|
|
30
|
+
cpdef _mul_(self, other)
|
|
31
|
+
cpdef _floordiv_(self, right)
|
|
32
|
+
cpdef Polynomial _mul_trunc_(self, Polynomial right, long n)
|
|
33
|
+
cpdef Polynomial _power_trunc(self, unsigned long n, long prec)
|
|
34
|
+
cdef Polynomial _mul_term(self, Polynomial term, bint term_on_right)
|
|
35
|
+
|
|
36
|
+
# UNSAFE, only call from an inplace operator
|
|
37
|
+
# may return a new element if not possible to modify inplace
|
|
38
|
+
cdef _inplace_truncate(self, long n)
|
|
39
|
+
|
|
40
|
+
cdef get_coeff_c(self, Py_ssize_t i)
|
|
41
|
+
cdef get_unsafe(self, Py_ssize_t i)
|
|
42
|
+
cpdef long number_of_terms(self) noexcept
|
|
43
|
+
|
|
44
|
+
# See 23227
|
|
45
|
+
cpdef _add_(self, right)
|
|
46
|
+
cpdef _mul_(self, right)
|
|
47
|
+
cpdef _floordiv_(self, right)
|
|
48
|
+
|
|
49
|
+
cdef public dict _cached_methods
|
|
50
|
+
|
|
51
|
+
cdef class Polynomial_generic_dense(Polynomial):
|
|
52
|
+
cdef Polynomial_generic_dense _new_c(self, list coeffs, Parent P)
|
|
53
|
+
cdef list _coeffs
|
|
54
|
+
cdef int _normalize(self) except -1
|
|
55
|
+
cpdef list list(self, bint copy=*)
|
|
56
|
+
|
|
57
|
+
cdef class Polynomial_generic_dense_inexact(Polynomial_generic_dense):
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
cpdef is_Polynomial(f)
|
|
61
|
+
cpdef Polynomial generic_power_trunc(Polynomial p, Integer n, long prec)
|
|
62
|
+
cpdef list _dict_to_list(dict x, zero)
|
|
63
|
+
|
|
64
|
+
cpdef bint polynomial_is_variable(x) noexcept
|