passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_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 +808 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-0cd532bd.so.1 +0 -0
- passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-bb76a5fc.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.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-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.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-musl.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-musl.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-musl.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-musl.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,858 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
Alternating forms on free modules
|
|
4
|
+
|
|
5
|
+
Given a free module `M` of finite rank over a commutative ring `R`
|
|
6
|
+
and a positive integer `p`, an *alternating form of degree* `p` on `M` is
|
|
7
|
+
a map
|
|
8
|
+
|
|
9
|
+
.. MATH::
|
|
10
|
+
|
|
11
|
+
a:\ \underbrace{M\times\cdots\times M}_{p\ \; \mbox{times}}
|
|
12
|
+
\longrightarrow R
|
|
13
|
+
|
|
14
|
+
that (i) is multilinear and (ii) vanishes whenever any of two of its
|
|
15
|
+
arguments are equal.
|
|
16
|
+
An alternating form of degree `p` is a tensor on `M` of type `(0,p)`.
|
|
17
|
+
|
|
18
|
+
Alternating forms are implemented via the class :class:`FreeModuleAltForm`,
|
|
19
|
+
which is a subclass of the generic tensor class
|
|
20
|
+
:class:`~sage.tensor.modules.free_module_tensor.FreeModuleTensor`.
|
|
21
|
+
|
|
22
|
+
AUTHORS:
|
|
23
|
+
|
|
24
|
+
- Eric Gourgoulhon, Michal Bejger (2014-2015): initial version
|
|
25
|
+
|
|
26
|
+
REFERENCES:
|
|
27
|
+
|
|
28
|
+
- Chap. 23 of R. Godement : *Algebra* [God1968]_
|
|
29
|
+
- Chap. 15 of S. Lang : *Algebra* [Lan2002]_
|
|
30
|
+
"""
|
|
31
|
+
#******************************************************************************
|
|
32
|
+
# Copyright (C) 2015 Eric Gourgoulhon <eric.gourgoulhon@obspm.fr>
|
|
33
|
+
# Copyright (C) 2015 Michal Bejger <bejger@camk.edu.pl>
|
|
34
|
+
#
|
|
35
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
36
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
37
|
+
# the License, or (at your option) any later version.
|
|
38
|
+
# http://www.gnu.org/licenses/
|
|
39
|
+
#******************************************************************************
|
|
40
|
+
|
|
41
|
+
from sage.tensor.modules.free_module_tensor import FreeModuleTensor
|
|
42
|
+
from sage.tensor.modules.comp import Components, CompFullyAntiSym
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class FreeModuleAltForm(FreeModuleTensor):
|
|
46
|
+
r"""
|
|
47
|
+
Alternating form on a free module of finite rank over a commutative ring.
|
|
48
|
+
|
|
49
|
+
This is a Sage *element* class, the corresponding *parent* class being
|
|
50
|
+
:class:`~sage.tensor.modules.ext_pow_free_module.ExtPowerDualFreeModule`.
|
|
51
|
+
|
|
52
|
+
INPUT:
|
|
53
|
+
|
|
54
|
+
- ``fmodule`` -- free module `M` of finite rank over a commutative ring
|
|
55
|
+
`R`, as an instance of
|
|
56
|
+
:class:`~sage.tensor.modules.finite_rank_free_module.FiniteRankFreeModule`
|
|
57
|
+
- ``degree`` -- positive integer; the degree `p` of the
|
|
58
|
+
alternating form (i.e. its tensor rank)
|
|
59
|
+
- ``name`` -- (default: ``None``) string; name given to the alternating
|
|
60
|
+
form
|
|
61
|
+
- ``latex_name`` -- (default: ``None``) string; LaTeX symbol to denote the
|
|
62
|
+
alternating form; if none is provided, ``name`` is used
|
|
63
|
+
|
|
64
|
+
EXAMPLES:
|
|
65
|
+
|
|
66
|
+
Alternating form of degree 2 on a rank-3 free module::
|
|
67
|
+
|
|
68
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M', start_index=1)
|
|
69
|
+
sage: e = M.basis('e')
|
|
70
|
+
sage: a = M.alternating_form(2, name='a') ; a
|
|
71
|
+
Alternating form a of degree 2 on the
|
|
72
|
+
Rank-3 free module M over the Integer Ring
|
|
73
|
+
sage: type(a)
|
|
74
|
+
<class 'sage.tensor.modules.ext_pow_free_module.ExtPowerDualFreeModule_with_category.element_class'>
|
|
75
|
+
sage: a.parent()
|
|
76
|
+
2nd exterior power of the dual of the Rank-3 free module M over the Integer Ring
|
|
77
|
+
sage: a[1,2], a[2,3] = 4, -3
|
|
78
|
+
sage: a.display(e)
|
|
79
|
+
a = 4 e^1∧e^2 - 3 e^2∧e^3
|
|
80
|
+
|
|
81
|
+
The alternating form acting on the basis elements::
|
|
82
|
+
|
|
83
|
+
sage: a(e[1],e[2])
|
|
84
|
+
4
|
|
85
|
+
sage: a(e[1],e[3])
|
|
86
|
+
0
|
|
87
|
+
sage: a(e[2],e[3])
|
|
88
|
+
-3
|
|
89
|
+
sage: a(e[2],e[1])
|
|
90
|
+
-4
|
|
91
|
+
|
|
92
|
+
An alternating form of degree 1 is a linear form::
|
|
93
|
+
|
|
94
|
+
sage: b = M.linear_form('b') ; b
|
|
95
|
+
Linear form b on the Rank-3 free module M over the Integer Ring
|
|
96
|
+
sage: b[:] = [2,-1,3] # components w.r.t. the module's default basis (e)
|
|
97
|
+
|
|
98
|
+
A linear form is a tensor of type `(0,1)`::
|
|
99
|
+
|
|
100
|
+
sage: b.tensor_type()
|
|
101
|
+
(0, 1)
|
|
102
|
+
|
|
103
|
+
It is an element of the dual module::
|
|
104
|
+
|
|
105
|
+
sage: b.parent()
|
|
106
|
+
Dual of the Rank-3 free module M over the Integer Ring
|
|
107
|
+
sage: b.parent() is M.dual()
|
|
108
|
+
True
|
|
109
|
+
|
|
110
|
+
The members of a dual basis are linear forms::
|
|
111
|
+
|
|
112
|
+
sage: e.dual_basis()[1]
|
|
113
|
+
Linear form e^1 on the Rank-3 free module M over the Integer Ring
|
|
114
|
+
sage: e.dual_basis()[2]
|
|
115
|
+
Linear form e^2 on the Rank-3 free module M over the Integer Ring
|
|
116
|
+
sage: e.dual_basis()[3]
|
|
117
|
+
Linear form e^3 on the Rank-3 free module M over the Integer Ring
|
|
118
|
+
|
|
119
|
+
Any linear form is expanded onto them::
|
|
120
|
+
|
|
121
|
+
sage: b.display(e)
|
|
122
|
+
b = 2 e^1 - e^2 + 3 e^3
|
|
123
|
+
|
|
124
|
+
In the above example, an equivalent writing would have been
|
|
125
|
+
``b.display()``, since the basis ``e`` is the module's default basis.
|
|
126
|
+
A linear form maps module elements to ring elements::
|
|
127
|
+
|
|
128
|
+
sage: v = M([1,1,1])
|
|
129
|
+
sage: b(v)
|
|
130
|
+
4
|
|
131
|
+
sage: b(v) in M.base_ring()
|
|
132
|
+
True
|
|
133
|
+
|
|
134
|
+
Test of linearity::
|
|
135
|
+
|
|
136
|
+
sage: u = M([-5,-2,7])
|
|
137
|
+
sage: b(3*u - 4*v) == 3*b(u) - 4*b(v)
|
|
138
|
+
True
|
|
139
|
+
|
|
140
|
+
The standard tensor operations apply to alternating forms, like the
|
|
141
|
+
extraction of components with respect to a given basis::
|
|
142
|
+
|
|
143
|
+
sage: a[e,1,2]
|
|
144
|
+
4
|
|
145
|
+
sage: a[1,2] # since e is the module's default basis
|
|
146
|
+
4
|
|
147
|
+
sage: all( a[i,j] == - a[j,i] for i in {1,2,3} for j in {1,2,3} )
|
|
148
|
+
True
|
|
149
|
+
|
|
150
|
+
the tensor product::
|
|
151
|
+
|
|
152
|
+
sage: c = b*b ; c
|
|
153
|
+
Symmetric bilinear form b⊗b on the Rank-3 free module M over the
|
|
154
|
+
Integer Ring
|
|
155
|
+
sage: c.parent()
|
|
156
|
+
Free module of type-(0,2) tensors on the Rank-3 free module M over the
|
|
157
|
+
Integer Ring
|
|
158
|
+
sage: c.display(e)
|
|
159
|
+
b⊗b = 4 e^1⊗e^1 - 2 e^1⊗e^2 + 6 e^1⊗e^3 - 2 e^2⊗e^1 + e^2⊗e^2
|
|
160
|
+
- 3 e^2⊗e^3 + 6 e^3⊗e^1 - 3 e^3⊗e^2 + 9 e^3⊗e^3
|
|
161
|
+
|
|
162
|
+
the contractions::
|
|
163
|
+
|
|
164
|
+
sage: s = a.contract(v) ; s
|
|
165
|
+
Linear form on the Rank-3 free module M over the Integer Ring
|
|
166
|
+
sage: s.parent()
|
|
167
|
+
Dual of the Rank-3 free module M over the Integer Ring
|
|
168
|
+
sage: s.display(e)
|
|
169
|
+
4 e^1 - 7 e^2 + 3 e^3
|
|
170
|
+
|
|
171
|
+
or tensor arithmetics::
|
|
172
|
+
|
|
173
|
+
sage: s = 3*a + c ; s
|
|
174
|
+
Type-(0,2) tensor on the Rank-3 free module M over the Integer Ring
|
|
175
|
+
sage: s.parent()
|
|
176
|
+
Free module of type-(0,2) tensors on the Rank-3 free module M over the
|
|
177
|
+
Integer Ring
|
|
178
|
+
sage: s.display(e)
|
|
179
|
+
4 e^1⊗e^1 + 10 e^1⊗e^2 + 6 e^1⊗e^3 - 14 e^2⊗e^1 + e^2⊗e^2
|
|
180
|
+
- 12 e^2⊗e^3 + 6 e^3⊗e^1 + 6 e^3⊗e^2 + 9 e^3⊗e^3
|
|
181
|
+
|
|
182
|
+
Note that tensor arithmetics preserves the alternating character if both
|
|
183
|
+
operands are alternating::
|
|
184
|
+
|
|
185
|
+
sage: s = a - 2*a ; s
|
|
186
|
+
Alternating form of degree 2 on the Rank-3 free module M over the
|
|
187
|
+
Integer Ring
|
|
188
|
+
sage: s.parent() # note the difference with s = 3*a + c above
|
|
189
|
+
2nd exterior power of the dual of the Rank-3 free module M over the
|
|
190
|
+
Integer Ring
|
|
191
|
+
sage: s == -a
|
|
192
|
+
True
|
|
193
|
+
|
|
194
|
+
An operation specific to alternating forms is of course the exterior
|
|
195
|
+
product::
|
|
196
|
+
|
|
197
|
+
sage: s = a.wedge(b) ; s
|
|
198
|
+
Alternating form a∧b of degree 3 on the Rank-3 free module M over the
|
|
199
|
+
Integer Ring
|
|
200
|
+
sage: s.parent()
|
|
201
|
+
3rd exterior power of the dual of the Rank-3 free module M over the
|
|
202
|
+
Integer Ring
|
|
203
|
+
sage: s.display(e)
|
|
204
|
+
a∧b = 6 e^1∧e^2∧e^3
|
|
205
|
+
sage: s[1,2,3] == a[1,2]*b[3] + a[2,3]*b[1] + a[3,1]*b[2]
|
|
206
|
+
True
|
|
207
|
+
|
|
208
|
+
The exterior product is nilpotent on linear forms::
|
|
209
|
+
|
|
210
|
+
sage: s = b.wedge(b) ; s
|
|
211
|
+
Alternating form zero of degree 2 on the Rank-3 free module M over the
|
|
212
|
+
Integer Ring
|
|
213
|
+
sage: s.display(e)
|
|
214
|
+
zero = 0
|
|
215
|
+
"""
|
|
216
|
+
def __init__(self, fmodule, degree, name=None, latex_name=None):
|
|
217
|
+
r"""
|
|
218
|
+
Initialize ``self``.
|
|
219
|
+
|
|
220
|
+
TESTS::
|
|
221
|
+
|
|
222
|
+
sage: from sage.tensor.modules.free_module_alt_form import FreeModuleAltForm
|
|
223
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
224
|
+
sage: e = M.basis('e')
|
|
225
|
+
sage: a = FreeModuleAltForm(M, 2, name='a')
|
|
226
|
+
sage: a[e,0,1] = 2
|
|
227
|
+
sage: TestSuite(a).run(skip='_test_category') # see below
|
|
228
|
+
|
|
229
|
+
In the above test suite, _test_category fails because a is not an
|
|
230
|
+
instance of a.parent().category().element_class. Actually alternating
|
|
231
|
+
forms must be constructed via ExtPowerDualFreeModule.element_class and
|
|
232
|
+
not by a direct call to FreeModuleAltForm::
|
|
233
|
+
|
|
234
|
+
sage: a1 = M.dual_exterior_power(2).element_class(M, 2, name='a')
|
|
235
|
+
sage: a1[e,0,1] = 2
|
|
236
|
+
sage: TestSuite(a1).run()
|
|
237
|
+
"""
|
|
238
|
+
FreeModuleTensor.__init__(self, fmodule, (0,degree), name=name,
|
|
239
|
+
latex_name=latex_name,
|
|
240
|
+
antisym=range(degree),
|
|
241
|
+
parent=fmodule.dual_exterior_power(degree))
|
|
242
|
+
|
|
243
|
+
def _repr_(self):
|
|
244
|
+
r"""
|
|
245
|
+
Return a string representation of ``self``.
|
|
246
|
+
|
|
247
|
+
EXAMPLES::
|
|
248
|
+
|
|
249
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
250
|
+
sage: M.alternating_form(1)
|
|
251
|
+
Linear form on the Rank-3 free module M over the Integer Ring
|
|
252
|
+
sage: M.alternating_form(1, name='a')
|
|
253
|
+
Linear form a on the Rank-3 free module M over the Integer Ring
|
|
254
|
+
sage: M.alternating_form(2)
|
|
255
|
+
Alternating form of degree 2 on the
|
|
256
|
+
Rank-3 free module M over the Integer Ring
|
|
257
|
+
sage: M.alternating_form(2, name='a')
|
|
258
|
+
Alternating form a of degree 2 on the
|
|
259
|
+
Rank-3 free module M over the Integer Ring
|
|
260
|
+
"""
|
|
261
|
+
if self._tensor_rank == 1:
|
|
262
|
+
description = "Linear form "
|
|
263
|
+
if self._name is not None:
|
|
264
|
+
description += self._name + " "
|
|
265
|
+
else:
|
|
266
|
+
description = "Alternating form "
|
|
267
|
+
if self._name is not None:
|
|
268
|
+
description += self._name + " "
|
|
269
|
+
description += "of degree {} ".format(self._tensor_rank)
|
|
270
|
+
description += "on the {}".format(self._fmodule)
|
|
271
|
+
return description
|
|
272
|
+
|
|
273
|
+
def _new_instance(self):
|
|
274
|
+
r"""
|
|
275
|
+
Create an instance of the same class as ``self``, on the same module
|
|
276
|
+
and of the same degree.
|
|
277
|
+
|
|
278
|
+
EXAMPLES::
|
|
279
|
+
|
|
280
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
281
|
+
sage: a = M.alternating_form(1)
|
|
282
|
+
sage: a._new_instance()
|
|
283
|
+
Linear form on the Rank-3 free module M over the Integer Ring
|
|
284
|
+
sage: a._new_instance().parent() is a.parent()
|
|
285
|
+
True
|
|
286
|
+
sage: b = M.alternating_form(2, name='b')
|
|
287
|
+
sage: b._new_instance()
|
|
288
|
+
Alternating form of degree 2 on the
|
|
289
|
+
Rank-3 free module M over the Integer Ring
|
|
290
|
+
sage: b._new_instance().parent() is b.parent()
|
|
291
|
+
True
|
|
292
|
+
"""
|
|
293
|
+
return self.__class__(self._fmodule, self._tensor_rank)
|
|
294
|
+
|
|
295
|
+
def _new_comp(self, basis):
|
|
296
|
+
r"""
|
|
297
|
+
Create some (uninitialized) components of ``self`` in a given basis.
|
|
298
|
+
|
|
299
|
+
This method, which is already implemented in
|
|
300
|
+
:meth:`FreeModuleTensor._new_comp`, is redefined here for efficiency.
|
|
301
|
+
|
|
302
|
+
INPUT:
|
|
303
|
+
|
|
304
|
+
- ``basis`` -- basis of the free module on which ``self`` is defined
|
|
305
|
+
|
|
306
|
+
OUTPUT:
|
|
307
|
+
|
|
308
|
+
- an instance of :class:`~sage.tensor.modules.comp.CompFullyAntiSym`,
|
|
309
|
+
or of :class:`~sage.tensor.modules.comp.Components` if
|
|
310
|
+
the degree of ``self`` is 1.
|
|
311
|
+
|
|
312
|
+
EXAMPLES::
|
|
313
|
+
|
|
314
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
315
|
+
sage: e = M.basis('e')
|
|
316
|
+
sage: a = M.alternating_form(2, name='a')
|
|
317
|
+
sage: a._new_comp(e)
|
|
318
|
+
Fully antisymmetric 2-indices components w.r.t. Basis (e_0,e_1,e_2)
|
|
319
|
+
on the Rank-3 free module M over the Integer Ring
|
|
320
|
+
sage: a = M.alternating_form(1)
|
|
321
|
+
sage: a._new_comp(e)
|
|
322
|
+
1-index components w.r.t. Basis (e_0,e_1,e_2) on the Rank-3 free
|
|
323
|
+
module M over the Integer Ring
|
|
324
|
+
"""
|
|
325
|
+
fmodule = self._fmodule # the base free module
|
|
326
|
+
if self._tensor_rank == 1:
|
|
327
|
+
return Components(fmodule._ring, basis, 1,
|
|
328
|
+
start_index=fmodule._sindex,
|
|
329
|
+
output_formatter=fmodule._output_formatter)
|
|
330
|
+
|
|
331
|
+
return CompFullyAntiSym(fmodule._ring, basis, self._tensor_rank,
|
|
332
|
+
start_index=fmodule._sindex,
|
|
333
|
+
output_formatter=fmodule._output_formatter)
|
|
334
|
+
|
|
335
|
+
def degree(self):
|
|
336
|
+
r"""
|
|
337
|
+
Return the degree of ``self``.
|
|
338
|
+
|
|
339
|
+
EXAMPLES::
|
|
340
|
+
|
|
341
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
342
|
+
sage: a = M.alternating_form(2, name='a')
|
|
343
|
+
sage: a.degree()
|
|
344
|
+
2
|
|
345
|
+
"""
|
|
346
|
+
return self._tensor_rank
|
|
347
|
+
|
|
348
|
+
def _display_expansion(self, basis=None, format_spec=None):
|
|
349
|
+
r"""
|
|
350
|
+
Return the pure expansion of ``self`` w.r.t. a given module basis.
|
|
351
|
+
|
|
352
|
+
The expansion is actually performed onto exterior products of elements
|
|
353
|
+
of the cobasis (dual basis) associated with ``basis`` (see examples
|
|
354
|
+
below). The output is either text-formatted (console mode) or
|
|
355
|
+
LaTeX-formatted (notebook mode).
|
|
356
|
+
|
|
357
|
+
INPUT:
|
|
358
|
+
|
|
359
|
+
- ``basis`` -- (default: ``None``) basis of the free module with
|
|
360
|
+
respect to which the alternating form is expanded; if none is
|
|
361
|
+
provided, the module's default basis is assumed
|
|
362
|
+
- ``format_spec`` -- (default: ``None``) format specification passed
|
|
363
|
+
to ``self._fmodule._output_formatter`` to format the output
|
|
364
|
+
|
|
365
|
+
TESTS:
|
|
366
|
+
|
|
367
|
+
Expansion display of an alternating form of degree 1 (linear form) on a
|
|
368
|
+
rank-3 free module::
|
|
369
|
+
|
|
370
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
371
|
+
sage: e = M.basis('e')
|
|
372
|
+
sage: e.dual_basis()
|
|
373
|
+
Dual basis (e^0,e^1,e^2) on the Rank-3 free module M over the Integer Ring
|
|
374
|
+
sage: a = M.linear_form('a', latex_name=r'\alpha')
|
|
375
|
+
sage: a[:] = [1,-3,4]
|
|
376
|
+
sage: a._display_expansion(e)
|
|
377
|
+
e^0 - 3 e^1 + 4 e^2
|
|
378
|
+
sage: a._display_expansion() # a shortcut since e is M's default basis
|
|
379
|
+
e^0 - 3 e^1 + 4 e^2
|
|
380
|
+
sage: latex(a._display_expansion()) # display in the notebook
|
|
381
|
+
e^{0} -3 e^{1} + 4 e^{2}
|
|
382
|
+
"""
|
|
383
|
+
from sage.misc.latex import latex
|
|
384
|
+
from sage.typeset.unicode_characters import unicode_wedge
|
|
385
|
+
from .format_utilities import is_atomic, FormattedExpansion
|
|
386
|
+
basis, format_spec = self._preparse_display(basis=basis,
|
|
387
|
+
format_spec=format_spec)
|
|
388
|
+
cobasis = basis.dual_basis()
|
|
389
|
+
comp = self.comp(basis)
|
|
390
|
+
terms_txt = []
|
|
391
|
+
terms_latex = []
|
|
392
|
+
for ind in comp.non_redundant_index_generator():
|
|
393
|
+
ind_arg = ind + (format_spec,)
|
|
394
|
+
coef = comp[ind_arg]
|
|
395
|
+
# Check whether the coefficient is zero, preferably via
|
|
396
|
+
# the fast method is_trivial_zero():
|
|
397
|
+
if hasattr(coef, 'is_trivial_zero'):
|
|
398
|
+
zero_coef = coef.is_trivial_zero()
|
|
399
|
+
else:
|
|
400
|
+
zero_coef = coef == 0
|
|
401
|
+
if not zero_coef:
|
|
402
|
+
bases_txt = []
|
|
403
|
+
bases_latex = []
|
|
404
|
+
for k in range(self._tensor_rank):
|
|
405
|
+
bases_txt.append(cobasis[ind[k]]._name)
|
|
406
|
+
bases_latex.append(latex(cobasis[ind[k]]))
|
|
407
|
+
basis_term_txt = unicode_wedge.join(bases_txt)
|
|
408
|
+
basis_term_latex = r'\wedge '.join(bases_latex)
|
|
409
|
+
coef_txt = repr(coef)
|
|
410
|
+
if coef_txt == '1':
|
|
411
|
+
terms_txt.append(basis_term_txt)
|
|
412
|
+
terms_latex.append(basis_term_latex)
|
|
413
|
+
elif coef_txt == '-1':
|
|
414
|
+
terms_txt.append('-' + basis_term_txt)
|
|
415
|
+
terms_latex.append('-' + basis_term_latex)
|
|
416
|
+
else:
|
|
417
|
+
coef_latex = latex(coef)
|
|
418
|
+
if is_atomic(coef_txt):
|
|
419
|
+
terms_txt.append(coef_txt + ' ' + basis_term_txt)
|
|
420
|
+
else:
|
|
421
|
+
terms_txt.append('(' + coef_txt + ') ' +
|
|
422
|
+
basis_term_txt)
|
|
423
|
+
if is_atomic(coef_latex):
|
|
424
|
+
terms_latex.append(coef_latex + basis_term_latex)
|
|
425
|
+
else:
|
|
426
|
+
terms_latex.append(r'\left(' + coef_latex +
|
|
427
|
+
r'\right)' + basis_term_latex)
|
|
428
|
+
if not terms_txt:
|
|
429
|
+
expansion_txt = '0'
|
|
430
|
+
else:
|
|
431
|
+
expansion_txt = terms_txt[0]
|
|
432
|
+
for term in terms_txt[1:]:
|
|
433
|
+
if term[0] == '-':
|
|
434
|
+
expansion_txt += ' - ' + term[1:]
|
|
435
|
+
else:
|
|
436
|
+
expansion_txt += ' + ' + term
|
|
437
|
+
if not terms_latex:
|
|
438
|
+
expansion_latex = '0'
|
|
439
|
+
else:
|
|
440
|
+
expansion_latex = terms_latex[0]
|
|
441
|
+
for term in terms_latex[1:]:
|
|
442
|
+
if term[0] == '-':
|
|
443
|
+
expansion_latex += term
|
|
444
|
+
else:
|
|
445
|
+
expansion_latex += '+' + term
|
|
446
|
+
return FormattedExpansion(expansion_txt, expansion_latex)
|
|
447
|
+
|
|
448
|
+
def display(self, basis=None, format_spec=None):
|
|
449
|
+
r"""
|
|
450
|
+
Display the alternating form ``self`` in terms of its expansion w.r.t.
|
|
451
|
+
a given module basis.
|
|
452
|
+
|
|
453
|
+
The expansion is actually performed onto exterior products of elements
|
|
454
|
+
of the cobasis (dual basis) associated with ``basis`` (see examples
|
|
455
|
+
below). The output is either text-formatted (console mode) or
|
|
456
|
+
LaTeX-formatted (notebook mode).
|
|
457
|
+
|
|
458
|
+
INPUT:
|
|
459
|
+
|
|
460
|
+
- ``basis`` -- (default: ``None``) basis of the free module with
|
|
461
|
+
respect to which the alternating form is expanded; if none is
|
|
462
|
+
provided, the module's default basis is assumed
|
|
463
|
+
- ``format_spec`` -- (default: ``None``) format specification passed
|
|
464
|
+
to ``self._fmodule._output_formatter`` to format the output
|
|
465
|
+
|
|
466
|
+
EXAMPLES:
|
|
467
|
+
|
|
468
|
+
Display of an alternating form of degree 1 (linear form) on a rank-3
|
|
469
|
+
free module::
|
|
470
|
+
|
|
471
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
472
|
+
sage: e = M.basis('e')
|
|
473
|
+
sage: e.dual_basis()
|
|
474
|
+
Dual basis (e^0,e^1,e^2) on the Rank-3 free module M over the Integer Ring
|
|
475
|
+
sage: a = M.linear_form('a', latex_name=r'\alpha')
|
|
476
|
+
sage: a[:] = [1,-3,4]
|
|
477
|
+
sage: a.display(e)
|
|
478
|
+
a = e^0 - 3 e^1 + 4 e^2
|
|
479
|
+
sage: a.display() # a shortcut since e is M's default basis
|
|
480
|
+
a = e^0 - 3 e^1 + 4 e^2
|
|
481
|
+
sage: latex(a.display()) # display in the notebook
|
|
482
|
+
\alpha = e^{0} -3 e^{1} + 4 e^{2}
|
|
483
|
+
|
|
484
|
+
A shortcut is ``disp()``::
|
|
485
|
+
|
|
486
|
+
sage: a.disp()
|
|
487
|
+
a = e^0 - 3 e^1 + 4 e^2
|
|
488
|
+
|
|
489
|
+
Display of an alternating form of degree 2 on a rank-3 free module::
|
|
490
|
+
|
|
491
|
+
sage: b = M.alternating_form(2, 'b', latex_name=r'\beta')
|
|
492
|
+
sage: b[0,1], b[0,2], b[1,2] = 3, 2, -1
|
|
493
|
+
sage: b.display()
|
|
494
|
+
b = 3 e^0∧e^1 + 2 e^0∧e^2 - e^1∧e^2
|
|
495
|
+
sage: latex(b.display()) # display in the notebook
|
|
496
|
+
\beta = 3 e^{0}\wedge e^{1} + 2 e^{0}\wedge e^{2} -e^{1}\wedge e^{2}
|
|
497
|
+
|
|
498
|
+
Display of an alternating form of degree 3 on a rank-3 free module::
|
|
499
|
+
|
|
500
|
+
sage: c = M.alternating_form(3, 'c')
|
|
501
|
+
sage: c[0,1,2] = 4
|
|
502
|
+
sage: c.display()
|
|
503
|
+
c = 4 e^0∧e^1∧e^2
|
|
504
|
+
sage: latex(c.display())
|
|
505
|
+
c = 4 e^{0}\wedge e^{1}\wedge e^{2}
|
|
506
|
+
|
|
507
|
+
Display of a vanishing alternating form::
|
|
508
|
+
|
|
509
|
+
sage: c[0,1,2] = 0 # the only independent component set to zero
|
|
510
|
+
sage: c.is_zero()
|
|
511
|
+
True
|
|
512
|
+
sage: c.display()
|
|
513
|
+
c = 0
|
|
514
|
+
sage: latex(c.display())
|
|
515
|
+
c = 0
|
|
516
|
+
sage: c[0,1,2] = 4 # value restored for what follows
|
|
517
|
+
|
|
518
|
+
Display in a basis which is not the default one::
|
|
519
|
+
|
|
520
|
+
sage: aut = M.automorphism(matrix=[[0,1,0], [0,0,-1], [1,0,0]],
|
|
521
|
+
....: basis=e)
|
|
522
|
+
sage: f = e.new_basis(aut, 'f')
|
|
523
|
+
sage: a.display(f)
|
|
524
|
+
a = 4 f^0 + f^1 + 3 f^2
|
|
525
|
+
sage: a.disp(f) # shortcut notation
|
|
526
|
+
a = 4 f^0 + f^1 + 3 f^2
|
|
527
|
+
sage: b.display(f)
|
|
528
|
+
b = -2 f^0∧f^1 - f^0∧f^2 - 3 f^1∧f^2
|
|
529
|
+
sage: c.display(f)
|
|
530
|
+
c = -4 f^0∧f^1∧f^2
|
|
531
|
+
|
|
532
|
+
The output format can be set via the argument ``output_formatter``
|
|
533
|
+
passed at the module construction::
|
|
534
|
+
|
|
535
|
+
sage: N = FiniteRankFreeModule(QQ, 3, name='N', start_index=1,
|
|
536
|
+
....: output_formatter=Rational.numerical_approx)
|
|
537
|
+
sage: e = N.basis('e')
|
|
538
|
+
sage: b = N.alternating_form(2, 'b')
|
|
539
|
+
sage: b[1,2], b[1,3], b[2,3] = 1/3, 5/2, 4
|
|
540
|
+
sage: b.display() # default format (53 bits of precision)
|
|
541
|
+
b = 0.333333333333333 e^1∧e^2 + 2.50000000000000 e^1∧e^3
|
|
542
|
+
+ 4.00000000000000 e^2∧e^3
|
|
543
|
+
|
|
544
|
+
The output format is then controlled by the argument ``format_spec`` of
|
|
545
|
+
the method :meth:`display`::
|
|
546
|
+
|
|
547
|
+
sage: b.display(format_spec=10) # 10 bits of precision
|
|
548
|
+
b = 0.33 e^1∧e^2 + 2.5 e^1∧e^3 + 4.0 e^2∧e^3
|
|
549
|
+
|
|
550
|
+
Check that the bug reported in :issue:`22520` is fixed::
|
|
551
|
+
|
|
552
|
+
sage: # needs sage.symbolic
|
|
553
|
+
sage: M = FiniteRankFreeModule(SR, 2, name='M')
|
|
554
|
+
sage: e = M.basis('e')
|
|
555
|
+
sage: a = M.alternating_form(2)
|
|
556
|
+
sage: a[0,1] = SR.var('t', domain='real')
|
|
557
|
+
sage: a.display()
|
|
558
|
+
t e^0∧e^1
|
|
559
|
+
"""
|
|
560
|
+
from sage.misc.latex import latex
|
|
561
|
+
from sage.tensor.modules.format_utilities import FormattedExpansion
|
|
562
|
+
exp = self._display_expansion(basis=basis, format_spec=format_spec)
|
|
563
|
+
if self._name is None:
|
|
564
|
+
resu_txt = repr(exp)
|
|
565
|
+
else:
|
|
566
|
+
resu_txt = self._name + " = " + repr(exp)
|
|
567
|
+
if self._latex_name is None:
|
|
568
|
+
resu_latex = latex(exp)
|
|
569
|
+
else:
|
|
570
|
+
resu_latex = latex(self) + " = " + latex(exp)
|
|
571
|
+
return FormattedExpansion(resu_txt, resu_latex)
|
|
572
|
+
|
|
573
|
+
disp = display
|
|
574
|
+
|
|
575
|
+
def wedge(self, other):
|
|
576
|
+
r"""
|
|
577
|
+
Exterior product of ``self`` with the alternating form ``other``.
|
|
578
|
+
|
|
579
|
+
INPUT:
|
|
580
|
+
|
|
581
|
+
- ``other`` -- an alternating form
|
|
582
|
+
|
|
583
|
+
OUTPUT:
|
|
584
|
+
|
|
585
|
+
- instance of :class:`FreeModuleAltForm` representing the exterior
|
|
586
|
+
product ``self ∧ other``
|
|
587
|
+
|
|
588
|
+
EXAMPLES:
|
|
589
|
+
|
|
590
|
+
Exterior product of two linear forms::
|
|
591
|
+
|
|
592
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
593
|
+
sage: e = M.basis('e')
|
|
594
|
+
sage: a = M.linear_form('A')
|
|
595
|
+
sage: a[:] = [1,-3,4]
|
|
596
|
+
sage: b = M.linear_form('B')
|
|
597
|
+
sage: b[:] = [2,-1,2]
|
|
598
|
+
sage: c = a.wedge(b) ; c
|
|
599
|
+
Alternating form A∧B of degree 2 on the Rank-3 free module M
|
|
600
|
+
over the Integer Ring
|
|
601
|
+
sage: c.display()
|
|
602
|
+
A∧B = 5 e^0∧e^1 - 6 e^0∧e^2 - 2 e^1∧e^2
|
|
603
|
+
sage: latex(c)
|
|
604
|
+
A\wedge B
|
|
605
|
+
sage: latex(c.display())
|
|
606
|
+
A\wedge B = 5 e^{0}\wedge e^{1} -6 e^{0}\wedge e^{2} -2 e^{1}\wedge e^{2}
|
|
607
|
+
|
|
608
|
+
Test of the computation::
|
|
609
|
+
|
|
610
|
+
sage: a.wedge(b) == a*b - b*a
|
|
611
|
+
True
|
|
612
|
+
|
|
613
|
+
Exterior product of a linear form and an alternating form of degree 2::
|
|
614
|
+
|
|
615
|
+
sage: d = M.linear_form('D')
|
|
616
|
+
sage: d[:] = [-1,2,4]
|
|
617
|
+
sage: s = d.wedge(c) ; s
|
|
618
|
+
Alternating form D∧A∧B of degree 3 on the Rank-3 free module M
|
|
619
|
+
over the Integer Ring
|
|
620
|
+
sage: s.display()
|
|
621
|
+
D∧A∧B = 34 e^0∧e^1∧e^2
|
|
622
|
+
|
|
623
|
+
Test of the computation::
|
|
624
|
+
|
|
625
|
+
sage: s[0,1,2] == d[0]*c[1,2] + d[1]*c[2,0] + d[2]*c[0,1]
|
|
626
|
+
True
|
|
627
|
+
|
|
628
|
+
Let us check that the exterior product is associative::
|
|
629
|
+
|
|
630
|
+
sage: d.wedge(a.wedge(b)) == (d.wedge(a)).wedge(b)
|
|
631
|
+
True
|
|
632
|
+
|
|
633
|
+
and that it is graded anticommutative::
|
|
634
|
+
|
|
635
|
+
sage: a.wedge(b) == - b.wedge(a)
|
|
636
|
+
True
|
|
637
|
+
sage: d.wedge(c) == c.wedge(d)
|
|
638
|
+
True
|
|
639
|
+
"""
|
|
640
|
+
from sage.typeset.unicode_characters import unicode_wedge
|
|
641
|
+
from .format_utilities import is_atomic
|
|
642
|
+
if not isinstance(other, FreeModuleAltForm):
|
|
643
|
+
raise TypeError("the second argument for the exterior product " +
|
|
644
|
+
"must be an alternating form")
|
|
645
|
+
if other._tensor_rank == 0:
|
|
646
|
+
return other * self
|
|
647
|
+
if self._tensor_rank == 0:
|
|
648
|
+
return self * other
|
|
649
|
+
fmodule = self._fmodule
|
|
650
|
+
rank_r = self._tensor_rank + other._tensor_rank
|
|
651
|
+
# Facilitate computations involving zero:
|
|
652
|
+
if rank_r > fmodule._rank:
|
|
653
|
+
return fmodule.dual_exterior_power(rank_r).zero()
|
|
654
|
+
if self._is_zero or other._is_zero:
|
|
655
|
+
return fmodule.dual_exterior_power(rank_r).zero()
|
|
656
|
+
if self is other and (self._tensor_rank % 2) == 1:
|
|
657
|
+
return fmodule.dual_exterior_power(rank_r).zero()
|
|
658
|
+
# Generic case:
|
|
659
|
+
basis = self.common_basis(other)
|
|
660
|
+
if basis is None:
|
|
661
|
+
raise ValueError("no common basis for the exterior product")
|
|
662
|
+
cmp_s = self._components[basis]
|
|
663
|
+
cmp_o = other._components[basis]
|
|
664
|
+
cmp_r = CompFullyAntiSym(fmodule._ring, basis, rank_r,
|
|
665
|
+
start_index=fmodule._sindex,
|
|
666
|
+
output_formatter=fmodule._output_formatter)
|
|
667
|
+
for ind_s, val_s in cmp_s._comp.items():
|
|
668
|
+
for ind_o, val_o in cmp_o._comp.items():
|
|
669
|
+
ind_r = ind_s + ind_o
|
|
670
|
+
if len(ind_r) == len(set(ind_r)): # all indices are different
|
|
671
|
+
cmp_r[[ind_r]] += val_s * val_o
|
|
672
|
+
result = fmodule.alternating_form(rank_r)
|
|
673
|
+
result._components[basis] = cmp_r
|
|
674
|
+
if self._name is not None and other._name is not None:
|
|
675
|
+
sname = self._name
|
|
676
|
+
oname = other._name
|
|
677
|
+
if not is_atomic(sname):
|
|
678
|
+
sname = '(' + sname + ')'
|
|
679
|
+
if not is_atomic(oname):
|
|
680
|
+
oname = '(' + oname + ')'
|
|
681
|
+
result._name = sname + unicode_wedge + oname
|
|
682
|
+
if self._latex_name is not None and other._latex_name is not None:
|
|
683
|
+
slname = self._latex_name
|
|
684
|
+
olname = other._latex_name
|
|
685
|
+
if not is_atomic(slname):
|
|
686
|
+
slname = '(' + slname + ')'
|
|
687
|
+
if not is_atomic(olname):
|
|
688
|
+
olname = '(' + olname + ')'
|
|
689
|
+
result._latex_name = slname + r'\wedge ' + olname
|
|
690
|
+
return result
|
|
691
|
+
|
|
692
|
+
def interior_product(self, alt_tensor):
|
|
693
|
+
r"""
|
|
694
|
+
Interior product with an alternating contravariant tensor.
|
|
695
|
+
|
|
696
|
+
If ``self`` is an alternating form `A` of degree `p` and `B` is an
|
|
697
|
+
alternating contravariant tensor of degree `q\geq p` on the same free
|
|
698
|
+
module, the interior product of `A` by `B` is the alternating
|
|
699
|
+
contravariant tensor `\iota_A B` of degree `q-p` defined by
|
|
700
|
+
|
|
701
|
+
.. MATH::
|
|
702
|
+
|
|
703
|
+
(\iota_A B)^{i_1\ldots i_{q-p}} = A_{k_1\ldots k_p}
|
|
704
|
+
B^{k_1\ldots k_p i_1\ldots i_{q-p}}
|
|
705
|
+
|
|
706
|
+
.. NOTE::
|
|
707
|
+
|
|
708
|
+
``A.interior_product(B)`` yields the same result as
|
|
709
|
+
``A.contract(0,..., p-1, B, 0,..., p-1)`` (cf.
|
|
710
|
+
:meth:`~sage.tensor.modules.free_module_tensor.FreeModuleTensor.contract`),
|
|
711
|
+
but ``interior_product`` is more efficient, the alternating
|
|
712
|
+
character of `A` being not used to reduce the computation in
|
|
713
|
+
:meth:`~sage.tensor.modules.free_module_tensor.FreeModuleTensor.contract`
|
|
714
|
+
|
|
715
|
+
INPUT:
|
|
716
|
+
|
|
717
|
+
- ``alt_tensor`` -- alternating contravariant tensor `B` (instance of
|
|
718
|
+
:class:`~sage.tensor.modules.alternating_contr_tensor.AlternatingContrTensor`);
|
|
719
|
+
the degree of `B` must be at least equal to the degree of ``self``
|
|
720
|
+
|
|
721
|
+
OUTPUT:
|
|
722
|
+
|
|
723
|
+
- element of the base ring (case `p=q`) or
|
|
724
|
+
:class:`~sage.tensor.modules.alternating_contr_tensor.AlternatingContrTensor`
|
|
725
|
+
(case `p<q`) representing the interior product `\iota_A B`, where `A`
|
|
726
|
+
is ``self``
|
|
727
|
+
|
|
728
|
+
.. SEEALSO::
|
|
729
|
+
|
|
730
|
+
:meth:`~sage.tensor.modules.alternating_contr_tensor.AlternatingContrTensor.interior_product`
|
|
731
|
+
for the interior product of an alternating contravariant tensor by
|
|
732
|
+
an alternating form
|
|
733
|
+
|
|
734
|
+
EXAMPLES:
|
|
735
|
+
|
|
736
|
+
Let us consider a rank-3 free module::
|
|
737
|
+
|
|
738
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M', start_index=1)
|
|
739
|
+
sage: e = M.basis('e')
|
|
740
|
+
|
|
741
|
+
and various interior products on it, starting with a linear form
|
|
742
|
+
(``p=1``) and a module element (``q=1``)::
|
|
743
|
+
|
|
744
|
+
sage: a = M.linear_form(name='A')
|
|
745
|
+
sage: a[:] = [-2, 4, 3]
|
|
746
|
+
sage: b = M([3, 1, 5], basis=e, name='B')
|
|
747
|
+
sage: c = a.interior_product(b); c
|
|
748
|
+
13
|
|
749
|
+
sage: c == a.contract(b)
|
|
750
|
+
True
|
|
751
|
+
|
|
752
|
+
Case ``p=1`` and ``q=2``::
|
|
753
|
+
|
|
754
|
+
sage: b = M.alternating_contravariant_tensor(2, name='B')
|
|
755
|
+
sage: b[1,2], b[1,3], b[2,3] = 5, 2, 3
|
|
756
|
+
sage: c = a.interior_product(b); c
|
|
757
|
+
Element i_A B of the Rank-3 free module M over the Integer Ring
|
|
758
|
+
sage: c.display()
|
|
759
|
+
i_A B = -26 e_1 - 19 e_2 + 8 e_3
|
|
760
|
+
sage: latex(c)
|
|
761
|
+
\iota_{A} B
|
|
762
|
+
sage: c == a.contract(b)
|
|
763
|
+
True
|
|
764
|
+
|
|
765
|
+
Case ``p=1`` and ``q=3``::
|
|
766
|
+
|
|
767
|
+
sage: b = M.alternating_contravariant_tensor(3, name='B')
|
|
768
|
+
sage: b[1,2,3] = 5
|
|
769
|
+
sage: c = a.interior_product(b); c
|
|
770
|
+
Alternating contravariant tensor i_A B of degree 2 on the Rank-3 free module M over the Integer Ring
|
|
771
|
+
sage: c.display()
|
|
772
|
+
i_A B = 15 e_1∧e_2 - 20 e_1∧e_3 - 10 e_2∧e_3
|
|
773
|
+
sage: c == a.contract(b)
|
|
774
|
+
True
|
|
775
|
+
|
|
776
|
+
Case ``p=2`` and ``q=2``::
|
|
777
|
+
|
|
778
|
+
sage: a = M.alternating_form(2, name='A')
|
|
779
|
+
sage: a[1,2], a[1,3], a[2,3] = 2, -3, 1
|
|
780
|
+
sage: b = M.alternating_contravariant_tensor(2, name='B')
|
|
781
|
+
sage: b[1,2], b[1,3], b[2,3] = 5, 2, 3
|
|
782
|
+
sage: c = a.interior_product(b); c
|
|
783
|
+
14
|
|
784
|
+
sage: c == a.contract(0, 1, b, 0, 1) # contraction on all indices of a
|
|
785
|
+
True
|
|
786
|
+
|
|
787
|
+
Case ``p=2`` and ``q=3``::
|
|
788
|
+
|
|
789
|
+
sage: b = M.alternating_contravariant_tensor(3, name='B')
|
|
790
|
+
sage: b[1,2,3] = 5
|
|
791
|
+
sage: c = a.interior_product(b); c
|
|
792
|
+
Element i_A B of the Rank-3 free module M over the Integer Ring
|
|
793
|
+
sage: c.display()
|
|
794
|
+
i_A B = 10 e_1 + 30 e_2 + 20 e_3
|
|
795
|
+
sage: c == a.contract(0, 1, b, 0, 1)
|
|
796
|
+
True
|
|
797
|
+
|
|
798
|
+
Case ``p=3`` and ``q=3``::
|
|
799
|
+
|
|
800
|
+
sage: a = M.alternating_form(3, name='A')
|
|
801
|
+
sage: a[1,2,3] = -2
|
|
802
|
+
sage: c = a.interior_product(b); c
|
|
803
|
+
-60
|
|
804
|
+
sage: c == a.contract(0, 1, 2, b, 0, 1, 2)
|
|
805
|
+
True
|
|
806
|
+
"""
|
|
807
|
+
from .format_utilities import is_atomic
|
|
808
|
+
from .alternating_contr_tensor import AlternatingContrTensor
|
|
809
|
+
if not isinstance(alt_tensor, AlternatingContrTensor):
|
|
810
|
+
raise TypeError("{} is not an alternating ".format(alt_tensor) +
|
|
811
|
+
"contravariant tensor")
|
|
812
|
+
p_res = alt_tensor._tensor_rank - self._tensor_rank # degree of result
|
|
813
|
+
if self._tensor_rank == 1:
|
|
814
|
+
# Case p = 1:
|
|
815
|
+
res = self.contract(alt_tensor) # contract() deals efficiently
|
|
816
|
+
# with antisymmetry for p = 1
|
|
817
|
+
else:
|
|
818
|
+
# Case p > 1:
|
|
819
|
+
if alt_tensor._fmodule != self._fmodule:
|
|
820
|
+
raise ValueError("{} is not defined on ".format(alt_tensor) +
|
|
821
|
+
"the same module as the {}".format(self))
|
|
822
|
+
if alt_tensor._tensor_rank < self._tensor_rank:
|
|
823
|
+
raise ValueError("the degree of the {} ".format(alt_tensor) +
|
|
824
|
+
"is lower than that of the {}".format(self))
|
|
825
|
+
# Interior product at the component level:
|
|
826
|
+
basis = self.common_basis(alt_tensor)
|
|
827
|
+
if basis is None:
|
|
828
|
+
raise ValueError("no common basis for the interior product")
|
|
829
|
+
comp = self._components[basis].interior_product(
|
|
830
|
+
alt_tensor._components[basis])
|
|
831
|
+
if p_res == 0:
|
|
832
|
+
res = comp # result is a scalar
|
|
833
|
+
else:
|
|
834
|
+
res = self._fmodule.tensor_from_comp((p_res, 0), comp)
|
|
835
|
+
# Name of the result
|
|
836
|
+
res_name = None
|
|
837
|
+
if self._name is not None and alt_tensor._name is not None:
|
|
838
|
+
sname = self._name
|
|
839
|
+
oname = alt_tensor._name
|
|
840
|
+
if not is_atomic(sname):
|
|
841
|
+
sname = '(' + sname + ')'
|
|
842
|
+
if not is_atomic(oname):
|
|
843
|
+
oname = '(' + oname + ')'
|
|
844
|
+
res_name = 'i_' + sname + ' ' + oname
|
|
845
|
+
res_latex_name = None
|
|
846
|
+
if self._latex_name is not None and alt_tensor._latex_name is not None:
|
|
847
|
+
slname = self._latex_name
|
|
848
|
+
olname = alt_tensor._latex_name
|
|
849
|
+
if not is_atomic(olname):
|
|
850
|
+
olname = r'\left(' + olname + r'\right)'
|
|
851
|
+
res_latex_name = r'\iota_{' + slname + '} ' + olname
|
|
852
|
+
if res_name:
|
|
853
|
+
try: # there is no guarantee that the result has set_name
|
|
854
|
+
# and is mutable
|
|
855
|
+
res.set_name(res_name, latex_name=res_latex_name)
|
|
856
|
+
except (AttributeError, TypeError, ValueError):
|
|
857
|
+
pass
|
|
858
|
+
return res
|