passagemath-modules 10.6.31__cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31.dist-info/RECORD +807 -0
- passagemath_modules-10.6.31.dist-info/WHEEL +6 -0
- passagemath_modules-10.6.31.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgfortran-83c28eba.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-6e109695.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-cda90e79.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7f678fcf.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-ecd7067e.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-2284e583.so.0.0.0 +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,968 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.rings.finite_rings
|
|
3
|
+
r"""
|
|
4
|
+
Morphisms between Ore modules
|
|
5
|
+
|
|
6
|
+
Let `R` be a commutative ring, `\theta : R \to R` by a ring
|
|
7
|
+
endomorphism and `\partial : R \to R` be a `\theta`-derivation.
|
|
8
|
+
Let also `\mathcal S = R[X; \theta, \partial]` denote the
|
|
9
|
+
associated Ore polynomial ring.
|
|
10
|
+
|
|
11
|
+
By definition, a Ore module is a module over `\mathcal S`. In
|
|
12
|
+
SageMath, there are rather represented as modules over `R`
|
|
13
|
+
equipped with the map giving the action of the Ore variable `X`.
|
|
14
|
+
We refer to :mod:`sage.modules.ore_module` for more details.
|
|
15
|
+
|
|
16
|
+
A morphism of Ore modules is a `R`-linear morphism commuting
|
|
17
|
+
with the Ore action, or equivalenty a `\mathcal S`-linear map.
|
|
18
|
+
|
|
19
|
+
.. RUBRIC:: Construction of morphisms
|
|
20
|
+
|
|
21
|
+
There are several ways for creating Ore modules morphisms in SageMath.
|
|
22
|
+
First of all, one can use the method :meth:`sage.modules.ore_module.OreModule.hom`,
|
|
23
|
+
passing to it the matrix (in the canonical bases) of the morphism
|
|
24
|
+
we want to build::
|
|
25
|
+
|
|
26
|
+
sage: K.<z> = GF(5^3)
|
|
27
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
28
|
+
sage: M.<e0,e1> = S.quotient_module(X^2 + X + z)
|
|
29
|
+
|
|
30
|
+
sage: mat = matrix(2, 2, [z, 3*z^2 + z + 2,
|
|
31
|
+
....: z + 1, 4*z + 4])
|
|
32
|
+
sage: f = M.hom(mat)
|
|
33
|
+
sage: f
|
|
34
|
+
Ore module endomorphism of Ore module <e0, e1> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
35
|
+
|
|
36
|
+
Clearly, this method is not optimal: typing all the entries of the
|
|
37
|
+
defining matrix is long and a potential source of errors.
|
|
38
|
+
|
|
39
|
+
Instead, one can use a dictionary encoding the values taken by the
|
|
40
|
+
morphism on a set of generators; the morphism is then automatically
|
|
41
|
+
prolonged by `\mathcal S`-linearity.
|
|
42
|
+
Actually here, `f` was just the multiplication by `X^3` on `M`.
|
|
43
|
+
We can then redefine it simply as follows::
|
|
44
|
+
|
|
45
|
+
sage: g = M.hom({e0: X^3*e0})
|
|
46
|
+
sage: g
|
|
47
|
+
Ore module endomorphism of Ore module <e0, e1> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
48
|
+
|
|
49
|
+
One can then recover the matrix by using the method
|
|
50
|
+
:meth:`sage.modules.ore_module_morphism.OreModuleMorphism.matrix`::
|
|
51
|
+
|
|
52
|
+
sage: g.matrix()
|
|
53
|
+
[ z 3*z^2 + z + 2]
|
|
54
|
+
[ z + 1 4*z + 4]
|
|
55
|
+
|
|
56
|
+
Alternatively, one can use the method
|
|
57
|
+
:meth:`sage.modules.ore_module.OreModule.multiplication_map`::
|
|
58
|
+
|
|
59
|
+
sage: h = M.multiplication_map(X^3)
|
|
60
|
+
sage: h
|
|
61
|
+
Ore module endomorphism of Ore module <e0, e1> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
62
|
+
sage: g == h
|
|
63
|
+
True
|
|
64
|
+
|
|
65
|
+
Of course, this method also accepts values in the base ring::
|
|
66
|
+
|
|
67
|
+
sage: h = M.multiplication_map(2)
|
|
68
|
+
sage: h
|
|
69
|
+
Ore module endomorphism of Ore module <e0, e1> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
70
|
+
sage: h.matrix()
|
|
71
|
+
[2 0]
|
|
72
|
+
[0 2]
|
|
73
|
+
|
|
74
|
+
Be careful that scalar multiplications do not always properly
|
|
75
|
+
define a morphism of Ore modules::
|
|
76
|
+
|
|
77
|
+
sage: M.multiplication_map(z)
|
|
78
|
+
Traceback (most recent call last):
|
|
79
|
+
...
|
|
80
|
+
ValueError: does not define a morphism of Ore modules
|
|
81
|
+
|
|
82
|
+
.. RUBRIC: Kernels, images and related things
|
|
83
|
+
|
|
84
|
+
SageMath provides methods to compute kernels, cokernels,
|
|
85
|
+
images and coimages. In order to illustrate this, we will
|
|
86
|
+
build the sequence
|
|
87
|
+
|
|
88
|
+
.. MATH::
|
|
89
|
+
|
|
90
|
+
0 \to \mathcal S/ \mathcal S P
|
|
91
|
+
\to \mathcal S/ \mathcal S PQ
|
|
92
|
+
\to \mathcal S/ \mathcal S Q \to 0
|
|
93
|
+
|
|
94
|
+
and check that it is exact.
|
|
95
|
+
We first build the Ore modules::
|
|
96
|
+
|
|
97
|
+
sage: P = X^2 + z*X + 1
|
|
98
|
+
sage: Q = X^3 + z^2*X^2 + X + z
|
|
99
|
+
sage: U = S.quotient_module(P, names='u')
|
|
100
|
+
sage: U.inject_variables()
|
|
101
|
+
Defining u0, u1
|
|
102
|
+
sage: V = S.quotient_module(P*Q, names='v')
|
|
103
|
+
sage: V.inject_variables()
|
|
104
|
+
Defining v0, v1, v2, v3, v4
|
|
105
|
+
sage: W = S.quotient_module(Q, names='w')
|
|
106
|
+
sage: W.inject_variables()
|
|
107
|
+
Defining w0, w1, w2
|
|
108
|
+
|
|
109
|
+
Next, we build the morphisms::
|
|
110
|
+
|
|
111
|
+
sage: f = U.hom({u0: Q*v0})
|
|
112
|
+
sage: g = V.hom({v0: w0})
|
|
113
|
+
|
|
114
|
+
We can now check that `f` is injective by computing its
|
|
115
|
+
kernel::
|
|
116
|
+
|
|
117
|
+
sage: f.kernel()
|
|
118
|
+
Ore module of rank 0 over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
119
|
+
|
|
120
|
+
We see on the output that it has dimension `0`; so it
|
|
121
|
+
vanishes. Instead of reading the output, one can check
|
|
122
|
+
programmatically the vanishing of a Ore module using the
|
|
123
|
+
method :meth:`sage.modules.ore_module.OreModule.is_zero`::
|
|
124
|
+
|
|
125
|
+
sage: f.kernel().is_zero()
|
|
126
|
+
True
|
|
127
|
+
|
|
128
|
+
Actually, in our use case, one can, more simply, use the method
|
|
129
|
+
:meth:`sage.modules.ore_module_morphism.OreModuleMorphism.is_injective`::
|
|
130
|
+
|
|
131
|
+
sage: f.is_injective()
|
|
132
|
+
True
|
|
133
|
+
|
|
134
|
+
Similarly, one checks that `g` is surjective::
|
|
135
|
+
|
|
136
|
+
sage: g.is_surjective()
|
|
137
|
+
True
|
|
138
|
+
|
|
139
|
+
or equivalently::
|
|
140
|
+
|
|
141
|
+
sage: g.cokernel().is_zero()
|
|
142
|
+
True
|
|
143
|
+
|
|
144
|
+
Now, we need to check that the kernel of `g` equals the
|
|
145
|
+
image of `f`. For this, we compute both and compare the
|
|
146
|
+
results::
|
|
147
|
+
|
|
148
|
+
sage: ker = g.kernel()
|
|
149
|
+
sage: im = f.image()
|
|
150
|
+
sage: ker == im
|
|
151
|
+
True
|
|
152
|
+
|
|
153
|
+
As a sanity check, one can also verity that the composite
|
|
154
|
+
`g \circ f` vanishes::
|
|
155
|
+
|
|
156
|
+
sage: h = g * f
|
|
157
|
+
sage: h
|
|
158
|
+
Ore module morphism:
|
|
159
|
+
From: Ore module <u0, u1> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
160
|
+
To: Ore module <w0, w1, w2> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
161
|
+
sage: h.is_zero()
|
|
162
|
+
True
|
|
163
|
+
|
|
164
|
+
Let us now consider another morphism `f` and build the
|
|
165
|
+
canonical isomorphism `\text{coim }f \to \text{im }f`
|
|
166
|
+
that it induces.
|
|
167
|
+
We start by defining `f`::
|
|
168
|
+
|
|
169
|
+
sage: A = X + z
|
|
170
|
+
sage: B = X + z + 1
|
|
171
|
+
sage: P = X^2 + X + z
|
|
172
|
+
sage: U = S.quotient_module(B*P, names='u')
|
|
173
|
+
sage: U.inject_variables()
|
|
174
|
+
Defining u0, u1, u2
|
|
175
|
+
sage: V = S.quotient_module(P*A, names='v')
|
|
176
|
+
sage: V.inject_variables()
|
|
177
|
+
Defining v0, v1, v2
|
|
178
|
+
|
|
179
|
+
sage: f = U.hom({u0: A*v0})
|
|
180
|
+
sage: f
|
|
181
|
+
Ore module morphism:
|
|
182
|
+
From: Ore module <u0, u1, u2> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
183
|
+
To: Ore module <v0, v1, v2> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
184
|
+
|
|
185
|
+
Now we compute the image and the coimage::
|
|
186
|
+
|
|
187
|
+
sage: I = f.image(names='im')
|
|
188
|
+
sage: I
|
|
189
|
+
Ore module <im0, im1> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
190
|
+
|
|
191
|
+
sage: C = f.coimage(names='co')
|
|
192
|
+
sage: C
|
|
193
|
+
Ore module <co0, co1> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
194
|
+
|
|
195
|
+
We can already check that the image and the coimage have the
|
|
196
|
+
same rank. We now want to construct the isomorphism between
|
|
197
|
+
them. For this, we first need to corestrict `f` to its image.
|
|
198
|
+
This is achieved via the method
|
|
199
|
+
:meth:`sage.modules.ore_module.OreSubmodule.morphism_corestriction`
|
|
200
|
+
of the Ore module::
|
|
201
|
+
|
|
202
|
+
sage: g = I.morphism_corestriction(f)
|
|
203
|
+
sage: g
|
|
204
|
+
Ore module morphism:
|
|
205
|
+
From: Ore module <u0, u1, u2> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
206
|
+
To: Ore module <im0, im1> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
207
|
+
|
|
208
|
+
Next, we want to factor `g` by the coimage. We proceed as follows::
|
|
209
|
+
|
|
210
|
+
sage: h = C.morphism_quotient(g)
|
|
211
|
+
sage: h
|
|
212
|
+
Ore module morphism:
|
|
213
|
+
From: Ore module <co0, co1> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
214
|
+
To: Ore module <im0, im1> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
215
|
+
|
|
216
|
+
We have found the morphism we were looking for: it is `h`.
|
|
217
|
+
We can now check that it is an isomorphism::
|
|
218
|
+
|
|
219
|
+
sage: h.is_isomorphism()
|
|
220
|
+
True
|
|
221
|
+
|
|
222
|
+
As a shortcut, we can use explicit conversions as follows::
|
|
223
|
+
|
|
224
|
+
sage: H = Hom(C, I) # the hom space
|
|
225
|
+
sage: h2 = H(f)
|
|
226
|
+
sage: h2
|
|
227
|
+
Ore module morphism:
|
|
228
|
+
From: Ore module <co0, co1> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
229
|
+
To: Ore module <im0, im1> over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
230
|
+
sage: h == h2
|
|
231
|
+
True
|
|
232
|
+
|
|
233
|
+
.. RUBRIC: Determinants and characteristic polynomials
|
|
234
|
+
|
|
235
|
+
For endomorphisms, one can compute classical invariants as
|
|
236
|
+
determinants and characteristic polynomials.
|
|
237
|
+
To illustrate this, we check on an example that the characteristic
|
|
238
|
+
polynomial of the multiplication by `X^3` on the quotient
|
|
239
|
+
`\mathcal S / \mathcal S P` is the reduced norm of `P`::
|
|
240
|
+
|
|
241
|
+
sage: P = X^5 + z*X^4 + z^2*X^2 + z + 1
|
|
242
|
+
sage: M = S.quotient_module(P)
|
|
243
|
+
sage: f = M.multiplication_map(X^3)
|
|
244
|
+
sage: f.charpoly()
|
|
245
|
+
x^5 + x^4 + x^3 + x^2 + 1
|
|
246
|
+
|
|
247
|
+
sage: P.reduced_norm('x')
|
|
248
|
+
x^5 + x^4 + x^3 + x^2 + 1
|
|
249
|
+
|
|
250
|
+
AUTHOR:
|
|
251
|
+
|
|
252
|
+
- Xavier Caruso (2024-10)
|
|
253
|
+
"""
|
|
254
|
+
|
|
255
|
+
# ***************************************************************************
|
|
256
|
+
# Copyright (C) 2024 Xavier Caruso <xavier.caruso@normalesup.org>
|
|
257
|
+
#
|
|
258
|
+
# This program is free software: you can redistribute it and/or modify
|
|
259
|
+
# it under the terms of the GNU General Public License as published by
|
|
260
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
261
|
+
# (at your option) any later version.
|
|
262
|
+
# https://www.gnu.org/licenses/
|
|
263
|
+
# ***************************************************************************
|
|
264
|
+
|
|
265
|
+
from sage.misc.latex import latex
|
|
266
|
+
from sage.structure.element import Element
|
|
267
|
+
from sage.matrix.matrix0 import Matrix
|
|
268
|
+
from sage.matrix.constructor import matrix
|
|
269
|
+
from sage.categories.map import Map
|
|
270
|
+
from sage.categories.morphism import Morphism
|
|
271
|
+
from sage.modules.ore_module import OreSubmodule, OreQuotientModule
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
class OreModuleMorphism(Morphism):
|
|
275
|
+
r"""
|
|
276
|
+
Generic class for morphism between Ore modules.
|
|
277
|
+
"""
|
|
278
|
+
def __init__(self, parent, im_gens, check=True):
|
|
279
|
+
r"""
|
|
280
|
+
Initialize this Ore module.
|
|
281
|
+
|
|
282
|
+
INPUT:
|
|
283
|
+
|
|
284
|
+
- ``parent`` -- the hom space
|
|
285
|
+
|
|
286
|
+
- ``im_gens`` -- the image of the generators (formatted as
|
|
287
|
+
a list, a tuple, a dictionary or a matrix) or a Ore modules
|
|
288
|
+
morphism
|
|
289
|
+
|
|
290
|
+
- ``check`` (default: ``True``) -- a boolean, whether we
|
|
291
|
+
should check if the given data correctly defined a morphism
|
|
292
|
+
of Ore modules
|
|
293
|
+
|
|
294
|
+
TESTS::
|
|
295
|
+
|
|
296
|
+
sage: K.<z> = GF(5^3)
|
|
297
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
298
|
+
sage: M = S.quotient_module(X^2 + z)
|
|
299
|
+
sage: f = M.multiplication_map(X^3)
|
|
300
|
+
sage: type(f)
|
|
301
|
+
<class 'sage.modules.ore_module_homspace.OreModule_homspace_with_category.element_class'>
|
|
302
|
+
|
|
303
|
+
sage: TestSuite(f).run()
|
|
304
|
+
"""
|
|
305
|
+
Morphism.__init__(self, parent)
|
|
306
|
+
domain = parent.domain()
|
|
307
|
+
codomain = parent.codomain()
|
|
308
|
+
base = domain.base_ring()
|
|
309
|
+
MS = parent.matrix_space()
|
|
310
|
+
if (isinstance(im_gens, Element)
|
|
311
|
+
and base.has_coerce_map_from(im_gens.parent())):
|
|
312
|
+
self._matrix = MS(im_gens)
|
|
313
|
+
elif isinstance(im_gens, Matrix):
|
|
314
|
+
self._matrix = MS(im_gens)
|
|
315
|
+
elif isinstance(im_gens, OreModuleMorphism):
|
|
316
|
+
# Not optimal: too many intermediate morphisms constructed
|
|
317
|
+
f = im_gens
|
|
318
|
+
if f.domain() is not domain:
|
|
319
|
+
f = domain._hom_change_domain(f)
|
|
320
|
+
if f.codomain() is not codomain:
|
|
321
|
+
f = codomain._hom_change_codomain(f)
|
|
322
|
+
self._matrix = f._matrix
|
|
323
|
+
elif isinstance(im_gens, (list, tuple)):
|
|
324
|
+
if len(im_gens) != domain.rank():
|
|
325
|
+
raise ValueError("wrong number of generators")
|
|
326
|
+
self._matrix = matrix([codomain(v).list() for v in im_gens])
|
|
327
|
+
elif isinstance(im_gens, dict):
|
|
328
|
+
zero = parent.base_ring().zero()
|
|
329
|
+
dimd = domain.rank()
|
|
330
|
+
dimc = codomain.rank()
|
|
331
|
+
d = dimc + dimd
|
|
332
|
+
vs = [domain(x).list() + codomain(y).list() for x, y in im_gens.items()]
|
|
333
|
+
if len(vs) < 2*d:
|
|
334
|
+
vs += (2*d - len(vs)) * [d * [zero]]
|
|
335
|
+
M = matrix(vs)
|
|
336
|
+
M.echelonize()
|
|
337
|
+
oldr = 0
|
|
338
|
+
r = M.rank()
|
|
339
|
+
iter = 1
|
|
340
|
+
fd = domain._pseudohom
|
|
341
|
+
fc = codomain._pseudohom
|
|
342
|
+
while r > oldr:
|
|
343
|
+
for i in range(r):
|
|
344
|
+
row = M.row(i).list()
|
|
345
|
+
x = row[:dimd]
|
|
346
|
+
y = row[dimd:]
|
|
347
|
+
for _ in range(iter):
|
|
348
|
+
x = fd(x)
|
|
349
|
+
y = fc(y)
|
|
350
|
+
v = x.list() + y.list()
|
|
351
|
+
for j in range(d):
|
|
352
|
+
M[i+r,j] = v[j]
|
|
353
|
+
M.echelonize()
|
|
354
|
+
oldr = r
|
|
355
|
+
r = M.rank()
|
|
356
|
+
iter *= 2
|
|
357
|
+
if list(M.pivots()) != list(range(dimd)):
|
|
358
|
+
raise ValueError("does not define a morphism of Ore modules")
|
|
359
|
+
self._matrix = M.submatrix(0, dimd, dimd, dimc)
|
|
360
|
+
else:
|
|
361
|
+
raise ValueError("cannot construct a morphism from the given data")
|
|
362
|
+
if check:
|
|
363
|
+
for x in parent.domain().basis():
|
|
364
|
+
if self._call_(x.image()) != self._call_(x).image():
|
|
365
|
+
raise ValueError("does not define a morphism of Ore modules")
|
|
366
|
+
|
|
367
|
+
def _repr_type(self):
|
|
368
|
+
r"""
|
|
369
|
+
Return a string with the type of this morphism.
|
|
370
|
+
|
|
371
|
+
TESTS::
|
|
372
|
+
|
|
373
|
+
sage: K.<z> = GF(5^3)
|
|
374
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
375
|
+
sage: M = S.quotient_module(X^2 + z)
|
|
376
|
+
sage: f = M.multiplication_map(X^3)
|
|
377
|
+
sage: f._repr_type()
|
|
378
|
+
'Ore module'
|
|
379
|
+
"""
|
|
380
|
+
return "Ore module"
|
|
381
|
+
|
|
382
|
+
def _latex_(self):
|
|
383
|
+
r"""
|
|
384
|
+
Return a LaTeX representation of this morphism.
|
|
385
|
+
|
|
386
|
+
TESTS::
|
|
387
|
+
|
|
388
|
+
sage: K.<z> = GF(5^3)
|
|
389
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
390
|
+
sage: M = S.quotient_module(X^2 + z)
|
|
391
|
+
sage: f = M.multiplication_map(X^3)
|
|
392
|
+
sage: latex(f)
|
|
393
|
+
\begin{array}{l}
|
|
394
|
+
\text{\texttt{Ore module morphism:}} \\
|
|
395
|
+
\text{\texttt{{ }{ }From:}}\hspace{1ex} \texttt{Ore module of rank } 2\texttt{ over } \Bold{F}_{5^{3}} \texttt{ twisted by } z \mapsto z^{5} \\
|
|
396
|
+
\text{\texttt{{ }{ }To:}}\hspace{3ex} \texttt{Ore module of rank } 2\texttt{ over } \Bold{F}_{5^{3}} \texttt{ twisted by } z \mapsto z^{5}
|
|
397
|
+
\end{array}
|
|
398
|
+
|
|
399
|
+
::
|
|
400
|
+
|
|
401
|
+
sage: Me = M.rename_basis('e')
|
|
402
|
+
sage: fe = Me.multiplication_map(X^3)
|
|
403
|
+
sage: latex(fe)
|
|
404
|
+
\begin{array}{l}
|
|
405
|
+
\text{\texttt{Ore module morphism:}} \\
|
|
406
|
+
\text{\texttt{{ }{ }From:}}\hspace{1ex} \left<e_{0}, e_{1}\right>_{\Bold{F}_{5^{3}} , z \mapsto z^{5} } \\
|
|
407
|
+
\text{\texttt{{ }{ }To:}}\hspace{3ex} \left<e_{0}, e_{1}\right>_{\Bold{F}_{5^{3}} , z \mapsto z^{5} }
|
|
408
|
+
\end{array}
|
|
409
|
+
"""
|
|
410
|
+
s = "\\begin{array}{l}\n"
|
|
411
|
+
s += "\\text{\\texttt{%s morphism:}} \\\\\n" % self._repr_type()
|
|
412
|
+
s += "\\text{\\texttt{{ }{ }From:}}\\hspace{1ex} %s \\\\\n" % latex(self.domain())
|
|
413
|
+
s += "\\text{\\texttt{{ }{ }To:}}\\hspace{3ex} %s\n" % latex(self.codomain())
|
|
414
|
+
s += "\\end{array}"
|
|
415
|
+
return s
|
|
416
|
+
|
|
417
|
+
def matrix(self):
|
|
418
|
+
r"""
|
|
419
|
+
Return the matrix defining this morphism.
|
|
420
|
+
|
|
421
|
+
EXAMPLES::
|
|
422
|
+
|
|
423
|
+
sage: K.<z> = GF(5^3)
|
|
424
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
425
|
+
sage: M = S.quotient_module(X^2 + z)
|
|
426
|
+
sage: f = M.multiplication_map(2)
|
|
427
|
+
sage: f.matrix()
|
|
428
|
+
[2 0]
|
|
429
|
+
[0 2]
|
|
430
|
+
|
|
431
|
+
sage: g = M.multiplication_map(X^3)
|
|
432
|
+
sage: g.matrix()
|
|
433
|
+
[ 0 3*z^2 + z + 1]
|
|
434
|
+
[ 2*z + 1 0]
|
|
435
|
+
"""
|
|
436
|
+
return self._matrix.__copy__()
|
|
437
|
+
|
|
438
|
+
def _call_(self, x):
|
|
439
|
+
r"""
|
|
440
|
+
Return the image of `x` by this morphism.
|
|
441
|
+
|
|
442
|
+
EXAMPLES::
|
|
443
|
+
|
|
444
|
+
sage: K.<z> = GF(5^3)
|
|
445
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
446
|
+
sage: M.<v,w> = S.quotient_module(X^2 + z*X + 1)
|
|
447
|
+
sage: f = M.multiplication_map(X^3)
|
|
448
|
+
sage: f(v)
|
|
449
|
+
(2*z^2+4*z+4)*v + (4*z^2+3*z+3)*w
|
|
450
|
+
|
|
451
|
+
We check that it is the correct answer::
|
|
452
|
+
|
|
453
|
+
sage: X^3 * v
|
|
454
|
+
(2*z^2+4*z+4)*v + (4*z^2+3*z+3)*w
|
|
455
|
+
"""
|
|
456
|
+
return self.codomain()(x * self._matrix)
|
|
457
|
+
|
|
458
|
+
def is_zero(self) -> bool:
|
|
459
|
+
r"""
|
|
460
|
+
Return ``True`` if this morphism is zero.
|
|
461
|
+
|
|
462
|
+
EXAMPLES::
|
|
463
|
+
|
|
464
|
+
sage: K.<z> = GF(5^3)
|
|
465
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
466
|
+
sage: P = X^3 + z*X^2 + z^2 + 1
|
|
467
|
+
sage: M = S.quotient_module(P^2, names='e')
|
|
468
|
+
sage: M.inject_variables()
|
|
469
|
+
Defining e0, e1, e2, e3, e4, e5
|
|
470
|
+
|
|
471
|
+
sage: f = M.hom({e0: P*e0})
|
|
472
|
+
sage: f.is_zero()
|
|
473
|
+
False
|
|
474
|
+
sage: (f*f).is_zero()
|
|
475
|
+
True
|
|
476
|
+
"""
|
|
477
|
+
return self._matrix.is_zero()
|
|
478
|
+
|
|
479
|
+
def is_identity(self) -> bool:
|
|
480
|
+
r"""
|
|
481
|
+
Return ``True`` if this morphism is the identity.
|
|
482
|
+
|
|
483
|
+
EXAMPLES::
|
|
484
|
+
|
|
485
|
+
sage: K.<z> = GF(5^3)
|
|
486
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
487
|
+
sage: M.<v,w> = S.quotient_module(X^2 + z)
|
|
488
|
+
sage: f = M.hom({v: v})
|
|
489
|
+
sage: f.is_identity()
|
|
490
|
+
True
|
|
491
|
+
|
|
492
|
+
sage: f = M.hom({v: 2*v})
|
|
493
|
+
sage: f.is_identity()
|
|
494
|
+
False
|
|
495
|
+
"""
|
|
496
|
+
return self.domain() is self.codomain() and self._matrix.is_one()
|
|
497
|
+
|
|
498
|
+
def _add_(self, other):
|
|
499
|
+
r"""
|
|
500
|
+
Return the sum of this morphism and ``other``.
|
|
501
|
+
|
|
502
|
+
TESTS::
|
|
503
|
+
|
|
504
|
+
sage: K.<z> = GF(5^3)
|
|
505
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
506
|
+
sage: M = S.quotient_module(X^2 + z)
|
|
507
|
+
sage: f = M.multiplication_map(X^3)
|
|
508
|
+
sage: g = M.multiplication_map(X^6)
|
|
509
|
+
sage: h = f + g
|
|
510
|
+
sage: h == M.multiplication_map(X^3 + X^6)
|
|
511
|
+
True
|
|
512
|
+
"""
|
|
513
|
+
if not isinstance(other, OreModuleMorphism):
|
|
514
|
+
raise ValueError("the morphism is not a morphism of Ore modules")
|
|
515
|
+
H = self.parent()
|
|
516
|
+
return H(self._matrix + other._matrix, check=False)
|
|
517
|
+
|
|
518
|
+
def _neg_(self):
|
|
519
|
+
r"""
|
|
520
|
+
Return the oppositive of this morphism.
|
|
521
|
+
|
|
522
|
+
TESTS::
|
|
523
|
+
|
|
524
|
+
sage: K.<z> = GF(5^3)
|
|
525
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
526
|
+
sage: M = S.quotient_module(X^2 + z)
|
|
527
|
+
sage: f = M.multiplication_map(X^3)
|
|
528
|
+
sage: g = -f
|
|
529
|
+
sage: g == M.multiplication_map(-X^3)
|
|
530
|
+
True
|
|
531
|
+
"""
|
|
532
|
+
H = self.parent()
|
|
533
|
+
return H(-self._matrix, check=False)
|
|
534
|
+
|
|
535
|
+
def _sub_(self, other):
|
|
536
|
+
r"""
|
|
537
|
+
Return the different between this morphism and ``other``.
|
|
538
|
+
|
|
539
|
+
TESTS::
|
|
540
|
+
|
|
541
|
+
sage: K.<z> = GF(5^3)
|
|
542
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
543
|
+
sage: M = S.quotient_module(X^2 + z)
|
|
544
|
+
sage: f = M.multiplication_map(X^3)
|
|
545
|
+
sage: g = M.multiplication_map(X^6)
|
|
546
|
+
sage: h = f - g
|
|
547
|
+
sage: h == M.multiplication_map(X^3 - X^6)
|
|
548
|
+
True
|
|
549
|
+
"""
|
|
550
|
+
if not isinstance(other, OreModuleMorphism):
|
|
551
|
+
raise ValueError("the morphism is not a morphism of Ore modules")
|
|
552
|
+
H = self.parent()
|
|
553
|
+
return H(self._matrix - other._matrix, check=False)
|
|
554
|
+
|
|
555
|
+
def _rmul_(self, a):
|
|
556
|
+
r"""
|
|
557
|
+
Return the product of the scalar `a` by this morphism.
|
|
558
|
+
|
|
559
|
+
TESTS::
|
|
560
|
+
|
|
561
|
+
sage: K.<z> = GF(5^3)
|
|
562
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
563
|
+
sage: M = S.quotient_module(X^2 + z)
|
|
564
|
+
sage: f = M.multiplication_map(X^3)
|
|
565
|
+
sage: g = 2*f
|
|
566
|
+
sage: g == M.multiplication_map(2*X^3)
|
|
567
|
+
True
|
|
568
|
+
"""
|
|
569
|
+
H = self.parent()
|
|
570
|
+
return H(a*self._matrix, check=False)
|
|
571
|
+
|
|
572
|
+
def __eq__(self, other):
|
|
573
|
+
r"""
|
|
574
|
+
Return ``True`` if this morphism is equal to ``other``.
|
|
575
|
+
|
|
576
|
+
TESTS::
|
|
577
|
+
|
|
578
|
+
sage: K.<z> = GF(5^3)
|
|
579
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
580
|
+
sage: M = S.quotient_module(X^2 + z)
|
|
581
|
+
sage: f = 2*M.multiplication_map(X^3)
|
|
582
|
+
sage: g = M.multiplication_map(2*X^3)
|
|
583
|
+
sage: f == g
|
|
584
|
+
True
|
|
585
|
+
"""
|
|
586
|
+
if not isinstance(other, OreModuleMorphism):
|
|
587
|
+
try:
|
|
588
|
+
other = self.parent()(other)
|
|
589
|
+
except ValueError:
|
|
590
|
+
return False
|
|
591
|
+
return self._matrix == other._matrix
|
|
592
|
+
|
|
593
|
+
def is_injective(self) -> bool:
|
|
594
|
+
r"""
|
|
595
|
+
Return ``True`` if this morphism is injective.
|
|
596
|
+
|
|
597
|
+
EXAMPLES::
|
|
598
|
+
|
|
599
|
+
sage: K.<z> = GF(5^3)
|
|
600
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
601
|
+
sage: P = X^3 + z*X^2 + z^2
|
|
602
|
+
sage: M = S.quotient_module(P^2, names='m')
|
|
603
|
+
sage: M.inject_variables()
|
|
604
|
+
Defining m0, m1, m2, m3, m4, m5
|
|
605
|
+
sage: N = S.quotient_module(P, names='n')
|
|
606
|
+
sage: N.inject_variables()
|
|
607
|
+
Defining n0, n1, n2
|
|
608
|
+
|
|
609
|
+
sage: f = N.hom({n0: P*m0})
|
|
610
|
+
sage: f.is_injective()
|
|
611
|
+
True
|
|
612
|
+
|
|
613
|
+
sage: g = M.hom({m0: n0})
|
|
614
|
+
sage: g.is_injective()
|
|
615
|
+
False
|
|
616
|
+
"""
|
|
617
|
+
return self._matrix.rank() == self.domain().rank()
|
|
618
|
+
|
|
619
|
+
def is_surjective(self) -> bool:
|
|
620
|
+
r"""
|
|
621
|
+
Return ``True`` if this morphism is surjective.
|
|
622
|
+
|
|
623
|
+
EXAMPLES::
|
|
624
|
+
|
|
625
|
+
sage: K.<z> = GF(5^3)
|
|
626
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
627
|
+
sage: P = X^3 + z*X^2 + z^2
|
|
628
|
+
sage: M = S.quotient_module(P^2, names='m')
|
|
629
|
+
sage: M.inject_variables()
|
|
630
|
+
Defining m0, m1, m2, m3, m4, m5
|
|
631
|
+
sage: N = S.quotient_module(P, names='n')
|
|
632
|
+
sage: N.inject_variables()
|
|
633
|
+
Defining n0, n1, n2
|
|
634
|
+
|
|
635
|
+
sage: f = N.hom({n0: P*m0})
|
|
636
|
+
sage: f.is_surjective()
|
|
637
|
+
False
|
|
638
|
+
|
|
639
|
+
sage: g = M.hom({m0: n0})
|
|
640
|
+
sage: g.is_surjective()
|
|
641
|
+
True
|
|
642
|
+
"""
|
|
643
|
+
return self._matrix.rank() == self.codomain().rank()
|
|
644
|
+
|
|
645
|
+
def is_bijective(self) -> bool:
|
|
646
|
+
r"""
|
|
647
|
+
Return ``True`` if this morphism is bijective.
|
|
648
|
+
|
|
649
|
+
EXAMPLES::
|
|
650
|
+
|
|
651
|
+
sage: K.<z> = GF(5^3)
|
|
652
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
653
|
+
sage: M = S.quotient_module(X^2 + z)
|
|
654
|
+
sage: f = M.multiplication_map(X^3)
|
|
655
|
+
sage: f.is_bijective()
|
|
656
|
+
True
|
|
657
|
+
|
|
658
|
+
sage: N = S.quotient_module(X^2)
|
|
659
|
+
sage: g = N.multiplication_map(X^3)
|
|
660
|
+
sage: g.is_bijective()
|
|
661
|
+
False
|
|
662
|
+
"""
|
|
663
|
+
return self.is_injective() and self.is_surjective()
|
|
664
|
+
|
|
665
|
+
def is_isomorphism(self) -> bool:
|
|
666
|
+
r"""
|
|
667
|
+
Return ``True`` if this morphism is an isomorphism.
|
|
668
|
+
|
|
669
|
+
EXAMPLES::
|
|
670
|
+
|
|
671
|
+
sage: K.<z> = GF(5^3)
|
|
672
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
673
|
+
sage: M = S.quotient_module(X^2 + z)
|
|
674
|
+
sage: f = M.multiplication_map(X^3)
|
|
675
|
+
sage: f.is_isomorphism()
|
|
676
|
+
True
|
|
677
|
+
|
|
678
|
+
sage: N = S.quotient_module(X^2)
|
|
679
|
+
sage: g = N.multiplication_map(X^3)
|
|
680
|
+
sage: g.is_isomorphism()
|
|
681
|
+
False
|
|
682
|
+
"""
|
|
683
|
+
return self.is_bijective()
|
|
684
|
+
|
|
685
|
+
def _composition_(self, other, homset):
|
|
686
|
+
r"""
|
|
687
|
+
Return the composite ``other`` `\circ` ``self``.
|
|
688
|
+
|
|
689
|
+
TESTS::
|
|
690
|
+
|
|
691
|
+
sage: K.<z> = GF(5^3)
|
|
692
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
693
|
+
sage: M = S.quotient_module(X^2 + z)
|
|
694
|
+
sage: f = M.multiplication_map(X^3)
|
|
695
|
+
sage: g = f * f
|
|
696
|
+
sage: g == M.multiplication_map(X^6)
|
|
697
|
+
True
|
|
698
|
+
"""
|
|
699
|
+
if not isinstance(other, OreModuleMorphism):
|
|
700
|
+
raise ValueError("the morphism is not a morphism of Ore modules")
|
|
701
|
+
return homset(other._matrix * self._matrix, check=False)
|
|
702
|
+
|
|
703
|
+
def inverse(self):
|
|
704
|
+
r"""
|
|
705
|
+
Return the inverse of this morphism.
|
|
706
|
+
|
|
707
|
+
EXAMPLES::
|
|
708
|
+
|
|
709
|
+
sage: K.<z> = GF(5^3)
|
|
710
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
711
|
+
sage: P = X^2 + z
|
|
712
|
+
sage: M.<e0,e1,e2,e3> = S.quotient_module(P^2)
|
|
713
|
+
|
|
714
|
+
sage: f = M.multiplication_map(X^3)
|
|
715
|
+
sage: g = f.inverse()
|
|
716
|
+
sage: (f*g).is_identity()
|
|
717
|
+
True
|
|
718
|
+
sage: (g*f).is_identity()
|
|
719
|
+
True
|
|
720
|
+
|
|
721
|
+
If the morphism is not invertible, an error is raised::
|
|
722
|
+
|
|
723
|
+
sage: h = M.hom({e0: P*e0})
|
|
724
|
+
sage: h.inverse()
|
|
725
|
+
Traceback (most recent call last):
|
|
726
|
+
...
|
|
727
|
+
ValueError: this morphism is not invertible
|
|
728
|
+
"""
|
|
729
|
+
if not self.is_isomorphism():
|
|
730
|
+
raise ValueError("this morphism is not invertible")
|
|
731
|
+
H = self.parent()
|
|
732
|
+
return H(self._matrix.inverse(), check=False)
|
|
733
|
+
|
|
734
|
+
__invert__ = inverse
|
|
735
|
+
|
|
736
|
+
def kernel(self, names=None):
|
|
737
|
+
r"""
|
|
738
|
+
Return ``True`` if this morphism is injective.
|
|
739
|
+
|
|
740
|
+
EXAMPLES::
|
|
741
|
+
|
|
742
|
+
sage: K.<z> = GF(5^3)
|
|
743
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
744
|
+
sage: P = X^3 + z*X^2 + z^2
|
|
745
|
+
sage: M = S.quotient_module(P^2, names='m')
|
|
746
|
+
sage: M.inject_variables()
|
|
747
|
+
Defining m0, m1, m2, m3, m4, m5
|
|
748
|
+
sage: N = S.quotient_module(P, names='n')
|
|
749
|
+
sage: N.inject_variables()
|
|
750
|
+
Defining n0, n1, n2
|
|
751
|
+
|
|
752
|
+
sage: f = M.hom({m0: n0})
|
|
753
|
+
sage: ker = f.kernel()
|
|
754
|
+
sage: ker
|
|
755
|
+
Ore module of rank 3 over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
756
|
+
sage: ker.basis()
|
|
757
|
+
[m0 + (2*z^2+3*z+1)*m3 + (4*z^2+3*z+3)*m4 + (2*z^2+3*z)*m5,
|
|
758
|
+
m1 + (z+3)*m3 + (z^2+z+4)*m4,
|
|
759
|
+
m2 + (2*z^2+4*z+2)*m4 + (2*z^2+z+1)*m5]
|
|
760
|
+
"""
|
|
761
|
+
ker = self._matrix.left_kernel_matrix()
|
|
762
|
+
return OreSubmodule(self.domain(), ker, names)
|
|
763
|
+
|
|
764
|
+
def image(self, names=None):
|
|
765
|
+
r"""
|
|
766
|
+
Return ``True`` if this morphism is injective.
|
|
767
|
+
|
|
768
|
+
EXAMPLES::
|
|
769
|
+
|
|
770
|
+
sage: K.<z> = GF(5^3)
|
|
771
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
772
|
+
sage: P = X^3 + z*X^2 + z^2
|
|
773
|
+
sage: M = S.quotient_module(P^2, names='m')
|
|
774
|
+
sage: M.inject_variables()
|
|
775
|
+
Defining m0, m1, m2, m3, m4, m5
|
|
776
|
+
sage: N = S.quotient_module(P, names='n')
|
|
777
|
+
sage: N.inject_variables()
|
|
778
|
+
Defining n0, n1, n2
|
|
779
|
+
|
|
780
|
+
sage: f = N.hom({n0: P*m0})
|
|
781
|
+
sage: im = f.image()
|
|
782
|
+
sage: im
|
|
783
|
+
Ore module of rank 3 over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
784
|
+
sage: im.basis()
|
|
785
|
+
[m0 + (2*z^2+3*z+1)*m3 + (4*z^2+3*z+3)*m4 + (2*z^2+3*z)*m5,
|
|
786
|
+
m1 + (z+3)*m3 + (z^2+z+4)*m4,
|
|
787
|
+
m2 + (2*z^2+4*z+2)*m4 + (2*z^2+z+1)*m5]
|
|
788
|
+
"""
|
|
789
|
+
return OreSubmodule(self.codomain(), self._matrix, names)
|
|
790
|
+
|
|
791
|
+
def cokernel(self, names=None):
|
|
792
|
+
r"""
|
|
793
|
+
Return ``True`` if this morphism is injective.
|
|
794
|
+
|
|
795
|
+
EXAMPLES::
|
|
796
|
+
|
|
797
|
+
sage: K.<z> = GF(5^3)
|
|
798
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
799
|
+
sage: P = X^3 + z*X^2 + z^2
|
|
800
|
+
sage: M = S.quotient_module(P^2, names='m')
|
|
801
|
+
sage: M.inject_variables()
|
|
802
|
+
Defining m0, m1, m2, m3, m4, m5
|
|
803
|
+
sage: N = S.quotient_module(P, names='n')
|
|
804
|
+
sage: N.inject_variables()
|
|
805
|
+
Defining n0, n1, n2
|
|
806
|
+
|
|
807
|
+
sage: f = N.hom({n0: P*m0})
|
|
808
|
+
sage: coker = f.cokernel()
|
|
809
|
+
sage: coker
|
|
810
|
+
Ore module of rank 3 over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
811
|
+
sage: coker.basis()
|
|
812
|
+
[m3, m4, m5]
|
|
813
|
+
"""
|
|
814
|
+
return OreQuotientModule(self.codomain(), self._matrix, names)
|
|
815
|
+
|
|
816
|
+
def coimage(self, names=None):
|
|
817
|
+
r"""
|
|
818
|
+
Return ``True`` if this morphism is injective.
|
|
819
|
+
|
|
820
|
+
EXAMPLES::
|
|
821
|
+
|
|
822
|
+
sage: K.<z> = GF(5^3)
|
|
823
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
824
|
+
sage: P = X^3 + z*X^2 + z^2
|
|
825
|
+
sage: M = S.quotient_module(P^2, names='m')
|
|
826
|
+
sage: M.inject_variables()
|
|
827
|
+
Defining m0, m1, m2, m3, m4, m5
|
|
828
|
+
sage: N = S.quotient_module(P, names='n')
|
|
829
|
+
sage: N.inject_variables()
|
|
830
|
+
Defining n0, n1, n2
|
|
831
|
+
|
|
832
|
+
sage: f = M.hom({m0: n0})
|
|
833
|
+
sage: coim = f.coimage()
|
|
834
|
+
sage: coim
|
|
835
|
+
Ore module of rank 3 over Finite Field in z of size 5^3 twisted by z |--> z^5
|
|
836
|
+
sage: coim.basis()
|
|
837
|
+
[m3, m4, m5]
|
|
838
|
+
"""
|
|
839
|
+
ker = self._matrix.left_kernel_matrix()
|
|
840
|
+
return OreQuotientModule(self.domain(), ker, names)
|
|
841
|
+
|
|
842
|
+
def determinant(self):
|
|
843
|
+
r"""
|
|
844
|
+
Return the determinant of this endomorphism.
|
|
845
|
+
|
|
846
|
+
EXAMPLES::
|
|
847
|
+
|
|
848
|
+
sage: K.<z> = GF(5^3)
|
|
849
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
850
|
+
sage: M.<m0,m1> = S.quotient_module(X^2 + z)
|
|
851
|
+
sage: f = M.multiplication_map(X^3)
|
|
852
|
+
sage: f.determinant()
|
|
853
|
+
2
|
|
854
|
+
|
|
855
|
+
If the domain differs from the codomain (even if they have
|
|
856
|
+
the same rank), an error is raised::
|
|
857
|
+
|
|
858
|
+
sage: N.<n0,n1> = S.quotient_module(X^2 + z^25)
|
|
859
|
+
sage: g = M.hom({z*m0: n0})
|
|
860
|
+
sage: g.determinant()
|
|
861
|
+
Traceback (most recent call last):
|
|
862
|
+
...
|
|
863
|
+
ValueError: determinants are only defined for endomorphisms
|
|
864
|
+
"""
|
|
865
|
+
if self.domain() is not self.codomain():
|
|
866
|
+
raise ValueError("determinants are only defined for endomorphisms")
|
|
867
|
+
return self._matrix.determinant()
|
|
868
|
+
|
|
869
|
+
det = determinant
|
|
870
|
+
|
|
871
|
+
def characteristic_polynomial(self, var='x'):
|
|
872
|
+
r"""
|
|
873
|
+
Return the determinant of this endomorphism.
|
|
874
|
+
|
|
875
|
+
EXAMPLES::
|
|
876
|
+
|
|
877
|
+
sage: K.<z> = GF(5^3)
|
|
878
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
879
|
+
sage: P = X^3 + z*X^2 + (z^2 + 3)*X + z^5
|
|
880
|
+
sage: M = S.quotient_module(P)
|
|
881
|
+
sage: f = M.multiplication_map(X^3)
|
|
882
|
+
sage: f.characteristic_polynomial()
|
|
883
|
+
x^3 + x^2 + 2*x + 2
|
|
884
|
+
|
|
885
|
+
We check that the latter is equal to the reduced norm
|
|
886
|
+
of `P`::
|
|
887
|
+
|
|
888
|
+
sage: P.reduced_norm('x')
|
|
889
|
+
x^3 + x^2 + 2*x + 2
|
|
890
|
+
|
|
891
|
+
TESTS::
|
|
892
|
+
|
|
893
|
+
sage: M.<m0,m1> = S.quotient_module(X^2 + z)
|
|
894
|
+
sage: N.<n0,n1> = S.quotient_module(X^2 + z^25)
|
|
895
|
+
sage: g = M.hom({z*m0: n0})
|
|
896
|
+
sage: g.characteristic_polynomial()
|
|
897
|
+
Traceback (most recent call last):
|
|
898
|
+
...
|
|
899
|
+
ValueError: characteristic polynomials are only defined for endomorphisms
|
|
900
|
+
"""
|
|
901
|
+
if self.domain() is not self.codomain():
|
|
902
|
+
raise ValueError("characteristic polynomials are only defined for endomorphisms")
|
|
903
|
+
return self._matrix.charpoly(var)
|
|
904
|
+
|
|
905
|
+
charpoly = characteristic_polynomial
|
|
906
|
+
|
|
907
|
+
|
|
908
|
+
class OreModuleRetraction(Map):
|
|
909
|
+
r"""
|
|
910
|
+
Conversion (partially defined) map from an ambient module
|
|
911
|
+
to one of its submodule.
|
|
912
|
+
"""
|
|
913
|
+
def _call_(self, y):
|
|
914
|
+
r"""
|
|
915
|
+
TESTS::
|
|
916
|
+
|
|
917
|
+
sage: K.<z> = GF(5^3)
|
|
918
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
919
|
+
sage: P = X^2 + z*X + 1
|
|
920
|
+
sage: M = S.quotient_module(P^2, names='e')
|
|
921
|
+
sage: M.inject_variables()
|
|
922
|
+
Defining e0, e1, e2, e3
|
|
923
|
+
sage: N = M.span(P*e0, names='u')
|
|
924
|
+
sage: N(P*e0) # indirect doctest
|
|
925
|
+
u0 + z*u1
|
|
926
|
+
|
|
927
|
+
sage: N(e0)
|
|
928
|
+
Traceback (most recent call last):
|
|
929
|
+
...
|
|
930
|
+
ValueError: not in the submodule
|
|
931
|
+
"""
|
|
932
|
+
X = self.codomain()
|
|
933
|
+
try:
|
|
934
|
+
xs = X._basis.solve_left(y)
|
|
935
|
+
except ValueError:
|
|
936
|
+
raise ValueError("not in the submodule")
|
|
937
|
+
return X(xs)
|
|
938
|
+
|
|
939
|
+
|
|
940
|
+
class OreModuleSection(Map):
|
|
941
|
+
r"""
|
|
942
|
+
Section map of the projection onto a quotient.
|
|
943
|
+
It is not necessarily compatible with the Ore action.
|
|
944
|
+
"""
|
|
945
|
+
def _call_(self, y):
|
|
946
|
+
r"""
|
|
947
|
+
TESTS::
|
|
948
|
+
|
|
949
|
+
sage: K.<z> = GF(5^3)
|
|
950
|
+
sage: S.<X> = OrePolynomialRing(K, K.frobenius_endomorphism())
|
|
951
|
+
sage: P = X^2 + z*X + 1
|
|
952
|
+
sage: M = S.quotient_module(P^2, names='e')
|
|
953
|
+
sage: M.inject_variables()
|
|
954
|
+
Defining e0, e1, e2, e3
|
|
955
|
+
sage: N = M.quo(P*e0, names='u')
|
|
956
|
+
sage: N.inject_variables()
|
|
957
|
+
Defining u0, u1
|
|
958
|
+
sage: M(u0) # indirect doctest
|
|
959
|
+
e2
|
|
960
|
+
"""
|
|
961
|
+
X = self.codomain()
|
|
962
|
+
Y = self.domain()
|
|
963
|
+
indices = Y._indices
|
|
964
|
+
zero = X.base_ring().zero()
|
|
965
|
+
xs = X.rank() * [zero]
|
|
966
|
+
for i in range(Y.rank()):
|
|
967
|
+
xs[indices[i]] = y[i]
|
|
968
|
+
return X(xs)
|