passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_modules.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-23768756.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7897025b.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-e34bb864.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-503f0c35.3.29.so +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-aarch64-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-aarch64-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,989 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
Morphisms of vector spaces (linear transformations)
|
|
4
|
+
|
|
5
|
+
AUTHOR:
|
|
6
|
+
|
|
7
|
+
- Rob Beezer: (2011-06-29)
|
|
8
|
+
|
|
9
|
+
A vector space morphism is a homomorphism between vector spaces, better known
|
|
10
|
+
as a linear transformation. These are a specialization of Sage's free module
|
|
11
|
+
homomorphisms. (A free module is like a vector space, but with scalars from a
|
|
12
|
+
ring that may not be a field.) So references to free modules in the
|
|
13
|
+
documentation or error messages should be understood as simply reflecting a
|
|
14
|
+
more general situation.
|
|
15
|
+
|
|
16
|
+
Creation
|
|
17
|
+
--------
|
|
18
|
+
|
|
19
|
+
The constructor :func:`linear_transformation` is designed to accept a
|
|
20
|
+
variety of inputs that can define a linear transformation. See the
|
|
21
|
+
documentation of the function for all the possibilities. Here we give two.
|
|
22
|
+
|
|
23
|
+
First a matrix representation. By default input matrices are understood
|
|
24
|
+
to act on vectors placed to left of the matrix. Optionally, an input
|
|
25
|
+
matrix can be described as acting on vectors placed to the right. ::
|
|
26
|
+
|
|
27
|
+
sage: A = matrix(QQ, [[-1, 2, 3], [4, 2, 0]])
|
|
28
|
+
sage: phi = linear_transformation(A)
|
|
29
|
+
sage: phi
|
|
30
|
+
Vector space morphism represented by the matrix:
|
|
31
|
+
[-1 2 3]
|
|
32
|
+
[ 4 2 0]
|
|
33
|
+
Domain: Vector space of dimension 2 over Rational Field
|
|
34
|
+
Codomain: Vector space of dimension 3 over Rational Field
|
|
35
|
+
sage: phi([2, -3])
|
|
36
|
+
(-14, -2, 6)
|
|
37
|
+
|
|
38
|
+
A symbolic function can be used to specify the "rule" for a
|
|
39
|
+
linear transformation, along with explicit descriptions of the
|
|
40
|
+
domain and codomain. ::
|
|
41
|
+
|
|
42
|
+
sage: # needs sage.symbolic
|
|
43
|
+
sage: F = Integers(13)
|
|
44
|
+
sage: D = F^3
|
|
45
|
+
sage: C = F^2
|
|
46
|
+
sage: x, y, z = var('x y z')
|
|
47
|
+
sage: f(x, y, z) = [2*x + 3*y + 5*z, x + z]
|
|
48
|
+
sage: rho = linear_transformation(D, C, f)
|
|
49
|
+
sage: f(1, 2, 3)
|
|
50
|
+
(23, 4)
|
|
51
|
+
sage: rho([1, 2, 3])
|
|
52
|
+
(10, 4)
|
|
53
|
+
|
|
54
|
+
A "vector space homspace" is the set of all linear transformations
|
|
55
|
+
between two vector spaces. Various input can be coerced into a
|
|
56
|
+
homspace to create a linear transformation. See
|
|
57
|
+
:mod:`sage.modules.vector_space_homspace` for more. ::
|
|
58
|
+
|
|
59
|
+
sage: D = QQ^4
|
|
60
|
+
sage: C = QQ^2
|
|
61
|
+
sage: hom_space = Hom(D, C)
|
|
62
|
+
sage: images = [[1, 3], [2, -1], [4, 0], [3, 7]]
|
|
63
|
+
sage: zeta = hom_space(images)
|
|
64
|
+
sage: zeta
|
|
65
|
+
Vector space morphism represented by the matrix:
|
|
66
|
+
[ 1 3]
|
|
67
|
+
[ 2 -1]
|
|
68
|
+
[ 4 0]
|
|
69
|
+
[ 3 7]
|
|
70
|
+
Domain: Vector space of dimension 4 over Rational Field
|
|
71
|
+
Codomain: Vector space of dimension 2 over Rational Field
|
|
72
|
+
|
|
73
|
+
A homomorphism may also be created via a method on the domain. ::
|
|
74
|
+
|
|
75
|
+
sage: # needs fpylll sage.rings.number_field sage.symbolic
|
|
76
|
+
sage: F = QQ[sqrt(3)]
|
|
77
|
+
sage: a = F.gen(0)
|
|
78
|
+
sage: D = F^2
|
|
79
|
+
sage: C = F^2
|
|
80
|
+
sage: A = matrix(F, [[a, 1], [2*a, 2]])
|
|
81
|
+
sage: psi = D.hom(A, C)
|
|
82
|
+
sage: psi
|
|
83
|
+
Vector space morphism represented by the matrix:
|
|
84
|
+
[ sqrt3 1]
|
|
85
|
+
[2*sqrt3 2]
|
|
86
|
+
Domain: Vector space of dimension 2 over Number Field in sqrt3
|
|
87
|
+
with defining polynomial x^2 - 3 with sqrt3 = 1.732050807568878?
|
|
88
|
+
Codomain: Vector space of dimension 2 over Number Field in sqrt3
|
|
89
|
+
with defining polynomial x^2 - 3 with sqrt3 = 1.732050807568878?
|
|
90
|
+
sage: psi([1, 4])
|
|
91
|
+
(9*sqrt3, 9)
|
|
92
|
+
|
|
93
|
+
Properties
|
|
94
|
+
----------
|
|
95
|
+
|
|
96
|
+
Many natural properties of a linear transformation can be computed.
|
|
97
|
+
Some of these are more general methods of objects in the classes
|
|
98
|
+
:class:`sage.modules.free_module_morphism.FreeModuleMorphism` and
|
|
99
|
+
:class:`sage.modules.matrix_morphism.MatrixMorphism`.
|
|
100
|
+
|
|
101
|
+
Values are computed in a natural way, an inverse image of an
|
|
102
|
+
element can be computed with the ``lift()`` method, when the inverse
|
|
103
|
+
image actually exists. ::
|
|
104
|
+
|
|
105
|
+
sage: A = matrix(QQ, [[1,2], [2,4], [3,6]])
|
|
106
|
+
sage: phi = linear_transformation(A)
|
|
107
|
+
sage: phi([1,2,0])
|
|
108
|
+
(5, 10)
|
|
109
|
+
sage: phi.lift([10, 20])
|
|
110
|
+
(10, 0, 0)
|
|
111
|
+
sage: phi.lift([100, 100])
|
|
112
|
+
Traceback (most recent call last):
|
|
113
|
+
...
|
|
114
|
+
ValueError: element is not in the image
|
|
115
|
+
|
|
116
|
+
Images and pre-images can be computed as vector spaces. ::
|
|
117
|
+
|
|
118
|
+
sage: A = matrix(QQ, [[1,2], [2,4], [3,6]])
|
|
119
|
+
sage: phi = linear_transformation(A)
|
|
120
|
+
sage: phi.image()
|
|
121
|
+
Vector space of degree 2 and dimension 1 over Rational Field
|
|
122
|
+
Basis matrix:
|
|
123
|
+
[1 2]
|
|
124
|
+
|
|
125
|
+
sage: phi.inverse_image( (QQ^2).span([[1,2]]) )
|
|
126
|
+
Vector space of degree 3 and dimension 3 over Rational Field
|
|
127
|
+
Basis matrix:
|
|
128
|
+
[1 0 0]
|
|
129
|
+
[0 1 0]
|
|
130
|
+
[0 0 1]
|
|
131
|
+
|
|
132
|
+
sage: phi.inverse_image( (QQ^2).span([[1,1]]) )
|
|
133
|
+
Vector space of degree 3 and dimension 2 over Rational Field
|
|
134
|
+
Basis matrix:
|
|
135
|
+
[ 1 0 -1/3]
|
|
136
|
+
[ 0 1 -2/3]
|
|
137
|
+
|
|
138
|
+
Injectivity and surjectivity can be checked. ::
|
|
139
|
+
|
|
140
|
+
sage: A = matrix(QQ, [[1,2], [2,4], [3,6]])
|
|
141
|
+
sage: phi = linear_transformation(A)
|
|
142
|
+
sage: phi.is_injective()
|
|
143
|
+
False
|
|
144
|
+
sage: phi.is_surjective()
|
|
145
|
+
False
|
|
146
|
+
|
|
147
|
+
Restrictions and representations
|
|
148
|
+
--------------------------------
|
|
149
|
+
|
|
150
|
+
It is possible to restrict the domain and codomain of a linear
|
|
151
|
+
transformation to make a new linear transformation. We will use
|
|
152
|
+
those commands to replace the domain and codomain by equal vector
|
|
153
|
+
spaces, but with alternate bases. The point here is that the
|
|
154
|
+
matrix representation used to represent linear transformations are
|
|
155
|
+
relative to the bases of both the domain and codomain. ::
|
|
156
|
+
|
|
157
|
+
sage: A = graphs.PetersenGraph().adjacency_matrix() # needs sage.graphs
|
|
158
|
+
sage: V = QQ^10
|
|
159
|
+
sage: phi = linear_transformation(V, V, A) # needs sage.graphs
|
|
160
|
+
sage: phi # needs sage.graphs
|
|
161
|
+
Vector space morphism represented by the matrix:
|
|
162
|
+
[0 1 0 0 1 1 0 0 0 0]
|
|
163
|
+
[1 0 1 0 0 0 1 0 0 0]
|
|
164
|
+
[0 1 0 1 0 0 0 1 0 0]
|
|
165
|
+
[0 0 1 0 1 0 0 0 1 0]
|
|
166
|
+
[1 0 0 1 0 0 0 0 0 1]
|
|
167
|
+
[1 0 0 0 0 0 0 1 1 0]
|
|
168
|
+
[0 1 0 0 0 0 0 0 1 1]
|
|
169
|
+
[0 0 1 0 0 1 0 0 0 1]
|
|
170
|
+
[0 0 0 1 0 1 1 0 0 0]
|
|
171
|
+
[0 0 0 0 1 0 1 1 0 0]
|
|
172
|
+
Domain: Vector space of dimension 10 over Rational Field
|
|
173
|
+
Codomain: Vector space of dimension 10 over Rational Field
|
|
174
|
+
|
|
175
|
+
sage: # needs sage.graphs
|
|
176
|
+
sage: B1 = [V.gen(i) + V.gen(i+1) for i in range(9)] + [V.gen(9)]
|
|
177
|
+
sage: B2 = [V.gen(0)] + [-V.gen(i-1) + V.gen(i) for i in range(1,10)]
|
|
178
|
+
sage: D = V.subspace_with_basis(B1)
|
|
179
|
+
sage: C = V.subspace_with_basis(B2)
|
|
180
|
+
sage: rho = phi.restrict_codomain(C)
|
|
181
|
+
sage: zeta = rho.restrict_domain(D)
|
|
182
|
+
sage: zeta
|
|
183
|
+
Vector space morphism represented by the matrix:
|
|
184
|
+
[6 5 4 3 3 2 1 0 0 0]
|
|
185
|
+
[6 5 4 3 2 2 2 1 0 0]
|
|
186
|
+
[6 6 5 4 3 2 2 2 1 0]
|
|
187
|
+
[6 5 5 4 3 2 2 2 2 1]
|
|
188
|
+
[6 4 4 4 3 3 3 3 2 1]
|
|
189
|
+
[6 5 4 4 4 4 4 4 3 1]
|
|
190
|
+
[6 6 5 4 4 4 3 3 3 2]
|
|
191
|
+
[6 6 6 5 4 4 2 1 1 1]
|
|
192
|
+
[6 6 6 6 5 4 3 1 0 0]
|
|
193
|
+
[3 3 3 3 3 2 2 1 0 0]
|
|
194
|
+
Domain: Vector space of degree 10 and dimension 10 over Rational Field
|
|
195
|
+
User basis matrix:
|
|
196
|
+
[1 1 0 0 0 0 0 0 0 0]
|
|
197
|
+
[0 1 1 0 0 0 0 0 0 0]
|
|
198
|
+
[0 0 1 1 0 0 0 0 0 0]
|
|
199
|
+
[0 0 0 1 1 0 0 0 0 0]
|
|
200
|
+
[0 0 0 0 1 1 0 0 0 0]
|
|
201
|
+
[0 0 0 0 0 1 1 0 0 0]
|
|
202
|
+
[0 0 0 0 0 0 1 1 0 0]
|
|
203
|
+
[0 0 0 0 0 0 0 1 1 0]
|
|
204
|
+
[0 0 0 0 0 0 0 0 1 1]
|
|
205
|
+
[0 0 0 0 0 0 0 0 0 1]
|
|
206
|
+
Codomain: Vector space of degree 10 and dimension 10 over Rational Field
|
|
207
|
+
User basis matrix:
|
|
208
|
+
[ 1 0 0 0 0 0 0 0 0 0]
|
|
209
|
+
[-1 1 0 0 0 0 0 0 0 0]
|
|
210
|
+
[ 0 -1 1 0 0 0 0 0 0 0]
|
|
211
|
+
[ 0 0 -1 1 0 0 0 0 0 0]
|
|
212
|
+
[ 0 0 0 -1 1 0 0 0 0 0]
|
|
213
|
+
[ 0 0 0 0 -1 1 0 0 0 0]
|
|
214
|
+
[ 0 0 0 0 0 -1 1 0 0 0]
|
|
215
|
+
[ 0 0 0 0 0 0 -1 1 0 0]
|
|
216
|
+
[ 0 0 0 0 0 0 0 -1 1 0]
|
|
217
|
+
[ 0 0 0 0 0 0 0 0 -1 1]
|
|
218
|
+
|
|
219
|
+
An endomorphism is a linear transformation with an equal domain and codomain,
|
|
220
|
+
and here each needs to have the same basis. We are using a
|
|
221
|
+
matrix that has well-behaved eigenvalues, as part of showing that these
|
|
222
|
+
do not change as the representation changes. ::
|
|
223
|
+
|
|
224
|
+
sage: # needs sage.graphs
|
|
225
|
+
sage: A = graphs.PetersenGraph().adjacency_matrix()
|
|
226
|
+
sage: V = QQ^10
|
|
227
|
+
sage: phi = linear_transformation(V, V, A)
|
|
228
|
+
sage: phi.eigenvalues() # needs sage.rings.number_field
|
|
229
|
+
[3, -2, -2, -2, -2, 1, 1, 1, 1, 1]
|
|
230
|
+
sage: B1 = [V.gen(i) + V.gen(i+1) for i in range(9)] + [V.gen(9)]
|
|
231
|
+
sage: C = V.subspace_with_basis(B1)
|
|
232
|
+
sage: zeta = phi.restrict(C)
|
|
233
|
+
sage: zeta
|
|
234
|
+
Vector space morphism represented by the matrix:
|
|
235
|
+
[ 1 0 1 -1 2 -1 2 -2 2 -2]
|
|
236
|
+
[ 1 0 1 0 0 0 1 0 0 0]
|
|
237
|
+
[ 0 1 0 1 0 0 0 1 0 0]
|
|
238
|
+
[ 1 -1 2 -1 2 -2 2 -2 3 -2]
|
|
239
|
+
[ 2 -2 2 -1 1 -1 1 0 1 0]
|
|
240
|
+
[ 1 0 0 0 0 0 0 1 1 0]
|
|
241
|
+
[ 0 1 0 0 0 1 -1 1 0 2]
|
|
242
|
+
[ 0 0 1 0 0 2 -1 1 -1 2]
|
|
243
|
+
[ 0 0 0 1 0 1 1 0 0 0]
|
|
244
|
+
[ 0 0 0 0 1 -1 2 -1 1 -1]
|
|
245
|
+
Domain: Vector space of degree 10 and dimension 10 over Rational Field
|
|
246
|
+
User basis matrix:
|
|
247
|
+
[1 1 0 0 0 0 0 0 0 0]
|
|
248
|
+
[0 1 1 0 0 0 0 0 0 0]
|
|
249
|
+
[0 0 1 1 0 0 0 0 0 0]
|
|
250
|
+
[0 0 0 1 1 0 0 0 0 0]
|
|
251
|
+
[0 0 0 0 1 1 0 0 0 0]
|
|
252
|
+
[0 0 0 0 0 1 1 0 0 0]
|
|
253
|
+
[0 0 0 0 0 0 1 1 0 0]
|
|
254
|
+
[0 0 0 0 0 0 0 1 1 0]
|
|
255
|
+
[0 0 0 0 0 0 0 0 1 1]
|
|
256
|
+
[0 0 0 0 0 0 0 0 0 1]
|
|
257
|
+
Codomain: Vector space of degree 10 and dimension 10 over Rational Field
|
|
258
|
+
User basis matrix:
|
|
259
|
+
[1 1 0 0 0 0 0 0 0 0]
|
|
260
|
+
[0 1 1 0 0 0 0 0 0 0]
|
|
261
|
+
[0 0 1 1 0 0 0 0 0 0]
|
|
262
|
+
[0 0 0 1 1 0 0 0 0 0]
|
|
263
|
+
[0 0 0 0 1 1 0 0 0 0]
|
|
264
|
+
[0 0 0 0 0 1 1 0 0 0]
|
|
265
|
+
[0 0 0 0 0 0 1 1 0 0]
|
|
266
|
+
[0 0 0 0 0 0 0 1 1 0]
|
|
267
|
+
[0 0 0 0 0 0 0 0 1 1]
|
|
268
|
+
[0 0 0 0 0 0 0 0 0 1]
|
|
269
|
+
sage: zeta.eigenvalues() # needs sage.rings.number_field
|
|
270
|
+
[3, -2, -2, -2, -2, 1, 1, 1, 1, 1]
|
|
271
|
+
|
|
272
|
+
Equality
|
|
273
|
+
--------
|
|
274
|
+
|
|
275
|
+
Equality of linear transformations is a bit nuanced. The equality operator
|
|
276
|
+
``==`` tests if two linear transformations have equal matrix representations,
|
|
277
|
+
while we determine if two linear transformations are the same function with the
|
|
278
|
+
``.is_equal_function()`` method. Notice in this example that the function
|
|
279
|
+
never changes, just the representations. ::
|
|
280
|
+
|
|
281
|
+
sage: f = lambda x: vector(QQ, [x[1], x[0]+x[1], x[0]])
|
|
282
|
+
sage: H = Hom(QQ^2, QQ^3)
|
|
283
|
+
sage: phi = H(f)
|
|
284
|
+
|
|
285
|
+
sage: rho = linear_transformation(QQ^2, QQ^3, matrix(QQ,2, 3, [[0,1,1], [1,1,0]]))
|
|
286
|
+
|
|
287
|
+
sage: phi == rho
|
|
288
|
+
True
|
|
289
|
+
|
|
290
|
+
sage: U = (QQ^2).subspace_with_basis([[1, 2], [-3, 1]])
|
|
291
|
+
sage: V = (QQ^3).subspace_with_basis([[0, 1, 0], [2, 3, 1], [-1, 1, 6]])
|
|
292
|
+
sage: K = Hom(U, V)
|
|
293
|
+
sage: zeta = K(f)
|
|
294
|
+
|
|
295
|
+
sage: zeta == phi
|
|
296
|
+
False
|
|
297
|
+
sage: zeta.is_equal_function(phi)
|
|
298
|
+
True
|
|
299
|
+
sage: zeta.is_equal_function(rho)
|
|
300
|
+
True
|
|
301
|
+
|
|
302
|
+
TESTS::
|
|
303
|
+
|
|
304
|
+
sage: V = QQ^2
|
|
305
|
+
sage: H = Hom(V, V)
|
|
306
|
+
sage: f = H([V.1,-2*V.0])
|
|
307
|
+
sage: loads(dumps(f))
|
|
308
|
+
Vector space morphism represented by the matrix:
|
|
309
|
+
[ 0 1]
|
|
310
|
+
[-2 0]
|
|
311
|
+
Domain: Vector space of dimension 2 over Rational Field
|
|
312
|
+
Codomain: Vector space of dimension 2 over Rational Field
|
|
313
|
+
sage: loads(dumps(f)) == f
|
|
314
|
+
True
|
|
315
|
+
"""
|
|
316
|
+
|
|
317
|
+
####################################################################################
|
|
318
|
+
# Copyright (C) 2011 Rob Beezer <beezer@ups.edu>
|
|
319
|
+
#
|
|
320
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
321
|
+
#
|
|
322
|
+
# This code is distributed in the hope that it will be useful,
|
|
323
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
324
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
325
|
+
# General Public License for more details.
|
|
326
|
+
#
|
|
327
|
+
# The full text of the GPL is available at:
|
|
328
|
+
#
|
|
329
|
+
# http://www.gnu.org/licenses/
|
|
330
|
+
####################################################################################
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
import sage.modules.free_module_morphism as free_module_morphism
|
|
334
|
+
import sage.modules.matrix_morphism as matrix_morphism
|
|
335
|
+
from sage.modules import vector_space_homspace
|
|
336
|
+
from sage.structure.element import Matrix
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def linear_transformation(arg0, arg1=None, arg2=None, side='left'):
|
|
340
|
+
r"""
|
|
341
|
+
Create a linear transformation from a variety of possible inputs.
|
|
342
|
+
|
|
343
|
+
FORMATS:
|
|
344
|
+
|
|
345
|
+
In the following, ``D`` and ``C`` are vector spaces over
|
|
346
|
+
the same field that are the domain and codomain
|
|
347
|
+
(respectively) of the linear transformation.
|
|
348
|
+
|
|
349
|
+
``side`` is a keyword that is either ``'left'`` or ``'right'``.
|
|
350
|
+
When a matrix is used to specify a linear transformation,
|
|
351
|
+
as in the first two call formats below, you may specify
|
|
352
|
+
if the function is given by matrix multiplication with
|
|
353
|
+
the vector on the left, or the vector on the right.
|
|
354
|
+
The default is 'left'. The matrix
|
|
355
|
+
representation may be obtained as either version, no matter
|
|
356
|
+
how it is created.
|
|
357
|
+
|
|
358
|
+
- ``linear_transformation(A, side='left')``
|
|
359
|
+
|
|
360
|
+
Where ``A`` is a matrix. The domain and codomain are inferred
|
|
361
|
+
from the dimension of the matrix and the base ring of the matrix.
|
|
362
|
+
The base ring must be a field, or have its fraction field implemented
|
|
363
|
+
in Sage.
|
|
364
|
+
|
|
365
|
+
- ``linear_transformation(D, C, A, side='left')``
|
|
366
|
+
|
|
367
|
+
``A`` is a matrix that behaves as above. However, now the domain
|
|
368
|
+
and codomain are given explicitly. The matrix is checked for
|
|
369
|
+
compatibility with the domain and codomain. Additionally, the
|
|
370
|
+
domain and codomain may be supplied with alternate ("user") bases
|
|
371
|
+
and the matrix is interpreted as being a representation relative
|
|
372
|
+
to those bases.
|
|
373
|
+
|
|
374
|
+
- ``linear_transformation(D, C, f)``
|
|
375
|
+
|
|
376
|
+
``f`` is any function that can be applied to the basis elements of the
|
|
377
|
+
domain and that produces elements of the codomain. The linear
|
|
378
|
+
transformation returned is the unique linear transformation that
|
|
379
|
+
extends this mapping on the basis elements. ``f`` may come from a
|
|
380
|
+
function defined by a Python ``def`` statement, or may be defined as a
|
|
381
|
+
``lambda`` function.
|
|
382
|
+
|
|
383
|
+
Alternatively, ``f`` may be specified by a callable symbolic function,
|
|
384
|
+
see the examples below for a demonstration.
|
|
385
|
+
|
|
386
|
+
- ``linear_transformation(D, C, images)``
|
|
387
|
+
|
|
388
|
+
``images`` is a list, or tuple, of codomain elements, equal in number
|
|
389
|
+
to the size of the basis of the domain. Each basis element of the domain
|
|
390
|
+
is mapped to the corresponding element of the ``images`` list, and the
|
|
391
|
+
linear transformation returned is the unique linear transformation that
|
|
392
|
+
extends this mapping.
|
|
393
|
+
|
|
394
|
+
OUTPUT:
|
|
395
|
+
|
|
396
|
+
A linear transformation described by the input. This is a
|
|
397
|
+
"vector space morphism", an object of the class
|
|
398
|
+
:class:`sage.modules.vector_space_morphism`.
|
|
399
|
+
|
|
400
|
+
EXAMPLES:
|
|
401
|
+
|
|
402
|
+
We can define a linear transformation with just a matrix, understood to
|
|
403
|
+
act on a vector placed on one side or the other. The field for the
|
|
404
|
+
vector spaces used as domain and codomain is obtained from the base
|
|
405
|
+
ring of the matrix, possibly promoting to a fraction field. ::
|
|
406
|
+
|
|
407
|
+
sage: A = matrix(ZZ, [[1, -1, 4], [2, 0, 5]])
|
|
408
|
+
sage: phi = linear_transformation(A)
|
|
409
|
+
sage: phi
|
|
410
|
+
Vector space morphism represented by the matrix:
|
|
411
|
+
[ 1 -1 4]
|
|
412
|
+
[ 2 0 5]
|
|
413
|
+
Domain: Vector space of dimension 2 over Rational Field
|
|
414
|
+
Codomain: Vector space of dimension 3 over Rational Field
|
|
415
|
+
sage: phi([1/2, 5])
|
|
416
|
+
(21/2, -1/2, 27)
|
|
417
|
+
|
|
418
|
+
sage: B = matrix(Integers(7), [[1, 2, 1], [3, 5, 6]])
|
|
419
|
+
sage: rho = linear_transformation(B, side='right')
|
|
420
|
+
sage: rho
|
|
421
|
+
Vector space morphism represented by the matrix:
|
|
422
|
+
[1 3]
|
|
423
|
+
[2 5]
|
|
424
|
+
[1 6]
|
|
425
|
+
Domain: Vector space of dimension 3 over Ring of integers modulo 7
|
|
426
|
+
Codomain: Vector space of dimension 2 over Ring of integers modulo 7
|
|
427
|
+
sage: rho([2, 4, 6])
|
|
428
|
+
(2, 6)
|
|
429
|
+
|
|
430
|
+
We can define a linear transformation with a matrix, while explicitly
|
|
431
|
+
giving the domain and codomain. Matrix entries will be coerced into the
|
|
432
|
+
common field of scalars for the vector spaces. ::
|
|
433
|
+
|
|
434
|
+
sage: D = QQ^3
|
|
435
|
+
sage: C = QQ^2
|
|
436
|
+
sage: A = matrix([[1, 7], [2, -1], [0, 5]])
|
|
437
|
+
sage: A.parent()
|
|
438
|
+
Full MatrixSpace of 3 by 2 dense matrices over Integer Ring
|
|
439
|
+
sage: zeta = linear_transformation(D, C, A)
|
|
440
|
+
sage: zeta.matrix().parent()
|
|
441
|
+
Full MatrixSpace of 3 by 2 dense matrices over Rational Field
|
|
442
|
+
sage: zeta
|
|
443
|
+
Vector space morphism represented by the matrix:
|
|
444
|
+
[ 1 7]
|
|
445
|
+
[ 2 -1]
|
|
446
|
+
[ 0 5]
|
|
447
|
+
Domain: Vector space of dimension 3 over Rational Field
|
|
448
|
+
Codomain: Vector space of dimension 2 over Rational Field
|
|
449
|
+
|
|
450
|
+
Matrix representations are relative to the bases for the domain
|
|
451
|
+
and codomain. ::
|
|
452
|
+
|
|
453
|
+
sage: u = vector(QQ, [1, -1])
|
|
454
|
+
sage: v = vector(QQ, [2, 3])
|
|
455
|
+
sage: D = (QQ^2).subspace_with_basis([u, v])
|
|
456
|
+
sage: x = vector(QQ, [2, 1])
|
|
457
|
+
sage: y = vector(QQ, [-1, 4])
|
|
458
|
+
sage: C = (QQ^2).subspace_with_basis([x, y])
|
|
459
|
+
sage: A = matrix(QQ, [[2, 5], [3, 7]])
|
|
460
|
+
sage: psi = linear_transformation(D, C, A)
|
|
461
|
+
sage: psi
|
|
462
|
+
Vector space morphism represented by the matrix:
|
|
463
|
+
[2 5]
|
|
464
|
+
[3 7]
|
|
465
|
+
Domain: Vector space of degree 2 and dimension 2 over Rational Field
|
|
466
|
+
User basis matrix:
|
|
467
|
+
[ 1 -1]
|
|
468
|
+
[ 2 3]
|
|
469
|
+
Codomain: Vector space of degree 2 and dimension 2 over Rational Field
|
|
470
|
+
User basis matrix:
|
|
471
|
+
[ 2 1]
|
|
472
|
+
[-1 4]
|
|
473
|
+
sage: psi(u) == 2*x + 5*y
|
|
474
|
+
True
|
|
475
|
+
sage: psi(v) == 3*x + 7*y
|
|
476
|
+
True
|
|
477
|
+
|
|
478
|
+
Functions that act on the domain may be used to compute images of
|
|
479
|
+
the domain's basis elements, and this mapping can be extended to
|
|
480
|
+
a unique linear transformation. The function may be a Python
|
|
481
|
+
function (via ``def`` or ``lambda``) or a Sage symbolic function. ::
|
|
482
|
+
|
|
483
|
+
sage: def g(x):
|
|
484
|
+
....: return vector(QQ, [2*x[0]+x[2], 5*x[1]])
|
|
485
|
+
sage: phi = linear_transformation(QQ^3, QQ^2, g)
|
|
486
|
+
sage: phi
|
|
487
|
+
Vector space morphism represented by the matrix:
|
|
488
|
+
[2 0]
|
|
489
|
+
[0 5]
|
|
490
|
+
[1 0]
|
|
491
|
+
Domain: Vector space of dimension 3 over Rational Field
|
|
492
|
+
Codomain: Vector space of dimension 2 over Rational Field
|
|
493
|
+
|
|
494
|
+
sage: f = lambda x: vector(QQ, [2*x[0]+x[2], 5*x[1]])
|
|
495
|
+
sage: rho = linear_transformation(QQ^3, QQ^2, f)
|
|
496
|
+
sage: rho
|
|
497
|
+
Vector space morphism represented by the matrix:
|
|
498
|
+
[2 0]
|
|
499
|
+
[0 5]
|
|
500
|
+
[1 0]
|
|
501
|
+
Domain: Vector space of dimension 3 over Rational Field
|
|
502
|
+
Codomain: Vector space of dimension 2 over Rational Field
|
|
503
|
+
|
|
504
|
+
sage: # needs sage.symbolic
|
|
505
|
+
sage: x, y, z = var('x y z')
|
|
506
|
+
sage: h(x, y, z) = [2*x + z, 5*y]
|
|
507
|
+
sage: zeta = linear_transformation(QQ^3, QQ^2, h)
|
|
508
|
+
sage: zeta
|
|
509
|
+
Vector space morphism represented by the matrix:
|
|
510
|
+
[2 0]
|
|
511
|
+
[0 5]
|
|
512
|
+
[1 0]
|
|
513
|
+
Domain: Vector space of dimension 3 over Rational Field
|
|
514
|
+
Codomain: Vector space of dimension 2 over Rational Field
|
|
515
|
+
|
|
516
|
+
sage: phi == rho
|
|
517
|
+
True
|
|
518
|
+
sage: rho == zeta # needs sage.symbolic
|
|
519
|
+
True
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
We create a linear transformation relative to non-standard bases,
|
|
523
|
+
and capture its representation relative to standard bases. With this, we
|
|
524
|
+
can build functions that create the same linear transformation relative
|
|
525
|
+
to the nonstandard bases. ::
|
|
526
|
+
|
|
527
|
+
sage: u = vector(QQ, [1, -1])
|
|
528
|
+
sage: v = vector(QQ, [2, 3])
|
|
529
|
+
sage: D = (QQ^2).subspace_with_basis([u, v])
|
|
530
|
+
sage: x = vector(QQ, [2, 1])
|
|
531
|
+
sage: y = vector(QQ, [-1, 4])
|
|
532
|
+
sage: C = (QQ^2).subspace_with_basis([x, y])
|
|
533
|
+
sage: A = matrix(QQ, [[2, 5], [3, 7]])
|
|
534
|
+
sage: psi = linear_transformation(D, C, A)
|
|
535
|
+
sage: rho = psi.restrict_codomain(QQ^2).restrict_domain(QQ^2)
|
|
536
|
+
sage: rho.matrix()
|
|
537
|
+
[ -4/5 97/5]
|
|
538
|
+
[ 1/5 -13/5]
|
|
539
|
+
|
|
540
|
+
sage: f = lambda x: vector(QQ, [(-4/5)*x[0] + (1/5)*x[1], (97/5)*x[0] + (-13/5)*x[1]])
|
|
541
|
+
sage: psi = linear_transformation(D, C, f)
|
|
542
|
+
sage: psi.matrix()
|
|
543
|
+
[2 5]
|
|
544
|
+
[3 7]
|
|
545
|
+
|
|
546
|
+
sage: # needs sage.symbolic
|
|
547
|
+
sage: s, t = var('s t')
|
|
548
|
+
sage: h(s, t) = [(-4/5)*s + (1/5)*t, (97/5)*s + (-13/5)*t]
|
|
549
|
+
sage: zeta = linear_transformation(D, C, h)
|
|
550
|
+
sage: zeta.matrix()
|
|
551
|
+
[2 5]
|
|
552
|
+
[3 7]
|
|
553
|
+
|
|
554
|
+
Finally, we can give an explicit list of images for the basis
|
|
555
|
+
elements of the domain. ::
|
|
556
|
+
|
|
557
|
+
sage: # needs sage.rings.number_field
|
|
558
|
+
sage: x = polygen(QQ)
|
|
559
|
+
sage: F.<a> = NumberField(x^3 + x + 1)
|
|
560
|
+
sage: u = vector(F, [1, a, a^2])
|
|
561
|
+
sage: v = vector(F, [a, a^2, 2])
|
|
562
|
+
sage: w = u + v
|
|
563
|
+
sage: D = F^3
|
|
564
|
+
sage: C = F^3
|
|
565
|
+
sage: rho = linear_transformation(D, C, [u, v, w])
|
|
566
|
+
sage: rho.matrix()
|
|
567
|
+
[ 1 a a^2]
|
|
568
|
+
[ a a^2 2]
|
|
569
|
+
[ a + 1 a^2 + a a^2 + 2]
|
|
570
|
+
sage: C = (F^3).subspace_with_basis([u, v])
|
|
571
|
+
sage: D = (F^3).subspace_with_basis([u, v])
|
|
572
|
+
sage: psi = linear_transformation(C, D, [u+v, u-v])
|
|
573
|
+
sage: psi.matrix()
|
|
574
|
+
[ 1 1]
|
|
575
|
+
[ 1 -1]
|
|
576
|
+
|
|
577
|
+
TESTS:
|
|
578
|
+
|
|
579
|
+
We test some bad inputs. First, the wrong things in the wrong places. ::
|
|
580
|
+
|
|
581
|
+
sage: linear_transformation('junk')
|
|
582
|
+
Traceback (most recent call last):
|
|
583
|
+
...
|
|
584
|
+
TypeError: first argument must be a matrix or a vector space, not junk
|
|
585
|
+
|
|
586
|
+
sage: linear_transformation(QQ^2, QQ^3, 'stuff')
|
|
587
|
+
Traceback (most recent call last):
|
|
588
|
+
...
|
|
589
|
+
TypeError: third argument must be a matrix, function, or list of images, not stuff
|
|
590
|
+
|
|
591
|
+
sage: linear_transformation(QQ^2, 'garbage')
|
|
592
|
+
Traceback (most recent call last):
|
|
593
|
+
...
|
|
594
|
+
TypeError: if first argument is a vector space, then second argument must be a vector space, not garbage
|
|
595
|
+
|
|
596
|
+
sage: linear_transformation(QQ^2, Integers(7)^2)
|
|
597
|
+
Traceback (most recent call last):
|
|
598
|
+
...
|
|
599
|
+
TypeError: vector spaces must have the same field of scalars, not Rational Field and Ring of integers modulo 7
|
|
600
|
+
|
|
601
|
+
Matrices must be over a field (or a ring that can be promoted to a field),
|
|
602
|
+
and of the right size. ::
|
|
603
|
+
|
|
604
|
+
sage: linear_transformation(matrix(Integers(6), [[2, 3],[4, 5]]))
|
|
605
|
+
Traceback (most recent call last):
|
|
606
|
+
...
|
|
607
|
+
TypeError: matrix must have entries from a field, or a ring with a fraction field, not Ring of integers modulo 6
|
|
608
|
+
|
|
609
|
+
sage: A = matrix(QQ, 3, 4, range(12))
|
|
610
|
+
sage: linear_transformation(QQ^4, QQ^4, A)
|
|
611
|
+
Traceback (most recent call last):
|
|
612
|
+
...
|
|
613
|
+
TypeError: domain dimension is incompatible with matrix size
|
|
614
|
+
|
|
615
|
+
sage: linear_transformation(QQ^3, QQ^3, A, side='right')
|
|
616
|
+
Traceback (most recent call last):
|
|
617
|
+
...
|
|
618
|
+
TypeError: domain dimension is incompatible with matrix size
|
|
619
|
+
|
|
620
|
+
sage: linear_transformation(QQ^3, QQ^3, A)
|
|
621
|
+
Traceback (most recent call last):
|
|
622
|
+
...
|
|
623
|
+
TypeError: codomain dimension is incompatible with matrix size
|
|
624
|
+
|
|
625
|
+
sage: linear_transformation(QQ^4, QQ^4, A, side='right')
|
|
626
|
+
Traceback (most recent call last):
|
|
627
|
+
...
|
|
628
|
+
TypeError: codomain dimension is incompatible with matrix size
|
|
629
|
+
|
|
630
|
+
Lists of images can be of the wrong number, or not really
|
|
631
|
+
elements of the codomain. ::
|
|
632
|
+
|
|
633
|
+
sage: linear_transformation(QQ^3, QQ^2, [vector(QQ, [1,2])])
|
|
634
|
+
Traceback (most recent call last):
|
|
635
|
+
...
|
|
636
|
+
ValueError: number of images should equal the size of the domain's basis (=3), not 1
|
|
637
|
+
|
|
638
|
+
sage: C = (QQ^2).subspace_with_basis([vector(QQ, [1,1])])
|
|
639
|
+
sage: linear_transformation(QQ^1, C, [vector(QQ, [1,2])])
|
|
640
|
+
Traceback (most recent call last):
|
|
641
|
+
...
|
|
642
|
+
ArithmeticError: some proposed image is not in the codomain, because
|
|
643
|
+
element [1, 2] is not in free module
|
|
644
|
+
|
|
645
|
+
|
|
646
|
+
Functions may not apply properly to domain elements,
|
|
647
|
+
or return values outside the codomain. ::
|
|
648
|
+
|
|
649
|
+
sage: f = lambda x: vector(QQ, [x[0], x[4]])
|
|
650
|
+
sage: linear_transformation(QQ^3, QQ^2, f)
|
|
651
|
+
Traceback (most recent call last):
|
|
652
|
+
...
|
|
653
|
+
ValueError: function cannot be applied properly to some basis element because
|
|
654
|
+
vector index out of range
|
|
655
|
+
|
|
656
|
+
sage: f = lambda x: vector(QQ, [x[0], x[1]])
|
|
657
|
+
sage: C = (QQ^2).span([vector(QQ, [1, 1])])
|
|
658
|
+
sage: linear_transformation(QQ^2, C, f)
|
|
659
|
+
Traceback (most recent call last):
|
|
660
|
+
...
|
|
661
|
+
ArithmeticError: some image of the function is not in the codomain, because
|
|
662
|
+
element [1, 0] is not in free module
|
|
663
|
+
|
|
664
|
+
A Sage symbolic function can come in a variety of forms that are
|
|
665
|
+
not representative of a linear transformation. ::
|
|
666
|
+
|
|
667
|
+
sage: x, y = var('x, y') # needs sage.symbolic
|
|
668
|
+
sage: f(x, y) = [y, x, y] # needs sage.symbolic
|
|
669
|
+
sage: linear_transformation(QQ^3, QQ^3, f) # needs sage.symbolic
|
|
670
|
+
Traceback (most recent call last):
|
|
671
|
+
...
|
|
672
|
+
ValueError: symbolic function has the wrong number of inputs for domain
|
|
673
|
+
|
|
674
|
+
sage: linear_transformation(QQ^2, QQ^2, f) # needs sage.symbolic
|
|
675
|
+
Traceback (most recent call last):
|
|
676
|
+
...
|
|
677
|
+
ValueError: symbolic function has the wrong number of outputs for codomain
|
|
678
|
+
|
|
679
|
+
sage: x, y = var('x y') # needs sage.symbolic
|
|
680
|
+
sage: f(x, y) = [y, x*y] # needs sage.symbolic
|
|
681
|
+
sage: linear_transformation(QQ^2, QQ^2, f) # needs sage.symbolic
|
|
682
|
+
Traceback (most recent call last):
|
|
683
|
+
...
|
|
684
|
+
ValueError: symbolic function must be linear in all the inputs:
|
|
685
|
+
unable to convert y to a rational
|
|
686
|
+
|
|
687
|
+
sage: # needs sage.symbolic
|
|
688
|
+
sage: x, y = var('x y')
|
|
689
|
+
sage: f(x, y) = [x, 2*y]
|
|
690
|
+
sage: C = (QQ^2).span([vector(QQ, [1, 1])])
|
|
691
|
+
sage: linear_transformation(QQ^2, C, f)
|
|
692
|
+
Traceback (most recent call last):
|
|
693
|
+
...
|
|
694
|
+
ArithmeticError: some image of the function is not in the codomain, because
|
|
695
|
+
element [1, 0] is not in free module
|
|
696
|
+
"""
|
|
697
|
+
from sage.categories.homset import Hom
|
|
698
|
+
from sage.matrix.constructor import matrix
|
|
699
|
+
from sage.modules.free_module import VectorSpace
|
|
700
|
+
from sage.modules.module import Module
|
|
701
|
+
try:
|
|
702
|
+
from sage.modules.vector_callable_symbolic_dense import (
|
|
703
|
+
Vector_callable_symbolic_dense,
|
|
704
|
+
)
|
|
705
|
+
except ImportError:
|
|
706
|
+
Vector_callable_symbolic_dense = ()
|
|
707
|
+
|
|
708
|
+
if side not in ['left', 'right']:
|
|
709
|
+
raise ValueError("side must be 'left' or 'right', not {}".format(side))
|
|
710
|
+
if isinstance(arg0, Matrix):
|
|
711
|
+
R = arg0.base_ring()
|
|
712
|
+
if not R.is_field():
|
|
713
|
+
try:
|
|
714
|
+
R = R.fraction_field()
|
|
715
|
+
except (NotImplementedError, TypeError):
|
|
716
|
+
msg = 'matrix must have entries from a field, or a ring with a fraction field, not {0}'
|
|
717
|
+
raise TypeError(msg.format(R))
|
|
718
|
+
if side == 'right':
|
|
719
|
+
arg0 = arg0.transpose()
|
|
720
|
+
side = 'left'
|
|
721
|
+
arg2 = arg0
|
|
722
|
+
arg0 = VectorSpace(R, arg2.nrows())
|
|
723
|
+
arg1 = VectorSpace(R, arg2.ncols())
|
|
724
|
+
elif isinstance(arg0, Module) and arg0.base_ring().is_field():
|
|
725
|
+
if not (isinstance(arg1, Module) and arg1.base_ring().is_field()):
|
|
726
|
+
msg = 'if first argument is a vector space, then second argument must be a vector space, not {0}'
|
|
727
|
+
raise TypeError(msg.format(arg1))
|
|
728
|
+
if arg0.base_ring() != arg1.base_ring():
|
|
729
|
+
msg = 'vector spaces must have the same field of scalars, not {0} and {1}'
|
|
730
|
+
raise TypeError(msg.format(arg0.base_ring(), arg1.base_ring()))
|
|
731
|
+
else:
|
|
732
|
+
raise TypeError('first argument must be a matrix or a vector space, not {}'.format(arg0))
|
|
733
|
+
# Now arg0 = domain D, arg1 = codomain C, and
|
|
734
|
+
# both are vector spaces with common field of scalars
|
|
735
|
+
# use these to make a VectorSpaceHomSpace
|
|
736
|
+
# arg2 might be a matrix that began in arg0
|
|
737
|
+
D = arg0
|
|
738
|
+
C = arg1
|
|
739
|
+
H = Hom(D, C, category=None)
|
|
740
|
+
|
|
741
|
+
# Examine arg2 as the "rule" for the linear transformation
|
|
742
|
+
# Pass on matrices, Python functions and lists to homspace call
|
|
743
|
+
# Convert symbolic function here, to a matrix
|
|
744
|
+
if isinstance(arg2, Matrix):
|
|
745
|
+
if side == 'right':
|
|
746
|
+
arg2 = arg2.transpose()
|
|
747
|
+
elif isinstance(arg2, (list, tuple)):
|
|
748
|
+
pass
|
|
749
|
+
elif isinstance(arg2, Vector_callable_symbolic_dense):
|
|
750
|
+
from sage.symbolic.ring import SR
|
|
751
|
+
args = arg2.parent().base_ring()._arguments
|
|
752
|
+
exprs = arg2.change_ring(SR)
|
|
753
|
+
m = len(args)
|
|
754
|
+
n = len(exprs)
|
|
755
|
+
if m != D.degree():
|
|
756
|
+
raise ValueError('symbolic function has the wrong number of inputs for domain')
|
|
757
|
+
if n != C.degree():
|
|
758
|
+
raise ValueError('symbolic function has the wrong number of outputs for codomain')
|
|
759
|
+
arg2 = [[e.coefficient(a) for e in exprs] for a in args]
|
|
760
|
+
try:
|
|
761
|
+
arg2 = matrix(D.base_ring(), m, n, arg2)
|
|
762
|
+
except TypeError as e:
|
|
763
|
+
msg = 'symbolic function must be linear in all the inputs:\n' + e.args[0]
|
|
764
|
+
raise ValueError(msg)
|
|
765
|
+
# have matrix with respect to standard bases, now consider user bases
|
|
766
|
+
images = [v * arg2 for v in D.basis()]
|
|
767
|
+
try:
|
|
768
|
+
arg2 = matrix([C.coordinates(C(a)) for a in images])
|
|
769
|
+
except (ArithmeticError, TypeError) as e:
|
|
770
|
+
msg = 'some image of the function is not in the codomain, because\n' + e.args[0]
|
|
771
|
+
raise ArithmeticError(msg)
|
|
772
|
+
elif callable(arg2):
|
|
773
|
+
pass
|
|
774
|
+
else:
|
|
775
|
+
msg = 'third argument must be a matrix, function, or list of images, not {0}'
|
|
776
|
+
raise TypeError(msg.format(arg2))
|
|
777
|
+
|
|
778
|
+
# arg2 now compatible with homspace H call method
|
|
779
|
+
# __init__ will check matrix sizes versus domain/codomain dimensions
|
|
780
|
+
return H(arg2)
|
|
781
|
+
|
|
782
|
+
|
|
783
|
+
def is_VectorSpaceMorphism(x) -> bool:
|
|
784
|
+
r"""
|
|
785
|
+
Return ``True`` if ``x`` is a vector space morphism (a linear transformation).
|
|
786
|
+
|
|
787
|
+
This function is deprecated.
|
|
788
|
+
|
|
789
|
+
INPUT:
|
|
790
|
+
|
|
791
|
+
- ``x`` -- anything
|
|
792
|
+
|
|
793
|
+
OUTPUT:
|
|
794
|
+
|
|
795
|
+
``True`` only if ``x`` is an instance of a vector space morphism,
|
|
796
|
+
which are also known as linear transformations.
|
|
797
|
+
|
|
798
|
+
EXAMPLES::
|
|
799
|
+
|
|
800
|
+
sage: V = QQ^2; f = V.hom([V.1,-2*V.0])
|
|
801
|
+
sage: sage.modules.vector_space_morphism.is_VectorSpaceMorphism(f)
|
|
802
|
+
doctest:warning...
|
|
803
|
+
DeprecationWarning: is_VectorSpaceMorphism is deprecated;
|
|
804
|
+
use isinstance(..., VectorSpaceMorphism) or categories instead
|
|
805
|
+
See https://github.com/sagemath/sage/issues/37731 for details.
|
|
806
|
+
True
|
|
807
|
+
sage: sage.modules.vector_space_morphism.is_VectorSpaceMorphism('junk')
|
|
808
|
+
False
|
|
809
|
+
"""
|
|
810
|
+
from sage.misc.superseded import deprecation
|
|
811
|
+
deprecation(37731,
|
|
812
|
+
"is_VectorSpaceMorphism is deprecated; "
|
|
813
|
+
"use isinstance(..., VectorSpaceMorphism) or categories instead")
|
|
814
|
+
return isinstance(x, VectorSpaceMorphism)
|
|
815
|
+
|
|
816
|
+
|
|
817
|
+
class VectorSpaceMorphism(free_module_morphism.FreeModuleMorphism):
|
|
818
|
+
|
|
819
|
+
def __init__(self, homspace, A, side='left'):
|
|
820
|
+
r"""
|
|
821
|
+
Create a linear transformation, a morphism between vector spaces.
|
|
822
|
+
|
|
823
|
+
INPUT:
|
|
824
|
+
|
|
825
|
+
- ``homspace`` -- a homspace (of vector spaces) to serve
|
|
826
|
+
as a parent for the linear transformation and a home for
|
|
827
|
+
the domain and codomain of the morphism
|
|
828
|
+
- ``A`` -- a matrix representing the linear transformation,
|
|
829
|
+
which will act on vectors placed to the left of the matrix
|
|
830
|
+
|
|
831
|
+
EXAMPLES:
|
|
832
|
+
|
|
833
|
+
Nominally, we require a homspace to hold the domain
|
|
834
|
+
and codomain and a matrix representation of the morphism
|
|
835
|
+
(linear transformation). ::
|
|
836
|
+
|
|
837
|
+
sage: from sage.modules.vector_space_homspace import VectorSpaceHomspace
|
|
838
|
+
sage: from sage.modules.vector_space_morphism import VectorSpaceMorphism
|
|
839
|
+
sage: H = VectorSpaceHomspace(QQ^3, QQ^2)
|
|
840
|
+
sage: A = matrix(QQ, 3, 2, range(6))
|
|
841
|
+
sage: zeta = VectorSpaceMorphism(H, A)
|
|
842
|
+
sage: zeta
|
|
843
|
+
Vector space morphism represented by the matrix:
|
|
844
|
+
[0 1]
|
|
845
|
+
[2 3]
|
|
846
|
+
[4 5]
|
|
847
|
+
Domain: Vector space of dimension 3 over Rational Field
|
|
848
|
+
Codomain: Vector space of dimension 2 over Rational Field
|
|
849
|
+
|
|
850
|
+
See the constructor,
|
|
851
|
+
:func:`sage.modules.vector_space_morphism.linear_transformation`
|
|
852
|
+
for another way to create linear transformations.
|
|
853
|
+
|
|
854
|
+
The ``.hom()`` method of a vector space will create a vector
|
|
855
|
+
space morphism. ::
|
|
856
|
+
|
|
857
|
+
sage: V = QQ^3; W = V.subspace_with_basis([[1,2,3], [-1,2,5/3], [0,1,-1]])
|
|
858
|
+
sage: phi = V.hom(matrix(QQ, 3, range(9)), codomain=W) # indirect doctest
|
|
859
|
+
sage: type(phi)
|
|
860
|
+
<class 'sage.modules.vector_space_morphism.VectorSpaceMorphism'>
|
|
861
|
+
|
|
862
|
+
A matrix may be coerced into a vector space homspace to
|
|
863
|
+
create a vector space morphism. ::
|
|
864
|
+
|
|
865
|
+
sage: from sage.modules.vector_space_homspace import VectorSpaceHomspace
|
|
866
|
+
sage: H = VectorSpaceHomspace(QQ^3, QQ^2)
|
|
867
|
+
sage: A = matrix(QQ, 3, 2, range(6))
|
|
868
|
+
sage: rho = H(A) # indirect doctest
|
|
869
|
+
sage: type(rho)
|
|
870
|
+
<class 'sage.modules.vector_space_morphism.VectorSpaceMorphism'>
|
|
871
|
+
"""
|
|
872
|
+
if not isinstance(homspace, vector_space_homspace.VectorSpaceHomspace):
|
|
873
|
+
raise TypeError('homspace must be a vector space hom space, not {}'.format(homspace))
|
|
874
|
+
if isinstance(A, matrix_morphism.MatrixMorphism):
|
|
875
|
+
A = A.matrix()
|
|
876
|
+
if not isinstance(A, Matrix):
|
|
877
|
+
msg = 'input must be a matrix representation or another matrix morphism, not {0}'
|
|
878
|
+
raise TypeError(msg.format(A))
|
|
879
|
+
# now have a vector space homspace, and a matrix, check compatibility
|
|
880
|
+
if side == "left":
|
|
881
|
+
if homspace.domain().dimension() != A.nrows():
|
|
882
|
+
raise TypeError('domain dimension is incompatible with matrix size')
|
|
883
|
+
if homspace.codomain().dimension() != A.ncols():
|
|
884
|
+
raise TypeError('codomain dimension is incompatible with matrix size')
|
|
885
|
+
if side == "right":
|
|
886
|
+
if homspace.codomain().dimension() != A.nrows():
|
|
887
|
+
raise TypeError('Domain dimension is incompatible with matrix size')
|
|
888
|
+
if homspace.domain().dimension() != A.ncols():
|
|
889
|
+
raise TypeError('codomain dimension is incompatible with matrix size')
|
|
890
|
+
|
|
891
|
+
A = homspace._matrix_space(side)(A)
|
|
892
|
+
free_module_morphism.FreeModuleMorphism.__init__(self, homspace, A, side)
|
|
893
|
+
|
|
894
|
+
def is_invertible(self) -> bool:
|
|
895
|
+
r"""
|
|
896
|
+
Determine if the vector space morphism has an inverse.
|
|
897
|
+
|
|
898
|
+
OUTPUT:
|
|
899
|
+
|
|
900
|
+
``True`` if the vector space morphism is invertible, otherwise
|
|
901
|
+
``False``.
|
|
902
|
+
|
|
903
|
+
EXAMPLES:
|
|
904
|
+
|
|
905
|
+
If the dimension of the domain does not match the dimension
|
|
906
|
+
of the codomain, then the morphism cannot be invertible. ::
|
|
907
|
+
|
|
908
|
+
sage: V = QQ^3
|
|
909
|
+
sage: U = V.subspace_with_basis([V.0 + V.1, 2*V.1 + 3*V.2])
|
|
910
|
+
sage: phi = V.hom([U.0, U.0 + U.1, U.0 - U.1], U)
|
|
911
|
+
sage: phi.is_invertible()
|
|
912
|
+
False
|
|
913
|
+
|
|
914
|
+
An invertible linear transformation. ::
|
|
915
|
+
|
|
916
|
+
sage: A = matrix(QQ, 3, [[-3, 5, -5], [4, -7, 7], [6, -8, 10]])
|
|
917
|
+
sage: A.determinant()
|
|
918
|
+
2
|
|
919
|
+
sage: H = Hom(QQ^3, QQ^3)
|
|
920
|
+
sage: rho = H(A)
|
|
921
|
+
sage: rho.is_invertible()
|
|
922
|
+
True
|
|
923
|
+
|
|
924
|
+
A non-invertible linear transformation, an endomorphism of
|
|
925
|
+
a vector space over a finite field. ::
|
|
926
|
+
|
|
927
|
+
sage: # needs sage.rings.finite_rings
|
|
928
|
+
sage: F.<a> = GF(11^2)
|
|
929
|
+
sage: A = matrix(F, [[6*a + 3, 8*a + 2, 10*a + 3],
|
|
930
|
+
....: [2*a + 7, 4*a + 3, 2*a + 3],
|
|
931
|
+
....: [9*a + 2, 10*a + 10, 3*a + 3]])
|
|
932
|
+
sage: A.nullity()
|
|
933
|
+
1
|
|
934
|
+
sage: E = End(F^3)
|
|
935
|
+
sage: zeta = E(A)
|
|
936
|
+
sage: zeta.is_invertible()
|
|
937
|
+
False
|
|
938
|
+
"""
|
|
939
|
+
# endomorphism or not, this is equivalent to invertibility of
|
|
940
|
+
# the matrix representation, so any test of this will suffice
|
|
941
|
+
m = self.matrix()
|
|
942
|
+
if not m.is_square():
|
|
943
|
+
return False
|
|
944
|
+
return m.rank() == m.ncols()
|
|
945
|
+
|
|
946
|
+
def _latex_(self):
|
|
947
|
+
r"""
|
|
948
|
+
A LaTeX representation of this vector space morphism.
|
|
949
|
+
|
|
950
|
+
EXAMPLES::
|
|
951
|
+
|
|
952
|
+
sage: H = Hom(QQ^3, QQ^2)
|
|
953
|
+
sage: f = H(matrix(3, 2, range(6)))
|
|
954
|
+
sage: f._latex_().split(' ')
|
|
955
|
+
['\\text{vector', 'space', 'morphism', 'from',
|
|
956
|
+
'}\n\\Bold{Q}^{3}\\text{', 'to', '}\n\\Bold{Q}^{2}\\text{',
|
|
957
|
+
'represented', 'by', 'the', 'matrix',
|
|
958
|
+
'}\n\\left(\\begin{array}{rr}\n0', '&', '1',
|
|
959
|
+
'\\\\\n2', '&', '3', '\\\\\n4', '&', '5\n\\end{array}\\right)']
|
|
960
|
+
"""
|
|
961
|
+
s = ('\\text{vector space morphism from }\n', self.domain()._latex_(),
|
|
962
|
+
'\\text{ to }\n', self.codomain()._latex_(),
|
|
963
|
+
'\\text{ represented by the matrix }\n', self.matrix()._latex_())
|
|
964
|
+
return ''.join(s)
|
|
965
|
+
|
|
966
|
+
def _repr_(self):
|
|
967
|
+
r"""
|
|
968
|
+
A text representation of this vector space morphism.
|
|
969
|
+
|
|
970
|
+
EXAMPLES::
|
|
971
|
+
|
|
972
|
+
sage: H = Hom(QQ^3, QQ^2)
|
|
973
|
+
sage: f = H(matrix(3, 2, range(6)))
|
|
974
|
+
sage: f._repr_().split(' ')
|
|
975
|
+
['Vector', 'space', 'morphism', 'represented', 'by',
|
|
976
|
+
'the', 'matrix:\n[0', '1]\n[2', '3]\n[4', '5]\nDomain:',
|
|
977
|
+
'Vector', 'space', 'of', 'dimension', '3', 'over',
|
|
978
|
+
'Rational', 'Field\nCodomain:', 'Vector', 'space', 'of',
|
|
979
|
+
'dimension', '2', 'over', 'Rational', 'Field']
|
|
980
|
+
"""
|
|
981
|
+
m = self.matrix()
|
|
982
|
+
act = ""
|
|
983
|
+
if self.side() == "right":
|
|
984
|
+
act = "as left-multiplication "
|
|
985
|
+
msg = ("Vector space morphism represented {}by the matrix:\n",
|
|
986
|
+
"{!r}\n",
|
|
987
|
+
"Domain: {}\n",
|
|
988
|
+
"Codomain: {}")
|
|
989
|
+
return ''.join(msg).format(act, m, self.domain(), self.codomain())
|