passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-0cd532bd.so.1 +0 -0
- passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-x86_64-linux-musl.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-x86_64-linux-musl.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,920 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
Morphisms between extension of rings
|
|
4
|
+
|
|
5
|
+
AUTHOR:
|
|
6
|
+
|
|
7
|
+
- Xavier Caruso (2019)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
#############################################################################
|
|
11
|
+
# Copyright (C) 2019 Xavier Caruso <xavier.caruso@normalesup.org>
|
|
12
|
+
#
|
|
13
|
+
# This program is free software: you can redistribute it and/or modify
|
|
14
|
+
# it under the terms of the GNU General Public License as published by
|
|
15
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
16
|
+
# (at your option) any later version.
|
|
17
|
+
# http://www.gnu.org/licenses/
|
|
18
|
+
#****************************************************************************
|
|
19
|
+
|
|
20
|
+
from sage.misc.cachefunc import cached_method
|
|
21
|
+
from sage.structure.richcmp import op_EQ, op_NE
|
|
22
|
+
|
|
23
|
+
from sage.structure.element cimport Element
|
|
24
|
+
from sage.categories.map import Map
|
|
25
|
+
from sage.structure.parent cimport Parent
|
|
26
|
+
from sage.rings.morphism cimport RingMap
|
|
27
|
+
from sage.rings.ring_extension cimport RingExtension_generic, RingExtensionWithBasis
|
|
28
|
+
from sage.rings.ring_extension_element cimport RingExtensionElement
|
|
29
|
+
from sage.rings.ring_extension_conversion cimport backend_parent, backend_element, backend_morphism
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# I don't trust the operator ==
|
|
33
|
+
cdef are_equal_morphisms(f, g):
|
|
34
|
+
r"""
|
|
35
|
+
Return ``True`` if ``f`` and ``g`` coincide on the
|
|
36
|
+
generators of the domain, ``False`` otherwise.
|
|
37
|
+
|
|
38
|
+
INPUT:
|
|
39
|
+
|
|
40
|
+
- ``f`` -- a ring homomorphism or ``None``; if ``None``,
|
|
41
|
+
we consider that ``f`` is a coercion map
|
|
42
|
+
|
|
43
|
+
- ``g`` -- a ring homomorphism or ``None``
|
|
44
|
+
|
|
45
|
+
TESTS::
|
|
46
|
+
|
|
47
|
+
sage: S.<x> = QQ[]
|
|
48
|
+
sage: T.<y> = S[]
|
|
49
|
+
sage: TT = T.over(QQ)
|
|
50
|
+
sage: H = End(TT)
|
|
51
|
+
|
|
52
|
+
sage: cc = S.hom([-x])
|
|
53
|
+
sage: f = T.hom([x^2 + y^2], base_map=cc)
|
|
54
|
+
sage: g = T.hom([x^2 + y^2])
|
|
55
|
+
|
|
56
|
+
sage: H(f) == H(g) # indirect doctest
|
|
57
|
+
False
|
|
58
|
+
sage: H(f^2) == H(g^2) # indirect doctest
|
|
59
|
+
True
|
|
60
|
+
"""
|
|
61
|
+
cdef Parent b
|
|
62
|
+
cdef tuple gens
|
|
63
|
+
if f is None and g is None:
|
|
64
|
+
return True
|
|
65
|
+
if f is None:
|
|
66
|
+
f, g = g, f
|
|
67
|
+
gens = tuple()
|
|
68
|
+
b = f.domain()
|
|
69
|
+
while b is not b._base:
|
|
70
|
+
gens += b.gens()
|
|
71
|
+
b = b._base
|
|
72
|
+
if g is None:
|
|
73
|
+
for x in gens:
|
|
74
|
+
if f(x) != x: return False
|
|
75
|
+
else:
|
|
76
|
+
for x in gens:
|
|
77
|
+
if f(x) != g(x): return False
|
|
78
|
+
return True
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
cdef class RingExtensionHomomorphism(RingMap):
|
|
82
|
+
r"""
|
|
83
|
+
A class for ring homomorphisms between extensions.
|
|
84
|
+
|
|
85
|
+
TESTS::
|
|
86
|
+
|
|
87
|
+
sage: # needs sage.rings.finite_rings
|
|
88
|
+
sage: K.<a> = GF(5^2).over()
|
|
89
|
+
sage: L.<b> = GF(5^4).over(K)
|
|
90
|
+
sage: phi = L.hom([b^5, a^5]); phi
|
|
91
|
+
Ring endomorphism of Field in b
|
|
92
|
+
with defining polynomial x^2 + (3 - a)*x + a over its base
|
|
93
|
+
Defn: b |--> (2 + a) + 2*b
|
|
94
|
+
with map on base ring:
|
|
95
|
+
a |--> 1 - a
|
|
96
|
+
sage: type(phi)
|
|
97
|
+
<class 'sage.rings.ring_extension_morphism.RingExtensionHomomorphism'>
|
|
98
|
+
sage: TestSuite(phi).run()
|
|
99
|
+
"""
|
|
100
|
+
def __init__(self, parent, defn, base_map=None, check=True):
|
|
101
|
+
r"""
|
|
102
|
+
Initialize this morphism.
|
|
103
|
+
|
|
104
|
+
INPUT:
|
|
105
|
+
|
|
106
|
+
- ``defn`` -- the definition of the morphism (either a map or images of generators)
|
|
107
|
+
|
|
108
|
+
- ``base_map`` -- a ring homomorphism or ``None`` (default: ``None``);
|
|
109
|
+
the action of this morphism on one of the bases of the domain;
|
|
110
|
+
if ``None``, a coercion map is used
|
|
111
|
+
|
|
112
|
+
- ``check`` -- boolean (default: ``True``); whether to check if
|
|
113
|
+
the given data define a valid homomorphism
|
|
114
|
+
|
|
115
|
+
TESTS::
|
|
116
|
+
|
|
117
|
+
sage: S.<x> = QQ[]
|
|
118
|
+
sage: T.<x,y> = QQ[]
|
|
119
|
+
sage: f = T.hom([x^2, y^2]); f
|
|
120
|
+
Ring endomorphism of Multivariate Polynomial Ring in x, y over Rational Field
|
|
121
|
+
Defn: x |--> x^2
|
|
122
|
+
y |--> y^2
|
|
123
|
+
|
|
124
|
+
sage: TT = T.over(QQ)
|
|
125
|
+
sage: End(TT)(f)
|
|
126
|
+
Ring endomorphism of Multivariate Polynomial Ring in x, y over Rational Field over its base
|
|
127
|
+
Defn: x |--> x^2
|
|
128
|
+
y |--> y^2
|
|
129
|
+
|
|
130
|
+
sage: TT = T.over(S)
|
|
131
|
+
sage: End(TT)(f)
|
|
132
|
+
Ring endomorphism of Multivariate Polynomial Ring in x, y over Rational Field over its base
|
|
133
|
+
Defn: y |--> y^2
|
|
134
|
+
with map on base ring:
|
|
135
|
+
x |--> x^2
|
|
136
|
+
"""
|
|
137
|
+
RingMap.__init__(self, parent)
|
|
138
|
+
domain = self.domain()
|
|
139
|
+
backend_domain = backend_parent(domain)
|
|
140
|
+
codomain = self.codomain()
|
|
141
|
+
backend_codomain = backend_parent(codomain)
|
|
142
|
+
# We construct the backend morphism
|
|
143
|
+
if isinstance(defn, Map):
|
|
144
|
+
if base_map is not None:
|
|
145
|
+
raise ValueError("base_map cannot be set when passing in the backend morphism")
|
|
146
|
+
backend = backend_morphism(defn)
|
|
147
|
+
if backend.domain() is not backend_domain:
|
|
148
|
+
raise TypeError("the domain of the backend morphism is not correct")
|
|
149
|
+
if backend.codomain() is not backend_codomain:
|
|
150
|
+
raise TypeError("the codomain of the backend morphism is not correct")
|
|
151
|
+
self._backend = backend
|
|
152
|
+
self._im_gens = None
|
|
153
|
+
self._base_map_construction = False
|
|
154
|
+
elif isinstance(defn, (list, tuple)):
|
|
155
|
+
# We figure out what is the base
|
|
156
|
+
if base_map is not None:
|
|
157
|
+
base = base_map.domain()
|
|
158
|
+
gens = domain.gens(base)
|
|
159
|
+
else:
|
|
160
|
+
base = domain
|
|
161
|
+
gens = tuple()
|
|
162
|
+
while True:
|
|
163
|
+
if len(gens) == len(defn):
|
|
164
|
+
break
|
|
165
|
+
if len(gens) > len(defn) or base is base.base_ring():
|
|
166
|
+
raise ValueError("the number of images does not match the number of generators")
|
|
167
|
+
gens += base.gens()
|
|
168
|
+
base = base.base_ring()
|
|
169
|
+
# We construct the backend morphism
|
|
170
|
+
im_gens = [ codomain(x) for x in defn ]
|
|
171
|
+
backend_bases = [ backend_domain ]
|
|
172
|
+
b = backend_domain.base_ring()
|
|
173
|
+
while b is not b.base_ring():
|
|
174
|
+
backend_bases.append(b)
|
|
175
|
+
b = b.base_ring()
|
|
176
|
+
backend_bases.reverse()
|
|
177
|
+
current_morphism = None
|
|
178
|
+
for current_domain in backend_bases:
|
|
179
|
+
current_im_gens = [ ]
|
|
180
|
+
for x in current_domain.gens():
|
|
181
|
+
pol = domain(backend_domain(x)).polynomial(base)
|
|
182
|
+
if base_map is not None:
|
|
183
|
+
pol = pol.map_coefficients(base_map)
|
|
184
|
+
y = pol(im_gens)
|
|
185
|
+
current_im_gens.append(backend_element(y))
|
|
186
|
+
current_morphism = current_domain.hom(current_im_gens, base_map=current_morphism, check=check)
|
|
187
|
+
# We check that everything went well
|
|
188
|
+
if check:
|
|
189
|
+
for i in range(len(gens)):
|
|
190
|
+
x = backend_element(domain(gens[i]))
|
|
191
|
+
y = backend_element(im_gens[i])
|
|
192
|
+
if current_morphism(x) != y:
|
|
193
|
+
raise ValueError("images do not define a valid homomorphism")
|
|
194
|
+
coercion_morphism = backend_morphism(domain.defining_morphism(base))
|
|
195
|
+
if base_map is None:
|
|
196
|
+
backend_base_map = coercion_morphism
|
|
197
|
+
else:
|
|
198
|
+
backend_base_map = backend_morphism(base_map)
|
|
199
|
+
restriction_current_morphism = current_morphism * coercion_morphism
|
|
200
|
+
if not are_equal_morphisms(restriction_current_morphism, backend_base_map):
|
|
201
|
+
raise ValueError("images do not define a valid homomorphism")
|
|
202
|
+
self._backend = current_morphism
|
|
203
|
+
self._im_gens = im_gens[:domain.ngens()]
|
|
204
|
+
if base is domain.base_ring():
|
|
205
|
+
self._base_map_construction = base_map
|
|
206
|
+
else:
|
|
207
|
+
self._base_map_construction = {
|
|
208
|
+
'im_gens': defn[domain.ngens():],
|
|
209
|
+
'base_map': base_map,
|
|
210
|
+
'check': False
|
|
211
|
+
}
|
|
212
|
+
else:
|
|
213
|
+
raise TypeError
|
|
214
|
+
|
|
215
|
+
def _repr_type(self):
|
|
216
|
+
r"""
|
|
217
|
+
Return a string that describes the type of this morphism.
|
|
218
|
+
|
|
219
|
+
EXAMPLES::
|
|
220
|
+
|
|
221
|
+
sage: K.<a> = GF(5^2).over() # over GF(5) # needs sage.rings.finite_rings
|
|
222
|
+
sage: f = K.hom([a^5]); f # needs sage.rings.finite_rings
|
|
223
|
+
Ring endomorphism of Field in a with defining polynomial x^2 + 4*x + 2 over its base
|
|
224
|
+
Defn: a |--> 1 - a
|
|
225
|
+
|
|
226
|
+
sage: f._repr_type() # needs sage.rings.finite_rings
|
|
227
|
+
'Ring'
|
|
228
|
+
"""
|
|
229
|
+
return "Ring"
|
|
230
|
+
|
|
231
|
+
cpdef Element _call_(self, x):
|
|
232
|
+
r"""
|
|
233
|
+
Return the image of ``x`` under this morphism.
|
|
234
|
+
|
|
235
|
+
INPUT:
|
|
236
|
+
|
|
237
|
+
- ``x`` -- an element in the domain of this morphism
|
|
238
|
+
|
|
239
|
+
EXAMPLES::
|
|
240
|
+
|
|
241
|
+
sage: # needs sage.rings.number_field
|
|
242
|
+
sage: x = polygen(QQ, 'x')
|
|
243
|
+
sage: A.<sqrt2> = QQ.extension(x^2 - 2)
|
|
244
|
+
sage: K.<sqrt2> = A.over()
|
|
245
|
+
sage: f = K.hom([-sqrt2]); f
|
|
246
|
+
Ring endomorphism of Field in sqrt2 with defining polynomial x^2 - 2 over its base
|
|
247
|
+
Defn: sqrt2 |--> -sqrt2
|
|
248
|
+
sage: f(sqrt2)
|
|
249
|
+
-sqrt2
|
|
250
|
+
|
|
251
|
+
TESTS::
|
|
252
|
+
|
|
253
|
+
sage: a = QQ.random_element()
|
|
254
|
+
sage: b = QQ.random_element()
|
|
255
|
+
sage: f(a + b*sqrt2) == a - b*sqrt2 # needs sage.rings.number_field
|
|
256
|
+
True
|
|
257
|
+
"""
|
|
258
|
+
y = self._backend(backend_element(x))
|
|
259
|
+
if isinstance(self.codomain(), RingExtension_generic):
|
|
260
|
+
y = self._codomain(y)
|
|
261
|
+
return y
|
|
262
|
+
|
|
263
|
+
@cached_method
|
|
264
|
+
def base_map(self):
|
|
265
|
+
r"""
|
|
266
|
+
Return the base map of this morphism
|
|
267
|
+
or just ``None`` if the base map is a coercion map.
|
|
268
|
+
|
|
269
|
+
EXAMPLES::
|
|
270
|
+
|
|
271
|
+
sage: F = GF(5)
|
|
272
|
+
sage: K.<a> = GF(5^2).over(F) # needs sage.rings.finite_rings
|
|
273
|
+
sage: L.<b> = GF(5^6).over(K) # needs sage.rings.finite_rings
|
|
274
|
+
|
|
275
|
+
We define the absolute Frobenius of L::
|
|
276
|
+
|
|
277
|
+
sage: FrobL = L.hom([b^5, a^5]); FrobL # needs sage.rings.finite_rings
|
|
278
|
+
Ring endomorphism of
|
|
279
|
+
Field in b with defining polynomial x^3 + (2 + 2*a)*x - a over its base
|
|
280
|
+
Defn: b |--> (-1 + a) + (1 + 2*a)*b + a*b^2
|
|
281
|
+
with map on base ring:
|
|
282
|
+
a |--> 1 - a
|
|
283
|
+
sage: FrobL.base_map() # needs sage.rings.finite_rings
|
|
284
|
+
Ring morphism:
|
|
285
|
+
From: Field in a with defining polynomial x^2 + 4*x + 2 over its base
|
|
286
|
+
To: Field in b with defining polynomial x^3 + (2 + 2*a)*x - a over its base
|
|
287
|
+
Defn: a |--> 1 - a
|
|
288
|
+
|
|
289
|
+
The square of ``FrobL`` acts trivially on K; in other words, it has
|
|
290
|
+
a trivial base map::
|
|
291
|
+
|
|
292
|
+
sage: phi = FrobL^2; phi # needs sage.rings.finite_rings
|
|
293
|
+
Ring endomorphism of
|
|
294
|
+
Field in b with defining polynomial x^3 + (2 + 2*a)*x - a over its base
|
|
295
|
+
Defn: b |--> 2 + 2*a*b + (2 - a)*b^2
|
|
296
|
+
sage: phi.base_map() # needs sage.rings.finite_rings
|
|
297
|
+
"""
|
|
298
|
+
domain = self.domain()
|
|
299
|
+
codomain = self.codomain()
|
|
300
|
+
base = domain.base_ring()
|
|
301
|
+
if base is base.base_ring():
|
|
302
|
+
return None
|
|
303
|
+
base_map = self._base_map_construction
|
|
304
|
+
if base_map is False:
|
|
305
|
+
if base is domain:
|
|
306
|
+
base_map = None
|
|
307
|
+
else:
|
|
308
|
+
base_map = self * domain.coerce_map_from(base)
|
|
309
|
+
elif isinstance(base_map, dict):
|
|
310
|
+
base_map = base.hom(**self._base_map_construction)
|
|
311
|
+
if base_map is None:
|
|
312
|
+
return None
|
|
313
|
+
if (codomain.has_coerce_map_from(base) and
|
|
314
|
+
are_equal_morphisms(backend_morphism(base_map),
|
|
315
|
+
backend_morphism(codomain.coerce_map_from(base)))):
|
|
316
|
+
return None
|
|
317
|
+
if base_map.codomain() is not self.codomain():
|
|
318
|
+
base_map = base_map.extend_codomain(self.codomain())
|
|
319
|
+
return base_map
|
|
320
|
+
|
|
321
|
+
cpdef _richcmp_(self, other, int op):
|
|
322
|
+
r"""
|
|
323
|
+
Compare this element with ``other`` according to
|
|
324
|
+
the rich comparison operator ``op``.
|
|
325
|
+
|
|
326
|
+
INPUT:
|
|
327
|
+
|
|
328
|
+
- ``other`` -- a morphism with the same codomain and codomain
|
|
329
|
+
|
|
330
|
+
- ``op`` -- the comparison operator
|
|
331
|
+
|
|
332
|
+
TESTS::
|
|
333
|
+
|
|
334
|
+
sage: # needs sage.rings.finite_rings
|
|
335
|
+
sage: K.<a> = GF(5^2).over() # over GF(5)
|
|
336
|
+
sage: L.<b> = GF(5^6).over(K)
|
|
337
|
+
sage: FrobK = K.hom([a^5])
|
|
338
|
+
sage: FrobL = L.hom([b^5], base_map=FrobK)
|
|
339
|
+
sage: FrobK^2 == End(K).identity()
|
|
340
|
+
True
|
|
341
|
+
sage: FrobL^6 == End(L).identity()
|
|
342
|
+
True
|
|
343
|
+
"""
|
|
344
|
+
eq = are_equal_morphisms(self._backend, backend_morphism(other))
|
|
345
|
+
if op == op_EQ:
|
|
346
|
+
return eq
|
|
347
|
+
if op == op_NE:
|
|
348
|
+
return not eq
|
|
349
|
+
return NotImplemented
|
|
350
|
+
|
|
351
|
+
def is_identity(self):
|
|
352
|
+
r"""
|
|
353
|
+
Return whether this morphism is the identity.
|
|
354
|
+
|
|
355
|
+
EXAMPLES::
|
|
356
|
+
|
|
357
|
+
sage: # needs sage.rings.finite_rings
|
|
358
|
+
sage: K.<a> = GF(5^2).over() # over GF(5)
|
|
359
|
+
sage: FrobK = K.hom([a^5])
|
|
360
|
+
sage: FrobK.is_identity()
|
|
361
|
+
False
|
|
362
|
+
sage: (FrobK^2).is_identity()
|
|
363
|
+
True
|
|
364
|
+
|
|
365
|
+
Coercion maps are not considered as identity morphisms::
|
|
366
|
+
|
|
367
|
+
sage: # needs sage.rings.finite_rings
|
|
368
|
+
sage: L.<b> = GF(5^6).over(K)
|
|
369
|
+
sage: iota = L.defining_morphism(); iota
|
|
370
|
+
Ring morphism:
|
|
371
|
+
From: Field in a with defining polynomial x^2 + 4*x + 2 over its base
|
|
372
|
+
To: Field in b with defining polynomial x^3 + (2 + 2*a)*x - a over its base
|
|
373
|
+
Defn: a |--> a
|
|
374
|
+
sage: iota.is_identity()
|
|
375
|
+
False
|
|
376
|
+
"""
|
|
377
|
+
if self.domain() is not self.codomain():
|
|
378
|
+
return False
|
|
379
|
+
return are_equal_morphisms(self._backend, None)
|
|
380
|
+
|
|
381
|
+
def is_injective(self):
|
|
382
|
+
r"""
|
|
383
|
+
Return whether this morphism is injective.
|
|
384
|
+
|
|
385
|
+
EXAMPLES::
|
|
386
|
+
|
|
387
|
+
sage: # needs sage.rings.finite_rings
|
|
388
|
+
sage: K = GF(5^10).over(GF(5^5))
|
|
389
|
+
sage: iota = K.defining_morphism(); iota
|
|
390
|
+
Ring morphism:
|
|
391
|
+
From: Finite Field in z5 of size 5^5
|
|
392
|
+
To: Field in z10 with defining polynomial
|
|
393
|
+
x^2 + (2*z5^3 + 2*z5^2 + 4*z5 + 4)*x + z5 over its base
|
|
394
|
+
Defn: z5 |--> z5
|
|
395
|
+
sage: iota.is_injective()
|
|
396
|
+
True
|
|
397
|
+
|
|
398
|
+
sage: K = GF(7).over(ZZ)
|
|
399
|
+
sage: iota = K.defining_morphism(); iota
|
|
400
|
+
Ring morphism:
|
|
401
|
+
From: Integer Ring
|
|
402
|
+
To: Finite Field of size 7 over its base
|
|
403
|
+
Defn: 1 |--> 1
|
|
404
|
+
sage: iota.is_injective()
|
|
405
|
+
False
|
|
406
|
+
"""
|
|
407
|
+
return self._backend.is_injective()
|
|
408
|
+
|
|
409
|
+
def is_surjective(self):
|
|
410
|
+
r"""
|
|
411
|
+
Return whether this morphism is surjective.
|
|
412
|
+
|
|
413
|
+
EXAMPLES::
|
|
414
|
+
|
|
415
|
+
sage: # needs sage.rings.finite_rings
|
|
416
|
+
sage: K = GF(5^10).over(GF(5^5))
|
|
417
|
+
sage: iota = K.defining_morphism(); iota
|
|
418
|
+
Ring morphism:
|
|
419
|
+
From: Finite Field in z5 of size 5^5
|
|
420
|
+
To: Field in z10 with defining polynomial
|
|
421
|
+
x^2 + (2*z5^3 + 2*z5^2 + 4*z5 + 4)*x + z5 over its base
|
|
422
|
+
Defn: z5 |--> z5
|
|
423
|
+
sage: iota.is_surjective()
|
|
424
|
+
False
|
|
425
|
+
|
|
426
|
+
sage: K = GF(7).over(ZZ)
|
|
427
|
+
sage: iota = K.defining_morphism(); iota
|
|
428
|
+
Ring morphism:
|
|
429
|
+
From: Integer Ring
|
|
430
|
+
To: Finite Field of size 7 over its base
|
|
431
|
+
Defn: 1 |--> 1
|
|
432
|
+
sage: iota.is_surjective()
|
|
433
|
+
True
|
|
434
|
+
"""
|
|
435
|
+
return self._backend.is_surjective()
|
|
436
|
+
|
|
437
|
+
def _repr_defn(self):
|
|
438
|
+
r"""
|
|
439
|
+
Return a string definition of this morphism.
|
|
440
|
+
|
|
441
|
+
By default, we show the action of the morphism on the
|
|
442
|
+
generators of the domain.
|
|
443
|
+
|
|
444
|
+
EXAMPLES::
|
|
445
|
+
|
|
446
|
+
sage: # needs sage.rings.finite_rings
|
|
447
|
+
sage: K.<a> = GF(5^2).over() # over GF(5)
|
|
448
|
+
sage: L.<b> = GF(5^6).over(K)
|
|
449
|
+
sage: FrobL = L.hom([b^5, a^5]) # absolute Frobenius
|
|
450
|
+
sage: print(FrobL._repr_defn())
|
|
451
|
+
b |--> (-1 + a) + (1 + 2*a)*b + a*b^2
|
|
452
|
+
with map on base ring:
|
|
453
|
+
a |--> 1 - a
|
|
454
|
+
"""
|
|
455
|
+
import re
|
|
456
|
+
s = ""
|
|
457
|
+
gens = self.domain().gens()
|
|
458
|
+
if self._im_gens is None:
|
|
459
|
+
self._im_gens = [ self(x) for x in gens ]
|
|
460
|
+
for i in range(len(gens)):
|
|
461
|
+
s += "%s |--> %s\n" % (gens[i], self._im_gens[i])
|
|
462
|
+
if self.base_map() is not None:
|
|
463
|
+
s += "with map on base ring"
|
|
464
|
+
ss = self.base_map()._repr_defn()
|
|
465
|
+
ss = re.sub('\nwith map on base ring:?$', '', ss, flags=re.MULTILINE)
|
|
466
|
+
if ss != "": s += ":\n" + ss
|
|
467
|
+
if s != "" and s[-1] == "\n":
|
|
468
|
+
s = s[:-1]
|
|
469
|
+
return s
|
|
470
|
+
|
|
471
|
+
def _composition(self, right):
|
|
472
|
+
r"""
|
|
473
|
+
Return the composite ``self o right``.
|
|
474
|
+
|
|
475
|
+
TESTS::
|
|
476
|
+
|
|
477
|
+
sage: # needs sage.rings.number_field
|
|
478
|
+
sage: x = polygen(ZZ, 'x')
|
|
479
|
+
sage: A.<sqrt5> = QQ.extension(x^2 - 5)
|
|
480
|
+
sage: K.<sqrt5> = A.over()
|
|
481
|
+
sage: f = K.hom([-sqrt5]); f
|
|
482
|
+
Ring endomorphism of Field in sqrt5 with defining polynomial x^2 - 5 over its base
|
|
483
|
+
Defn: sqrt5 |--> -sqrt5
|
|
484
|
+
sage: f^2 # indirect doctest
|
|
485
|
+
Ring endomorphism of Field in sqrt5 with defining polynomial x^2 - 5 over its base
|
|
486
|
+
Defn: sqrt5 |--> sqrt5
|
|
487
|
+
"""
|
|
488
|
+
domain = right.domain()
|
|
489
|
+
codomain = self.codomain()
|
|
490
|
+
backend_right = backend_morphism(right)
|
|
491
|
+
backend = self._backend * backend_right
|
|
492
|
+
if isinstance(domain, RingExtension_generic) or isinstance(codomain, RingExtension_generic):
|
|
493
|
+
return RingExtensionHomomorphism(domain.Hom(codomain), backend)
|
|
494
|
+
else:
|
|
495
|
+
return backend
|
|
496
|
+
|
|
497
|
+
cdef _update_slots(self, dict _slots):
|
|
498
|
+
"""
|
|
499
|
+
Helper function for copying and pickling.
|
|
500
|
+
|
|
501
|
+
TESTS::
|
|
502
|
+
|
|
503
|
+
sage: # needs sage.rings.finite_rings
|
|
504
|
+
sage: K.<a> = GF(5^2).over() # over GF(5)
|
|
505
|
+
sage: f = K.hom([a^5])
|
|
506
|
+
sage: g = copy(f) # indirect doctest
|
|
507
|
+
sage: f == g
|
|
508
|
+
True
|
|
509
|
+
sage: f is g
|
|
510
|
+
False
|
|
511
|
+
"""
|
|
512
|
+
self._backend = _slots['_backend']
|
|
513
|
+
RingMap._update_slots(self, _slots)
|
|
514
|
+
|
|
515
|
+
cdef dict _extra_slots(self):
|
|
516
|
+
"""
|
|
517
|
+
Helper function for copying and pickling.
|
|
518
|
+
|
|
519
|
+
TESTS::
|
|
520
|
+
|
|
521
|
+
sage: K.<a> = GF(5^2).over() # over GF(5) # needs sage.rings.finite_rings
|
|
522
|
+
sage: f = K.hom([a^5]) # needs sage.rings.finite_rings
|
|
523
|
+
sage: loads(dumps(f)) == f # needs sage.rings.finite_rings
|
|
524
|
+
True
|
|
525
|
+
"""
|
|
526
|
+
slots = RingMap._extra_slots(self)
|
|
527
|
+
slots['_backend'] = self._backend
|
|
528
|
+
return slots
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
cdef class RingExtensionBackendIsomorphism(RingExtensionHomomorphism):
|
|
532
|
+
r"""
|
|
533
|
+
A class for implementating isomorphisms taking an element of the
|
|
534
|
+
backend to its ring extension.
|
|
535
|
+
|
|
536
|
+
TESTS::
|
|
537
|
+
|
|
538
|
+
sage: # needs sage.rings.finite_rings
|
|
539
|
+
sage: K = GF(11^9).over(GF(11^3))
|
|
540
|
+
sage: f = K.coerce_map_from(GF(11^9)); f
|
|
541
|
+
Coercion morphism:
|
|
542
|
+
From: Finite Field in z9 of size 11^9
|
|
543
|
+
To: Field in z9 with defining polynomial
|
|
544
|
+
x^3 + (9*z3^2 + 5*z3 + 1)*x^2 + (4*z3 + 3)*x + 10*z3 over its base
|
|
545
|
+
sage: type(f)
|
|
546
|
+
<class 'sage.rings.ring_extension_morphism.RingExtensionBackendIsomorphism'>
|
|
547
|
+
sage: TestSuite(f).run()
|
|
548
|
+
"""
|
|
549
|
+
def __init__(self, parent):
|
|
550
|
+
r"""
|
|
551
|
+
Initialize this morphism.
|
|
552
|
+
|
|
553
|
+
TESTS::
|
|
554
|
+
|
|
555
|
+
sage: x = polygen(ZZ, 'x')
|
|
556
|
+
sage: A.<a> = QQ.extension(x^2 - 5) # needs sage.rings.number_field
|
|
557
|
+
sage: K = A.over() # needs sage.rings.number_field
|
|
558
|
+
sage: K.coerce_map_from(A) # needs sage.rings.number_field
|
|
559
|
+
Coercion morphism:
|
|
560
|
+
From: Number Field in a with defining polynomial x^2 - 5
|
|
561
|
+
To: Field in a with defining polynomial x^2 - 5 over its base
|
|
562
|
+
"""
|
|
563
|
+
RingMap.__init__(self, parent)
|
|
564
|
+
domain = self.domain()
|
|
565
|
+
self._backend = domain.Hom(domain).identity()
|
|
566
|
+
|
|
567
|
+
def _repr_type(self):
|
|
568
|
+
r"""
|
|
569
|
+
Return a string that describes the type of this morphism.
|
|
570
|
+
|
|
571
|
+
EXAMPLES::
|
|
572
|
+
|
|
573
|
+
sage: K.<a> = GF(5^2).over() # over GF(5) # needs sage.rings.finite_rings
|
|
574
|
+
sage: f = K.coerce_map_from(GF(5^2)); f # needs sage.rings.finite_rings
|
|
575
|
+
Coercion morphism:
|
|
576
|
+
From: Finite Field in z2 of size 5^2
|
|
577
|
+
To: Field in a with defining polynomial x^2 + 4*x + 2 over its base
|
|
578
|
+
|
|
579
|
+
sage: f._repr_type() # needs sage.rings.finite_rings
|
|
580
|
+
'Coercion'
|
|
581
|
+
"""
|
|
582
|
+
return "Coercion"
|
|
583
|
+
|
|
584
|
+
def _repr_defn(self):
|
|
585
|
+
r"""
|
|
586
|
+
Return the empty string since this morphism is canonical.
|
|
587
|
+
|
|
588
|
+
EXAMPLES::
|
|
589
|
+
|
|
590
|
+
sage: K.<a> = GF(5^2).over() # over GF(5) # needs sage.rings.finite_rings
|
|
591
|
+
sage: f = K.coerce_map_from(GF(5^2)); f # needs sage.rings.finite_rings
|
|
592
|
+
Coercion morphism:
|
|
593
|
+
From: Finite Field in z2 of size 5^2
|
|
594
|
+
To: Field in a with defining polynomial x^2 + 4*x + 2 over its base
|
|
595
|
+
|
|
596
|
+
sage: f._repr_defn() # needs sage.rings.finite_rings
|
|
597
|
+
''
|
|
598
|
+
"""
|
|
599
|
+
return ""
|
|
600
|
+
|
|
601
|
+
cpdef Element _call_(self, x):
|
|
602
|
+
r"""
|
|
603
|
+
Return the image of ``x`` under this morphism.
|
|
604
|
+
|
|
605
|
+
INPUT:
|
|
606
|
+
|
|
607
|
+
- ``x`` -- an element in the domain of this morphism
|
|
608
|
+
|
|
609
|
+
EXAMPLES::
|
|
610
|
+
|
|
611
|
+
sage: K.<a> = GF(5^2).over() # over GF(5) # needs sage.rings.finite_rings
|
|
612
|
+
sage: f = K.coerce_map_from(GF(5^2)) # needs sage.rings.finite_rings
|
|
613
|
+
sage: f(GF(5^2).gen()) # needs sage.rings.finite_rings
|
|
614
|
+
a
|
|
615
|
+
"""
|
|
616
|
+
codomain = self.codomain()
|
|
617
|
+
return codomain.element_class(codomain, x)
|
|
618
|
+
|
|
619
|
+
|
|
620
|
+
cdef class RingExtensionBackendReverseIsomorphism(RingExtensionHomomorphism):
|
|
621
|
+
r"""
|
|
622
|
+
A class for implementating isomorphisms from a ring extension to
|
|
623
|
+
its backend.
|
|
624
|
+
|
|
625
|
+
TESTS::
|
|
626
|
+
|
|
627
|
+
sage: # needs sage.rings.finite_rings
|
|
628
|
+
sage: K = GF(11^9).over(GF(11^3))
|
|
629
|
+
sage: f = GF(11^9).convert_map_from(K); f
|
|
630
|
+
Canonical morphism:
|
|
631
|
+
From: Field in z9 with defining polynomial
|
|
632
|
+
x^3 + (9*z3^2 + 5*z3 + 1)*x^2 + (4*z3 + 3)*x + 10*z3 over its base
|
|
633
|
+
To: Finite Field in z9 of size 11^9
|
|
634
|
+
sage: type(f)
|
|
635
|
+
<class 'sage.rings.ring_extension_morphism.RingExtensionBackendReverseIsomorphism'>
|
|
636
|
+
sage: TestSuite(f).run()
|
|
637
|
+
"""
|
|
638
|
+
def __init__(self, parent):
|
|
639
|
+
r"""
|
|
640
|
+
Initialize this morphism.
|
|
641
|
+
|
|
642
|
+
TESTS::
|
|
643
|
+
|
|
644
|
+
sage: x = polygen(ZZ, 'x')
|
|
645
|
+
sage: A.<a> = QQ.extension(x^2 - 5) # needs sage.rings.number_field
|
|
646
|
+
sage: K = A.over() # needs sage.rings.number_field
|
|
647
|
+
sage: A.convert_map_from(K) # needs sage.rings.number_field
|
|
648
|
+
Canonical morphism:
|
|
649
|
+
From: Field in a with defining polynomial x^2 - 5 over its base
|
|
650
|
+
To: Number Field in a with defining polynomial x^2 - 5
|
|
651
|
+
"""
|
|
652
|
+
RingMap.__init__(self, parent)
|
|
653
|
+
codomain = self.codomain()
|
|
654
|
+
self._backend = codomain.Hom(codomain).identity()
|
|
655
|
+
|
|
656
|
+
def _repr_type(self):
|
|
657
|
+
r"""
|
|
658
|
+
Return a string that describes the type of this morphism.
|
|
659
|
+
|
|
660
|
+
EXAMPLES::
|
|
661
|
+
|
|
662
|
+
sage: K.<a> = GF(5^2).over() # over GF(5) # needs sage.rings.finite_rings
|
|
663
|
+
sage: f = GF(5^2).convert_map_from(K); f # needs sage.rings.finite_rings
|
|
664
|
+
Canonical morphism:
|
|
665
|
+
From: Field in a with defining polynomial x^2 + 4*x + 2 over its base
|
|
666
|
+
To: Finite Field in z2 of size 5^2
|
|
667
|
+
|
|
668
|
+
sage: f._repr_type() # needs sage.rings.finite_rings
|
|
669
|
+
'Canonical'
|
|
670
|
+
"""
|
|
671
|
+
return "Canonical"
|
|
672
|
+
|
|
673
|
+
def _repr_defn(self):
|
|
674
|
+
r"""
|
|
675
|
+
Return the empty string since this morphism is canonical.
|
|
676
|
+
|
|
677
|
+
EXAMPLES::
|
|
678
|
+
|
|
679
|
+
sage: K.<a> = GF(5^2).over() # over GF(5) # needs sage.rings.finite_rings
|
|
680
|
+
sage: f = GF(5^2).convert_map_from(K); f # needs sage.rings.finite_rings
|
|
681
|
+
Canonical morphism:
|
|
682
|
+
From: Field in a with defining polynomial x^2 + 4*x + 2 over its base
|
|
683
|
+
To: Finite Field in z2 of size 5^2
|
|
684
|
+
|
|
685
|
+
sage: f._repr_defn() # needs sage.rings.finite_rings
|
|
686
|
+
''
|
|
687
|
+
"""
|
|
688
|
+
return ""
|
|
689
|
+
|
|
690
|
+
cpdef Element _call_(self, x):
|
|
691
|
+
r"""
|
|
692
|
+
Return the image of ``x`` under this morphism.
|
|
693
|
+
|
|
694
|
+
INPUT:
|
|
695
|
+
|
|
696
|
+
- ``x`` -- an element in the domain of this morphism
|
|
697
|
+
|
|
698
|
+
EXAMPLES::
|
|
699
|
+
|
|
700
|
+
sage: K.<a> = GF(5^2).over() # over GF(5) # needs sage.rings.finite_rings
|
|
701
|
+
sage: f = GF(5^2).convert_map_from(K) # needs sage.rings.finite_rings
|
|
702
|
+
sage: f(a) # needs sage.rings.finite_rings
|
|
703
|
+
z2
|
|
704
|
+
"""
|
|
705
|
+
return (<RingExtensionElement>x)._backend
|
|
706
|
+
|
|
707
|
+
|
|
708
|
+
cdef class MapFreeModuleToRelativeRing(Map):
|
|
709
|
+
"""
|
|
710
|
+
Base class of the module isomorphism between a ring extension
|
|
711
|
+
and a free module over one of its bases.
|
|
712
|
+
|
|
713
|
+
TESTS::
|
|
714
|
+
|
|
715
|
+
sage: K = GF(5^2).over() # needs sage.rings.finite_rings
|
|
716
|
+
sage: V, i, j = K.free_module() # needs sage.rings.finite_rings
|
|
717
|
+
sage: type(i) # needs sage.rings.finite_rings
|
|
718
|
+
<class 'sage.rings.ring_extension_morphism.MapFreeModuleToRelativeRing'>
|
|
719
|
+
"""
|
|
720
|
+
def __init__(self, E, K):
|
|
721
|
+
r"""
|
|
722
|
+
Initialize this morphism.
|
|
723
|
+
|
|
724
|
+
INPUT:
|
|
725
|
+
|
|
726
|
+
- ``E`` -- a ring extension
|
|
727
|
+
|
|
728
|
+
- ``K`` -- a commutative ring; one base of ``E``
|
|
729
|
+
|
|
730
|
+
TESTS::
|
|
731
|
+
|
|
732
|
+
sage: K = GF(11^6).over(GF(11^3)) # needs sage.rings.finite_rings
|
|
733
|
+
sage: V, i, j = K.free_module() # needs sage.rings.finite_rings
|
|
734
|
+
sage: i # needs sage.rings.finite_rings
|
|
735
|
+
Generic map:
|
|
736
|
+
From: Vector space of dimension 2 over Finite Field in z3 of size 11^3
|
|
737
|
+
To: Field in z6 with defining polynomial x^2 + (10*z3^2 + z3 + 6)*x + z3 over its base
|
|
738
|
+
"""
|
|
739
|
+
self._degree = E.degree(K)
|
|
740
|
+
self._basis = [ (<RingExtensionElement>x)._backend for x in E.basis_over(K) ]
|
|
741
|
+
self._f = backend_morphism(E.defining_morphism(K), forget='codomain')
|
|
742
|
+
domain = K ** self._degree
|
|
743
|
+
parent = domain.Hom(E)
|
|
744
|
+
Map.__init__(self, parent)
|
|
745
|
+
|
|
746
|
+
def is_injective(self):
|
|
747
|
+
r"""
|
|
748
|
+
Return whether this morphism is injective.
|
|
749
|
+
|
|
750
|
+
EXAMPLES::
|
|
751
|
+
|
|
752
|
+
sage: K = GF(11^6).over(GF(11^3)) # needs sage.rings.finite_rings
|
|
753
|
+
sage: V, i, j = K.free_module() # needs sage.rings.finite_rings
|
|
754
|
+
sage: i.is_injective() # needs sage.rings.finite_rings
|
|
755
|
+
True
|
|
756
|
+
"""
|
|
757
|
+
return True
|
|
758
|
+
|
|
759
|
+
def is_surjective(self):
|
|
760
|
+
r"""
|
|
761
|
+
Return whether this morphism is surjective.
|
|
762
|
+
|
|
763
|
+
EXAMPLES::
|
|
764
|
+
|
|
765
|
+
sage: K = GF(11^6).over(GF(11^3)) # needs sage.rings.finite_rings
|
|
766
|
+
sage: V, i, j = K.free_module() # needs sage.rings.finite_rings
|
|
767
|
+
sage: i.is_surjective() # needs sage.rings.finite_rings
|
|
768
|
+
True
|
|
769
|
+
"""
|
|
770
|
+
return True
|
|
771
|
+
|
|
772
|
+
cpdef Element _call_(self, v):
|
|
773
|
+
r"""
|
|
774
|
+
Return the image of ``x`` under this morphism.
|
|
775
|
+
|
|
776
|
+
INPUT:
|
|
777
|
+
|
|
778
|
+
- ``x`` -- an element in the domain of this morphism
|
|
779
|
+
|
|
780
|
+
EXAMPLES::
|
|
781
|
+
|
|
782
|
+
sage: K.<a> = GF(11^6).over(GF(11^3)) # needs sage.rings.finite_rings
|
|
783
|
+
sage: V, i, j = K.free_module() # needs sage.rings.finite_rings
|
|
784
|
+
sage: i((0,1)) # needs sage.rings.finite_rings
|
|
785
|
+
a
|
|
786
|
+
"""
|
|
787
|
+
cdef Element elt
|
|
788
|
+
elt = self._f(v[0]) * self._basis[0]
|
|
789
|
+
for i in range(1, self._degree):
|
|
790
|
+
elt += self._f(v[i]) * self._basis[i]
|
|
791
|
+
return self.codomain()(elt)
|
|
792
|
+
|
|
793
|
+
|
|
794
|
+
cdef class MapRelativeRingToFreeModule(Map):
|
|
795
|
+
"""
|
|
796
|
+
Base class of the module isomorphism between a ring extension
|
|
797
|
+
and a free module over one of its bases.
|
|
798
|
+
|
|
799
|
+
TESTS::
|
|
800
|
+
|
|
801
|
+
sage: K = GF(5^2).over() # needs sage.rings.finite_rings
|
|
802
|
+
sage: V, i, j = K.free_module() # needs sage.rings.finite_rings
|
|
803
|
+
sage: type(j) # needs sage.rings.finite_rings
|
|
804
|
+
<class 'sage.rings.ring_extension_morphism.MapRelativeRingToFreeModule'>
|
|
805
|
+
"""
|
|
806
|
+
def __init__(self, E, K):
|
|
807
|
+
r"""
|
|
808
|
+
Initialize this morphism.
|
|
809
|
+
|
|
810
|
+
INPUT:
|
|
811
|
+
|
|
812
|
+
- ``E`` -- a ring extension
|
|
813
|
+
|
|
814
|
+
- ``K`` -- a commutative ring; one base of ``E``
|
|
815
|
+
|
|
816
|
+
TESTS::
|
|
817
|
+
|
|
818
|
+
sage: K = GF(11^6).over(GF(11^3)) # needs sage.rings.finite_rings
|
|
819
|
+
sage: V, i, j = K.free_module() # needs sage.rings.finite_rings
|
|
820
|
+
sage: j # needs sage.rings.finite_rings
|
|
821
|
+
Generic map:
|
|
822
|
+
From: Field in z6 with defining polynomial x^2 + (10*z3^2 + z3 + 6)*x + z3 over its base
|
|
823
|
+
To: Vector space of dimension 2 over Finite Field in z3 of size 11^3
|
|
824
|
+
"""
|
|
825
|
+
cdef Parent L, base
|
|
826
|
+
|
|
827
|
+
self._degree = (<RingExtensionWithBasis>E)._degree_over(K)
|
|
828
|
+
self._basis = [ (<RingExtensionElement>x)._backend for x in E.basis_over(K) ]
|
|
829
|
+
f = backend_morphism(E.defining_morphism(K), forget='codomain')
|
|
830
|
+
codomain = K ** self._degree
|
|
831
|
+
Map.__init__(self, E.Hom(codomain))
|
|
832
|
+
|
|
833
|
+
K = backend_parent(K)
|
|
834
|
+
L = (<RingExtensionWithBasis>E)._backend
|
|
835
|
+
|
|
836
|
+
# We compute the matrix of our isomorphism (over base)
|
|
837
|
+
from sage.rings.ring_extension import common_base
|
|
838
|
+
base = common_base(K, L, False)
|
|
839
|
+
EK, iK, jK = K.free_module(base, map=True)
|
|
840
|
+
EL, iL, jL = L.free_module(base, map=True)
|
|
841
|
+
|
|
842
|
+
self._dimK = EK.dimension()
|
|
843
|
+
self._iK = iK
|
|
844
|
+
self._jL = jL
|
|
845
|
+
|
|
846
|
+
M = [ ]
|
|
847
|
+
for x in self._basis:
|
|
848
|
+
for v in EK.basis():
|
|
849
|
+
y = x * f(iK(v))
|
|
850
|
+
M.append(jL(y))
|
|
851
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
852
|
+
self._matrix = MatrixSpace(base,len(M))(M).inverse_of_unit()
|
|
853
|
+
|
|
854
|
+
def is_injective(self):
|
|
855
|
+
r"""
|
|
856
|
+
Return whether this morphism is injective.
|
|
857
|
+
|
|
858
|
+
EXAMPLES::
|
|
859
|
+
|
|
860
|
+
sage: K = GF(11^6).over(GF(11^3)) # needs sage.rings.finite_rings
|
|
861
|
+
sage: V, i, j = K.free_module() # needs sage.rings.finite_rings
|
|
862
|
+
sage: j.is_injective() # needs sage.rings.finite_rings
|
|
863
|
+
True
|
|
864
|
+
"""
|
|
865
|
+
return True
|
|
866
|
+
|
|
867
|
+
def is_surjective(self):
|
|
868
|
+
r"""
|
|
869
|
+
Return whether this morphism is injective.
|
|
870
|
+
|
|
871
|
+
EXAMPLES::
|
|
872
|
+
|
|
873
|
+
sage: K = GF(11^6).over(GF(11^3)) # needs sage.rings.finite_rings
|
|
874
|
+
sage: V, i, j = K.free_module() # needs sage.rings.finite_rings
|
|
875
|
+
sage: j.is_surjective() # needs sage.rings.finite_rings
|
|
876
|
+
True
|
|
877
|
+
"""
|
|
878
|
+
return True
|
|
879
|
+
|
|
880
|
+
cpdef Element _call_(self, x):
|
|
881
|
+
r"""
|
|
882
|
+
Return the image of ``x`` under this morphism.
|
|
883
|
+
|
|
884
|
+
INPUT:
|
|
885
|
+
|
|
886
|
+
- ``x`` -- an element in the domain of this morphism
|
|
887
|
+
|
|
888
|
+
EXAMPLES::
|
|
889
|
+
|
|
890
|
+
sage: K.<a> = GF(11^6).over(GF(11^3)) # needs sage.rings.finite_rings
|
|
891
|
+
sage: V, i, j = K.free_module() # needs sage.rings.finite_rings
|
|
892
|
+
sage: j(a) # needs sage.rings.finite_rings
|
|
893
|
+
(0, 1)
|
|
894
|
+
"""
|
|
895
|
+
coeffs = self.backend_coefficients(x)
|
|
896
|
+
return self.codomain()(coeffs)
|
|
897
|
+
|
|
898
|
+
cdef list backend_coefficients(self, RingExtensionElement x):
|
|
899
|
+
r"""
|
|
900
|
+
Return the coordinates of the image of ``x``
|
|
901
|
+
as elements of the backend ring.
|
|
902
|
+
|
|
903
|
+
INPUT:
|
|
904
|
+
|
|
905
|
+
- ``x`` -- an element in the domain of this morphism
|
|
906
|
+
|
|
907
|
+
TESTS::
|
|
908
|
+
|
|
909
|
+
sage: K.<a> = GF(11^9).over(GF(11^3)) # needs sage.rings.finite_rings
|
|
910
|
+
sage: V, i, j = K.free_module() # needs sage.rings.finite_rings
|
|
911
|
+
sage: j(a + 2*a^2) # indirect doctest # needs sage.rings.finite_rings
|
|
912
|
+
(0, 1, 2)
|
|
913
|
+
"""
|
|
914
|
+
cdef list coeffs = [ ]
|
|
915
|
+
dK = self._dimK
|
|
916
|
+
w = (self._jL(x._backend) * self._matrix).list()
|
|
917
|
+
for i in range(self._degree):
|
|
918
|
+
coeff = self._iK(w[i*dK:(i+1)*dK])
|
|
919
|
+
coeffs.append(coeff)
|
|
920
|
+
return coeffs
|