passagemath-modules 10.6.31rc3__cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.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 +807 -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-83c28eba.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-6e109695.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-cda90e79.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7f678fcf.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-82690d50.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-2284e583.so.0.0.0 +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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-gnu.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-gnu.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-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-x86_64-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-x86_64-linux-gnu.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-gnu.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-gnu.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-gnu.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-gnu.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-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-x86_64-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-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-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-x86_64-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,1043 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.groups
|
|
3
|
+
r"""
|
|
4
|
+
Index notation for tensors
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- Eric Gourgoulhon, Michal Bejger (2014-2015): initial version
|
|
9
|
+
- Léo Brunswic (2019): add multiple symmetries and multiple contractions
|
|
10
|
+
"""
|
|
11
|
+
# ****************************************************************************
|
|
12
|
+
# Copyright (C) 2015 Eric Gourgoulhon <eric.gourgoulhon@obspm.fr>
|
|
13
|
+
# Copyright (C) 2015 Michal Bejger <bejger@camk.edu.pl>
|
|
14
|
+
#
|
|
15
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
16
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
17
|
+
# the License, or (at your option) any later version.
|
|
18
|
+
# https://www.gnu.org/licenses/
|
|
19
|
+
# ****************************************************************************
|
|
20
|
+
from itertools import combinations
|
|
21
|
+
import re
|
|
22
|
+
|
|
23
|
+
from sage.structure.sage_object import SageObject
|
|
24
|
+
|
|
25
|
+
# Regular expression for the allowed characters in index notation.
|
|
26
|
+
# This includes Unicode word constituents but excludes digits and underscores.
|
|
27
|
+
# Compare with https://docs.python.org/3/reference/lexical_analysis.html#identifiers
|
|
28
|
+
# The dot is special syntax for unnamed index positions.
|
|
29
|
+
_alph_or_dot_pattern = r"([.]|[^\d\W_])"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class TensorWithIndices(SageObject):
|
|
33
|
+
r"""
|
|
34
|
+
Index notation for tensors.
|
|
35
|
+
|
|
36
|
+
This is a technical class to allow one to write some tensor operations
|
|
37
|
+
(contractions and symmetrizations) in index notation.
|
|
38
|
+
|
|
39
|
+
INPUT:
|
|
40
|
+
|
|
41
|
+
- ``tensor`` -- a tensor (or a tensor field)
|
|
42
|
+
- ``indices`` -- string containing the indices, as single letters; the
|
|
43
|
+
contravariant indices must be stated first and separated from the
|
|
44
|
+
covariant indices by the character ``_``
|
|
45
|
+
|
|
46
|
+
EXAMPLES:
|
|
47
|
+
|
|
48
|
+
Index representation of tensors on a rank-3 free module::
|
|
49
|
+
|
|
50
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
51
|
+
sage: e = M.basis('e')
|
|
52
|
+
sage: a = M.tensor((2,0), name='a')
|
|
53
|
+
sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
|
|
54
|
+
sage: b = M.tensor((0,2), name='b')
|
|
55
|
+
sage: b[:] = [[-1,2,-3], [-4,5,6], [7,-8,9]]
|
|
56
|
+
sage: t = a*b ; t.set_name('t') ; t
|
|
57
|
+
Type-(2,2) tensor t on the 3-dimensional vector space M over the
|
|
58
|
+
Rational Field
|
|
59
|
+
sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
|
|
60
|
+
sage: T = TensorWithIndices(t, '^ij_kl') ; T
|
|
61
|
+
t^ij_kl
|
|
62
|
+
|
|
63
|
+
The :class:`TensorWithIndices` object is returned by the square
|
|
64
|
+
bracket operator acting on the tensor and fed with the string specifying
|
|
65
|
+
the indices::
|
|
66
|
+
|
|
67
|
+
sage: a['^ij']
|
|
68
|
+
a^ij
|
|
69
|
+
sage: type(a['^ij'])
|
|
70
|
+
<class 'sage.tensor.modules.tensor_with_indices.TensorWithIndices'>
|
|
71
|
+
sage: b['_ef']
|
|
72
|
+
b_ef
|
|
73
|
+
sage: t['^ij_kl']
|
|
74
|
+
t^ij_kl
|
|
75
|
+
|
|
76
|
+
The symbol '^' may be omitted, since the distinction between covariant
|
|
77
|
+
and contravariant indices is performed by the index position relative to
|
|
78
|
+
the symbol '_'::
|
|
79
|
+
|
|
80
|
+
sage: t['ij_kl']
|
|
81
|
+
t^ij_kl
|
|
82
|
+
|
|
83
|
+
Also, LaTeX notation may be used::
|
|
84
|
+
|
|
85
|
+
sage: t['^{ij}_{kl}']
|
|
86
|
+
t^ij_kl
|
|
87
|
+
|
|
88
|
+
If some operation is asked in the index notation, the resulting tensor
|
|
89
|
+
is returned, not a :class:`TensorWithIndices` object; for instance, for
|
|
90
|
+
a symmetrization::
|
|
91
|
+
|
|
92
|
+
sage: s = t['^(ij)_kl'] ; s # the symmetrization on i,j is indicated by parentheses
|
|
93
|
+
Type-(2,2) tensor on the 3-dimensional vector space M over the
|
|
94
|
+
Rational Field
|
|
95
|
+
sage: s.symmetries()
|
|
96
|
+
symmetry: (0, 1); no antisymmetry
|
|
97
|
+
sage: s == t.symmetrize(0,1)
|
|
98
|
+
True
|
|
99
|
+
|
|
100
|
+
The letters denoting the indices can be chosen freely; since they carry no
|
|
101
|
+
information, they can even be replaced by dots::
|
|
102
|
+
|
|
103
|
+
sage: t['^(..)_..'] == t.symmetrize(0,1)
|
|
104
|
+
True
|
|
105
|
+
|
|
106
|
+
Similarly, for an antisymmetrization::
|
|
107
|
+
|
|
108
|
+
sage: s = t['^ij_[kl]'] ; s # the symmetrization on k,l is indicated by square brackets
|
|
109
|
+
Type-(2,2) tensor on the 3-dimensional vector space M over the Rational
|
|
110
|
+
Field
|
|
111
|
+
sage: s.symmetries()
|
|
112
|
+
no symmetry; antisymmetry: (2, 3)
|
|
113
|
+
sage: s == t.antisymmetrize(2,3)
|
|
114
|
+
True
|
|
115
|
+
|
|
116
|
+
One can also perform multiple symmetrization-antisymmetrizations::
|
|
117
|
+
|
|
118
|
+
sage: aa = a*a
|
|
119
|
+
sage: aa['(..)(..)'] == aa.symmetrize(0,1).symmetrize(2,3)
|
|
120
|
+
True
|
|
121
|
+
sage: aa == aa['(..)(..)'] + aa['[..][..]'] + aa['(..)[..]'] + aa['[..](..)']
|
|
122
|
+
True
|
|
123
|
+
|
|
124
|
+
Another example of an operation indicated by indices is a contraction::
|
|
125
|
+
|
|
126
|
+
sage: s = t['^ki_kj'] ; s # contraction on the repeated index k
|
|
127
|
+
Type-(1,1) tensor on the 3-dimensional vector space M over the Rational
|
|
128
|
+
Field
|
|
129
|
+
sage: s == t.trace(0,2)
|
|
130
|
+
True
|
|
131
|
+
|
|
132
|
+
Indices not involved in the contraction may be replaced by dots::
|
|
133
|
+
|
|
134
|
+
sage: s == t['^k._k.']
|
|
135
|
+
True
|
|
136
|
+
|
|
137
|
+
The contraction of two tensors is indicated by repeated indices and
|
|
138
|
+
the ``*`` operator::
|
|
139
|
+
|
|
140
|
+
sage: s = a['^ik'] * b['_kj'] ; s
|
|
141
|
+
Type-(1,1) tensor on the 3-dimensional vector space M over the Rational
|
|
142
|
+
Field
|
|
143
|
+
sage: s == a.contract(1, b, 0)
|
|
144
|
+
True
|
|
145
|
+
sage: s = t['^.k_..'] * b['_.k'] ; s
|
|
146
|
+
Type-(1,3) tensor on the 3-dimensional vector space M over the Rational
|
|
147
|
+
Field
|
|
148
|
+
sage: s == t.contract(1, b, 1)
|
|
149
|
+
True
|
|
150
|
+
sage: t['^{ik}_{jl}']*b['_{mk}'] == s # LaTeX notation
|
|
151
|
+
True
|
|
152
|
+
|
|
153
|
+
Contraction on two indices::
|
|
154
|
+
|
|
155
|
+
sage: s = a['^kl'] * b['_kl'] ; s
|
|
156
|
+
105
|
|
157
|
+
sage: s == (a*b)['^kl_kl']
|
|
158
|
+
True
|
|
159
|
+
sage: s == (a*b)['_kl^kl']
|
|
160
|
+
True
|
|
161
|
+
sage: s == a.contract(0,1, b, 0,1)
|
|
162
|
+
True
|
|
163
|
+
|
|
164
|
+
The square bracket operator acts in a similar way on :class:`TensorWithIndices`::
|
|
165
|
+
|
|
166
|
+
sage: b = +a["ij"] ; b._tensor.set_name("b") # create a copy of a["ij"]
|
|
167
|
+
sage: b
|
|
168
|
+
b^ij
|
|
169
|
+
sage: b[:]
|
|
170
|
+
[1 2 3]
|
|
171
|
+
[4 5 6]
|
|
172
|
+
[7 8 9]
|
|
173
|
+
sage: b[0,0] == 1
|
|
174
|
+
True
|
|
175
|
+
sage: b["ji"]
|
|
176
|
+
b^ji
|
|
177
|
+
sage: b["(ij)"][:]
|
|
178
|
+
[1 3 5]
|
|
179
|
+
[3 5 7]
|
|
180
|
+
[5 7 9]
|
|
181
|
+
sage: b["(ij)"] == b["(ij)"]["ij"]
|
|
182
|
+
True
|
|
183
|
+
|
|
184
|
+
However, it keeps track of indices::
|
|
185
|
+
|
|
186
|
+
sage: b["ij"] = a["ji"]
|
|
187
|
+
sage: b[:] == a[:]
|
|
188
|
+
False
|
|
189
|
+
sage: b[:] == a[:].transpose()
|
|
190
|
+
True
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
Arithmetics::
|
|
194
|
+
|
|
195
|
+
sage: 2*a['^ij']
|
|
196
|
+
X^ij
|
|
197
|
+
sage: (2*a['^ij'])._tensor == 2*a
|
|
198
|
+
True
|
|
199
|
+
sage: 2*t['ij_kl']
|
|
200
|
+
X^ij_kl
|
|
201
|
+
sage: +a['^ij']
|
|
202
|
+
+a^ij
|
|
203
|
+
sage: +t['ij_kl']
|
|
204
|
+
+t^ij_kl
|
|
205
|
+
sage: -a['^ij']
|
|
206
|
+
-a^ij
|
|
207
|
+
sage: -t['ij_kl']
|
|
208
|
+
-t^ij_kl
|
|
209
|
+
sage: a["^(..)"]["ij"] == 1/2*(a["^ij"] + a["^ji"])
|
|
210
|
+
True
|
|
211
|
+
|
|
212
|
+
The output indices are the ones of the left term of the addition::
|
|
213
|
+
|
|
214
|
+
sage: a["^(..)"]["ji"] == 1/2*(a["^ij"] + a["^ji"])
|
|
215
|
+
False
|
|
216
|
+
sage: (a*a)["^..(ij)"]["abij"] == 1/2*((a*a)["^abij"] + (a*a)["^abji"])
|
|
217
|
+
True
|
|
218
|
+
sage: c = 1/2*((a*a)["^abij"] + (a*a)["^ijab"])
|
|
219
|
+
sage: from itertools import product
|
|
220
|
+
sage: all(c[i,j,k,l] == c[k,l,i,j] for i,j,k,l in product(range(3),repeat=4))
|
|
221
|
+
True
|
|
222
|
+
|
|
223
|
+
Non-digit unicode identifier characters are allowed::
|
|
224
|
+
|
|
225
|
+
sage: a['^μξ']
|
|
226
|
+
a^μξ
|
|
227
|
+
|
|
228
|
+
Conventions are checked and non acceptable indices raise
|
|
229
|
+
:exc:`ValueError`, for instance::
|
|
230
|
+
|
|
231
|
+
sage: a['([..])'] # nested symmetries
|
|
232
|
+
Traceback (most recent call last):
|
|
233
|
+
...
|
|
234
|
+
ValueError: index conventions not satisfied
|
|
235
|
+
sage: a['(..'] # unbalanced parenthis
|
|
236
|
+
Traceback (most recent call last):
|
|
237
|
+
...
|
|
238
|
+
ValueError: index conventions not satisfied
|
|
239
|
+
sage: a['ii'] # repeated indices of the same type
|
|
240
|
+
Traceback (most recent call last):
|
|
241
|
+
...
|
|
242
|
+
ValueError: index conventions not satisfied: repeated indices of same type
|
|
243
|
+
sage: (a*a)['^(ij)^(kl)'] # multiple indices group of the same type
|
|
244
|
+
Traceback (most recent call last):
|
|
245
|
+
...
|
|
246
|
+
ValueError: index conventions not satisfied
|
|
247
|
+
sage: a["^\u2663\u2665"] # non-word-constituent
|
|
248
|
+
Traceback (most recent call last):
|
|
249
|
+
...
|
|
250
|
+
ValueError: index conventions not satisfied
|
|
251
|
+
"""
|
|
252
|
+
|
|
253
|
+
@staticmethod
|
|
254
|
+
def _parse_indices(indices, tensor_type=None, allow_contraction=True,
|
|
255
|
+
allow_symmetries=True):
|
|
256
|
+
r"""
|
|
257
|
+
Parse index notation for tensors, enforces conventions and return
|
|
258
|
+
indices.
|
|
259
|
+
|
|
260
|
+
Parse ``indices`` checking usual conventions on repeating indices,
|
|
261
|
+
wildcard, balanced parentheses/brackets and raises a :exc:`ValueError`
|
|
262
|
+
if not. Return a couple contravariant/covariant indices.
|
|
263
|
+
|
|
264
|
+
INPUT:
|
|
265
|
+
|
|
266
|
+
- ``indices`` -- string of index notation
|
|
267
|
+
- ``tensor_type`` -- (default: ``None``) a valid tensor type
|
|
268
|
+
(a couple of nonnegative integers). If not ``None``, the indices
|
|
269
|
+
are checked to have the correct type.
|
|
270
|
+
- ``allow_contraction`` -- (default: ``True``) determines if
|
|
271
|
+
repeated indices are allowed in the index notation
|
|
272
|
+
- ``allow_symmetries`` -- (default: ``True``) determines if
|
|
273
|
+
symmetries ()/[] are allowed in the index notation
|
|
274
|
+
|
|
275
|
+
OUTPUT:
|
|
276
|
+
|
|
277
|
+
- A couple of string corresponding to the contravariant and the
|
|
278
|
+
covariant part
|
|
279
|
+
|
|
280
|
+
TESTS::
|
|
281
|
+
|
|
282
|
+
sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
|
|
283
|
+
sage: TensorWithIndices._parse_indices('([..])') # nested symmetries
|
|
284
|
+
Traceback (most recent call last):
|
|
285
|
+
...
|
|
286
|
+
ValueError: index conventions not satisfied
|
|
287
|
+
sage: TensorWithIndices._parse_indices('(..') # unbalanced parenthis
|
|
288
|
+
Traceback (most recent call last):
|
|
289
|
+
...
|
|
290
|
+
ValueError: index conventions not satisfied
|
|
291
|
+
sage: TensorWithIndices._parse_indices('ii') # repeated indices of the same type
|
|
292
|
+
Traceback (most recent call last):
|
|
293
|
+
...
|
|
294
|
+
ValueError: index conventions not satisfied: repeated indices of same type
|
|
295
|
+
sage: TensorWithIndices._parse_indices('^(ij)^(kl)') # multiple indices group of the same type
|
|
296
|
+
Traceback (most recent call last):
|
|
297
|
+
...
|
|
298
|
+
ValueError: index conventions not satisfied
|
|
299
|
+
sage: TensorWithIndices._parse_indices("^17") # digits are not allowed as names
|
|
300
|
+
Traceback (most recent call last):
|
|
301
|
+
...
|
|
302
|
+
ValueError: index conventions not satisfied
|
|
303
|
+
sage: TensorWithIndices._parse_indices("^;") # non-word-constituents are not allowed as names
|
|
304
|
+
Traceback (most recent call last):
|
|
305
|
+
...
|
|
306
|
+
ValueError: index conventions not satisfied
|
|
307
|
+
sage: TensorWithIndices._parse_indices("^\u00ae") # non-word-constituents are not allowed as names
|
|
308
|
+
Traceback (most recent call last):
|
|
309
|
+
...
|
|
310
|
+
ValueError: index conventions not satisfied
|
|
311
|
+
sage: TensorWithIndices._parse_indices("^\u25e2") # non-word-constituents are not allowed as names
|
|
312
|
+
Traceback (most recent call last):
|
|
313
|
+
...
|
|
314
|
+
ValueError: index conventions not satisfied
|
|
315
|
+
sage: TensorWithIndices._parse_indices('^ij_kl')
|
|
316
|
+
('ij', 'kl')
|
|
317
|
+
sage: TensorWithIndices._parse_indices('_kl^ij')
|
|
318
|
+
('ij', 'kl')
|
|
319
|
+
sage: TensorWithIndices._parse_indices("(ij)_ik",tensor_type=(2,2))
|
|
320
|
+
('(ij)', 'ik')
|
|
321
|
+
sage: TensorWithIndices._parse_indices("(ij)_ik",tensor_type=(2,0))
|
|
322
|
+
Traceback (most recent call last):
|
|
323
|
+
...
|
|
324
|
+
IndexError: number of covavariant indices not compatible with the tensor type
|
|
325
|
+
sage: TensorWithIndices._parse_indices("(ij)_ik", allow_contraction=False)
|
|
326
|
+
Traceback (most recent call last):
|
|
327
|
+
...
|
|
328
|
+
IndexError: no contraction allowed
|
|
329
|
+
sage: TensorWithIndices._parse_indices("(ij)_ik", allow_symmetries=False)
|
|
330
|
+
Traceback (most recent call last):
|
|
331
|
+
...
|
|
332
|
+
IndexError: no symmetry allowed
|
|
333
|
+
"""
|
|
334
|
+
# Suppress all '{' and '}' coming from LaTeX notations:
|
|
335
|
+
indices = indices.replace('{','').replace('}','')
|
|
336
|
+
|
|
337
|
+
# Check index notation conventions and parse indices
|
|
338
|
+
allowed_pattern = r"(\(" + _alph_or_dot_pattern + r"{2,}\)|\[" + _alph_or_dot_pattern + r"{2,}\]|" + _alph_or_dot_pattern + r"+)*"
|
|
339
|
+
con_then_cov = r"^(\^|)" + allowed_pattern + r"(\_" + allowed_pattern + r"|)$"
|
|
340
|
+
cov_then_con = r"^\_" + allowed_pattern + r"(\^" + allowed_pattern + r"|)$"
|
|
341
|
+
if (re.match(con_then_cov,indices) is None
|
|
342
|
+
and re.match(cov_then_con,indices) is None):
|
|
343
|
+
raise ValueError("index conventions not satisfied")
|
|
344
|
+
elif re.match(con_then_cov,indices):
|
|
345
|
+
try:
|
|
346
|
+
con,cov = indices.replace("^","").split("_")
|
|
347
|
+
except ValueError:
|
|
348
|
+
con = indices.replace("^","")
|
|
349
|
+
cov = ""
|
|
350
|
+
else:
|
|
351
|
+
try:
|
|
352
|
+
cov,con = indices.replace("_","").split("^")
|
|
353
|
+
except ValueError:
|
|
354
|
+
cov = indices.replace("_","")
|
|
355
|
+
con = ""
|
|
356
|
+
if not allow_contraction:
|
|
357
|
+
for ind in con:
|
|
358
|
+
if ind != '.' and ind in cov:
|
|
359
|
+
raise IndexError("no contraction allowed")
|
|
360
|
+
con_without_sym = (con.replace("(","").replace(")","").replace("[","").replace("]",""))
|
|
361
|
+
cov_without_sym = (cov.replace("(","").replace(")","").replace("[","").replace("]",""))
|
|
362
|
+
if allow_symmetries:
|
|
363
|
+
if len(con_without_sym) != len(set(con_without_sym)) \
|
|
364
|
+
+ max(con_without_sym.count(".")-1, 0):
|
|
365
|
+
raise ValueError("index conventions not satisfied: "
|
|
366
|
+
"repeated indices of same type")
|
|
367
|
+
if len(cov_without_sym) != len(set(cov_without_sym)) \
|
|
368
|
+
+ max(cov_without_sym.count(".")-1, 0):
|
|
369
|
+
raise ValueError("index conventions not satisfied: "
|
|
370
|
+
"repeated indices of same type")
|
|
371
|
+
else:
|
|
372
|
+
if re.search(r"[()\[\]]",con) is not None:
|
|
373
|
+
raise IndexError("no symmetry allowed")
|
|
374
|
+
if re.search(r"[()\[\]]",cov) is not None:
|
|
375
|
+
raise IndexError("no symmetry allowed")
|
|
376
|
+
if tensor_type is not None:
|
|
377
|
+
# Check number of (co/contra)variant indices
|
|
378
|
+
if len(con_without_sym) != tensor_type[0]:
|
|
379
|
+
raise IndexError("number of contravariant indices not compatible "
|
|
380
|
+
"with the tensor type")
|
|
381
|
+
if len(cov_without_sym) != tensor_type[1]:
|
|
382
|
+
raise IndexError("number of covavariant indices not compatible "
|
|
383
|
+
"with the tensor type")
|
|
384
|
+
return con,cov
|
|
385
|
+
|
|
386
|
+
def __init__(self, tensor, indices):
|
|
387
|
+
r"""
|
|
388
|
+
TESTS::
|
|
389
|
+
|
|
390
|
+
sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
|
|
391
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
392
|
+
sage: t = M.tensor((2,1), name='t')
|
|
393
|
+
sage: ti = TensorWithIndices(t, 'ab_c')
|
|
394
|
+
|
|
395
|
+
We need to skip the pickling test because we can't check equality
|
|
396
|
+
unless the tensor was defined w.r.t. a basis::
|
|
397
|
+
|
|
398
|
+
sage: TestSuite(ti).run(skip='_test_pickling')
|
|
399
|
+
|
|
400
|
+
::
|
|
401
|
+
|
|
402
|
+
sage: e = M.basis('e')
|
|
403
|
+
sage: t[:] = [[[1,2,3], [-4,5,6], [7,8,-9]],
|
|
404
|
+
....: [[10,-11,12], [13,14,-15], [16,17,18]],
|
|
405
|
+
....: [[19,-20,-21], [-22,23,24], [25,26,-27]]]
|
|
406
|
+
sage: ti = TensorWithIndices(t, 'ab_c')
|
|
407
|
+
sage: TestSuite(ti).run()
|
|
408
|
+
"""
|
|
409
|
+
self._tensor = tensor # may be changed below
|
|
410
|
+
self._changed = False # indicates whether self contains an altered
|
|
411
|
+
# version of the original tensor (True if
|
|
412
|
+
# symmetries or contractions are indicated in the
|
|
413
|
+
# indices)
|
|
414
|
+
|
|
415
|
+
# Check whether the usual convention for indices, symmetries and
|
|
416
|
+
# contractions are respected. This includes restrictions on the
|
|
417
|
+
# indices symbols used, non nested (anti)symmetries,
|
|
418
|
+
# (co/contra)variant identification of repeated indices, as well
|
|
419
|
+
# as checking the number of covariant and contravariant indices.
|
|
420
|
+
# Latex notations '{' and '}' are totally ignored.
|
|
421
|
+
# "^{ijkl}_{ib(cd)}"
|
|
422
|
+
|
|
423
|
+
con,cov = self._parse_indices(
|
|
424
|
+
indices,
|
|
425
|
+
tensor_type=self._tensor.tensor_type()
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
# Apply (anti)symmetrizations on contravariant indices
|
|
429
|
+
first_sym_regex = r"(\(|\[)" + _alph_or_dot_pattern + r"*[)\]]"
|
|
430
|
+
while re.search(first_sym_regex,con):
|
|
431
|
+
first_sym = re.search(first_sym_regex,con)
|
|
432
|
+
sym1 = first_sym.span()[0]
|
|
433
|
+
sym2 = first_sym.span()[1]-1
|
|
434
|
+
if first_sym.groups()[0] == "(":
|
|
435
|
+
self._tensor = self._tensor.symmetrize(*range(
|
|
436
|
+
sym1,
|
|
437
|
+
sym2-1
|
|
438
|
+
))
|
|
439
|
+
else:
|
|
440
|
+
self._tensor = self._tensor.antisymmetrize(*range(
|
|
441
|
+
sym1,
|
|
442
|
+
sym2-1
|
|
443
|
+
))
|
|
444
|
+
self._changed = True # self does no longer contain the original tensor
|
|
445
|
+
con = con[:sym1] + con[sym1+1:sym2] + con[sym2+1:]
|
|
446
|
+
self._con = con
|
|
447
|
+
|
|
448
|
+
# Apply (anti)symmetrizations on covariant indices
|
|
449
|
+
while re.search(first_sym_regex,cov):
|
|
450
|
+
first_sym = re.search(first_sym_regex,cov)
|
|
451
|
+
sym1 = first_sym.span()[0]
|
|
452
|
+
sym2 = first_sym.span()[1]-1
|
|
453
|
+
if first_sym.groups()[0] == "(":
|
|
454
|
+
self._tensor = self._tensor.symmetrize(*range(
|
|
455
|
+
self._tensor._tensor_type[0] + sym1,
|
|
456
|
+
self._tensor._tensor_type[0] + sym2-1
|
|
457
|
+
))
|
|
458
|
+
else:
|
|
459
|
+
self._tensor = self._tensor.antisymmetrize(*range(
|
|
460
|
+
self._tensor._tensor_type[0] + sym1,
|
|
461
|
+
self._tensor._tensor_type[0] + sym2-1
|
|
462
|
+
))
|
|
463
|
+
self._changed = True # self does no longer contain the original tensor
|
|
464
|
+
cov = cov[:sym1] + cov[sym1+1:sym2] + cov[sym2+1:]
|
|
465
|
+
self._cov = cov
|
|
466
|
+
|
|
467
|
+
# Treatment of possible self-contractions:
|
|
468
|
+
# ---------------------------------------
|
|
469
|
+
contraction_pair_list = []
|
|
470
|
+
for ind in self._con:
|
|
471
|
+
if ind != '.' and ind in self._cov:
|
|
472
|
+
pos1 = self._con.index(ind)
|
|
473
|
+
pos2 = self._tensor._tensor_type[0] + self._cov.index(ind)
|
|
474
|
+
contraction_pair_list.append([pos1, pos2])
|
|
475
|
+
while contraction_pair_list:
|
|
476
|
+
pos1, pos2 = contraction_pair_list.pop()
|
|
477
|
+
self._tensor = self._tensor.trace(pos1, pos2)
|
|
478
|
+
for contraction_pair in contraction_pair_list:
|
|
479
|
+
if contraction_pair[0] > pos1:
|
|
480
|
+
contraction_pair[0] = contraction_pair[0]-1
|
|
481
|
+
if contraction_pair[1] > pos2:
|
|
482
|
+
contraction_pair[1] = contraction_pair[1]-1
|
|
483
|
+
contraction_pair[1] = contraction_pair[1]-1
|
|
484
|
+
self._changed = True # self does no longer contain the original
|
|
485
|
+
# tensor
|
|
486
|
+
ind = self._con[pos1]
|
|
487
|
+
self._con = self._con.replace(ind, '')
|
|
488
|
+
self._cov = self._cov.replace(ind, '')
|
|
489
|
+
|
|
490
|
+
def _repr_(self):
|
|
491
|
+
r"""
|
|
492
|
+
Return a string representation of ``self``.
|
|
493
|
+
|
|
494
|
+
EXAMPLES::
|
|
495
|
+
|
|
496
|
+
sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
|
|
497
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
498
|
+
sage: t = M.tensor((2,1), name='t')
|
|
499
|
+
sage: ti = TensorWithIndices(t, 'ab_c')
|
|
500
|
+
sage: ti._repr_()
|
|
501
|
+
't^ab_c'
|
|
502
|
+
sage: t = M.tensor((0,2), name='t')
|
|
503
|
+
sage: ti = TensorWithIndices(t, '_{ij}')
|
|
504
|
+
sage: ti._repr_()
|
|
505
|
+
't_ij'
|
|
506
|
+
"""
|
|
507
|
+
name = 'X'
|
|
508
|
+
if hasattr(self._tensor, '_name'):
|
|
509
|
+
if self._tensor._name is not None:
|
|
510
|
+
name = self._tensor._name
|
|
511
|
+
if self._con == '':
|
|
512
|
+
if self._cov == '':
|
|
513
|
+
return 'scalar'
|
|
514
|
+
else:
|
|
515
|
+
return name + '_' + self._cov
|
|
516
|
+
elif self._cov == '':
|
|
517
|
+
return name + '^' + self._con
|
|
518
|
+
else:
|
|
519
|
+
return name + '^' + self._con + '_' + self._cov
|
|
520
|
+
|
|
521
|
+
def update(self):
|
|
522
|
+
r"""
|
|
523
|
+
Return the tensor contains in ``self`` if it differs from that used
|
|
524
|
+
for creating ``self``, otherwise return ``self``.
|
|
525
|
+
|
|
526
|
+
EXAMPLES::
|
|
527
|
+
|
|
528
|
+
sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
|
|
529
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
530
|
+
sage: e = M.basis('e')
|
|
531
|
+
sage: a = M.tensor((1,1), name='a')
|
|
532
|
+
sage: a[:] = [[1,-2,3], [-4,5,-6], [7,-8,9]]
|
|
533
|
+
sage: a_ind = TensorWithIndices(a, 'i_j') ; a_ind
|
|
534
|
+
a^i_j
|
|
535
|
+
sage: a_ind.update()
|
|
536
|
+
a^i_j
|
|
537
|
+
sage: a_ind.update() is a_ind
|
|
538
|
+
True
|
|
539
|
+
sage: a_ind = TensorWithIndices(a, 'k_k') ; a_ind
|
|
540
|
+
scalar
|
|
541
|
+
sage: a_ind.update()
|
|
542
|
+
15
|
|
543
|
+
"""
|
|
544
|
+
if self._changed:
|
|
545
|
+
return self._tensor
|
|
546
|
+
else:
|
|
547
|
+
return self
|
|
548
|
+
|
|
549
|
+
def __eq__(self, other):
|
|
550
|
+
r"""
|
|
551
|
+
Check equality.
|
|
552
|
+
|
|
553
|
+
TESTS::
|
|
554
|
+
|
|
555
|
+
sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
|
|
556
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
557
|
+
sage: t = M.tensor((2,1), name='t')
|
|
558
|
+
sage: ti = TensorWithIndices(t, 'ab_c')
|
|
559
|
+
sage: ti == TensorWithIndices(t, '^{ab}_c')
|
|
560
|
+
True
|
|
561
|
+
sage: ti == TensorWithIndices(t, 'ac_b')
|
|
562
|
+
False
|
|
563
|
+
sage: tp = M.tensor((2,1))
|
|
564
|
+
sage: ti == TensorWithIndices(tp, 'ab_c')
|
|
565
|
+
Traceback (most recent call last):
|
|
566
|
+
...
|
|
567
|
+
ValueError: no common basis for the comparison
|
|
568
|
+
"""
|
|
569
|
+
if not isinstance(other, TensorWithIndices):
|
|
570
|
+
return False
|
|
571
|
+
return (self._tensor == other._tensor
|
|
572
|
+
and self._con == other._con
|
|
573
|
+
and self._cov == other._cov)
|
|
574
|
+
|
|
575
|
+
def __ne__(self, other):
|
|
576
|
+
r"""
|
|
577
|
+
Check not equals.
|
|
578
|
+
|
|
579
|
+
TESTS::
|
|
580
|
+
|
|
581
|
+
sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
|
|
582
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
583
|
+
sage: t = M.tensor((2,1), name='t')
|
|
584
|
+
sage: ti = TensorWithIndices(t, 'ab_c')
|
|
585
|
+
sage: ti != TensorWithIndices(t, '^{ab}_c')
|
|
586
|
+
False
|
|
587
|
+
sage: ti != TensorWithIndices(t, 'ac_b')
|
|
588
|
+
True
|
|
589
|
+
"""
|
|
590
|
+
return not self == other
|
|
591
|
+
|
|
592
|
+
def __mul__(self, other):
|
|
593
|
+
r"""
|
|
594
|
+
Tensor product or contraction on specified indices.
|
|
595
|
+
|
|
596
|
+
EXAMPLES::
|
|
597
|
+
|
|
598
|
+
sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
|
|
599
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
600
|
+
sage: e = M.basis('e')
|
|
601
|
+
sage: a = M.tensor((2,0), name='a')
|
|
602
|
+
sage: a[:] = [[1,-2,3], [-4,5,-6], [7,-8,9]]
|
|
603
|
+
sage: b = M.linear_form(name='b')
|
|
604
|
+
sage: b[:] = [4,2,1]
|
|
605
|
+
sage: ai = TensorWithIndices(a, '^ij')
|
|
606
|
+
sage: bi = TensorWithIndices(b, '_k')
|
|
607
|
+
sage: s = ai.__mul__(bi) ; s # no repeated indices ==> tensor product
|
|
608
|
+
Type-(2,1) tensor a⊗b on the 3-dimensional vector space M over the
|
|
609
|
+
Rational Field
|
|
610
|
+
sage: s == a*b
|
|
611
|
+
True
|
|
612
|
+
sage: s[:]
|
|
613
|
+
[[[4, 2, 1], [-8, -4, -2], [12, 6, 3]],
|
|
614
|
+
[[-16, -8, -4], [20, 10, 5], [-24, -12, -6]],
|
|
615
|
+
[[28, 14, 7], [-32, -16, -8], [36, 18, 9]]]
|
|
616
|
+
sage: ai = TensorWithIndices(a, '^kj')
|
|
617
|
+
sage: s = ai.__mul__(bi) ; s # repeated index k ==> contraction
|
|
618
|
+
Element of the 3-dimensional vector space M over the Rational Field
|
|
619
|
+
sage: s == a.contract(0, b)
|
|
620
|
+
True
|
|
621
|
+
sage: s[:]
|
|
622
|
+
[3, -6, 9]
|
|
623
|
+
"""
|
|
624
|
+
if not isinstance(other, TensorWithIndices):
|
|
625
|
+
raise TypeError("the second item of * must be a tensor with " +
|
|
626
|
+
"specified indices")
|
|
627
|
+
contraction_pairs = []
|
|
628
|
+
for ind in self._con:
|
|
629
|
+
if ind != '.':
|
|
630
|
+
if ind in other._cov:
|
|
631
|
+
pos1 = self._con.index(ind)
|
|
632
|
+
pos2 = other._tensor._tensor_type[0] + other._cov.index(ind)
|
|
633
|
+
contraction_pairs.append((pos1, pos2))
|
|
634
|
+
if ind in other._con:
|
|
635
|
+
raise IndexError(f"the index {ind} appears twice "
|
|
636
|
+
+ "in a contravariant position")
|
|
637
|
+
for ind in self._cov:
|
|
638
|
+
if ind != '.':
|
|
639
|
+
if ind in other._con:
|
|
640
|
+
pos1 = self._tensor._tensor_type[0] + self._cov.index(ind)
|
|
641
|
+
pos2 = other._con.index(ind)
|
|
642
|
+
contraction_pairs.append((pos1, pos2))
|
|
643
|
+
if ind in other._cov:
|
|
644
|
+
raise IndexError(f"the index {ind} appears twice "
|
|
645
|
+
+ "in a covariant position")
|
|
646
|
+
if not contraction_pairs:
|
|
647
|
+
# No contraction is performed: the tensor product is returned
|
|
648
|
+
return self._tensor * other._tensor
|
|
649
|
+
ncontr = len(contraction_pairs)
|
|
650
|
+
pos1 = [contraction_pairs[i][0] for i in range(ncontr)]
|
|
651
|
+
pos2 = [contraction_pairs[i][1] for i in range(ncontr)]
|
|
652
|
+
args = pos1 + [other._tensor] + pos2
|
|
653
|
+
return self._tensor.contract(*args)
|
|
654
|
+
|
|
655
|
+
def __rmul__(self, other):
|
|
656
|
+
r"""
|
|
657
|
+
Multiplication on the left by ``other``.
|
|
658
|
+
|
|
659
|
+
EXAMPLES::
|
|
660
|
+
|
|
661
|
+
sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
|
|
662
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
663
|
+
sage: e = M.basis('e')
|
|
664
|
+
sage: a = M.tensor((2,1), name='a')
|
|
665
|
+
sage: a[0,2,1], a[1,2,0] = 7, -4
|
|
666
|
+
sage: ai = TensorWithIndices(a, 'ij_k')
|
|
667
|
+
sage: s = ai.__rmul__(3) ; s
|
|
668
|
+
X^ij_k
|
|
669
|
+
sage: s._tensor == 3*a
|
|
670
|
+
True
|
|
671
|
+
"""
|
|
672
|
+
return TensorWithIndices(other*self._tensor,
|
|
673
|
+
self._con + '_' + self._cov)
|
|
674
|
+
|
|
675
|
+
def __add__(self, other):
|
|
676
|
+
r"""
|
|
677
|
+
Addition between tensors with indices.
|
|
678
|
+
|
|
679
|
+
The underlying tensor of the output is the sum of the underlying tensor
|
|
680
|
+
of ``self`` with the underlying tensor of ``other`` whose entries have
|
|
681
|
+
be permuted to respect Einstein summation usual conventions. The
|
|
682
|
+
indices names of the output are those of ``self``.
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
TESTS::
|
|
686
|
+
|
|
687
|
+
sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
|
|
688
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
689
|
+
sage: e = M.basis('e')
|
|
690
|
+
sage: a = M.tensor((2,0), name='a')
|
|
691
|
+
sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
|
|
692
|
+
sage: b = M.tensor((0,2), name='b')
|
|
693
|
+
sage: b[:] = [[-1,2,-3], [-4,5,6], [7,-8,9]]
|
|
694
|
+
sage: T = a*a*b*b
|
|
695
|
+
sage: 1/4*(T["ijkl_abcd"] + T["jikl_abcd"] + T["ijkl_abdc"]\
|
|
696
|
+
....: + T["jikl_abdc"]) == T["(..).._..(..)"]["ijkl_abcd"]
|
|
697
|
+
True
|
|
698
|
+
"""
|
|
699
|
+
# Check tensor types are compatible
|
|
700
|
+
if self._tensor.tensor_type() != other._tensor.tensor_type():
|
|
701
|
+
raise ValueError("Tensors are not of the same type")
|
|
702
|
+
# Check the set of indices are compatible
|
|
703
|
+
if set(self._cov) != set(other._cov):
|
|
704
|
+
raise ValueError("The covariant Indices sets are not identical")
|
|
705
|
+
if set(self._con) != set(other._con):
|
|
706
|
+
raise ValueError("The contravariant Indices sets are not identical")
|
|
707
|
+
self_wild_card_indices = [match.span()[0] for match in re.finditer(r"\.", self._con)]
|
|
708
|
+
other_wild_card_indices = [match.span()[0] for match in re.finditer(r"\.", self._cov)]
|
|
709
|
+
if self_wild_card_indices != other_wild_card_indices:
|
|
710
|
+
raise ValueError("Ambiguous wildcard notation")
|
|
711
|
+
|
|
712
|
+
# Permutation of the components of self
|
|
713
|
+
# -------------------------------------
|
|
714
|
+
|
|
715
|
+
permutation = list(range(other._tensor.tensor_rank()))
|
|
716
|
+
for other_index in range(other._tensor.tensor_type()[0]):
|
|
717
|
+
if other._con[other_index] == self._con[other_index]:
|
|
718
|
+
permutation[other_index] = other_index
|
|
719
|
+
else:
|
|
720
|
+
permutation[other_index] = self._con.index(other._con[other_index])
|
|
721
|
+
for other_index in range(other._tensor.tensor_type()[1]):
|
|
722
|
+
if other._cov[other_index] == self._cov[other_index]:
|
|
723
|
+
permutation[other._tensor.tensor_type()[0] + other_index]\
|
|
724
|
+
= other._tensor.tensor_type()[0] + other_index
|
|
725
|
+
else:
|
|
726
|
+
permutation[other._tensor.tensor_type()[0] + other_index]\
|
|
727
|
+
= other._tensor.tensor_type()[0] + self._cov.index(other._cov[other_index])
|
|
728
|
+
|
|
729
|
+
result = self.__pos__()
|
|
730
|
+
result._tensor = result._tensor + other.permute_indices(permutation)._tensor
|
|
731
|
+
return result
|
|
732
|
+
|
|
733
|
+
def __sub__(self, other):
|
|
734
|
+
r"""
|
|
735
|
+
Subtraction between tensors with indices.
|
|
736
|
+
|
|
737
|
+
The underlying tensor of the output is the underlying tensor of
|
|
738
|
+
``self`` minus the underlying tensor of ``other`` whose entries have
|
|
739
|
+
be permuted to respect Einstein summation usual conventions. The
|
|
740
|
+
indices names of the output are those of ``self``.
|
|
741
|
+
|
|
742
|
+
EXAMPLES::
|
|
743
|
+
|
|
744
|
+
sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
|
|
745
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
746
|
+
sage: e = M.basis('e')
|
|
747
|
+
sage: a = M.tensor((2,0), name='a')
|
|
748
|
+
sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
|
|
749
|
+
sage: b = M.tensor((0,2), name='b')
|
|
750
|
+
sage: b[:] = [[-1,2,-3], [-4,5,6], [7,-8,9]]
|
|
751
|
+
sage: a["^[..]"]["ij"] == 1/2*(a["^ij"]-a["^ji"])
|
|
752
|
+
True
|
|
753
|
+
sage: (a*a)["^..[ij]"]["abij"] == 1/2*((a*a)["^abij"]-(a*a)["^abji"])
|
|
754
|
+
True
|
|
755
|
+
sage: Riem = a*a
|
|
756
|
+
sage: Riem = Riem["[ij][kl]"]
|
|
757
|
+
sage: Riem = 1/2*(Riem["ijkl"]+Riem["klij"])
|
|
758
|
+
sage: O = M.tensor((4,0), name='O')
|
|
759
|
+
sage: O[0,0,0,0] = 0
|
|
760
|
+
sage: (Riem["ijkl"]+Riem["iklj"]+Riem["iljk"]) == O["ijkl"]
|
|
761
|
+
True
|
|
762
|
+
|
|
763
|
+
TESTS::
|
|
764
|
+
|
|
765
|
+
sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
|
|
766
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
767
|
+
sage: e = M.basis('e')
|
|
768
|
+
sage: a = M.tensor((2,0), name='a')
|
|
769
|
+
sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
|
|
770
|
+
sage: b = M.tensor((0,2), name='b')
|
|
771
|
+
sage: b[:] = [[-1,2,-3], [-4,5,6], [7,-8,9]]
|
|
772
|
+
sage: T = a*a*b*b
|
|
773
|
+
sage: 1/4*(T["ijkl_abcd"]-T["jikl_abcd"] - T["ijkl_abdc"]\
|
|
774
|
+
....: + T["jikl_abdc"] ) == T["[..].._..[..]"]["ijkl_abcd"]
|
|
775
|
+
True
|
|
776
|
+
"""
|
|
777
|
+
return self + (-other)
|
|
778
|
+
|
|
779
|
+
def __getitem__(self, args):
|
|
780
|
+
r"""
|
|
781
|
+
Return a component of the underlying tensor w.r.t. some basis.
|
|
782
|
+
|
|
783
|
+
NB: if ``args`` is a string, this method acts as a shortcut for
|
|
784
|
+
tensor contractions and symmetrizations, the string containing
|
|
785
|
+
abstract indices.
|
|
786
|
+
|
|
787
|
+
INPUT:
|
|
788
|
+
|
|
789
|
+
- ``args`` -- list of indices defining the component; if ``[:]`` is
|
|
790
|
+
provided, all the components are returned. The basis can be passed
|
|
791
|
+
as the first item of ``args``; if not, the free module's default
|
|
792
|
+
basis is assumed.
|
|
793
|
+
if ``args`` is a string, this method acts as a shortcut for
|
|
794
|
+
tensor contractions and symmetrizations, the string containing
|
|
795
|
+
abstract indices.
|
|
796
|
+
|
|
797
|
+
TESTS::
|
|
798
|
+
|
|
799
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
800
|
+
sage: e = M.basis('e')
|
|
801
|
+
sage: a = M.tensor((2,0), name='a')
|
|
802
|
+
sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
|
|
803
|
+
sage: b = a["ij"]
|
|
804
|
+
sage: b
|
|
805
|
+
a^ij
|
|
806
|
+
sage: b[:]
|
|
807
|
+
[1 2 3]
|
|
808
|
+
[4 5 6]
|
|
809
|
+
[7 8 9]
|
|
810
|
+
sage: b[0,0] == 1
|
|
811
|
+
True
|
|
812
|
+
sage: b["ji"]
|
|
813
|
+
a^ji
|
|
814
|
+
sage: b["(ij)"][:]
|
|
815
|
+
[1 3 5]
|
|
816
|
+
[3 5 7]
|
|
817
|
+
[5 7 9]
|
|
818
|
+
"""
|
|
819
|
+
if isinstance(args, str):
|
|
820
|
+
result = +self
|
|
821
|
+
result.__init__(self._tensor, args)
|
|
822
|
+
return result
|
|
823
|
+
else:
|
|
824
|
+
return self._tensor[args]
|
|
825
|
+
|
|
826
|
+
def __setitem__(self, args, value):
|
|
827
|
+
r"""
|
|
828
|
+
Set a component w.r.t. some basis.
|
|
829
|
+
|
|
830
|
+
INPUT:
|
|
831
|
+
|
|
832
|
+
- ``args`` -- list of indices defining the component; if ``[:]`` is
|
|
833
|
+
provided, all the components are set. The basis can be passed
|
|
834
|
+
as the first item of ``args``; if not, the free module's default
|
|
835
|
+
basis is assumed if ``args`` is a string and value is a tensor
|
|
836
|
+
with indices, this method permutes the coefficients of ``value``
|
|
837
|
+
before assigning the underlying tensor of ``value`` to ``self``.
|
|
838
|
+
|
|
839
|
+
- ``value`` -- the value to be set or a list of values if
|
|
840
|
+
``args = [:]`` or a tensor with indices
|
|
841
|
+
|
|
842
|
+
TESTS::
|
|
843
|
+
|
|
844
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
845
|
+
sage: e = M.basis('e')
|
|
846
|
+
sage: a = M.tensor((2,0), name='a')["ij"]
|
|
847
|
+
sage: b = M.tensor((2,0), name='b')["ij"]
|
|
848
|
+
sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
|
|
849
|
+
sage: b["ij"] = a["ji"]
|
|
850
|
+
sage: b[:] == a[:].transpose()
|
|
851
|
+
True
|
|
852
|
+
"""
|
|
853
|
+
if isinstance(args, str):
|
|
854
|
+
if not isinstance(value,TensorWithIndices):
|
|
855
|
+
raise ValueError("The tensor provided should be with indices")
|
|
856
|
+
elif self._tensor.tensor_type() != value._tensor.tensor_type():
|
|
857
|
+
raise ValueError("The tensors are not of the same type")
|
|
858
|
+
else:
|
|
859
|
+
con,cov = self._parse_indices(
|
|
860
|
+
args,
|
|
861
|
+
tensor_type=self._tensor.tensor_type(),
|
|
862
|
+
allow_symmetries=False,
|
|
863
|
+
allow_contraction=False
|
|
864
|
+
)
|
|
865
|
+
|
|
866
|
+
permutation = list(range(value._tensor.tensor_rank()))
|
|
867
|
+
for value_index in range(value._tensor.tensor_type()[0]):
|
|
868
|
+
if value._con[value_index] == self._con[value_index]:
|
|
869
|
+
permutation[value_index] = value_index
|
|
870
|
+
else:
|
|
871
|
+
permutation[value_index] = self._con.index(value._con[value_index])
|
|
872
|
+
for value_index in range(value._tensor.tensor_type()[1]):
|
|
873
|
+
if value._cov[value_index] == self._cov[value_index]:
|
|
874
|
+
permutation[value._tensor.tensor_type()[0] + value_index]\
|
|
875
|
+
= value._tensor.tensor_type()[0] + value_index
|
|
876
|
+
else:
|
|
877
|
+
permutation[value._tensor.tensor_type()[0] + value_index]\
|
|
878
|
+
= value._tensor.tensor_type()[0] + self._cov.index(value._cov[value_index])
|
|
879
|
+
self._tensor[:] = value.permute_indices(permutation)[:]
|
|
880
|
+
|
|
881
|
+
else:
|
|
882
|
+
self._tensor.__setitem__(args,value)
|
|
883
|
+
|
|
884
|
+
def permute_indices(self, permutation):
|
|
885
|
+
r"""
|
|
886
|
+
Return a tensor with indices with permuted indices.
|
|
887
|
+
|
|
888
|
+
INPUT:
|
|
889
|
+
|
|
890
|
+
- ``permutation`` -- permutation that has to be applied to the indices
|
|
891
|
+
the input should be a ``list`` containing the second line of the permutation
|
|
892
|
+
in Cauchy notation.
|
|
893
|
+
|
|
894
|
+
OUTPUT:
|
|
895
|
+
|
|
896
|
+
- an instance of ``TensorWithIndices`` whose indices names and place
|
|
897
|
+
are those of ``self`` but whose components have been permuted with
|
|
898
|
+
``permutation``.
|
|
899
|
+
|
|
900
|
+
EXAMPLES::
|
|
901
|
+
|
|
902
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
903
|
+
sage: e = M.basis('e')
|
|
904
|
+
sage: a = M.tensor((2,0), name='a')
|
|
905
|
+
sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
|
|
906
|
+
sage: b = M.tensor((2,0), name='b')
|
|
907
|
+
sage: b[:] = [[-1,2,-3], [-4,5,6], [7,-8,9]]
|
|
908
|
+
sage: identity = [0,1]
|
|
909
|
+
sage: transposition = [1,0]
|
|
910
|
+
sage: a["ij"].permute_indices(identity) == a["ij"]
|
|
911
|
+
True
|
|
912
|
+
sage: a["ij"].permute_indices(transposition)[:] == a[:].transpose()
|
|
913
|
+
True
|
|
914
|
+
sage: cycle = [1,2,3,0] # the cyclic permutation sending 0 to 1
|
|
915
|
+
sage: (a*b)[0,1,2,0] == (a*b)["ijkl"].permute_indices(cycle)[1,2,0,0]
|
|
916
|
+
True
|
|
917
|
+
|
|
918
|
+
TESTS::
|
|
919
|
+
|
|
920
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
921
|
+
sage: e = M.basis('e')
|
|
922
|
+
sage: a = M.tensor((2,0), name='a')
|
|
923
|
+
sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
|
|
924
|
+
sage: identity = [0,1]
|
|
925
|
+
sage: transposition = [1,0]
|
|
926
|
+
sage: a["ij"].permute_indices(identity) == a["ij"]
|
|
927
|
+
True
|
|
928
|
+
sage: a["ij"].permute_indices(transposition)[:] == a[:].transpose()
|
|
929
|
+
True
|
|
930
|
+
sage: (a*a)["ijkl"].permute_indices([1,2,3,0])[0,1,2,1] == (a*a)[1,2,1,0]
|
|
931
|
+
True
|
|
932
|
+
"""
|
|
933
|
+
# Decomposition of the permutation of the components of self
|
|
934
|
+
# into product of swaps given by the method
|
|
935
|
+
# sage.tensor.modules.comp.Components.swap_adjacent_indices
|
|
936
|
+
|
|
937
|
+
# A swap is determined by 3 distinct integers
|
|
938
|
+
swap_params = list(combinations(range(self._tensor.tensor_rank()+1), 3))
|
|
939
|
+
|
|
940
|
+
# The associated permutation is as follows
|
|
941
|
+
def swap(param, N):
|
|
942
|
+
i,j,k = param
|
|
943
|
+
L = list(range(1,N+1))
|
|
944
|
+
L = L[:i] + L[j:k] + L[i:j] + L[k:]
|
|
945
|
+
return L
|
|
946
|
+
|
|
947
|
+
# Construction of the permutation group generated by swaps
|
|
948
|
+
from sage.groups.perm_gps.permgroup import PermutationGroup
|
|
949
|
+
|
|
950
|
+
perm_group = PermutationGroup(
|
|
951
|
+
[swap(param, self._tensor.tensor_rank()) for param in swap_params],
|
|
952
|
+
canonicalize=False
|
|
953
|
+
)
|
|
954
|
+
# Compute a decomposition of the permutation as a product of swaps
|
|
955
|
+
decomposition_as_string = perm_group([x+1 for x in permutation]).word_problem(
|
|
956
|
+
perm_group.gens(),
|
|
957
|
+
display=False
|
|
958
|
+
)[0]
|
|
959
|
+
|
|
960
|
+
if decomposition_as_string != "<identity ...>":
|
|
961
|
+
decomposition_as_string = [
|
|
962
|
+
# Two cases whether the term appear with an exponent or not
|
|
963
|
+
("^" in term)*term.split("^") + ("^" not in term)*(term.split("^")+['1'])
|
|
964
|
+
for term in decomposition_as_string.replace("x","").split("*")
|
|
965
|
+
]
|
|
966
|
+
decomposition = [(swap_params[int(x)-1], int(y)) for x, y in decomposition_as_string]
|
|
967
|
+
decomposition.reverse() # /!\ The symmetric group acts on the right by default /!\.
|
|
968
|
+
else:
|
|
969
|
+
decomposition = []
|
|
970
|
+
# Choice of a basis
|
|
971
|
+
basis = self._tensor._fmodule._def_basis
|
|
972
|
+
|
|
973
|
+
# Swap of components
|
|
974
|
+
|
|
975
|
+
swaped_components = self._tensor.comp(basis)
|
|
976
|
+
for swap_param,exponent in decomposition:
|
|
977
|
+
if exponent > 0:
|
|
978
|
+
for i in range(exponent):
|
|
979
|
+
# Apply the swap given by swap_param
|
|
980
|
+
swaped_components = swaped_components\
|
|
981
|
+
.swap_adjacent_indices(*swap_param)
|
|
982
|
+
elif exponent < 0:
|
|
983
|
+
for i in range(-exponent):
|
|
984
|
+
# Apply the opposite of the swap given by swap_param
|
|
985
|
+
swaped_components = swaped_components\
|
|
986
|
+
.swap_adjacent_indices(
|
|
987
|
+
swap_param[0],
|
|
988
|
+
swap_param[0] + swap_param[2] - swap_param[1],
|
|
989
|
+
swap_param[2]
|
|
990
|
+
)
|
|
991
|
+
else:
|
|
992
|
+
pass
|
|
993
|
+
result = self.__pos__()
|
|
994
|
+
result._tensor = self._tensor._fmodule.tensor_from_comp(
|
|
995
|
+
self._tensor.tensor_type(),
|
|
996
|
+
swaped_components
|
|
997
|
+
)
|
|
998
|
+
|
|
999
|
+
return result
|
|
1000
|
+
|
|
1001
|
+
def __pos__(self):
|
|
1002
|
+
r"""
|
|
1003
|
+
Unary plus operator.
|
|
1004
|
+
|
|
1005
|
+
OUTPUT: an exact copy of ``self``
|
|
1006
|
+
|
|
1007
|
+
EXAMPLES::
|
|
1008
|
+
|
|
1009
|
+
sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
|
|
1010
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
1011
|
+
sage: e = M.basis('e')
|
|
1012
|
+
sage: a = M.tensor((2,1), name='a')
|
|
1013
|
+
sage: a[0,2,1], a[1,2,0] = 7, -4
|
|
1014
|
+
sage: ai = TensorWithIndices(a, 'ij_k')
|
|
1015
|
+
sage: s = ai.__pos__() ; s
|
|
1016
|
+
+a^ij_k
|
|
1017
|
+
sage: s._tensor == a
|
|
1018
|
+
True
|
|
1019
|
+
"""
|
|
1020
|
+
return TensorWithIndices(+self._tensor,
|
|
1021
|
+
self._con + '_' + self._cov)
|
|
1022
|
+
|
|
1023
|
+
def __neg__(self):
|
|
1024
|
+
r"""
|
|
1025
|
+
Unary minus operator.
|
|
1026
|
+
|
|
1027
|
+
OUTPUT: negative of ``self``
|
|
1028
|
+
|
|
1029
|
+
EXAMPLES::
|
|
1030
|
+
|
|
1031
|
+
sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
|
|
1032
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
1033
|
+
sage: e = M.basis('e')
|
|
1034
|
+
sage: a = M.tensor((2,1), name='a')
|
|
1035
|
+
sage: a[0,2,1], a[1,2,0] = 7, -4
|
|
1036
|
+
sage: ai = TensorWithIndices(a, 'ij_k')
|
|
1037
|
+
sage: s = ai.__neg__() ; s
|
|
1038
|
+
-a^ij_k
|
|
1039
|
+
sage: s._tensor == -a
|
|
1040
|
+
True
|
|
1041
|
+
"""
|
|
1042
|
+
return TensorWithIndices(-self._tensor,
|
|
1043
|
+
self._con + '_' + self._cov)
|