passagemath-modules 10.6.31rc3__cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_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.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +806 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +6 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgfortran-e1b7dfc8.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-93ebf16a.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-e3525837.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-c5c421e1.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-e0f11cf3.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-4c5b64b1.3.29.so +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,1126 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Weyl Algebras
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- Travis Scrimshaw (2013-09-06): Initial version
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# ****************************************************************************
|
|
12
|
+
# Copyright (C) 2013 Travis Scrimshaw <tscrim at ucdavis.edu>
|
|
13
|
+
#
|
|
14
|
+
# This program is free software: you can redistribute it and/or modify
|
|
15
|
+
# it under the terms of the GNU General Public License as published by
|
|
16
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
17
|
+
# (at your option) any later version.
|
|
18
|
+
# https://www.gnu.org/licenses/
|
|
19
|
+
# ****************************************************************************
|
|
20
|
+
|
|
21
|
+
from sage.misc.cachefunc import cached_method
|
|
22
|
+
from sage.misc.latex import latex, LatexExpr
|
|
23
|
+
from sage.misc.lazy_attribute import lazy_attribute
|
|
24
|
+
from sage.misc.misc_c import prod
|
|
25
|
+
from sage.structure.parent import Parent
|
|
26
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
27
|
+
from sage.categories.action import Action
|
|
28
|
+
from sage.categories.rings import Rings
|
|
29
|
+
from sage.categories.algebras_with_basis import AlgebrasWithBasis
|
|
30
|
+
from sage.sets.family import Family
|
|
31
|
+
import sage.data_structures.blas_dict as blas
|
|
32
|
+
from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic
|
|
33
|
+
from sage.rings.polynomial.multi_polynomial_ring_base import MPolynomialRing_base
|
|
34
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
35
|
+
from sage.structure.global_options import GlobalOptions
|
|
36
|
+
from sage.modules.with_basis.indexed_element import IndexedFreeModuleElement
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def repr_from_monomials(monomials, term_repr, use_latex=False) -> str:
|
|
40
|
+
r"""
|
|
41
|
+
Return a string representation of an element of a free module
|
|
42
|
+
from the dictionary ``monomials``.
|
|
43
|
+
|
|
44
|
+
INPUT:
|
|
45
|
+
|
|
46
|
+
- ``monomials`` -- list of pairs ``[m, c]`` where ``m`` is the index
|
|
47
|
+
and ``c`` is the coefficient
|
|
48
|
+
- ``term_repr`` -- a function which returns a string given an index
|
|
49
|
+
(can be ``repr`` or ``latex``, for example)
|
|
50
|
+
- ``use_latex`` -- boolean (default: ``False``); if ``True`` then the
|
|
51
|
+
output is in latex format
|
|
52
|
+
|
|
53
|
+
EXAMPLES::
|
|
54
|
+
|
|
55
|
+
sage: from sage.algebras.weyl_algebra import repr_from_monomials
|
|
56
|
+
sage: R.<x,y,z> = QQ[]
|
|
57
|
+
sage: d = [(z, 4/7), (y, sqrt(2)), (x, -5)] # needs sage.symbolic
|
|
58
|
+
sage: repr_from_monomials(d, lambda m: repr(m)) # needs sage.symbolic
|
|
59
|
+
'4/7*z + sqrt(2)*y - 5*x'
|
|
60
|
+
sage: a = repr_from_monomials(d, lambda m: latex(m), True); a # needs sage.symbolic
|
|
61
|
+
\frac{4}{7} z + \sqrt{2} y - 5 x
|
|
62
|
+
sage: type(a) # needs sage.symbolic
|
|
63
|
+
<class 'sage.misc.latex.LatexExpr'>
|
|
64
|
+
|
|
65
|
+
The zero element::
|
|
66
|
+
|
|
67
|
+
sage: repr_from_monomials([], lambda m: repr(m))
|
|
68
|
+
'0'
|
|
69
|
+
sage: a = repr_from_monomials([], lambda m: latex(m), True); a
|
|
70
|
+
0
|
|
71
|
+
sage: type(a)
|
|
72
|
+
<class 'sage.misc.latex.LatexExpr'>
|
|
73
|
+
|
|
74
|
+
A "unity" element::
|
|
75
|
+
|
|
76
|
+
sage: repr_from_monomials([(1, 1)], lambda m: repr(m))
|
|
77
|
+
'1'
|
|
78
|
+
sage: a = repr_from_monomials([(1, 1)], lambda m: latex(m), True); a
|
|
79
|
+
1
|
|
80
|
+
sage: type(a)
|
|
81
|
+
<class 'sage.misc.latex.LatexExpr'>
|
|
82
|
+
|
|
83
|
+
::
|
|
84
|
+
|
|
85
|
+
sage: repr_from_monomials([(1, -1)], lambda m: repr(m))
|
|
86
|
+
'-1'
|
|
87
|
+
sage: a = repr_from_monomials([(1, -1)], lambda m: latex(m), True); a
|
|
88
|
+
-1
|
|
89
|
+
sage: type(a)
|
|
90
|
+
<class 'sage.misc.latex.LatexExpr'>
|
|
91
|
+
|
|
92
|
+
Leading minus signs are dealt with appropriately::
|
|
93
|
+
|
|
94
|
+
sage: # needs sage.symbolic
|
|
95
|
+
sage: d = [(z, -4/7), (y, -sqrt(2)), (x, -5)]
|
|
96
|
+
sage: repr_from_monomials(d, lambda m: repr(m))
|
|
97
|
+
'-4/7*z - sqrt(2)*y - 5*x'
|
|
98
|
+
sage: a = repr_from_monomials(d, lambda m: latex(m), True); a
|
|
99
|
+
-\frac{4}{7} z - \sqrt{2} y - 5 x
|
|
100
|
+
sage: type(a)
|
|
101
|
+
<class 'sage.misc.latex.LatexExpr'>
|
|
102
|
+
|
|
103
|
+
Indirect doctests using a class that uses this function::
|
|
104
|
+
|
|
105
|
+
sage: R.<x,y> = QQ[]
|
|
106
|
+
sage: A = CliffordAlgebra(QuadraticForm(R, 3, [x,0,-1,3,-4,5]))
|
|
107
|
+
sage: a,b,c = A.gens()
|
|
108
|
+
sage: a*b*c
|
|
109
|
+
e0*e1*e2
|
|
110
|
+
sage: b*c
|
|
111
|
+
e1*e2
|
|
112
|
+
sage: (a*a + 2)
|
|
113
|
+
x + 2
|
|
114
|
+
sage: c*(a*a + 2)*b
|
|
115
|
+
(-x - 2)*e1*e2 - 4*x - 8
|
|
116
|
+
sage: latex(c*(a*a + 2)*b)
|
|
117
|
+
\left( -x - 2 \right) e_{1} e_{2} - 4 x - 8
|
|
118
|
+
"""
|
|
119
|
+
if not monomials:
|
|
120
|
+
if use_latex:
|
|
121
|
+
return latex(0)
|
|
122
|
+
else:
|
|
123
|
+
return '0'
|
|
124
|
+
|
|
125
|
+
ret = ''
|
|
126
|
+
for m, c in monomials:
|
|
127
|
+
# Get the monomial portion
|
|
128
|
+
term = term_repr(m)
|
|
129
|
+
|
|
130
|
+
# Determine what to do with the coefficient
|
|
131
|
+
if use_latex:
|
|
132
|
+
coeff = latex(c)
|
|
133
|
+
else:
|
|
134
|
+
coeff = repr(c)
|
|
135
|
+
|
|
136
|
+
if not term or term == '1':
|
|
137
|
+
term = coeff
|
|
138
|
+
elif coeff == '-1':
|
|
139
|
+
term = '-' + term
|
|
140
|
+
elif coeff != '1':
|
|
141
|
+
atomic_repr = c.parent()._repr_option('element_is_atomic')
|
|
142
|
+
if not atomic_repr and (coeff.find("+") != -1 or coeff.rfind("-") > 0):
|
|
143
|
+
if use_latex:
|
|
144
|
+
term = '\\left(' + coeff + '\\right) ' + term
|
|
145
|
+
elif coeff not in ['', '-']:
|
|
146
|
+
term = '(' + coeff + ')*' + term
|
|
147
|
+
else:
|
|
148
|
+
if use_latex:
|
|
149
|
+
term = coeff + ' ' + term
|
|
150
|
+
else:
|
|
151
|
+
term = coeff + '*' + term
|
|
152
|
+
|
|
153
|
+
# Append this term with the correct sign
|
|
154
|
+
if ret:
|
|
155
|
+
if term[0] == '-':
|
|
156
|
+
ret += ' - ' + term[1:]
|
|
157
|
+
else:
|
|
158
|
+
ret += ' + ' + term
|
|
159
|
+
else:
|
|
160
|
+
ret = term
|
|
161
|
+
return ret
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def repr_factored(w, latex_output=False) -> str:
|
|
165
|
+
r"""
|
|
166
|
+
Return a string representation of ``w`` with the `dx_i` generators
|
|
167
|
+
factored on the right.
|
|
168
|
+
|
|
169
|
+
EXAMPLES::
|
|
170
|
+
|
|
171
|
+
sage: from sage.algebras.weyl_algebra import repr_factored
|
|
172
|
+
sage: R.<t> = QQ[]
|
|
173
|
+
sage: D = DifferentialWeylAlgebra(R)
|
|
174
|
+
sage: t, dt = D.gens()
|
|
175
|
+
sage: x = dt^3*t^3 + dt^2*t^4
|
|
176
|
+
sage: x
|
|
177
|
+
t^3*dt^3 + t^4*dt^2 + 9*t^2*dt^2 + 8*t^3*dt + 18*t*dt + 12*t^2 + 6
|
|
178
|
+
sage: print(repr_factored(x))
|
|
179
|
+
(12*t^2 + 6) + (8*t^3 + 18*t)*dt + (t^4 + 9*t^2)*dt^2 + (t^3)*dt^3
|
|
180
|
+
sage: repr_factored(x, True)
|
|
181
|
+
(12 t^{2} + 6) + (8 t^{3} + 18 t) \frac{\partial}{\partial t}
|
|
182
|
+
+ (t^{4} + 9 t^{2}) \frac{\partial^{2}}{\partial t^{2}}
|
|
183
|
+
+ (t^{3}) \frac{\partial^{3}}{\partial t^{3}}
|
|
184
|
+
sage: repr_factored(D.zero())
|
|
185
|
+
'0'
|
|
186
|
+
|
|
187
|
+
With multiple variables::
|
|
188
|
+
|
|
189
|
+
sage: R.<x,y,z> = QQ[]
|
|
190
|
+
sage: D = DifferentialWeylAlgebra(R)
|
|
191
|
+
sage: x, y, z, dx, dy, dz = D.gens()
|
|
192
|
+
sage: elt = dx^3*x^3 + (y^3-z*x)*dx^3 + dy^3*x^3 + dx*dy*dz*x*y*z
|
|
193
|
+
sage: elt
|
|
194
|
+
x^3*dy^3 + x*y*z*dx*dy*dz + y^3*dx^3 + x^3*dx^3 - x*z*dx^3 + y*z*dy*dz
|
|
195
|
+
+ x*z*dx*dz + x*y*dx*dy + 9*x^2*dx^2 + z*dz + y*dy + 19*x*dx + 7
|
|
196
|
+
sage: print(repr_factored(elt))
|
|
197
|
+
(7) + (z)*dz + (y)*dy + (y*z)*dy*dz + (x^3)*dy^3 + (19*x)*dx
|
|
198
|
+
+ (x*z)*dx*dz + (x*y)*dx*dy + (x*y*z)*dx*dy*dz
|
|
199
|
+
+ (9*x^2)*dx^2 + (x^3 + y^3 - x*z)*dx^3
|
|
200
|
+
sage: repr_factored(D.zero(), True)
|
|
201
|
+
0
|
|
202
|
+
"""
|
|
203
|
+
f = w.factor_differentials()
|
|
204
|
+
gens = w.parent().polynomial_ring().gens()
|
|
205
|
+
|
|
206
|
+
if latex_output:
|
|
207
|
+
def exp(e):
|
|
208
|
+
return '^{{{}}}'.format(e) if e > 1 else ''
|
|
209
|
+
|
|
210
|
+
def repr_dx(k):
|
|
211
|
+
total = sum(k)
|
|
212
|
+
if total == 0:
|
|
213
|
+
return ''
|
|
214
|
+
denom = ' '.join('\\partial {}{}'.format(latex(g), exp(e))
|
|
215
|
+
for e, g in zip(k, gens) if e != 0)
|
|
216
|
+
return ''.join(' \\frac{{\\partial{}}}{{{}}}'.format(exp(total), denom))
|
|
217
|
+
repr_x = latex
|
|
218
|
+
else:
|
|
219
|
+
def exp(e):
|
|
220
|
+
return '^{}'.format(e) if e > 1 else ''
|
|
221
|
+
|
|
222
|
+
def repr_dx(k):
|
|
223
|
+
return ''.join('*d{}{}'.format(g, exp(e)) for e, g in zip(k, gens) if e != 0)
|
|
224
|
+
repr_x = repr
|
|
225
|
+
ret = " + ".join("({}){}".format(repr_x(f[k]), repr_dx(k))
|
|
226
|
+
for k in sorted(f))
|
|
227
|
+
if not ret:
|
|
228
|
+
ret = '0'
|
|
229
|
+
if latex_output:
|
|
230
|
+
return LatexExpr(ret)
|
|
231
|
+
return ret
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
class DifferentialWeylAlgebraElement(IndexedFreeModuleElement):
|
|
235
|
+
"""
|
|
236
|
+
An element in a differential Weyl algebra.
|
|
237
|
+
|
|
238
|
+
TESTS:
|
|
239
|
+
|
|
240
|
+
Some computations in the Weyl algebra, using the implicit
|
|
241
|
+
coercion from the polynomial ring into the Weyl algebra::
|
|
242
|
+
|
|
243
|
+
sage: W.<x,y,z> = DifferentialWeylAlgebra(QQ)
|
|
244
|
+
sage: dx,dy,dz = W.differentials()
|
|
245
|
+
sage: elt = ((x^3-z)*dx + dy)^2
|
|
246
|
+
sage: TestSuite(elt).run()
|
|
247
|
+
|
|
248
|
+
sage: R.<x,y,z> = QQ[]
|
|
249
|
+
sage: W = DifferentialWeylAlgebra(R)
|
|
250
|
+
sage: dx,dy,dz = W.differentials()
|
|
251
|
+
sage: dy*(x^3-y*z)*dx == -z*dx + x^3*dx*dy - y*z*dx*dy
|
|
252
|
+
True
|
|
253
|
+
sage: W.zero() == 0
|
|
254
|
+
True
|
|
255
|
+
sage: W.one() == 1
|
|
256
|
+
True
|
|
257
|
+
sage: x == 1
|
|
258
|
+
False
|
|
259
|
+
sage: x + 1 == 1
|
|
260
|
+
False
|
|
261
|
+
sage: W(x^3 - y*z) == x^3 - y*z
|
|
262
|
+
True
|
|
263
|
+
sage: W.<x,y,z> = DifferentialWeylAlgebra(QQ)
|
|
264
|
+
sage: dx,dy,dz = W.differentials()
|
|
265
|
+
sage: dx != dy
|
|
266
|
+
True
|
|
267
|
+
sage: W.one() != 1
|
|
268
|
+
False
|
|
269
|
+
sage: dy - (3*x - z)*dx
|
|
270
|
+
dy + z*dx - 3*x*dx
|
|
271
|
+
sage: (dx*dy) + dz + x^3 - 2
|
|
272
|
+
dx*dy + dz + x^3 - 2
|
|
273
|
+
sage: elt = (dy - (3*x - z)*dx)
|
|
274
|
+
sage: sorted(elt.monomial_coefficients().items())
|
|
275
|
+
[(((0, 0, 0), (0, 1, 0)), 1),
|
|
276
|
+
(((0, 0, 1), (1, 0, 0)), 1),
|
|
277
|
+
(((1, 0, 0), (1, 0, 0)), -3)]
|
|
278
|
+
sage: elt = dy - (3*x - z)*dx + 1
|
|
279
|
+
sage: sorted(elt.support())
|
|
280
|
+
[((0, 0, 0), (0, 0, 0)),
|
|
281
|
+
((0, 0, 0), (0, 1, 0)),
|
|
282
|
+
((0, 0, 1), (1, 0, 0)),
|
|
283
|
+
((1, 0, 0), (1, 0, 0))]
|
|
284
|
+
|
|
285
|
+
Hashing works::
|
|
286
|
+
|
|
287
|
+
sage: hash(dx) == hash(dx) # hashing works
|
|
288
|
+
True
|
|
289
|
+
|
|
290
|
+
Comparison works, even if mathematically meaningless
|
|
291
|
+
(but useful e.g. for sorting)::
|
|
292
|
+
|
|
293
|
+
sage: dx < dy or dy < dx
|
|
294
|
+
True
|
|
295
|
+
"""
|
|
296
|
+
def _repr_(self) -> str:
|
|
297
|
+
r"""
|
|
298
|
+
Return a string representation of ``self``.
|
|
299
|
+
|
|
300
|
+
TESTS::
|
|
301
|
+
|
|
302
|
+
sage: W.<x,y,z> = DifferentialWeylAlgebra(QQ)
|
|
303
|
+
sage: dx,dy,dz = W.differentials()
|
|
304
|
+
sage: ((x^3-z)*dx + dy)^2
|
|
305
|
+
dy^2 + 2*x^3*dx*dy - 2*z*dx*dy + x^6*dx^2 - 2*x^3*z*dx^2
|
|
306
|
+
+ z^2*dx^2 + 3*x^5*dx - 3*x^2*z*dx
|
|
307
|
+
"""
|
|
308
|
+
if self.parent().options.factor_representation:
|
|
309
|
+
return repr_factored(self, False)
|
|
310
|
+
|
|
311
|
+
def term(m):
|
|
312
|
+
ret = ''
|
|
313
|
+
for i, power in enumerate(m[0] + m[1]):
|
|
314
|
+
if power == 0:
|
|
315
|
+
continue
|
|
316
|
+
name = self.parent().variable_names()[i]
|
|
317
|
+
if ret:
|
|
318
|
+
ret += '*'
|
|
319
|
+
if power == 1:
|
|
320
|
+
ret += '{}'.format(name)
|
|
321
|
+
else:
|
|
322
|
+
ret += '{}^{}'.format(name, power)
|
|
323
|
+
return ret
|
|
324
|
+
return repr_from_monomials(self.list(), term)
|
|
325
|
+
|
|
326
|
+
def _latex_(self) -> str:
|
|
327
|
+
r"""
|
|
328
|
+
Return a `\LaTeX` representation of ``self``.
|
|
329
|
+
|
|
330
|
+
TESTS::
|
|
331
|
+
|
|
332
|
+
sage: R = PolynomialRing(QQ, 'x', 3)
|
|
333
|
+
sage: W = DifferentialWeylAlgebra(R)
|
|
334
|
+
sage: x0,x1,x2,dx0,dx1,dx2 = W.gens()
|
|
335
|
+
sage: latex( ((x0^3-x2)*dx0 + dx1)^2 )
|
|
336
|
+
\frac{\partial^{2}}{\partial x_{1}^{2}}
|
|
337
|
+
+ 2 x_{0}^{3} \frac{\partial^{2}}{\partial x_{0} \partial x_{1}}
|
|
338
|
+
- 2 x_{2} \frac{\partial^{2}}{\partial x_{0} \partial x_{1}}
|
|
339
|
+
+ x_{0}^{6} \frac{\partial^{2}}{\partial x_{0}^{2}}
|
|
340
|
+
- 2 x_{0}^{3} x_{2} \frac{\partial^{2}}{\partial x_{0}^{2}}
|
|
341
|
+
+ x_{2}^{2} \frac{\partial^{2}}{\partial x_{0}^{2}}
|
|
342
|
+
+ 3 x_{0}^{5} \frac{\partial}{\partial x_{0}}
|
|
343
|
+
- 3 x_{0}^{2} x_{2} \frac{\partial}{\partial x_{0}}
|
|
344
|
+
"""
|
|
345
|
+
if self.parent().options.factor_representation:
|
|
346
|
+
return repr_factored(self, True)
|
|
347
|
+
|
|
348
|
+
def exp(e):
|
|
349
|
+
return '^{{{}}}'.format(e) if e > 1 else ''
|
|
350
|
+
|
|
351
|
+
def term(m):
|
|
352
|
+
R = self.parent()._poly_ring
|
|
353
|
+
|
|
354
|
+
def half_term(mon, polynomial):
|
|
355
|
+
total = sum(mon)
|
|
356
|
+
if total == 0:
|
|
357
|
+
return '1'
|
|
358
|
+
ret = ' '.join('{}{}'.format(latex(R.gen(i)), exp(power)) if polynomial
|
|
359
|
+
else '\\partial {}{}'.format(latex(R.gen(i)), exp(power))
|
|
360
|
+
for i, power in enumerate(mon) if power > 0)
|
|
361
|
+
if not polynomial:
|
|
362
|
+
return '\\frac{{\\partial{}}}{{{}}}'.format(exp(total), ret)
|
|
363
|
+
return ret
|
|
364
|
+
p = half_term(m[0], True)
|
|
365
|
+
d = half_term(m[1], False)
|
|
366
|
+
if p == '1': # No polynomial part
|
|
367
|
+
return d
|
|
368
|
+
elif d == '1': # No differential part
|
|
369
|
+
return p
|
|
370
|
+
else:
|
|
371
|
+
return p + ' ' + d
|
|
372
|
+
return repr_from_monomials(self.list(), term, True)
|
|
373
|
+
|
|
374
|
+
def _mul_(self, other):
|
|
375
|
+
"""
|
|
376
|
+
Return ``self`` multiplied by ``other``.
|
|
377
|
+
|
|
378
|
+
EXAMPLES::
|
|
379
|
+
|
|
380
|
+
sage: W.<x,y,z> = DifferentialWeylAlgebra(QQ)
|
|
381
|
+
sage: dx,dy,dz = W.differentials()
|
|
382
|
+
sage: dx*(x*y + z)
|
|
383
|
+
x*y*dx + z*dx + y
|
|
384
|
+
sage: ((x^3-z)*dx + dy) * (dx*dz^2 - 10*x)
|
|
385
|
+
dx*dy*dz^2 + x^3*dx^2*dz^2 - z*dx^2*dz^2 - 10*x*dy - 10*x^4*dx
|
|
386
|
+
+ 10*x*z*dx - 10*x^3 + 10*z
|
|
387
|
+
"""
|
|
388
|
+
def add_tuples(x, y):
|
|
389
|
+
return tuple(a + y[i] for i, a in enumerate(x))
|
|
390
|
+
|
|
391
|
+
d = {}
|
|
392
|
+
n = self.parent()._n
|
|
393
|
+
t = tuple([0] * n)
|
|
394
|
+
zero = self.parent().base_ring().zero()
|
|
395
|
+
for ml in self._monomial_coefficients:
|
|
396
|
+
cl = self._monomial_coefficients[ml]
|
|
397
|
+
for mr in other._monomial_coefficients:
|
|
398
|
+
cr = other._monomial_coefficients[mr]
|
|
399
|
+
cur = [((mr[0], t), cl * cr)]
|
|
400
|
+
for i, p in enumerate(ml[1]):
|
|
401
|
+
for _ in range(p):
|
|
402
|
+
next = []
|
|
403
|
+
for m, c in cur: # Distribute and apply the derivative
|
|
404
|
+
diff = list(m[1])
|
|
405
|
+
diff[i] += 1
|
|
406
|
+
next.append(((m[0], tuple(diff)), c))
|
|
407
|
+
if m[0][i] != 0:
|
|
408
|
+
poly = list(m[0])
|
|
409
|
+
c *= poly[i]
|
|
410
|
+
poly[i] -= 1
|
|
411
|
+
next.append(((tuple(poly), m[1]), c))
|
|
412
|
+
cur = next
|
|
413
|
+
|
|
414
|
+
for m, c in cur:
|
|
415
|
+
# multiply the resulting term by the other term
|
|
416
|
+
m = (add_tuples(ml[0], m[0]), add_tuples(mr[1], m[1]))
|
|
417
|
+
d[m] = d.get(m, zero) + c
|
|
418
|
+
if d[m] == zero:
|
|
419
|
+
del d[m]
|
|
420
|
+
return self.__class__(self.parent(), d)
|
|
421
|
+
|
|
422
|
+
def _rmul_(self, other):
|
|
423
|
+
"""
|
|
424
|
+
Multiply ``self`` on the right side of ``other``.
|
|
425
|
+
|
|
426
|
+
EXAMPLES::
|
|
427
|
+
|
|
428
|
+
sage: W.<x,y,z> = DifferentialWeylAlgebra(QQ)
|
|
429
|
+
sage: dx,dy,dz = W.differentials()
|
|
430
|
+
sage: a = (x*y + z) * dx
|
|
431
|
+
sage: 3/2 * a
|
|
432
|
+
3/2*x*y*dx + 3/2*z*dx
|
|
433
|
+
"""
|
|
434
|
+
if other == 0:
|
|
435
|
+
return self.parent().zero()
|
|
436
|
+
M = self._monomial_coefficients
|
|
437
|
+
return self.__class__(self.parent(), {t: other * M[t] for t in M})
|
|
438
|
+
|
|
439
|
+
def _lmul_(self, other):
|
|
440
|
+
"""
|
|
441
|
+
Multiply ``self`` on the left side of ``other``.
|
|
442
|
+
|
|
443
|
+
EXAMPLES::
|
|
444
|
+
|
|
445
|
+
sage: W.<x,y,z> = DifferentialWeylAlgebra(QQ)
|
|
446
|
+
sage: dx,dy,dz = W.differentials()
|
|
447
|
+
sage: a = (x*y + z) * dx
|
|
448
|
+
sage: a * 3/2
|
|
449
|
+
3/2*x*y*dx + 3/2*z*dx
|
|
450
|
+
"""
|
|
451
|
+
if other == 0:
|
|
452
|
+
return self.parent().zero()
|
|
453
|
+
M = self._monomial_coefficients
|
|
454
|
+
return self.__class__(self.parent(), {t: M[t] * other for t in M})
|
|
455
|
+
|
|
456
|
+
def __iter__(self):
|
|
457
|
+
"""
|
|
458
|
+
Return an iterator of ``self``.
|
|
459
|
+
|
|
460
|
+
This is the iterator of ``self.list()``.
|
|
461
|
+
|
|
462
|
+
EXAMPLES::
|
|
463
|
+
|
|
464
|
+
sage: W.<x,y,z> = DifferentialWeylAlgebra(QQ)
|
|
465
|
+
sage: dx,dy,dz = W.differentials()
|
|
466
|
+
sage: list(dy - (3*x - z)*dx)
|
|
467
|
+
[(((0, 0, 0), (0, 1, 0)), 1),
|
|
468
|
+
(((0, 0, 1), (1, 0, 0)), 1),
|
|
469
|
+
(((1, 0, 0), (1, 0, 0)), -3)]
|
|
470
|
+
"""
|
|
471
|
+
return iter(self.list())
|
|
472
|
+
|
|
473
|
+
def list(self) -> list:
|
|
474
|
+
"""
|
|
475
|
+
Return ``self`` as a list.
|
|
476
|
+
|
|
477
|
+
This list consists of pairs `(m, c)`, where `m` is a pair of
|
|
478
|
+
tuples indexing a basis element of ``self``, and `c` is the
|
|
479
|
+
coordinate of ``self`` corresponding to this basis element.
|
|
480
|
+
(Only nonzero coordinates are shown.)
|
|
481
|
+
|
|
482
|
+
EXAMPLES::
|
|
483
|
+
|
|
484
|
+
sage: W.<x,y,z> = DifferentialWeylAlgebra(QQ)
|
|
485
|
+
sage: dx,dy,dz = W.differentials()
|
|
486
|
+
sage: elt = dy - (3*x - z)*dx
|
|
487
|
+
sage: elt.list()
|
|
488
|
+
[(((0, 0, 0), (0, 1, 0)), 1),
|
|
489
|
+
(((0, 0, 1), (1, 0, 0)), 1),
|
|
490
|
+
(((1, 0, 0), (1, 0, 0)), -3)]
|
|
491
|
+
"""
|
|
492
|
+
return sorted(self._monomial_coefficients.items(),
|
|
493
|
+
key=lambda x: (-sum(x[0][1]), x[0][1], -sum(x[0][0]), x[0][0]))
|
|
494
|
+
|
|
495
|
+
# This is essentially copied from
|
|
496
|
+
# sage.combinat.free_module.CombinatorialFreeModuleElement
|
|
497
|
+
def __truediv__(self, x):
|
|
498
|
+
"""
|
|
499
|
+
Division by coefficients.
|
|
500
|
+
|
|
501
|
+
EXAMPLES::
|
|
502
|
+
|
|
503
|
+
sage: W.<x,y,z> = DifferentialWeylAlgebra(QQ)
|
|
504
|
+
sage: x / 2
|
|
505
|
+
1/2*x
|
|
506
|
+
sage: W.<x,y,z> = DifferentialWeylAlgebra(ZZ)
|
|
507
|
+
sage: a = 2*x + 4*y*z
|
|
508
|
+
sage: a / 2
|
|
509
|
+
2*y*z + x
|
|
510
|
+
"""
|
|
511
|
+
F = self.parent()
|
|
512
|
+
D = self._monomial_coefficients
|
|
513
|
+
if F.base_ring().is_field():
|
|
514
|
+
x = F.base_ring()(x)
|
|
515
|
+
x_inv = x**-1
|
|
516
|
+
D = blas.linear_combination([(D, x_inv)])
|
|
517
|
+
|
|
518
|
+
return self.__class__(F, D)
|
|
519
|
+
|
|
520
|
+
return self.__class__(F, {t: D[t]._divide_if_possible(x) for t in D})
|
|
521
|
+
|
|
522
|
+
def factor_differentials(self) -> dict:
|
|
523
|
+
"""
|
|
524
|
+
Return a dict representing ``self`` with the differentials
|
|
525
|
+
factored out.
|
|
526
|
+
|
|
527
|
+
EXAMPLES::
|
|
528
|
+
|
|
529
|
+
sage: R.<t> = QQ[]
|
|
530
|
+
sage: D = DifferentialWeylAlgebra(R)
|
|
531
|
+
sage: t, dt = D.gens()
|
|
532
|
+
sage: x = dt^3*t^3 + dt^2*t^4
|
|
533
|
+
sage: x
|
|
534
|
+
t^3*dt^3 + t^4*dt^2 + 9*t^2*dt^2 + 8*t^3*dt + 18*t*dt + 12*t^2 + 6
|
|
535
|
+
sage: x.factor_differentials()
|
|
536
|
+
{(0,): 12*t^2 + 6, (1,): 8*t^3 + 18*t, (2,): t^4 + 9*t^2, (3,): t^3}
|
|
537
|
+
sage: D.zero().factor_differentials()
|
|
538
|
+
{}
|
|
539
|
+
|
|
540
|
+
sage: R.<x,y,z> = QQ[]
|
|
541
|
+
sage: D = DifferentialWeylAlgebra(R)
|
|
542
|
+
sage: x, y, z, dx, dy, dz = D.gens()
|
|
543
|
+
sage: elt = dx^3*x^3 + (y^3-z*x)*dx^3 + dy^3*x^3 + dx*dy*dz*x*y*z
|
|
544
|
+
sage: elt
|
|
545
|
+
x^3*dy^3 + x*y*z*dx*dy*dz + y^3*dx^3 + x^3*dx^3 - x*z*dx^3 + y*z*dy*dz
|
|
546
|
+
+ x*z*dx*dz + x*y*dx*dy + 9*x^2*dx^2 + z*dz + y*dy + 19*x*dx + 7
|
|
547
|
+
sage: elt.factor_differentials()
|
|
548
|
+
{(0, 0, 0): 7,
|
|
549
|
+
(0, 0, 1): z,
|
|
550
|
+
(0, 1, 0): y,
|
|
551
|
+
(0, 1, 1): y*z,
|
|
552
|
+
(0, 3, 0): x^3,
|
|
553
|
+
(1, 0, 0): 19*x,
|
|
554
|
+
(1, 0, 1): x*z,
|
|
555
|
+
(1, 1, 0): x*y,
|
|
556
|
+
(1, 1, 1): x*y*z,
|
|
557
|
+
(2, 0, 0): 9*x^2,
|
|
558
|
+
(3, 0, 0): x^3 + y^3 - x*z}
|
|
559
|
+
"""
|
|
560
|
+
ret = {}
|
|
561
|
+
DW = self.parent()
|
|
562
|
+
P = DW.polynomial_ring()
|
|
563
|
+
gens = P.gens()
|
|
564
|
+
for m, c in self:
|
|
565
|
+
x, dx = m
|
|
566
|
+
if dx not in ret:
|
|
567
|
+
ret[dx] = P.zero()
|
|
568
|
+
ret[dx] += c * prod(g**e for e, g in zip(x, gens))
|
|
569
|
+
return ret
|
|
570
|
+
|
|
571
|
+
def diff(self, p):
|
|
572
|
+
"""
|
|
573
|
+
Apply this differential operator to a polynomial.
|
|
574
|
+
|
|
575
|
+
INPUT:
|
|
576
|
+
|
|
577
|
+
- ``p`` -- polynomial of the underlying polynomial ring
|
|
578
|
+
|
|
579
|
+
OUTPUT:
|
|
580
|
+
|
|
581
|
+
The result of the left action of the Weyl algebra on the polynomial
|
|
582
|
+
ring via differentiation.
|
|
583
|
+
|
|
584
|
+
EXAMPLES::
|
|
585
|
+
|
|
586
|
+
sage: R.<x,y> = QQ[]
|
|
587
|
+
sage: W = R.weyl_algebra()
|
|
588
|
+
sage: dx, dy = W.differentials()
|
|
589
|
+
sage: dx.diff(x^3)
|
|
590
|
+
3*x^2
|
|
591
|
+
sage: (dx*dy).diff(W(x^3*y^3))
|
|
592
|
+
9*x^2*y^2
|
|
593
|
+
sage: (x*dx + dy + 1).diff(x^4*y^4 + 1)
|
|
594
|
+
5*x^4*y^4 + 4*x^4*y^3 + 1
|
|
595
|
+
"""
|
|
596
|
+
return self.parent().diff_action(self, p)
|
|
597
|
+
|
|
598
|
+
|
|
599
|
+
class DifferentialWeylAlgebra(UniqueRepresentation, Parent):
|
|
600
|
+
r"""
|
|
601
|
+
The differential Weyl algebra of a polynomial ring.
|
|
602
|
+
|
|
603
|
+
Let `R` be a commutative ring. The (differential) Weyl algebra `W` is
|
|
604
|
+
the algebra generated by `x_1, x_2, \ldots x_n, \partial_{x_1},
|
|
605
|
+
\partial_{x_2}, \ldots, \partial_{x_n}` subject to the relations:
|
|
606
|
+
`[x_i, x_j] = 0`, `[\partial_{x_i}, \partial_{x_j}] = 0`, and
|
|
607
|
+
`\partial_{x_i} x_j = x_j \partial_{x_i} + \delta_{ij}`. Therefore
|
|
608
|
+
`\partial_{x_i}` is acting as the partial differential operator on `x_i`.
|
|
609
|
+
|
|
610
|
+
The Weyl algebra can also be constructed as an iterated Ore extension
|
|
611
|
+
of the polynomial ring `R[x_1, x_2, \ldots, x_n]` by adding `x_i` at
|
|
612
|
+
each step. It can also be seen as a quantization of the symmetric algebra
|
|
613
|
+
`Sym(V)`, where `V` is a finite dimensional vector space over a field
|
|
614
|
+
of characteristic zero, by using a modified Groenewold-Moyal
|
|
615
|
+
product in the symmetric algebra.
|
|
616
|
+
|
|
617
|
+
The Weyl algebra (even for `n = 1`) over a field of characteristic 0
|
|
618
|
+
has many interesting properties.
|
|
619
|
+
|
|
620
|
+
- It's a non-commutative domain.
|
|
621
|
+
- It's a simple ring (but not in positive characteristic) that is not
|
|
622
|
+
a matrix ring over a division ring.
|
|
623
|
+
- It has no finite-dimensional representations.
|
|
624
|
+
- It's a quotient of the universal enveloping algebra of the
|
|
625
|
+
Heisenberg algebra `\mathfrak{h}_n`.
|
|
626
|
+
|
|
627
|
+
REFERENCES:
|
|
628
|
+
|
|
629
|
+
- :wikipedia:`Weyl_algebra`
|
|
630
|
+
|
|
631
|
+
INPUT:
|
|
632
|
+
|
|
633
|
+
- ``R`` -- a (polynomial) ring
|
|
634
|
+
- ``names`` -- (default: ``None``) if ``None`` and ``R`` is a
|
|
635
|
+
polynomial ring, then the variable names correspond to
|
|
636
|
+
those of ``R``; otherwise if ``names`` is specified, then ``R``
|
|
637
|
+
is the base ring
|
|
638
|
+
|
|
639
|
+
EXAMPLES:
|
|
640
|
+
|
|
641
|
+
There are two ways to create a Weyl algebra, the first is from
|
|
642
|
+
a polynomial ring::
|
|
643
|
+
|
|
644
|
+
sage: R.<x,y,z> = QQ[]
|
|
645
|
+
sage: W = DifferentialWeylAlgebra(R); W
|
|
646
|
+
Differential Weyl algebra of polynomials in x, y, z over Rational Field
|
|
647
|
+
|
|
648
|
+
We can call ``W.inject_variables()`` to give the polynomial ring
|
|
649
|
+
variables, now as elements of ``W``, and the differentials::
|
|
650
|
+
|
|
651
|
+
sage: W.inject_variables()
|
|
652
|
+
Defining x, y, z, dx, dy, dz
|
|
653
|
+
sage: (dx * dy * dz) * (x^2 * y * z + x * z * dy + 1)
|
|
654
|
+
x*z*dx*dy^2*dz + z*dy^2*dz + x^2*y*z*dx*dy*dz + dx*dy*dz
|
|
655
|
+
+ x*dx*dy^2 + 2*x*y*z*dy*dz + dy^2 + x^2*z*dx*dz + x^2*y*dx*dy
|
|
656
|
+
+ 2*x*z*dz + 2*x*y*dy + x^2*dx + 2*x
|
|
657
|
+
|
|
658
|
+
Or directly by specifying a base ring and variable names::
|
|
659
|
+
|
|
660
|
+
sage: W.<a,b> = DifferentialWeylAlgebra(QQ); W
|
|
661
|
+
Differential Weyl algebra of polynomials in a, b over Rational Field
|
|
662
|
+
|
|
663
|
+
.. TODO::
|
|
664
|
+
|
|
665
|
+
Implement the :meth:`graded_algebra` as a polynomial ring once
|
|
666
|
+
they are considered to be graded rings (algebras).
|
|
667
|
+
"""
|
|
668
|
+
@staticmethod
|
|
669
|
+
def __classcall__(cls, R, names=None):
|
|
670
|
+
"""
|
|
671
|
+
Normalize input to ensure a unique representation.
|
|
672
|
+
|
|
673
|
+
EXAMPLES::
|
|
674
|
+
|
|
675
|
+
sage: W1.<x,y,z> = DifferentialWeylAlgebra(QQ)
|
|
676
|
+
sage: W2 = DifferentialWeylAlgebra(QQ['x,y,z'])
|
|
677
|
+
sage: W1 is W2
|
|
678
|
+
True
|
|
679
|
+
"""
|
|
680
|
+
if isinstance(R, (PolynomialRing_generic, MPolynomialRing_base)):
|
|
681
|
+
if names is None:
|
|
682
|
+
names = R.variable_names()
|
|
683
|
+
R = R.base_ring()
|
|
684
|
+
elif names is None:
|
|
685
|
+
raise ValueError("the names must be specified")
|
|
686
|
+
elif R not in Rings().Commutative():
|
|
687
|
+
raise TypeError("argument R must be a commutative ring")
|
|
688
|
+
return super().__classcall__(cls, R, names)
|
|
689
|
+
|
|
690
|
+
def __init__(self, R, names=None) -> None:
|
|
691
|
+
r"""
|
|
692
|
+
Initialize ``self``.
|
|
693
|
+
|
|
694
|
+
EXAMPLES::
|
|
695
|
+
|
|
696
|
+
sage: R.<x,y,z> = QQ[]
|
|
697
|
+
sage: W = DifferentialWeylAlgebra(R)
|
|
698
|
+
sage: TestSuite(W).run()
|
|
699
|
+
"""
|
|
700
|
+
self._n = len(names)
|
|
701
|
+
self._poly_ring = PolynomialRing(R, names)
|
|
702
|
+
names = names + tuple('d' + n for n in names)
|
|
703
|
+
if len(names) != self._n * 2:
|
|
704
|
+
raise ValueError("variable names cannot differ by a leading 'd'")
|
|
705
|
+
# TODO: Make this into a filtered algebra under the natural grading of
|
|
706
|
+
# x_i and dx_i have degree 1
|
|
707
|
+
# Filtered is not included because it is a supercategory of super
|
|
708
|
+
if R.is_field():
|
|
709
|
+
cat = AlgebrasWithBasis(R).NoZeroDivisors().Super()
|
|
710
|
+
else:
|
|
711
|
+
cat = AlgebrasWithBasis(R).Super()
|
|
712
|
+
Parent.__init__(self, base=R, names=names, category=cat)
|
|
713
|
+
|
|
714
|
+
def _repr_(self) -> str:
|
|
715
|
+
r"""
|
|
716
|
+
Return a string representation of ``self``.
|
|
717
|
+
|
|
718
|
+
EXAMPLES::
|
|
719
|
+
|
|
720
|
+
sage: R.<x,y,z> = QQ[]
|
|
721
|
+
sage: DifferentialWeylAlgebra(R)
|
|
722
|
+
Differential Weyl algebra of polynomials in x, y, z over Rational Field
|
|
723
|
+
"""
|
|
724
|
+
poly_gens = ', '.join(repr(x) for x in self.variables())
|
|
725
|
+
return "Differential Weyl algebra of polynomials in {} over {}".format(
|
|
726
|
+
poly_gens, self.base_ring())
|
|
727
|
+
|
|
728
|
+
# add options to class
|
|
729
|
+
class options(GlobalOptions):
|
|
730
|
+
r"""
|
|
731
|
+
Set the global options for elements of the differential Weyl
|
|
732
|
+
algebra class. The default is to have the factored
|
|
733
|
+
representations turned off.
|
|
734
|
+
|
|
735
|
+
@OPTIONS@
|
|
736
|
+
|
|
737
|
+
If no parameters are set, then the function returns a copy of the
|
|
738
|
+
options dictionary.
|
|
739
|
+
|
|
740
|
+
EXAMPLES::
|
|
741
|
+
|
|
742
|
+
sage: R.<t> = QQ[]
|
|
743
|
+
sage: D = DifferentialWeylAlgebra(R)
|
|
744
|
+
sage: t,dt = D.gens()
|
|
745
|
+
sage: x = dt^3*t^3 + dt^2*t^4
|
|
746
|
+
sage: x
|
|
747
|
+
t^3*dt^3 + t^4*dt^2 + 9*t^2*dt^2 + 8*t^3*dt + 18*t*dt + 12*t^2 + 6
|
|
748
|
+
|
|
749
|
+
sage: D.options.factor_representation = True
|
|
750
|
+
sage: x
|
|
751
|
+
(12*t^2 + 6) + (8*t^3 + 18*t)*dt + (t^4 + 9*t^2)*dt^2 + (t^3)*dt^3
|
|
752
|
+
|
|
753
|
+
sage: D.options._reset()
|
|
754
|
+
"""
|
|
755
|
+
NAME = 'DifferentialWeylAlgebra'
|
|
756
|
+
module = 'sage.algebras.weyl_algebra'
|
|
757
|
+
factor_representation = {'default': False,
|
|
758
|
+
'description': 'Controls whether to factor the differentials out or not in the output representations',
|
|
759
|
+
'checker': lambda x: x in [True, False]}
|
|
760
|
+
|
|
761
|
+
def _element_constructor_(self, x):
|
|
762
|
+
"""
|
|
763
|
+
Construct an element of ``self`` from ``x``.
|
|
764
|
+
|
|
765
|
+
EXAMPLES::
|
|
766
|
+
|
|
767
|
+
sage: R.<x,y,z> = QQ[]
|
|
768
|
+
sage: W = DifferentialWeylAlgebra(R)
|
|
769
|
+
sage: a = W(2); a
|
|
770
|
+
2
|
|
771
|
+
sage: a.parent() is W
|
|
772
|
+
True
|
|
773
|
+
sage: W(x^2 - y*z)
|
|
774
|
+
-y*z + x^2
|
|
775
|
+
"""
|
|
776
|
+
t = tuple([0] * (self._n))
|
|
777
|
+
if x in self.base_ring():
|
|
778
|
+
if x == self.base_ring().zero():
|
|
779
|
+
return self.zero()
|
|
780
|
+
return self.element_class(self, {(t, t): x})
|
|
781
|
+
if isinstance(x, DifferentialWeylAlgebraElement):
|
|
782
|
+
R = self.base_ring()
|
|
783
|
+
if x.parent().base_ring() is R:
|
|
784
|
+
return self.element_class(self, dict(x))
|
|
785
|
+
zero = R.zero()
|
|
786
|
+
return self.element_class(self, {i: R(c) for i, c in x if R(c) != zero})
|
|
787
|
+
x = self._poly_ring(x)
|
|
788
|
+
return self.element_class(self, {(tuple(m), t): c
|
|
789
|
+
for m, c in x.monomial_coefficients().items()})
|
|
790
|
+
|
|
791
|
+
def _coerce_map_from_(self, R):
|
|
792
|
+
"""
|
|
793
|
+
Return data which determines if there is a coercion map
|
|
794
|
+
from ``R`` to ``self``.
|
|
795
|
+
|
|
796
|
+
If such a map exists, the output could be a map, callable,
|
|
797
|
+
or ``True``, which constructs a generic map. Otherwise the output
|
|
798
|
+
must be ``False`` or ``None``.
|
|
799
|
+
|
|
800
|
+
EXAMPLES::
|
|
801
|
+
|
|
802
|
+
sage: R.<x,y,z> = QQ[]
|
|
803
|
+
sage: W = DifferentialWeylAlgebra(R)
|
|
804
|
+
sage: W._coerce_map_from_(R)
|
|
805
|
+
True
|
|
806
|
+
sage: W._coerce_map_from_(QQ)
|
|
807
|
+
True
|
|
808
|
+
sage: W._coerce_map_from_(ZZ['x'])
|
|
809
|
+
True
|
|
810
|
+
|
|
811
|
+
Order of the names matter::
|
|
812
|
+
|
|
813
|
+
sage: Wp = DifferentialWeylAlgebra(QQ['x,z,y'])
|
|
814
|
+
sage: W.has_coerce_map_from(Wp)
|
|
815
|
+
False
|
|
816
|
+
sage: Wp.has_coerce_map_from(W)
|
|
817
|
+
False
|
|
818
|
+
|
|
819
|
+
Zero coordinates are handled appropriately::
|
|
820
|
+
|
|
821
|
+
sage: R.<x,y,z> = ZZ[]
|
|
822
|
+
sage: W3 = DifferentialWeylAlgebra(GF(3)['x,y,z'])
|
|
823
|
+
sage: W3.has_coerce_map_from(R)
|
|
824
|
+
True
|
|
825
|
+
|
|
826
|
+
sage: W.<x,y,z> = DifferentialWeylAlgebra(ZZ)
|
|
827
|
+
sage: W3.has_coerce_map_from(W)
|
|
828
|
+
True
|
|
829
|
+
sage: W3(3*x + y)
|
|
830
|
+
y
|
|
831
|
+
"""
|
|
832
|
+
if self._poly_ring.has_coerce_map_from(R):
|
|
833
|
+
return True
|
|
834
|
+
if isinstance(R, DifferentialWeylAlgebra):
|
|
835
|
+
return (R.variable_names() == self.variable_names()
|
|
836
|
+
and self.base_ring().has_coerce_map_from(R.base_ring()))
|
|
837
|
+
return super()._coerce_map_from_(R)
|
|
838
|
+
|
|
839
|
+
def degree_on_basis(self, i):
|
|
840
|
+
"""
|
|
841
|
+
Return the degree of the basis element indexed by ``i``.
|
|
842
|
+
|
|
843
|
+
EXAMPLES::
|
|
844
|
+
|
|
845
|
+
sage: W.<a,b> = DifferentialWeylAlgebra(QQ)
|
|
846
|
+
sage: W.degree_on_basis( ((1, 3, 2), (0, 1, 3)) )
|
|
847
|
+
10
|
|
848
|
+
|
|
849
|
+
sage: W.<x,y,z> = DifferentialWeylAlgebra(QQ)
|
|
850
|
+
sage: dx,dy,dz = W.differentials()
|
|
851
|
+
sage: elt = y*dy - (3*x - z)*dx
|
|
852
|
+
sage: elt.degree()
|
|
853
|
+
2
|
|
854
|
+
"""
|
|
855
|
+
return sum(i[0]) + sum(i[1])
|
|
856
|
+
|
|
857
|
+
def polynomial_ring(self):
|
|
858
|
+
"""
|
|
859
|
+
Return the associated polynomial ring of ``self``.
|
|
860
|
+
|
|
861
|
+
EXAMPLES::
|
|
862
|
+
|
|
863
|
+
sage: W.<a,b> = DifferentialWeylAlgebra(QQ)
|
|
864
|
+
sage: W.polynomial_ring()
|
|
865
|
+
Multivariate Polynomial Ring in a, b over Rational Field
|
|
866
|
+
|
|
867
|
+
::
|
|
868
|
+
|
|
869
|
+
sage: R.<x,y,z> = QQ[]
|
|
870
|
+
sage: W = DifferentialWeylAlgebra(R)
|
|
871
|
+
sage: W.polynomial_ring() == R
|
|
872
|
+
True
|
|
873
|
+
"""
|
|
874
|
+
return self._poly_ring
|
|
875
|
+
|
|
876
|
+
@cached_method
|
|
877
|
+
def basis(self):
|
|
878
|
+
"""
|
|
879
|
+
Return a basis of ``self``.
|
|
880
|
+
|
|
881
|
+
EXAMPLES::
|
|
882
|
+
|
|
883
|
+
sage: W.<x,y> = DifferentialWeylAlgebra(QQ)
|
|
884
|
+
sage: B = W.basis()
|
|
885
|
+
sage: it = iter(B)
|
|
886
|
+
sage: [next(it) for i in range(20)]
|
|
887
|
+
[1, x, y, dx, dy, x^2, x*y, x*dx, x*dy, y^2, y*dx, y*dy,
|
|
888
|
+
dx^2, dx*dy, dy^2, x^3, x^2*y, x^2*dx, x^2*dy, x*y^2]
|
|
889
|
+
sage: dx, dy = W.differentials()
|
|
890
|
+
sage: sorted((dx*x).monomials(), key=str)
|
|
891
|
+
[1, x*dx]
|
|
892
|
+
sage: B[(x*y).support()[0]]
|
|
893
|
+
x*y
|
|
894
|
+
sage: sorted((dx*x).monomial_coefficients().items())
|
|
895
|
+
[(((0, 0), (0, 0)), 1), (((1, 0), (1, 0)), 1)]
|
|
896
|
+
"""
|
|
897
|
+
n = self._n
|
|
898
|
+
from sage.combinat.integer_lists.nn import IntegerListsNN
|
|
899
|
+
|
|
900
|
+
def elt_map(u):
|
|
901
|
+
return (tuple(u[:n]), tuple(u[n:]))
|
|
902
|
+
|
|
903
|
+
I = IntegerListsNN(length=2 * n, element_constructor=elt_map)
|
|
904
|
+
one = self.base_ring().one()
|
|
905
|
+
|
|
906
|
+
def f(x):
|
|
907
|
+
return self.element_class(self, {(x[0], x[1]): one})
|
|
908
|
+
|
|
909
|
+
return Family(I, f, name="basis map")
|
|
910
|
+
|
|
911
|
+
@cached_method
|
|
912
|
+
def algebra_generators(self):
|
|
913
|
+
"""
|
|
914
|
+
Return the algebra generators of ``self``.
|
|
915
|
+
|
|
916
|
+
.. SEEALSO::
|
|
917
|
+
|
|
918
|
+
:meth:`variables`, :meth:`differentials`
|
|
919
|
+
|
|
920
|
+
EXAMPLES::
|
|
921
|
+
|
|
922
|
+
sage: R.<x,y,z> = QQ[]
|
|
923
|
+
sage: W = DifferentialWeylAlgebra(R)
|
|
924
|
+
sage: W.algebra_generators()
|
|
925
|
+
Finite family {'x': x, 'y': y, 'z': z, 'dx': dx, 'dy': dy, 'dz': dz}
|
|
926
|
+
"""
|
|
927
|
+
d = {x: self.gen(i) for i, x in enumerate(self.variable_names())}
|
|
928
|
+
return Family(self.variable_names(), lambda x: d[x])
|
|
929
|
+
|
|
930
|
+
gens = algebra_generators
|
|
931
|
+
|
|
932
|
+
@cached_method
|
|
933
|
+
def variables(self):
|
|
934
|
+
"""
|
|
935
|
+
Return the variables of ``self``.
|
|
936
|
+
|
|
937
|
+
.. SEEALSO::
|
|
938
|
+
|
|
939
|
+
:meth:`algebra_generators`, :meth:`differentials`
|
|
940
|
+
|
|
941
|
+
EXAMPLES::
|
|
942
|
+
|
|
943
|
+
sage: W.<x,y,z> = DifferentialWeylAlgebra(QQ)
|
|
944
|
+
sage: W.variables()
|
|
945
|
+
Finite family {'x': x, 'y': y, 'z': z}
|
|
946
|
+
"""
|
|
947
|
+
N = self.variable_names()[:self._n]
|
|
948
|
+
d = {x: self.gen(i) for i, x in enumerate(N)}
|
|
949
|
+
return Family(N, lambda x: d[x])
|
|
950
|
+
|
|
951
|
+
@cached_method
|
|
952
|
+
def differentials(self):
|
|
953
|
+
"""
|
|
954
|
+
Return the differentials of ``self``.
|
|
955
|
+
|
|
956
|
+
.. SEEALSO::
|
|
957
|
+
|
|
958
|
+
:meth:`algebra_generators`, :meth:`variables`
|
|
959
|
+
|
|
960
|
+
EXAMPLES::
|
|
961
|
+
|
|
962
|
+
sage: W.<x,y,z> = DifferentialWeylAlgebra(QQ)
|
|
963
|
+
sage: W.differentials()
|
|
964
|
+
Finite family {'dx': dx, 'dy': dy, 'dz': dz}
|
|
965
|
+
"""
|
|
966
|
+
N = self.variable_names()[self._n:]
|
|
967
|
+
d = {x: self.gen(self._n + i) for i, x in enumerate(N)}
|
|
968
|
+
return Family(N, lambda x: d[x])
|
|
969
|
+
|
|
970
|
+
def gen(self, i):
|
|
971
|
+
"""
|
|
972
|
+
Return the ``i``-th generator of ``self``.
|
|
973
|
+
|
|
974
|
+
.. SEEALSO::
|
|
975
|
+
|
|
976
|
+
:meth:`algebra_generators`
|
|
977
|
+
|
|
978
|
+
EXAMPLES::
|
|
979
|
+
|
|
980
|
+
sage: R.<x,y,z> = QQ[]
|
|
981
|
+
sage: W = DifferentialWeylAlgebra(R)
|
|
982
|
+
sage: [W.gen(i) for i in range(6)]
|
|
983
|
+
[x, y, z, dx, dy, dz]
|
|
984
|
+
"""
|
|
985
|
+
P = [0] * self._n
|
|
986
|
+
D = [0] * self._n
|
|
987
|
+
if i < self._n:
|
|
988
|
+
P[i] = 1
|
|
989
|
+
else:
|
|
990
|
+
D[i - self._n] = 1
|
|
991
|
+
return self.element_class(self, {(tuple(P), tuple(D)): self.base_ring().one()})
|
|
992
|
+
|
|
993
|
+
def ngens(self):
|
|
994
|
+
"""
|
|
995
|
+
Return the number of generators of ``self``.
|
|
996
|
+
|
|
997
|
+
EXAMPLES::
|
|
998
|
+
|
|
999
|
+
sage: R.<x,y,z> = QQ[]
|
|
1000
|
+
sage: W = DifferentialWeylAlgebra(R)
|
|
1001
|
+
sage: W.ngens()
|
|
1002
|
+
6
|
|
1003
|
+
"""
|
|
1004
|
+
return self._n * 2
|
|
1005
|
+
|
|
1006
|
+
@cached_method
|
|
1007
|
+
def one(self):
|
|
1008
|
+
"""
|
|
1009
|
+
Return the multiplicative identity element `1`.
|
|
1010
|
+
|
|
1011
|
+
EXAMPLES::
|
|
1012
|
+
|
|
1013
|
+
sage: R.<x,y,z> = QQ[]
|
|
1014
|
+
sage: W = DifferentialWeylAlgebra(R)
|
|
1015
|
+
sage: W.one()
|
|
1016
|
+
1
|
|
1017
|
+
"""
|
|
1018
|
+
t = tuple([0] * self._n)
|
|
1019
|
+
return self.element_class(self, {(t, t): self.base_ring().one()})
|
|
1020
|
+
|
|
1021
|
+
@cached_method
|
|
1022
|
+
def zero(self):
|
|
1023
|
+
"""
|
|
1024
|
+
Return the additive identity element `0`.
|
|
1025
|
+
|
|
1026
|
+
EXAMPLES::
|
|
1027
|
+
|
|
1028
|
+
sage: R.<x,y,z> = QQ[]
|
|
1029
|
+
sage: W = DifferentialWeylAlgebra(R)
|
|
1030
|
+
sage: W.zero()
|
|
1031
|
+
0
|
|
1032
|
+
"""
|
|
1033
|
+
return self.element_class(self, {})
|
|
1034
|
+
|
|
1035
|
+
@lazy_attribute
|
|
1036
|
+
def diff_action(self):
|
|
1037
|
+
"""
|
|
1038
|
+
Left action of this Weyl algebra on the underlying polynomial ring by
|
|
1039
|
+
differentiation.
|
|
1040
|
+
|
|
1041
|
+
EXAMPLES::
|
|
1042
|
+
|
|
1043
|
+
sage: R.<x,y> = QQ[]
|
|
1044
|
+
sage: W = R.weyl_algebra()
|
|
1045
|
+
sage: dx, dy = W.differentials()
|
|
1046
|
+
sage: W.diff_action
|
|
1047
|
+
Left action by Differential Weyl algebra of polynomials in x, y
|
|
1048
|
+
over Rational Field on Multivariate Polynomial Ring in x, y over
|
|
1049
|
+
Rational Field
|
|
1050
|
+
sage: W.diff_action(dx^2 + dy + 1, x^3*y^3)
|
|
1051
|
+
x^3*y^3 + 3*x^3*y^2 + 6*x*y^3
|
|
1052
|
+
"""
|
|
1053
|
+
return DifferentialWeylAlgebraAction(self)
|
|
1054
|
+
|
|
1055
|
+
Element = DifferentialWeylAlgebraElement
|
|
1056
|
+
|
|
1057
|
+
|
|
1058
|
+
class DifferentialWeylAlgebraAction(Action):
|
|
1059
|
+
"""
|
|
1060
|
+
Left action of a Weyl algebra on its underlying polynomial ring by
|
|
1061
|
+
differentiation.
|
|
1062
|
+
|
|
1063
|
+
EXAMPLES::
|
|
1064
|
+
|
|
1065
|
+
sage: R.<x,y> = QQ[]
|
|
1066
|
+
sage: W = R.weyl_algebra()
|
|
1067
|
+
sage: dx, dy = W.differentials()
|
|
1068
|
+
sage: W.diff_action
|
|
1069
|
+
Left action by Differential Weyl algebra of polynomials in x, y
|
|
1070
|
+
over Rational Field on Multivariate Polynomial Ring in x, y over
|
|
1071
|
+
Rational Field
|
|
1072
|
+
|
|
1073
|
+
::
|
|
1074
|
+
|
|
1075
|
+
sage: g = dx^2 + x*dy
|
|
1076
|
+
sage: p = x^5 + x^3 + y^2*x^2 + 1
|
|
1077
|
+
sage: W.diff_action(g, p)
|
|
1078
|
+
2*x^3*y + 20*x^3 + 2*y^2 + 6*x
|
|
1079
|
+
|
|
1080
|
+
The action is a left action::
|
|
1081
|
+
|
|
1082
|
+
sage: h = dx*x + x*y
|
|
1083
|
+
sage: W.diff_action(h, W.diff_action(g, p)) == W.diff_action(h*g, p)
|
|
1084
|
+
True
|
|
1085
|
+
|
|
1086
|
+
The action endomorphism of a differential operator::
|
|
1087
|
+
|
|
1088
|
+
sage: dg = W.diff_action(g); dg
|
|
1089
|
+
Action of dx^2 + x*dy on Multivariate Polynomial Ring in x, y over
|
|
1090
|
+
Rational Field under Left action by Differential Weyl algebra...
|
|
1091
|
+
sage: dg(p) == W.diff_action(g, p) == g.diff(p)
|
|
1092
|
+
True
|
|
1093
|
+
"""
|
|
1094
|
+
|
|
1095
|
+
def __init__(self, G) -> None:
|
|
1096
|
+
"""
|
|
1097
|
+
INPUT:
|
|
1098
|
+
|
|
1099
|
+
- ``G`` -- Weyl algebra
|
|
1100
|
+
|
|
1101
|
+
EXAMPLES::
|
|
1102
|
+
|
|
1103
|
+
sage: from sage.algebras.weyl_algebra import DifferentialWeylAlgebraAction
|
|
1104
|
+
sage: W.<x,y> = DifferentialWeylAlgebra(QQ)
|
|
1105
|
+
sage: DifferentialWeylAlgebraAction(W)
|
|
1106
|
+
Left action by Differential Weyl algebra of polynomials in x, y
|
|
1107
|
+
over Rational Field on Multivariate Polynomial Ring in x, y over
|
|
1108
|
+
Rational Field
|
|
1109
|
+
"""
|
|
1110
|
+
super().__init__(G, G.polynomial_ring(), is_left=True)
|
|
1111
|
+
|
|
1112
|
+
def _act_(self, g, x):
|
|
1113
|
+
"""
|
|
1114
|
+
Apply a differential operator to a polynomial.
|
|
1115
|
+
|
|
1116
|
+
EXAMPLES::
|
|
1117
|
+
|
|
1118
|
+
sage: W.<x,y> = DifferentialWeylAlgebra(QQ)
|
|
1119
|
+
sage: dx, dy = W.differentials()
|
|
1120
|
+
sage: W.diff_action(dx^3 + dx, x^3*y^3 + x*y)
|
|
1121
|
+
3*x^2*y^3 + 6*y^3 + y
|
|
1122
|
+
"""
|
|
1123
|
+
f = g * x
|
|
1124
|
+
D = {y: c for (y, dy), c in f.monomial_coefficients(copy=False).items()
|
|
1125
|
+
if all(dyi == 0 for dyi in dy)}
|
|
1126
|
+
return self.right_domain()(D)
|