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,1131 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.rings.finite_rings
|
|
3
|
+
r"""
|
|
4
|
+
Finite Drinfeld modules
|
|
5
|
+
|
|
6
|
+
This module provides the class
|
|
7
|
+
:class:`sage.rings.function_fields.drinfeld_module.finite_drinfeld_module.DrinfeldModule_finite`,
|
|
8
|
+
which inherits
|
|
9
|
+
:class:`sage.rings.function_fields.drinfeld_module.drinfeld_module.DrinfeldModule`.
|
|
10
|
+
|
|
11
|
+
AUTHORS:
|
|
12
|
+
|
|
13
|
+
- Antoine Leudière (2022-04)
|
|
14
|
+
- Yossef Musleh (2023-02): added characteristic polynomial methods
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
# *****************************************************************************
|
|
18
|
+
# Copyright (C) 2022 Antoine Leudière <antoine.leudiere@inria.fr>
|
|
19
|
+
#
|
|
20
|
+
# This program is free software: you can redistribute it and/or modify
|
|
21
|
+
# it under the terms of the GNU General Public License as published by
|
|
22
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
23
|
+
# (at your option) any later version.
|
|
24
|
+
# http://www.gnu.org/licenses/
|
|
25
|
+
# *****************************************************************************
|
|
26
|
+
|
|
27
|
+
from sage.functions.log import logb
|
|
28
|
+
from sage.functions.other import ceil, sqrt
|
|
29
|
+
from sage.matrix.constructor import Matrix
|
|
30
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
31
|
+
from sage.matrix.special import companion_matrix
|
|
32
|
+
from sage.misc.misc_c import prod
|
|
33
|
+
from sage.modules.free_module_element import vector
|
|
34
|
+
from sage.rings.function_field.drinfeld_modules.drinfeld_module import DrinfeldModule
|
|
35
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class DrinfeldModule_finite(DrinfeldModule):
|
|
39
|
+
r"""
|
|
40
|
+
This class implements finite Drinfeld `\mathbb{F}_q[T]`-modules.
|
|
41
|
+
|
|
42
|
+
A *finite Drinfeld module* is a Drinfeld module whose base field is
|
|
43
|
+
finite. In this case, the function field characteristic is a prime
|
|
44
|
+
ideal.
|
|
45
|
+
|
|
46
|
+
For general definitions and help on Drinfeld modules, see class
|
|
47
|
+
:class:`sage.rings.function_fields.drinfeld_module.drinfeld_module.DrinfeldModule`.
|
|
48
|
+
|
|
49
|
+
.. RUBRIC:: Construction:
|
|
50
|
+
|
|
51
|
+
The user does not ever need to directly call
|
|
52
|
+
``DrinfeldModule_finite`` --- the metaclass ``DrinfeldModule`` is
|
|
53
|
+
responsible for instantiating ``DrinfeldModule`` or
|
|
54
|
+
``DrinfeldModule_finite`` depending on the input::
|
|
55
|
+
|
|
56
|
+
sage: Fq = GF(343)
|
|
57
|
+
sage: A.<T> = Fq[]
|
|
58
|
+
sage: K.<z6> = Fq.extension(2)
|
|
59
|
+
sage: phi = DrinfeldModule(A, [z6, 0, 5])
|
|
60
|
+
sage: phi
|
|
61
|
+
Drinfeld module defined by T |--> 5*t^2 + z6
|
|
62
|
+
|
|
63
|
+
::
|
|
64
|
+
|
|
65
|
+
sage: isinstance(phi, DrinfeldModule)
|
|
66
|
+
True
|
|
67
|
+
sage: from sage.rings.function_field.drinfeld_modules.finite_drinfeld_module import DrinfeldModule_finite
|
|
68
|
+
sage: isinstance(phi, DrinfeldModule_finite)
|
|
69
|
+
True
|
|
70
|
+
|
|
71
|
+
The user should never use ``DrinfeldModule_finite`` to test if a
|
|
72
|
+
Drinfeld module is finite, but rather the ``is_finite`` method::
|
|
73
|
+
|
|
74
|
+
sage: phi.is_finite()
|
|
75
|
+
True
|
|
76
|
+
|
|
77
|
+
.. RUBRIC:: Complex multiplication of rank two finite Drinfeld modules
|
|
78
|
+
|
|
79
|
+
We can handle some aspects of the theory of complex multiplication
|
|
80
|
+
of finite Drinfeld modules. Apart from the method
|
|
81
|
+
``frobenius_endomorphism``, we only handle rank two Drinfeld
|
|
82
|
+
modules.
|
|
83
|
+
|
|
84
|
+
First of all, it is easy to create the Frobenius endomorphism::
|
|
85
|
+
|
|
86
|
+
sage: frobenius_endomorphism = phi.frobenius_endomorphism()
|
|
87
|
+
sage: frobenius_endomorphism
|
|
88
|
+
Endomorphism of Drinfeld module defined by T |--> 5*t^2 + z6
|
|
89
|
+
Defn: t^2
|
|
90
|
+
|
|
91
|
+
Its characteristic polynomial can be computed::
|
|
92
|
+
|
|
93
|
+
sage: chi = phi.frobenius_charpoly()
|
|
94
|
+
sage: chi
|
|
95
|
+
X^2 + (T + 2*z3^2 + 2*z3 + 1)*X + 2*T^2 + (z3^2 + z3 + 4)*T + 2*z3
|
|
96
|
+
sage: frob_pol = frobenius_endomorphism.ore_polynomial()
|
|
97
|
+
sage: chi(frob_pol, phi(T))
|
|
98
|
+
0
|
|
99
|
+
|
|
100
|
+
as well as its trace and norm::
|
|
101
|
+
|
|
102
|
+
sage: phi.frobenius_trace()
|
|
103
|
+
6*T + 5*z3^2 + 5*z3 + 6
|
|
104
|
+
sage: phi.frobenius_trace() == -chi[1]
|
|
105
|
+
True
|
|
106
|
+
sage: phi.frobenius_norm()
|
|
107
|
+
2*T^2 + (z3^2 + z3 + 4)*T + 2*z3
|
|
108
|
+
|
|
109
|
+
We can decide if a Drinfeld module is ordinary or supersingular::
|
|
110
|
+
|
|
111
|
+
sage: phi.is_ordinary()
|
|
112
|
+
True
|
|
113
|
+
sage: phi.is_supersingular()
|
|
114
|
+
False
|
|
115
|
+
|
|
116
|
+
.. RUBRIC:: Inverting the Drinfeld module
|
|
117
|
+
|
|
118
|
+
The morphism that defines a Drinfeld module is injective (see
|
|
119
|
+
[Gos1998]_, cor. 4.5.2). If the Drinfeld module is finite, one can
|
|
120
|
+
retrieve preimages::
|
|
121
|
+
|
|
122
|
+
sage: a = A.random_element()
|
|
123
|
+
sage: phi.invert(phi(a)) == a
|
|
124
|
+
True
|
|
125
|
+
"""
|
|
126
|
+
|
|
127
|
+
def __init__(self, gen, category):
|
|
128
|
+
"""
|
|
129
|
+
Initialize ``self``.
|
|
130
|
+
|
|
131
|
+
Validity of the input is checked in ``__classcall_private__``. The
|
|
132
|
+
``__init__`` just saves attributes.
|
|
133
|
+
|
|
134
|
+
INPUT:
|
|
135
|
+
|
|
136
|
+
- ``function_ring`` -- a univariate polynomial ring whose base
|
|
137
|
+
is a finite field
|
|
138
|
+
|
|
139
|
+
- ``gen`` -- the generator of the Drinfeld module as a list of
|
|
140
|
+
coefficients or an Ore polynomial
|
|
141
|
+
|
|
142
|
+
- ``name`` -- (default: ``'t'``) the name of the Ore polynomial
|
|
143
|
+
ring gen
|
|
144
|
+
|
|
145
|
+
TESTS::
|
|
146
|
+
|
|
147
|
+
sage: Fq = GF(25)
|
|
148
|
+
sage: A.<T> = Fq[]
|
|
149
|
+
sage: K.<z12> = Fq.extension(6)
|
|
150
|
+
sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
|
|
151
|
+
sage: gen = [p_root, z12^3, z12^5]
|
|
152
|
+
sage: phi = DrinfeldModule(A, gen)
|
|
153
|
+
sage: ore_polring = phi.ore_polring()
|
|
154
|
+
sage: phi._gen == ore_polring(gen)
|
|
155
|
+
True
|
|
156
|
+
"""
|
|
157
|
+
# NOTE: There used to be no __init__ here (which was fine). I
|
|
158
|
+
# added one to ensure that DrinfeldModule_finite would always
|
|
159
|
+
# have _frobenius_norm and _frobenius_trace attributes.
|
|
160
|
+
super().__init__(gen, category)
|
|
161
|
+
self._base_degree_over_constants = self.base_over_constants_field().degree(self._Fq)
|
|
162
|
+
self._frobenius_norm = None
|
|
163
|
+
self._frobenius_trace = None
|
|
164
|
+
self._frobenius_charpoly = None
|
|
165
|
+
|
|
166
|
+
def _frobenius_matrix_crystalline(self):
|
|
167
|
+
r"""
|
|
168
|
+
Return the matrix representing the Frobenius endomorphism on the
|
|
169
|
+
crystalline cohomology of the Drinfeld module. This is done up to
|
|
170
|
+
precision [K:Fq] + 1, which is enough to ensure the characteristic
|
|
171
|
+
polynomial can be recovered.
|
|
172
|
+
|
|
173
|
+
For the formal construction of the crystalline cohomology, see
|
|
174
|
+
[Ang1997]_. It is a free module of rank r over the ring of Witt
|
|
175
|
+
vectors in `T - \mathfrak{p}`.
|
|
176
|
+
|
|
177
|
+
EXAMPLES::
|
|
178
|
+
|
|
179
|
+
sage: Fq = GF(25)
|
|
180
|
+
sage: A.<T> = Fq[]
|
|
181
|
+
sage: K.<z12> = Fq.extension(6)
|
|
182
|
+
sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
|
|
183
|
+
sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5])
|
|
184
|
+
sage: phi._frobenius_matrix_crystalline()
|
|
185
|
+
[...((z2 + 3) + z12 + (4*z2 + 1)*z12^2 + (z2 + 4)*z12^3 + (z2 + 4)*z12^4 + (2*z2 + 3)*z12^5)*T^3 + (2*z2 + 2*z2*z12 + (2*z2 + 3)*z12^2 + ... + (3*z2 + 4)*z12^3 + (2*z2 + 3)*z12^4 + 3*z2*z12^5]
|
|
186
|
+
|
|
187
|
+
ALGORITHM:
|
|
188
|
+
|
|
189
|
+
Compute the action of the Frobenius on an explicit basis for the
|
|
190
|
+
cohomology using a recurrence relation, and return the resulting
|
|
191
|
+
matrix.
|
|
192
|
+
"""
|
|
193
|
+
Fq = self._Fq
|
|
194
|
+
K = self.base_over_constants_field()
|
|
195
|
+
A = self.function_ring()
|
|
196
|
+
char, q = Fq.characteristic(), Fq.cardinality()
|
|
197
|
+
qdeg = logb(q, char)
|
|
198
|
+
r, n = self.rank(), self._base_degree_over_constants
|
|
199
|
+
nstar = ceil(sqrt(n))
|
|
200
|
+
nquo, nrem = divmod(n, nstar)
|
|
201
|
+
drin_coeffs = self.coefficients(sparse=False)
|
|
202
|
+
poly_K = PolynomialRing(K, name=str(A.gen()))
|
|
203
|
+
matrix_poly_K = MatrixSpace(poly_K, r, r)
|
|
204
|
+
mu_coeffs = ((poly_K.gen() - drin_coeffs[0])**(n+1)) \
|
|
205
|
+
.coefficients(sparse=False)
|
|
206
|
+
|
|
207
|
+
def companion(order):
|
|
208
|
+
# + [1] is required to satisfy formatting for companion matrix
|
|
209
|
+
M = matrix_poly_K(companion_matrix([(drin_coeffs[i]/drin_coeffs[r])
|
|
210
|
+
.frobenius(qdeg*order)
|
|
211
|
+
for i in range(r)] + [1], format='top'))
|
|
212
|
+
M[0, r-1] += poly_K.gen() / drin_coeffs[r].frobenius(qdeg*order)
|
|
213
|
+
return M
|
|
214
|
+
|
|
215
|
+
companion_initial = prod([companion(i) for i in range(nrem, 0, -1)])
|
|
216
|
+
companion_step = prod([companion(i)
|
|
217
|
+
for i in range(nstar + nrem, nrem, -1)])
|
|
218
|
+
reduced_companions = []
|
|
219
|
+
for k in range(nquo - 1, 0, -1):
|
|
220
|
+
M = Matrix(poly_K, r, r)
|
|
221
|
+
modulus = poly_K([c.frobenius(qdeg*(-k*nstar % n))
|
|
222
|
+
for c in mu_coeffs])
|
|
223
|
+
for i, row in enumerate(companion_step):
|
|
224
|
+
for j, entry in enumerate(row):
|
|
225
|
+
reduction = entry % modulus
|
|
226
|
+
M[i, j] = poly_K([c.frobenius(qdeg*(k*nstar))
|
|
227
|
+
for c in reduction
|
|
228
|
+
.coefficients(sparse=False)])
|
|
229
|
+
reduced_companions.append(M)
|
|
230
|
+
return (prod(reduced_companions) * companion_step * companion_initial)
|
|
231
|
+
|
|
232
|
+
def frobenius_endomorphism(self):
|
|
233
|
+
r"""
|
|
234
|
+
Return the Frobenius endomorphism of the Drinfeld module as a
|
|
235
|
+
morphism object.
|
|
236
|
+
|
|
237
|
+
Let `q` be the order of the base field of the function ring. The
|
|
238
|
+
*Frobenius endomorphism* is defined as the endomorphism whose
|
|
239
|
+
defining Ore polynomial is `t^q`.
|
|
240
|
+
|
|
241
|
+
EXAMPLES::
|
|
242
|
+
|
|
243
|
+
sage: Fq = GF(343)
|
|
244
|
+
sage: A.<T> = Fq[]
|
|
245
|
+
sage: K.<z6> = Fq.extension(2)
|
|
246
|
+
sage: phi = DrinfeldModule(A, [1, 0, z6])
|
|
247
|
+
sage: phi.frobenius_endomorphism()
|
|
248
|
+
Endomorphism of Drinfeld module defined by T |--> z6*t^2 + 1
|
|
249
|
+
Defn: t^2
|
|
250
|
+
|
|
251
|
+
TESTS::
|
|
252
|
+
|
|
253
|
+
sage: from sage.rings.function_field.drinfeld_modules.morphism import DrinfeldModuleMorphism
|
|
254
|
+
sage: isinstance(phi.frobenius_endomorphism(), DrinfeldModuleMorphism)
|
|
255
|
+
True
|
|
256
|
+
"""
|
|
257
|
+
t = self.ore_polring().gen()
|
|
258
|
+
deg = self.base_over_constants_field().degree_over()
|
|
259
|
+
return self._Hom_(self, category=self.category())(t**deg)
|
|
260
|
+
|
|
261
|
+
def frobenius_charpoly(self, var='X', algorithm=None):
|
|
262
|
+
r"""
|
|
263
|
+
Return the characteristic polynomial of the Frobenius
|
|
264
|
+
endomorphism.
|
|
265
|
+
|
|
266
|
+
Let `\mathbb{F}_q` be the base field of the function ring. The
|
|
267
|
+
*characteristic polynomial* `\chi` *of the Frobenius endomorphism*
|
|
268
|
+
is defined in [Gek1991]_. An important feature of this
|
|
269
|
+
polynomial is that it is monic, univariate, and has coefficients
|
|
270
|
+
in the function ring. As in our case the function
|
|
271
|
+
ring is a univariate polynomial ring, it is customary to see the
|
|
272
|
+
characteristic polynomial of the Frobenius endomorphism as a
|
|
273
|
+
bivariate polynomial.
|
|
274
|
+
|
|
275
|
+
Let `\chi = X^r + \sum_{i=0}^{r-1} A_{i}(T)X^{i}` be the
|
|
276
|
+
characteristic polynomial of the Frobenius endomorphism, and
|
|
277
|
+
let `t^n` be the Ore polynomial that defines the Frobenius
|
|
278
|
+
endomorphism of `\phi`; by definition, `n` is the degree of `K`
|
|
279
|
+
over the base field `\mathbb{F}_q`. Then we have
|
|
280
|
+
|
|
281
|
+
.. MATH::
|
|
282
|
+
|
|
283
|
+
\chi(t^n)(\phi(T))
|
|
284
|
+
= t^{nr} + \sum_{i=1}^{r} \phi_{A_{i}}t^{n(i)}
|
|
285
|
+
= 0,
|
|
286
|
+
|
|
287
|
+
with `\deg(A_i) \leq \frac{n(r-i)}{r}`.
|
|
288
|
+
|
|
289
|
+
Note that the *Frobenius trace* is defined as `A_{r-1}(T)` and the
|
|
290
|
+
*Frobenius norm* is defined as `A_0(T)`.
|
|
291
|
+
|
|
292
|
+
INPUT:
|
|
293
|
+
|
|
294
|
+
- ``var`` (default: ``'X'``) -- the name of the second variable
|
|
295
|
+
- ``algorithm`` (default: ``None``) -- the algorithm
|
|
296
|
+
used to compute the characteristic polynomial
|
|
297
|
+
|
|
298
|
+
.. NOTE:
|
|
299
|
+
|
|
300
|
+
Available algorithms are:
|
|
301
|
+
|
|
302
|
+
- ``'CSA'`` -- it exploits the fact that `K\{\tau\}` is a
|
|
303
|
+
central simple algebra (CSA) over `\mathbb
|
|
304
|
+
F_q[\text{Frob}_\phi]` (see Chapter 4 of [CL2023]_).
|
|
305
|
+
- ``'crystalline'`` -- it uses the action of the Frobenius
|
|
306
|
+
on the crystalline cohomology (see [MS2023]_).
|
|
307
|
+
- ``'gekeler'`` -- it tries to identify coefficients by
|
|
308
|
+
writing that the characteristic polynomial annihilates the
|
|
309
|
+
Frobenius endomorphism; this algorithm may fail is some
|
|
310
|
+
cases (see [Gek2008]_).
|
|
311
|
+
- ``'motive'`` -- it uses the action of the Frobenius on the
|
|
312
|
+
Anderson motive (see Chapter 2 of [CL2023]_).
|
|
313
|
+
|
|
314
|
+
The method raises an exception if the user asks for an
|
|
315
|
+
unimplemented algorithm, even if the characteristic polynomial
|
|
316
|
+
has already been computed.
|
|
317
|
+
|
|
318
|
+
EXAMPLES::
|
|
319
|
+
|
|
320
|
+
sage: Fq = GF(25)
|
|
321
|
+
sage: A.<T> = Fq[]
|
|
322
|
+
sage: K.<z12> = Fq.extension(6)
|
|
323
|
+
sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
|
|
324
|
+
sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5])
|
|
325
|
+
sage: phi.frobenius_charpoly()
|
|
326
|
+
X^2 + ((4*z2 + 4)*T^3 + (z2 + 3)*T^2 + 3*T + 2*z2 + 3)*X + 3*z2*T^6 + (4*z2 + 3)*T^5 + (4*z2 + 4)*T^4 + 2*T^3 + (3*z2 + 3)*T^2 + (z2 + 2)*T + 4*z2
|
|
327
|
+
|
|
328
|
+
::
|
|
329
|
+
|
|
330
|
+
sage: Fq = GF(343)
|
|
331
|
+
sage: A.<T> = Fq[]
|
|
332
|
+
sage: K.<z6> = Fq.extension(2)
|
|
333
|
+
sage: phi = DrinfeldModule(A, [1, 0, z6])
|
|
334
|
+
sage: chi = phi.frobenius_charpoly(algorithm='crystalline')
|
|
335
|
+
sage: chi
|
|
336
|
+
X^2 + ((3*z3^2 + z3 + 4)*T + 4*z3^2 + 6*z3 + 3)*X + (5*z3^2 + 2*z3)*T^2 + (4*z3^2 + 3*z3)*T + 5*z3^2 + 2*z3
|
|
337
|
+
|
|
338
|
+
::
|
|
339
|
+
|
|
340
|
+
sage: frob_pol = phi.frobenius_endomorphism().ore_polynomial()
|
|
341
|
+
sage: chi(frob_pol, phi(T))
|
|
342
|
+
0
|
|
343
|
+
sage: phi.frobenius_charpoly(algorithm='motive')(phi.frobenius_endomorphism())
|
|
344
|
+
Endomorphism of Drinfeld module defined by T |--> z6*t^2 + 1
|
|
345
|
+
Defn: 0
|
|
346
|
+
|
|
347
|
+
::
|
|
348
|
+
|
|
349
|
+
sage: phi.frobenius_charpoly(algorithm="NotImplemented")
|
|
350
|
+
Traceback (most recent call last):
|
|
351
|
+
...
|
|
352
|
+
NotImplementedError: algorithm "NotImplemented" not implemented
|
|
353
|
+
|
|
354
|
+
ALGORITHM:
|
|
355
|
+
|
|
356
|
+
If the user specifies an algorithm, then the characteristic
|
|
357
|
+
polynomial is computed according to the user's input (see
|
|
358
|
+
the note above), even if it had already been computed.
|
|
359
|
+
|
|
360
|
+
If no algorithm is given, then the function either returns a
|
|
361
|
+
cached value, or if no cached value is available, the
|
|
362
|
+
function computes the Frobenius characteristic polynomial
|
|
363
|
+
from scratch. In that case, if the rank `r` is less than the
|
|
364
|
+
extension degree `n`, then the ``crystalline`` algorithm is
|
|
365
|
+
used, while the ``CSA`` algorithm is used otherwise.
|
|
366
|
+
|
|
367
|
+
TESTS::
|
|
368
|
+
|
|
369
|
+
sage: Fq = GF(9)
|
|
370
|
+
sage: A.<T> = Fq[]
|
|
371
|
+
sage: k.<zk> = Fq.extension(2)
|
|
372
|
+
sage: K.<z> = k.extension(3)
|
|
373
|
+
|
|
374
|
+
::
|
|
375
|
+
|
|
376
|
+
sage: phi = DrinfeldModule(A, [K(zk), z^8, z^7])
|
|
377
|
+
sage: phi.frobenius_charpoly(algorithm='CSA')
|
|
378
|
+
X^2 + (2*T^3 + (2*z2 + 2)*T^2 + (z2 + 1)*T + 2*z2)*X + z2*T^6 + (2*z2 + 2)*T^3 + 2
|
|
379
|
+
sage: phi.frobenius_charpoly(algorithm='crystalline')
|
|
380
|
+
X^2 + (2*T^3 + (2*z2 + 2)*T^2 + (z2 + 1)*T + 2*z2)*X + z2*T^6 + (2*z2 + 2)*T^3 + 2
|
|
381
|
+
sage: phi.frobenius_charpoly(algorithm='gekeler')
|
|
382
|
+
X^2 + (2*T^3 + (2*z2 + 2)*T^2 + (z2 + 1)*T + 2*z2)*X + z2*T^6 + (2*z2 + 2)*T^3 + 2
|
|
383
|
+
sage: phi.frobenius_charpoly(algorithm='motive')
|
|
384
|
+
X^2 + (2*T^3 + (2*z2 + 2)*T^2 + (z2 + 1)*T + 2*z2)*X + z2*T^6 + (2*z2 + 2)*T^3 + 2
|
|
385
|
+
sage: phi.frobenius_charpoly()(phi.frobenius_endomorphism()).ore_polynomial()
|
|
386
|
+
0
|
|
387
|
+
|
|
388
|
+
::
|
|
389
|
+
|
|
390
|
+
sage: phi = DrinfeldModule(A, [K(zk), z^2, z^3, z^4])
|
|
391
|
+
sage: phi.frobenius_charpoly(algorithm='CSA')
|
|
392
|
+
X^3 + ((z2 + 1)*T^2 + (z2 + 1)*T + z2 + 2)*X^2 + ((z2 + 2)*T^4 + 2*T^3 + z2*T^2 + T + 2*z2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
|
|
393
|
+
sage: phi.frobenius_charpoly(algorithm='crystalline')
|
|
394
|
+
X^3 + ((z2 + 1)*T^2 + (z2 + 1)*T + z2 + 2)*X^2 + ((z2 + 2)*T^4 + 2*T^3 + z2*T^2 + T + 2*z2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
|
|
395
|
+
sage: phi.frobenius_charpoly(algorithm='gekeler')
|
|
396
|
+
X^3 + ((z2 + 1)*T^2 + (z2 + 1)*T + z2 + 2)*X^2 + ((z2 + 2)*T^4 + 2*T^3 + z2*T^2 + T + 2*z2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
|
|
397
|
+
sage: phi.frobenius_charpoly(algorithm='motive')
|
|
398
|
+
X^3 + ((z2 + 1)*T^2 + (z2 + 1)*T + z2 + 2)*X^2 + ((z2 + 2)*T^4 + 2*T^3 + z2*T^2 + T + 2*z2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
|
|
399
|
+
sage: phi.frobenius_charpoly()(phi.frobenius_endomorphism()).ore_polynomial()
|
|
400
|
+
0
|
|
401
|
+
|
|
402
|
+
::
|
|
403
|
+
|
|
404
|
+
sage: phi = DrinfeldModule(A, [K(zk), z^8, z^7, z^20])
|
|
405
|
+
sage: phi.frobenius_charpoly(algorithm='CSA')
|
|
406
|
+
X^3 + (z2*T^2 + z2*T + z2 + 1)*X^2 + (T^4 + (2*z2 + 1)*T^3 + (z2 + 2)*T^2 + (2*z2 + 1)*T + z2 + 2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
|
|
407
|
+
sage: phi.frobenius_charpoly(algorithm='crystalline')
|
|
408
|
+
X^3 + (z2*T^2 + z2*T + z2 + 1)*X^2 + (T^4 + (2*z2 + 1)*T^3 + (z2 + 2)*T^2 + (2*z2 + 1)*T + z2 + 2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
|
|
409
|
+
sage: phi.frobenius_charpoly(algorithm='gekeler')
|
|
410
|
+
X^3 + (z2*T^2 + z2*T + z2 + 1)*X^2 + (T^4 + (2*z2 + 1)*T^3 + (z2 + 2)*T^2 + (2*z2 + 1)*T + z2 + 2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
|
|
411
|
+
sage: phi.frobenius_charpoly(algorithm='motive')
|
|
412
|
+
X^3 + (z2*T^2 + z2*T + z2 + 1)*X^2 + (T^4 + (2*z2 + 1)*T^3 + (z2 + 2)*T^2 + (2*z2 + 1)*T + z2 + 2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
|
|
413
|
+
sage: phi.frobenius_charpoly()(phi.frobenius_endomorphism()).ore_polynomial()
|
|
414
|
+
0
|
|
415
|
+
|
|
416
|
+
Check that ``var`` inputs are taken into account for cached
|
|
417
|
+
characteristic polynomials::
|
|
418
|
+
|
|
419
|
+
sage: Fq = GF(2)
|
|
420
|
+
sage: A.<T> = Fq[]
|
|
421
|
+
sage: K.<z> = Fq.extension(2)
|
|
422
|
+
sage: phi = DrinfeldModule(A, [z, 0, 1])
|
|
423
|
+
sage: phi.frobenius_charpoly()
|
|
424
|
+
X^2 + X + T^2 + T + 1
|
|
425
|
+
sage: phi.frobenius_charpoly(var='Foo')
|
|
426
|
+
Foo^2 + Foo + T^2 + T + 1
|
|
427
|
+
sage: phi.frobenius_charpoly(var='Bar')
|
|
428
|
+
Bar^2 + Bar + T^2 + T + 1
|
|
429
|
+
"""
|
|
430
|
+
# If no algorithm is specified, return cached data (if it
|
|
431
|
+
# exists), or pick an algorithm:
|
|
432
|
+
if algorithm is None:
|
|
433
|
+
if self._frobenius_charpoly is not None:
|
|
434
|
+
return self._frobenius_charpoly.change_variable_name(var)
|
|
435
|
+
else:
|
|
436
|
+
if self.rank() < self._base_degree_over_constants:
|
|
437
|
+
algorithm = 'crystalline'
|
|
438
|
+
else:
|
|
439
|
+
algorithm = 'CSA'
|
|
440
|
+
# If an algorithm is specified, do not use cached data, even
|
|
441
|
+
# if it is possible:
|
|
442
|
+
method_name = f'_frobenius_charpoly_{algorithm}'
|
|
443
|
+
if not hasattr(self, method_name):
|
|
444
|
+
raise NotImplementedError(f'algorithm "{algorithm}" not implemented')
|
|
445
|
+
self._frobenius_charpoly = getattr(self, method_name)()
|
|
446
|
+
return self._frobenius_charpoly.change_variable_name(var)
|
|
447
|
+
|
|
448
|
+
def _frobenius_charpoly_CSA(self):
|
|
449
|
+
r"""
|
|
450
|
+
Return the characteristic polynomial of the Frobenius
|
|
451
|
+
endomorphism using Crystalline cohomology.
|
|
452
|
+
|
|
453
|
+
The algorithm works for Drinfeld `\mathbb{F}_q[T]`-modules of
|
|
454
|
+
any rank.
|
|
455
|
+
|
|
456
|
+
This method is private and should not be directly called.
|
|
457
|
+
Instead, use :meth:`frobenius_charpoly` with the option
|
|
458
|
+
`algorithm='CSA'`.
|
|
459
|
+
|
|
460
|
+
EXAMPLES::
|
|
461
|
+
|
|
462
|
+
sage: Fq = GF(5)
|
|
463
|
+
sage: A.<T> = Fq[]
|
|
464
|
+
sage: K.<z> = Fq.extension(3)
|
|
465
|
+
sage: phi = DrinfeldModule(A, [z^i for i in range(1, 50)])
|
|
466
|
+
sage: phi.frobenius_charpoly(algorithm="CSA") # indirect doctest
|
|
467
|
+
X^48 + 4*X^47 + 4*X^46 + X^45 + 3*X^44 + X^42 + 4*X^41 + 4*X^39 + 2*X^37 + 4*X^36 + 3*X^35 + 2*X^33 + (4*T + 2)*X^32 + (4*T + 1)*X^31 + (3*T + 1)*X^30 + 4*T*X^29 + 4*T*X^28 + 2*X^27 + X^26 + (3*T + 4)*X^25 + (4*T + 4)*X^24 + (T + 1)*X^23 + (T + 3)*X^22 + 4*T*X^21 + (2*T + 1)*X^20 + 4*X^19 + 4*T*X^18 + (T + 4)*X^17 + 4*T^2*X^16 + (T^2 + 3*T + 3)*X^15 + (4*T^2 + 3*T + 3)*X^14 + (3*T^2 + 3*T + 3)*X^13 + (3*T^2 + 4*T + 4)*X^12 + (T^2 + 2*T + 2)*X^11 + (3*T^2 + 4*T + 4)*X^10 + (3*T^2 + T + 1)*X^9 + (4*T + 4)*X^8 + (3*T + 3)*X^7 + (T^2 + 3*T + 3)*X^6 + (3*T^2 + T + 1)*X^5 + (2*T^2 + 3*T + 3)*X^4 + (2*T^2 + 3*T + 3)*X^3 + 3*T^2*X^2 + 4*T^2*X + 2*T^3 + T + 1
|
|
468
|
+
|
|
469
|
+
ALGORITHM:
|
|
470
|
+
|
|
471
|
+
Compute the characteristic polynomial of the Frobenius from
|
|
472
|
+
the reduced characteristic polynomial of the Ore polynomial
|
|
473
|
+
`\phi_T`. This algorithm is particularly interesting when the
|
|
474
|
+
rank of the Drinfeld module is large compared to the degree
|
|
475
|
+
of the extension `K/\mathbb F_q`. See [CL2023]_.
|
|
476
|
+
"""
|
|
477
|
+
E = self._base
|
|
478
|
+
EZ = PolynomialRing(E, name='Z')
|
|
479
|
+
n = self._base_degree_over_constants
|
|
480
|
+
f = self.gen() # phi_T, which is updated in the subsequent loop
|
|
481
|
+
t = self.ore_variable()
|
|
482
|
+
rows = []
|
|
483
|
+
for i in range(n):
|
|
484
|
+
m = f.degree() + 1
|
|
485
|
+
row = [EZ([f[jj] for jj in range(j, m, n)]) for j in range(n)]
|
|
486
|
+
rows.append(row)
|
|
487
|
+
f = t * f
|
|
488
|
+
chi = Matrix(rows).charpoly()
|
|
489
|
+
# Format the result
|
|
490
|
+
K = self.base_over_constants_field()
|
|
491
|
+
A = self.function_ring()
|
|
492
|
+
n = self._base_degree_over_constants
|
|
493
|
+
r = self.rank()
|
|
494
|
+
lc = chi[0][r]
|
|
495
|
+
coeffs = [A([K(chi[i][j]/lc).in_base()
|
|
496
|
+
for i in range((r-j)*n // r + 1)])
|
|
497
|
+
for j in range(r+1)]
|
|
498
|
+
return PolynomialRing(A, name='X')(coeffs)
|
|
499
|
+
|
|
500
|
+
def _frobenius_charpoly_crystalline(self):
|
|
501
|
+
r"""
|
|
502
|
+
Return the characteristic polynomial of the Frobenius
|
|
503
|
+
endomorphism using Crystalline cohomology.
|
|
504
|
+
|
|
505
|
+
The algorithm works for Drinfeld `\mathbb{F}_q[T]`-modules of
|
|
506
|
+
any rank.
|
|
507
|
+
|
|
508
|
+
This method is private and should not be directly called.
|
|
509
|
+
Instead, use :meth:`frobenius_charpoly` with the option
|
|
510
|
+
`algorithm='crystalline'`.
|
|
511
|
+
|
|
512
|
+
OUTPUT: a univariate polynomial with coefficients in the
|
|
513
|
+
function ring
|
|
514
|
+
|
|
515
|
+
EXAMPLES::
|
|
516
|
+
|
|
517
|
+
sage: Fq = GF(25)
|
|
518
|
+
sage: A.<T> = Fq[]
|
|
519
|
+
sage: K.<z12> = Fq.extension(6)
|
|
520
|
+
sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
|
|
521
|
+
sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5])
|
|
522
|
+
sage: phi.frobenius_charpoly(algorithm='crystalline') # indirect doctest
|
|
523
|
+
X^2 + ((4*z2 + 4)*T^3 + (z2 + 3)*T^2 + 3*T + 2*z2 + 3)*X + 3*z2*T^6 + (4*z2 + 3)*T^5 + (4*z2 + 4)*T^4 + 2*T^3 + (3*z2 + 3)*T^2 + (z2 + 2)*T + 4*z2
|
|
524
|
+
|
|
525
|
+
::
|
|
526
|
+
|
|
527
|
+
sage: Fq = GF(25)
|
|
528
|
+
sage: A.<T> = Fq[]
|
|
529
|
+
sage: K.<z> = Fq.extension(8)
|
|
530
|
+
sage: phi = DrinfeldModule(A, [z, 4, 1, z, z+1, 2, z+2, 1, 1, 3, 1])
|
|
531
|
+
sage: phi.frobenius_charpoly(algorithm='crystalline') # indirect doctest
|
|
532
|
+
X^10 + X^9 + (3*T + z2 + 1)*X^8 + (4*T^2 + z2*T + 2*z2 + 1)*X^7 + ... + (4*z2 + 4)*T^4 + 4*z2*T^2 + (z2 + 2)*T + z2
|
|
533
|
+
|
|
534
|
+
::
|
|
535
|
+
|
|
536
|
+
sage: Fq = GF(27)
|
|
537
|
+
sage: A.<T> = Fq[]
|
|
538
|
+
sage: K.<z> = Fq.extension(10)
|
|
539
|
+
sage: phi = DrinfeldModule(A, [z, z^2 + z, 2, 1, z, z+1, 2, z+2, 0, 1, 1, z^2 + z])
|
|
540
|
+
sage: phi.frobenius_charpoly(algorithm='crystalline') # indirect doctest
|
|
541
|
+
X^11 + (z3^2 + 2*z3)*X^10 + ((z3 + 1)*T + z3)*X^9 + ((2*z3^2 + z3 + 2)*T^2 + ... + (2*z3^2 + 2*z3 + 2)*T + z3^2
|
|
542
|
+
|
|
543
|
+
ALGORITHM:
|
|
544
|
+
|
|
545
|
+
Compute the characteristic polynomial of the Frobenius endomorphism
|
|
546
|
+
acting on the crystalline cohomology of a Drinfeld module, which
|
|
547
|
+
is equal to that of the Frobenius endomorphism on the Drinfeld
|
|
548
|
+
module. A recurrence on elements of the cohomology allows us to
|
|
549
|
+
compute a matrix representation of the Frobenius endomorphism
|
|
550
|
+
efficiently using a companion matrix method. Based on the algorithm
|
|
551
|
+
of section 6.3 in [MS2023]_.
|
|
552
|
+
"""
|
|
553
|
+
A = self.function_ring()
|
|
554
|
+
charpoly_K = self._frobenius_matrix_crystalline().charpoly().list()
|
|
555
|
+
|
|
556
|
+
# The above line obtains the char poly with coefficients in K[T]
|
|
557
|
+
# This maps them into A = Fq[T]
|
|
558
|
+
|
|
559
|
+
coeffs_A = [A([x.in_base() for x in coeff]) for coeff in charpoly_K]
|
|
560
|
+
return PolynomialRing(A, name='X')(coeffs_A)
|
|
561
|
+
|
|
562
|
+
def _frobenius_charpoly_gekeler(self):
|
|
563
|
+
r"""
|
|
564
|
+
Return the characteristic polynomial of the Frobenius
|
|
565
|
+
endomorphism using Gekeler's algorithm.
|
|
566
|
+
|
|
567
|
+
The algorithm works for Drinfeld `\mathbb{F}_q[T]`-modules of
|
|
568
|
+
any rank, provided that the constant coefficient is a generator
|
|
569
|
+
of the base field.
|
|
570
|
+
|
|
571
|
+
This method is private and should not be directly called.
|
|
572
|
+
Instead, use :meth:`frobenius_charpoly` with the option
|
|
573
|
+
`algorithm='gekeler'`.
|
|
574
|
+
|
|
575
|
+
.. WARNING::
|
|
576
|
+
|
|
577
|
+
This algorithm only works in the generic case when the
|
|
578
|
+
corresponding linear system is invertible. Notable cases
|
|
579
|
+
where this fails include Drinfeld modules whose minimal
|
|
580
|
+
polynomial is not equal to the characteristic polynomial,
|
|
581
|
+
and rank 2 Drinfeld modules where the degree 1 coefficient
|
|
582
|
+
of `\phi_T` is 0. In that case, an exception is raised.
|
|
583
|
+
|
|
584
|
+
EXAMPLES::
|
|
585
|
+
|
|
586
|
+
sage: Fq = GF(25)
|
|
587
|
+
sage: A.<T> = Fq[]
|
|
588
|
+
sage: K.<z> = Fq.extension(6)
|
|
589
|
+
sage: phi = DrinfeldModule(A, [z, 4, 1, z])
|
|
590
|
+
sage: phi.frobenius_charpoly(algorithm='gekeler') # indirect doctest
|
|
591
|
+
X^3 + ((z2 + 2)*T^2 + (z2 + 2)*T + 4*z2 + 4)*X^2 + ... + (3*z2 + 2)*T^2 + (3*z2 + 3)*T + 4
|
|
592
|
+
|
|
593
|
+
::
|
|
594
|
+
|
|
595
|
+
sage: Fq = GF(125)
|
|
596
|
+
sage: A.<T> = Fq[]
|
|
597
|
+
sage: K.<z> = Fq.extension(2)
|
|
598
|
+
sage: phi = DrinfeldModule(A, [z, 0, z])
|
|
599
|
+
sage: phi.frobenius_charpoly(algorithm='gekeler') # indirect doctest
|
|
600
|
+
Traceback (most recent call last):
|
|
601
|
+
NotImplementedError: 'gekeler' algorithm failed
|
|
602
|
+
|
|
603
|
+
ALGORITHM:
|
|
604
|
+
|
|
605
|
+
Construct a linear system based on the requirement that the
|
|
606
|
+
Frobenius satisfies a degree r polynomial with coefficients in
|
|
607
|
+
the function ring. This generalizes the procedure from
|
|
608
|
+
[Gek2008]_ for the rank 2 case.
|
|
609
|
+
"""
|
|
610
|
+
K = self.base_over_constants_field()
|
|
611
|
+
A = self.function_ring()
|
|
612
|
+
r, n = self.rank(), self._base_degree_over_constants
|
|
613
|
+
# Compute constants that determine the block structure of the
|
|
614
|
+
# linear system. The system is prepared such that the solution
|
|
615
|
+
# vector has the form [a_0, a_1, ... a_{r-1}]^T with each a_i
|
|
616
|
+
# corresponding to a block of length (n*(r - i))//r + 1
|
|
617
|
+
shifts = [(n*(r - i))//r + 1 for i in range(r)]
|
|
618
|
+
rows, cols = n*r + 1, sum(shifts)
|
|
619
|
+
block_shifts = [0]
|
|
620
|
+
for i in range(r-1):
|
|
621
|
+
block_shifts.append(block_shifts[-1] + shifts[i])
|
|
622
|
+
# Compute the images \phi_T^i for i = 0 .. n.
|
|
623
|
+
gen_powers = [self(A.gen()**i).coefficients(sparse=False)
|
|
624
|
+
for i in range(0, n + 1)]
|
|
625
|
+
sys, vec = Matrix(K, rows, cols), vector(K, rows)
|
|
626
|
+
vec[rows - 1] = -1
|
|
627
|
+
for j in range(r):
|
|
628
|
+
for k in range(shifts[j]):
|
|
629
|
+
for i in range(len(gen_powers[k])):
|
|
630
|
+
sys[i + n*j, block_shifts[j] + k] = gen_powers[k][i]
|
|
631
|
+
if sys.right_nullity() != 0:
|
|
632
|
+
raise NotImplementedError("'gekeler' algorithm failed")
|
|
633
|
+
sol = list(sys.solve_right(vec))
|
|
634
|
+
# The system is solved over K, but the coefficients should all
|
|
635
|
+
# be in Fq We project back into Fq here.
|
|
636
|
+
sol_Fq = [K(x).vector()[0] for x in sol]
|
|
637
|
+
char_poly = []
|
|
638
|
+
for i in range(r):
|
|
639
|
+
char_poly.append([sol_Fq[block_shifts[i] + j]
|
|
640
|
+
for j in range(shifts[i])])
|
|
641
|
+
return PolynomialRing(A, name='X')(char_poly + [1])
|
|
642
|
+
|
|
643
|
+
def _frobenius_charpoly_motive(self):
|
|
644
|
+
r"""
|
|
645
|
+
Return the characteristic polynomial of the Frobenius
|
|
646
|
+
endomorphism using Motivic cohomology.
|
|
647
|
+
|
|
648
|
+
The algorithm works for Drinfeld `\mathbb{F}_q[T]`-modules of
|
|
649
|
+
any rank.
|
|
650
|
+
|
|
651
|
+
This method is private and should not be directly called.
|
|
652
|
+
Instead, use :meth:`frobenius_charpoly` with the option
|
|
653
|
+
`algorithm='motive'`.
|
|
654
|
+
|
|
655
|
+
OUTPUT: a univariate polynomial with coefficients in the
|
|
656
|
+
function ring
|
|
657
|
+
|
|
658
|
+
EXAMPLES::
|
|
659
|
+
|
|
660
|
+
sage: Fq = GF(25)
|
|
661
|
+
sage: A.<T> = Fq[]
|
|
662
|
+
sage: K.<z12> = Fq.extension(6)
|
|
663
|
+
sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
|
|
664
|
+
sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5])
|
|
665
|
+
sage: phi.frobenius_charpoly(algorithm='motive') # indirect doctest
|
|
666
|
+
X^2 + ((4*z2 + 4)*T^3 + (z2 + 3)*T^2 + 3*T + 2*z2 + 3)*X + 3*z2*T^6 + (4*z2 + 3)*T^5 + (4*z2 + 4)*T^4 + 2*T^3 + (3*z2 + 3)*T^2 + (z2 + 2)*T + 4*z2
|
|
667
|
+
|
|
668
|
+
::
|
|
669
|
+
|
|
670
|
+
sage: Fq = GF(25)
|
|
671
|
+
sage: A.<T> = Fq[]
|
|
672
|
+
sage: K.<z> = Fq.extension(8)
|
|
673
|
+
sage: phi = DrinfeldModule(A, [z, 4, 1, z, z+1, 2, z+2, 1, 1, 3, 1])
|
|
674
|
+
sage: phi.frobenius_charpoly(algorithm='motive') # indirect doctest
|
|
675
|
+
X^10 + X^9 + (3*T + z2 + 1)*X^8 + (4*T^2 + z2*T + 2*z2 + 1)*X^7 + ... + (4*z2 + 4)*T^4 + 4*z2*T^2 + (z2 + 2)*T + z2
|
|
676
|
+
|
|
677
|
+
::
|
|
678
|
+
|
|
679
|
+
sage: Fq = GF(27)
|
|
680
|
+
sage: A.<T> = Fq[]
|
|
681
|
+
sage: K.<z> = Fq.extension(10)
|
|
682
|
+
sage: phi = DrinfeldModule(A, [z, z^2 + z, 2, 1, z, z+1, 2, z+2, 0, 1, 1, z^2 + z])
|
|
683
|
+
sage: phi.frobenius_charpoly(algorithm='motive') # indirect doctest
|
|
684
|
+
X^11 + (z3^2 + 2*z3)*X^10 + ((z3 + 1)*T + z3)*X^9 + ((2*z3^2 + z3 + 2)*T^2 + ... + (2*z3^2 + 2*z3 + 2)*T + z3^2
|
|
685
|
+
"""
|
|
686
|
+
return self.frobenius_endomorphism().characteristic_polynomial('X')
|
|
687
|
+
|
|
688
|
+
def frobenius_norm(self):
|
|
689
|
+
r"""
|
|
690
|
+
Return the Frobenius norm of the Drinfeld module.
|
|
691
|
+
|
|
692
|
+
Let `C(X) = \sum_{i=0}^r a_iX^{i}` denote the characteristic
|
|
693
|
+
polynomial of the Frobenius endomorphism. The Frobenius norm
|
|
694
|
+
is `a_{0}`, and given by the formula
|
|
695
|
+
|
|
696
|
+
.. MATH::
|
|
697
|
+
|
|
698
|
+
a_0 = (-1)^{nr - n -r}
|
|
699
|
+
\mathrm{Norm}_{K/\mathbb F_q}(\Delta)^{-1}
|
|
700
|
+
p^{n / \mathrm{deg}(p)},
|
|
701
|
+
|
|
702
|
+
where `K` is the ground field, which as degree `n` over
|
|
703
|
+
`\mathbb F_q`, `r` is the rank of the Drinfeld module,
|
|
704
|
+
and `\Delta` is the leading coefficient of the generator.
|
|
705
|
+
This formula is given in Theorem~4.2.7 of [Pap2023]_.
|
|
706
|
+
|
|
707
|
+
Note that the Frobenius norm computed by this method may be
|
|
708
|
+
different than what is computed as the isogeny norm of the
|
|
709
|
+
Frobenius endomorphism (see :meth:`norm` on the Frobenius
|
|
710
|
+
endomorphism), which is an ideal defined of the function ring
|
|
711
|
+
given by its monic generator; the Frobenius norm may not be
|
|
712
|
+
monic.
|
|
713
|
+
|
|
714
|
+
EXAMPLES::
|
|
715
|
+
|
|
716
|
+
sage: Fq = GF(343)
|
|
717
|
+
sage: A.<T> = Fq[]
|
|
718
|
+
sage: K.<z6> = Fq.extension(2)
|
|
719
|
+
sage: phi = DrinfeldModule(A, [1, 0, z6])
|
|
720
|
+
sage: frobenius_norm = phi.frobenius_norm()
|
|
721
|
+
sage: frobenius_norm
|
|
722
|
+
(5*z3^2 + 2*z3)*T^2 + (4*z3^2 + 3*z3)*T + 5*z3^2 + 2*z3
|
|
723
|
+
|
|
724
|
+
::
|
|
725
|
+
|
|
726
|
+
sage: n = 2 # Degree of the base field over Fq
|
|
727
|
+
sage: frobenius_norm.degree() == n
|
|
728
|
+
True
|
|
729
|
+
|
|
730
|
+
::
|
|
731
|
+
|
|
732
|
+
sage: frobenius_norm == phi.frobenius_charpoly()[0]
|
|
733
|
+
True
|
|
734
|
+
|
|
735
|
+
::
|
|
736
|
+
|
|
737
|
+
sage: lc = frobenius_norm.leading_coefficient()
|
|
738
|
+
sage: isogeny_norm = phi.frobenius_endomorphism().norm()
|
|
739
|
+
sage: isogeny_norm.gen() == frobenius_norm / lc
|
|
740
|
+
True
|
|
741
|
+
sage: A.ideal(frobenius_norm) == isogeny_norm
|
|
742
|
+
True
|
|
743
|
+
|
|
744
|
+
ALGORITHM:
|
|
745
|
+
|
|
746
|
+
The Frobenius norm is computed using the formula, by
|
|
747
|
+
Gekeler, given in [MS2019]_, Section 4, Proposition 3.
|
|
748
|
+
"""
|
|
749
|
+
if self._frobenius_norm is not None:
|
|
750
|
+
return self._frobenius_norm
|
|
751
|
+
K = self.base_over_constants_field()
|
|
752
|
+
n = K.degree(self._Fq)
|
|
753
|
+
r = self.rank()
|
|
754
|
+
p = self.characteristic()
|
|
755
|
+
norm = K(self.coefficients()[-1]).norm()
|
|
756
|
+
self._frobenius_norm = (-1) ** (n*r - n - r) \
|
|
757
|
+
* norm**(-1) \
|
|
758
|
+
* p ** (n//p.degree())
|
|
759
|
+
return self._frobenius_norm
|
|
760
|
+
|
|
761
|
+
def frobenius_trace(self, algorithm=None):
|
|
762
|
+
r"""
|
|
763
|
+
Return the Frobenius trace of the Drinfeld module.
|
|
764
|
+
|
|
765
|
+
Let `C(X) = \sum_{i=0}^r a_iX^{i}` denote the characteristic
|
|
766
|
+
polynomial of the Frobenius endomorphism. The Frobenius trace
|
|
767
|
+
is `-a_{r-1}`. This is an element of the regular function ring
|
|
768
|
+
and if `n` is the degree of the base field over `\mathbb{F}_q`,
|
|
769
|
+
then the Frobenius trace has degree at most `\frac{n}{r}`.
|
|
770
|
+
|
|
771
|
+
INPUT:
|
|
772
|
+
|
|
773
|
+
- ``algorithm`` (default: ``None``) -- the algorithm
|
|
774
|
+
used to compute the characteristic polynomial
|
|
775
|
+
|
|
776
|
+
.. NOTE:
|
|
777
|
+
|
|
778
|
+
Available algorithms are:
|
|
779
|
+
|
|
780
|
+
- ``'CSA'`` -- it exploits the fact that `K\{\tau\}` is a
|
|
781
|
+
central simple algebra (CSA) over `\mathbb
|
|
782
|
+
F_q[\text{Frob}_\phi]` (see Chapter 4 of [CL2023]_).
|
|
783
|
+
- ``'crystalline'`` -- it uses the action of the Frobenius
|
|
784
|
+
on the crystalline cohomology (see [MS2023]_).
|
|
785
|
+
|
|
786
|
+
The method raises an exception if the user asks for an
|
|
787
|
+
unimplemented algorithm, even if the characteristic has already
|
|
788
|
+
been computed. See :meth:`frobenius_charpoly` for more details.
|
|
789
|
+
|
|
790
|
+
EXAMPLES::
|
|
791
|
+
|
|
792
|
+
sage: Fq = GF(343)
|
|
793
|
+
sage: A.<T> = Fq[]
|
|
794
|
+
sage: K.<z6> = Fq.extension(2)
|
|
795
|
+
sage: phi = DrinfeldModule(A, [1, 0, z6])
|
|
796
|
+
sage: frobenius_trace = phi.frobenius_trace()
|
|
797
|
+
sage: frobenius_trace
|
|
798
|
+
(4*z3^2 + 6*z3 + 3)*T + 3*z3^2 + z3 + 4
|
|
799
|
+
|
|
800
|
+
::
|
|
801
|
+
|
|
802
|
+
sage: n = 2 # Degree over Fq of the base codomain
|
|
803
|
+
sage: frobenius_trace.degree() <= n/2
|
|
804
|
+
True
|
|
805
|
+
|
|
806
|
+
::
|
|
807
|
+
|
|
808
|
+
sage: frobenius_trace == -phi.frobenius_charpoly()[1]
|
|
809
|
+
True
|
|
810
|
+
|
|
811
|
+
One can specify an algorithm::
|
|
812
|
+
|
|
813
|
+
sage: psi = DrinfeldModule(A, [z6, 1, z6^3, z6 + 1])
|
|
814
|
+
sage: psi.frobenius_trace(algorithm='crystalline')
|
|
815
|
+
z3^2 + 6*z3 + 2
|
|
816
|
+
sage: psi.frobenius_trace(algorithm='CSA')
|
|
817
|
+
z3^2 + 6*z3 + 2
|
|
818
|
+
|
|
819
|
+
ALGORITHM:
|
|
820
|
+
|
|
821
|
+
If the user specifies an algorithm, then the trace is
|
|
822
|
+
computed according to the user's input (see the note above),
|
|
823
|
+
even if the Frobenius trace or the Frobenius characteristic
|
|
824
|
+
polynomial had already been computed.
|
|
825
|
+
|
|
826
|
+
If no algorithm is given, then the function either returns a
|
|
827
|
+
cached value, or if no cached value is available, the
|
|
828
|
+
function computes the Frobenius trace from scratch. In that
|
|
829
|
+
case, if the rank `r` is less than the extension degree `n`,
|
|
830
|
+
then the ``crystalline`` algorithm is used, while the
|
|
831
|
+
``CSA`` algorithm is used otherwise.
|
|
832
|
+
|
|
833
|
+
TESTS:
|
|
834
|
+
|
|
835
|
+
These test values are taken from :meth:`frobenius_charpoly`::
|
|
836
|
+
|
|
837
|
+
sage: Fq = GF(9)
|
|
838
|
+
sage: A.<T> = Fq[]
|
|
839
|
+
sage: k.<zk> = Fq.extension(2)
|
|
840
|
+
sage: K.<z> = k.extension(3)
|
|
841
|
+
|
|
842
|
+
::
|
|
843
|
+
|
|
844
|
+
sage: phi = DrinfeldModule(A, [K(zk), z^8, z^7])
|
|
845
|
+
sage: phi.frobenius_trace(algorithm='CSA')
|
|
846
|
+
T^3 + (z2 + 1)*T^2 + (2*z2 + 2)*T + z2
|
|
847
|
+
sage: phi.frobenius_trace(algorithm='crystalline')
|
|
848
|
+
T^3 + (z2 + 1)*T^2 + (2*z2 + 2)*T + z2
|
|
849
|
+
sage: charpoly = phi.frobenius_charpoly()
|
|
850
|
+
sage: trace = phi.frobenius_trace()
|
|
851
|
+
sage: trace == -charpoly[1]
|
|
852
|
+
True
|
|
853
|
+
|
|
854
|
+
::
|
|
855
|
+
|
|
856
|
+
sage: phi = DrinfeldModule(A, [K(zk), z^2, z^3, z^4])
|
|
857
|
+
sage: phi.frobenius_trace(algorithm='CSA')
|
|
858
|
+
(2*z2 + 2)*T^2 + (2*z2 + 2)*T + 2*z2 + 1
|
|
859
|
+
sage: phi.frobenius_trace(algorithm='crystalline')
|
|
860
|
+
(2*z2 + 2)*T^2 + (2*z2 + 2)*T + 2*z2 + 1
|
|
861
|
+
sage: charpoly = phi.frobenius_charpoly()
|
|
862
|
+
sage: trace = phi.frobenius_trace()
|
|
863
|
+
sage: trace == -charpoly[2]
|
|
864
|
+
True
|
|
865
|
+
|
|
866
|
+
::
|
|
867
|
+
|
|
868
|
+
sage: phi = DrinfeldModule(A, [K(zk), z^8, z^7, z^20])
|
|
869
|
+
sage: phi.frobenius_trace(algorithm='CSA')
|
|
870
|
+
2*z2*T^2 + 2*z2*T + 2*z2 + 2
|
|
871
|
+
sage: phi.frobenius_trace(algorithm='crystalline')
|
|
872
|
+
2*z2*T^2 + 2*z2*T + 2*z2 + 2
|
|
873
|
+
sage: charpoly = phi.frobenius_charpoly()
|
|
874
|
+
sage: trace = phi.frobenius_trace()
|
|
875
|
+
sage: trace == -charpoly[2]
|
|
876
|
+
True
|
|
877
|
+
"""
|
|
878
|
+
if algorithm is None:
|
|
879
|
+
# If no algorithm is specified, return cached data (if it
|
|
880
|
+
# exists), or pick an algorithm:
|
|
881
|
+
# However, if an algorithm is specified, do not use cached
|
|
882
|
+
# data, even if it is possible
|
|
883
|
+
if self._frobenius_trace is not None:
|
|
884
|
+
return self._frobenius_trace
|
|
885
|
+
if self._frobenius_charpoly is not None:
|
|
886
|
+
self._frobenius_trace = -self._frobenius_charpoly \
|
|
887
|
+
.coefficients(sparse=False)[-2]
|
|
888
|
+
return self._frobenius_trace
|
|
889
|
+
else:
|
|
890
|
+
if self.rank() < self._base_degree_over_constants:
|
|
891
|
+
algorithm = 'crystalline'
|
|
892
|
+
else:
|
|
893
|
+
algorithm = 'CSA'
|
|
894
|
+
# We first check if a matrix method is available
|
|
895
|
+
matrix_method_name = f'_frobenius_matrix_{algorithm}'
|
|
896
|
+
if hasattr(self, matrix_method_name):
|
|
897
|
+
matrix = getattr(self, matrix_method_name)()
|
|
898
|
+
trace = matrix.trace()
|
|
899
|
+
A = self.function_ring()
|
|
900
|
+
self._frobenius_trace = A([x.in_base() for x in trace])
|
|
901
|
+
return self._frobenius_trace
|
|
902
|
+
# If it is not, we look for a charpoly method
|
|
903
|
+
charpoly_method_name = f'_frobenius_charpoly_{algorithm}'
|
|
904
|
+
if hasattr(self, charpoly_method_name):
|
|
905
|
+
charpoly = getattr(self, charpoly_method_name)()
|
|
906
|
+
self._frobenius_trace = -charpoly.list()[-2]
|
|
907
|
+
return self._frobenius_trace
|
|
908
|
+
# If all fail, we raise an error
|
|
909
|
+
raise NotImplementedError(f'algorithm "{algorithm}" not implemented')
|
|
910
|
+
|
|
911
|
+
def invert(self, ore_pol):
|
|
912
|
+
r"""
|
|
913
|
+
Return the preimage of the input under the Drinfeld module, if it
|
|
914
|
+
exists.
|
|
915
|
+
|
|
916
|
+
INPUT:
|
|
917
|
+
|
|
918
|
+
- ``ore_pol`` -- the Ore polynomial whose preimage we want to
|
|
919
|
+
compute
|
|
920
|
+
|
|
921
|
+
EXAMPLES::
|
|
922
|
+
|
|
923
|
+
sage: Fq = GF(25)
|
|
924
|
+
sage: A.<T> = Fq[]
|
|
925
|
+
sage: K.<z12> = Fq.extension(6)
|
|
926
|
+
sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
|
|
927
|
+
sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5])
|
|
928
|
+
sage: a = A.random_element()
|
|
929
|
+
sage: phi.invert(phi(a)) == a
|
|
930
|
+
True
|
|
931
|
+
sage: phi.invert(phi(T)) == T
|
|
932
|
+
True
|
|
933
|
+
sage: phi.invert(phi(Fq.gen())) == Fq.gen()
|
|
934
|
+
True
|
|
935
|
+
|
|
936
|
+
When the input is not in the image of the Drinfeld module, an
|
|
937
|
+
exception is raised::
|
|
938
|
+
|
|
939
|
+
sage: t = phi.ore_polring().gen()
|
|
940
|
+
sage: phi.invert(t + 1)
|
|
941
|
+
Traceback (most recent call last):
|
|
942
|
+
...
|
|
943
|
+
ValueError: input must be in the image of the Drinfeld module
|
|
944
|
+
|
|
945
|
+
::
|
|
946
|
+
|
|
947
|
+
sage: phi.invert(t^4 + t^2 + 1)
|
|
948
|
+
Traceback (most recent call last):
|
|
949
|
+
...
|
|
950
|
+
ValueError: input must be in the image of the Drinfeld module
|
|
951
|
+
|
|
952
|
+
ALGORITHM:
|
|
953
|
+
|
|
954
|
+
The algorithm relies on the inversion of a linear algebra
|
|
955
|
+
system. See [MS2019]_, 3.2.5 for details.
|
|
956
|
+
|
|
957
|
+
TESTS::
|
|
958
|
+
|
|
959
|
+
sage: a = A.random_element()
|
|
960
|
+
sage: cat = phi.category()
|
|
961
|
+
sage: phi_r1 = cat.random_object(1)
|
|
962
|
+
sage: phi_r1.invert(phi_r1(a)) == a
|
|
963
|
+
True
|
|
964
|
+
sage: phi_r2 = cat.random_object(2)
|
|
965
|
+
sage: phi_r2.invert(phi_r2(a)) == a
|
|
966
|
+
True
|
|
967
|
+
sage: phi_r3 = cat.random_object(3)
|
|
968
|
+
sage: phi_r3.invert(phi_r3(a)) == a
|
|
969
|
+
True
|
|
970
|
+
sage: phi_r4 = cat.random_object(4)
|
|
971
|
+
sage: phi_r4.invert(phi_r4(a)) == a
|
|
972
|
+
True
|
|
973
|
+
sage: phi_r5 = cat.random_object(5)
|
|
974
|
+
sage: phi_r5.invert(phi_r5(a)) == a
|
|
975
|
+
True
|
|
976
|
+
|
|
977
|
+
::
|
|
978
|
+
|
|
979
|
+
sage: B.<X> = Fq[]
|
|
980
|
+
sage: phi_r5.invert(X)
|
|
981
|
+
Traceback (most recent call last):
|
|
982
|
+
...
|
|
983
|
+
TypeError: input must be an Ore polynomial
|
|
984
|
+
"""
|
|
985
|
+
deg = ore_pol.degree()
|
|
986
|
+
r = self.rank()
|
|
987
|
+
E = self.base()
|
|
988
|
+
K = self.base_over_constants_field()
|
|
989
|
+
if ore_pol in self._ore_polring:
|
|
990
|
+
ore_pol = self._ore_polring(ore_pol)
|
|
991
|
+
else:
|
|
992
|
+
raise TypeError('input must be an Ore polynomial')
|
|
993
|
+
|
|
994
|
+
# Trivial cases
|
|
995
|
+
if deg <= 0:
|
|
996
|
+
return K(ore_pol[0]).in_base()
|
|
997
|
+
if deg % r != 0:
|
|
998
|
+
raise ValueError('input must be in the image of the Drinfeld module')
|
|
999
|
+
# Write the system and solve it
|
|
1000
|
+
k = deg // r
|
|
1001
|
+
A = self._function_ring
|
|
1002
|
+
mat_rows = [[E.zero() for _ in range(k+1)] for _ in range(k+1)]
|
|
1003
|
+
mat_rows[0][0] = E.one()
|
|
1004
|
+
phiT = self.gen()
|
|
1005
|
+
phiTi = self.ore_polring().one()
|
|
1006
|
+
for i in range(1, k+1):
|
|
1007
|
+
phiTi *= phiT
|
|
1008
|
+
for j in range(i+1):
|
|
1009
|
+
mat_rows[j][i] = phiTi[r*j]
|
|
1010
|
+
mat = Matrix(mat_rows)
|
|
1011
|
+
vec = vector([ore_pol[r*j] for j in range(k+1)])
|
|
1012
|
+
coeffs_K = list(mat.inverse() * vec)
|
|
1013
|
+
# Cast the coefficients to Fq
|
|
1014
|
+
try:
|
|
1015
|
+
coeffs_Fq = [K(c).in_base() for c in coeffs_K]
|
|
1016
|
+
pre_image = A(coeffs_Fq)
|
|
1017
|
+
if self(pre_image) == ore_pol:
|
|
1018
|
+
return pre_image
|
|
1019
|
+
except ValueError:
|
|
1020
|
+
pass
|
|
1021
|
+
raise ValueError('input must be in the image of the Drinfeld module')
|
|
1022
|
+
|
|
1023
|
+
def is_isogenous(self, psi):
|
|
1024
|
+
r"""
|
|
1025
|
+
Return ``True`` when ``self`` is isogenous to the other
|
|
1026
|
+
Drinfeld module.
|
|
1027
|
+
|
|
1028
|
+
If the Drinfeld modules do not belong to the same category, an
|
|
1029
|
+
exception is raised.
|
|
1030
|
+
|
|
1031
|
+
EXAMPLES::
|
|
1032
|
+
|
|
1033
|
+
sage: Fq = GF(2)
|
|
1034
|
+
sage: A.<T> = Fq[]
|
|
1035
|
+
sage: K.<z> = Fq.extension(3)
|
|
1036
|
+
sage: psi = DrinfeldModule(A, [z, z + 1, z^2 + z + 1])
|
|
1037
|
+
sage: phi = DrinfeldModule(A, [z, z^2 + z + 1, z^2 + z])
|
|
1038
|
+
sage: phi.is_isogenous(psi)
|
|
1039
|
+
True
|
|
1040
|
+
|
|
1041
|
+
::
|
|
1042
|
+
|
|
1043
|
+
sage: chi = DrinfeldModule(A, [z, z + 1, z^2 + z])
|
|
1044
|
+
sage: phi.is_isogenous(chi)
|
|
1045
|
+
False
|
|
1046
|
+
|
|
1047
|
+
::
|
|
1048
|
+
|
|
1049
|
+
sage: mu = DrinfeldModule(A, [z + 1, z^2 + z + 1, z^2 + z])
|
|
1050
|
+
sage: phi.is_isogenous(mu)
|
|
1051
|
+
Traceback (most recent call last):
|
|
1052
|
+
...
|
|
1053
|
+
TypeError: Drinfeld modules are not in the same category
|
|
1054
|
+
|
|
1055
|
+
::
|
|
1056
|
+
|
|
1057
|
+
sage: mu = 1
|
|
1058
|
+
sage: phi.is_isogenous(mu)
|
|
1059
|
+
Traceback (most recent call last):
|
|
1060
|
+
...
|
|
1061
|
+
TypeError: input must be a Drinfeld module
|
|
1062
|
+
|
|
1063
|
+
ALGORITHM:
|
|
1064
|
+
|
|
1065
|
+
Two Drinfeld A-modules of equal characteristic are isogenous
|
|
1066
|
+
if and only if:
|
|
1067
|
+
|
|
1068
|
+
- they have the same rank
|
|
1069
|
+
- the characteristic polynomial of the Frobenius endomorphism
|
|
1070
|
+
for both Drinfeld modules are equal.
|
|
1071
|
+
"""
|
|
1072
|
+
if not isinstance(psi, DrinfeldModule):
|
|
1073
|
+
raise TypeError("input must be a Drinfeld module")
|
|
1074
|
+
if self.category() != psi.category():
|
|
1075
|
+
raise TypeError("Drinfeld modules are not in the same category")
|
|
1076
|
+
return self.rank() == psi.rank() \
|
|
1077
|
+
and self.frobenius_charpoly() == psi.frobenius_charpoly()
|
|
1078
|
+
|
|
1079
|
+
def is_supersingular(self):
|
|
1080
|
+
r"""
|
|
1081
|
+
Return ``True`` if this Drinfeld module is supersingular.
|
|
1082
|
+
|
|
1083
|
+
A Drinfeld module is supersingular if and only if its
|
|
1084
|
+
height equals its rank.
|
|
1085
|
+
|
|
1086
|
+
EXAMPLES::
|
|
1087
|
+
|
|
1088
|
+
sage: Fq = GF(343)
|
|
1089
|
+
sage: A.<T> = Fq[]
|
|
1090
|
+
sage: K.<z6> = Fq.extension(2)
|
|
1091
|
+
sage: phi = DrinfeldModule(A, [1, 0, z6])
|
|
1092
|
+
sage: phi.is_supersingular()
|
|
1093
|
+
True
|
|
1094
|
+
sage: phi(phi.characteristic()) # Purely inseparable
|
|
1095
|
+
z6*t^2
|
|
1096
|
+
|
|
1097
|
+
In rank two, a Drinfeld module is either ordinary or
|
|
1098
|
+
supersinguler. In higher ranks, it could be neither of
|
|
1099
|
+
the two::
|
|
1100
|
+
|
|
1101
|
+
sage: psi = DrinfeldModule(A, [1, 0, z6, z6])
|
|
1102
|
+
sage: psi.is_ordinary()
|
|
1103
|
+
False
|
|
1104
|
+
sage: psi.is_supersingular()
|
|
1105
|
+
False
|
|
1106
|
+
"""
|
|
1107
|
+
return self.height() == self.rank()
|
|
1108
|
+
|
|
1109
|
+
def is_ordinary(self):
|
|
1110
|
+
r"""
|
|
1111
|
+
Return ``True`` if this Drinfeld module is ordinary.
|
|
1112
|
+
|
|
1113
|
+
A Drinfeld module is ordinary if and only if its
|
|
1114
|
+
height is one.
|
|
1115
|
+
|
|
1116
|
+
EXAMPLES::
|
|
1117
|
+
|
|
1118
|
+
sage: Fq = GF(343)
|
|
1119
|
+
sage: A.<T> = Fq[]
|
|
1120
|
+
sage: K.<z6> = Fq.extension(2)
|
|
1121
|
+
sage: phi = DrinfeldModule(A, [1, 0, z6])
|
|
1122
|
+
sage: phi.is_ordinary()
|
|
1123
|
+
False
|
|
1124
|
+
|
|
1125
|
+
::
|
|
1126
|
+
|
|
1127
|
+
sage: phi = DrinfeldModule(A, [1, z6, 0, z6])
|
|
1128
|
+
sage: phi.is_ordinary()
|
|
1129
|
+
True
|
|
1130
|
+
"""
|
|
1131
|
+
return self.height() == 1
|