passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +807 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_modules.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-23768756.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7897025b.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-e34bb864.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-503f0c35.3.29.so +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-aarch64-linux-musl.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-aarch64-linux-musl.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-aarch64-linux-musl.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-musl.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-aarch64-linux-musl.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-aarch64-linux-musl.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-aarch64-linux-musl.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-aarch64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-aarch64-linux-musl.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-aarch64-linux-musl.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-aarch64-linux-musl.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-aarch64-linux-musl.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-musl.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-musl.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-aarch64-linux-musl.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,908 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.combinat
|
|
3
|
+
r"""
|
|
4
|
+
Univariate skew polynomial rings
|
|
5
|
+
|
|
6
|
+
This module provides the
|
|
7
|
+
:class:`~sage.rings.polynomial.skew_polynomial_ring.SkewPolynomialRing`.
|
|
8
|
+
In the class hierarchy in Sage, the locution *Skew Polynomial* is used
|
|
9
|
+
for a Ore polynomial without twisting derivation.
|
|
10
|
+
|
|
11
|
+
This module also provides:
|
|
12
|
+
|
|
13
|
+
- the class :class:`~sage.rings.polynomial.skew_polynomial_ring.SkewPolynomialRing_finite_order`,
|
|
14
|
+
which is a specialized class for skew polynomial rings over fields
|
|
15
|
+
equipped with an automorphism of finite order. It inherits from
|
|
16
|
+
:class:`~sage.rings.polynomial.skew_polynomial_ring.SkewPolynomialRing`
|
|
17
|
+
but contains more methods and provides better algorithms.
|
|
18
|
+
|
|
19
|
+
- the class :class:`~sage.rings.polynomial.skew_polynomial_ring.SkewPolynomialRing_finite_field`,
|
|
20
|
+
which is a specialized class for skew polynomial rings over finite fields.
|
|
21
|
+
|
|
22
|
+
.. SEEALSO::
|
|
23
|
+
|
|
24
|
+
:class:`~sage.rings.polynomial.ore_polynomial_ring.OrePolynomialRing`
|
|
25
|
+
|
|
26
|
+
AUTHOR:
|
|
27
|
+
|
|
28
|
+
- Xavier Caruso (2012-06-29): initial version
|
|
29
|
+
|
|
30
|
+
- Arpit Merchant (2016-08-04): improved docstrings, fixed doctests
|
|
31
|
+
and refactored classes and methods
|
|
32
|
+
|
|
33
|
+
- Johan Rosenkilde (2016-08-03): changes for bug fixes, docstring and
|
|
34
|
+
doctest errors
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
# ***************************************************************************
|
|
38
|
+
# Copyright (C) 2012 Xavier Caruso <xavier.caruso@normalesup.org>
|
|
39
|
+
#
|
|
40
|
+
# This program is free software: you can redistribute it and/or modify
|
|
41
|
+
# it under the terms of the GNU General Public License as published by
|
|
42
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
43
|
+
# (at your option) any later version.
|
|
44
|
+
# https://www.gnu.org/licenses/
|
|
45
|
+
# ***************************************************************************
|
|
46
|
+
|
|
47
|
+
from sage.structure.richcmp import op_EQ, op_NE
|
|
48
|
+
from sage.structure.category_object import normalize_names
|
|
49
|
+
|
|
50
|
+
from sage.categories.fields import Fields
|
|
51
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
52
|
+
|
|
53
|
+
from sage.rings.morphism import RingHomomorphism
|
|
54
|
+
from sage.categories.homset import Hom
|
|
55
|
+
from sage.categories.map import Section
|
|
56
|
+
|
|
57
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
58
|
+
from sage.rings.polynomial.ore_polynomial_ring import OrePolynomialRing
|
|
59
|
+
|
|
60
|
+
WORKING_CENTER_MAX_TRIES = 1000
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
# Helper functions
|
|
64
|
+
|
|
65
|
+
def _base_ring_to_fraction_field(S):
|
|
66
|
+
r"""
|
|
67
|
+
Return the unique skew polynomial ring over the fraction field of
|
|
68
|
+
``S.base_ring()`` which has ``S`` a sub-ring (internal method).
|
|
69
|
+
|
|
70
|
+
INPUT:
|
|
71
|
+
|
|
72
|
+
- ``S`` -- a skew polynomial ring
|
|
73
|
+
|
|
74
|
+
OUTPUT:
|
|
75
|
+
|
|
76
|
+
- ``Q`` -- the skew polynomial ring over the fraction field
|
|
77
|
+
of ``S.base_ring``
|
|
78
|
+
|
|
79
|
+
EXAMPLES::
|
|
80
|
+
|
|
81
|
+
sage: from sage.rings.polynomial.skew_polynomial_ring import _base_ring_to_fraction_field
|
|
82
|
+
sage: R.<t> = ZZ[]
|
|
83
|
+
sage: sigma = R.hom([t + 1])
|
|
84
|
+
sage: S.<x> = R['x', sigma]
|
|
85
|
+
sage: _base_ring_to_fraction_field(S)
|
|
86
|
+
Ore Polynomial Ring in x over Fraction Field of Univariate Polynomial Ring in t over Integer Ring twisted by t |--> t + 1
|
|
87
|
+
"""
|
|
88
|
+
R = S.base_ring()
|
|
89
|
+
if R in Fields():
|
|
90
|
+
return S
|
|
91
|
+
|
|
92
|
+
Q = R.fraction_field()
|
|
93
|
+
gens = R.gens()
|
|
94
|
+
sigmaS = S.twisting_morphism()
|
|
95
|
+
sigmaQ = Q.hom([Q(sigmaS(g)) for g in gens])
|
|
96
|
+
return Q[S.variable_name(), sigmaQ]
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _minimal_vanishing_polynomial(R, eval_pts):
|
|
100
|
+
r"""
|
|
101
|
+
Return the minimal vanishing polynomial (internal function).
|
|
102
|
+
|
|
103
|
+
See the documentation for
|
|
104
|
+
:meth:`SkewPolynomialRing.minimal_vanishing_polynomial` for a description.
|
|
105
|
+
|
|
106
|
+
INPUT:
|
|
107
|
+
|
|
108
|
+
- ``R`` -- a skew polynomial ring over a field
|
|
109
|
+
|
|
110
|
+
- ``eval_pts`` -- list of evaluation points
|
|
111
|
+
|
|
112
|
+
OUTPUT: the minimal vanishing polynomial
|
|
113
|
+
|
|
114
|
+
EXAMPLES::
|
|
115
|
+
|
|
116
|
+
sage: # needs sage.rings.finite_rings
|
|
117
|
+
sage: from sage.rings.polynomial.skew_polynomial_ring import _minimal_vanishing_polynomial
|
|
118
|
+
sage: k.<t> = GF(5^3)
|
|
119
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
120
|
+
sage: S.<x> = k['x',Frob]
|
|
121
|
+
sage: eval_pts = [1, t, t^2]
|
|
122
|
+
sage: b = _minimal_vanishing_polynomial(S, eval_pts); b
|
|
123
|
+
doctest:...: FutureWarning: This class/method/function is marked as experimental.
|
|
124
|
+
It, its functionality or its interface might change without a formal deprecation.
|
|
125
|
+
See https://github.com/sagemath/sage/issues/13215 for details.
|
|
126
|
+
x^3 + 4
|
|
127
|
+
"""
|
|
128
|
+
l = len(eval_pts)
|
|
129
|
+
if l == 0:
|
|
130
|
+
return R.one()
|
|
131
|
+
elif l == 1:
|
|
132
|
+
e = eval_pts[0]
|
|
133
|
+
if e.is_zero():
|
|
134
|
+
return R.one()
|
|
135
|
+
else:
|
|
136
|
+
return R.gen() - R.twisting_morphism()(e) / e
|
|
137
|
+
else:
|
|
138
|
+
t = l // 2
|
|
139
|
+
A = eval_pts[:t]
|
|
140
|
+
B = eval_pts[t:]
|
|
141
|
+
M_A = _minimal_vanishing_polynomial(R, A)
|
|
142
|
+
B_moved = M_A.multi_point_evaluation(B)
|
|
143
|
+
M_at_B_moved = _minimal_vanishing_polynomial(R, B_moved)
|
|
144
|
+
return M_at_B_moved * M_A
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def _lagrange_polynomial(R, eval_pts, values):
|
|
148
|
+
r"""
|
|
149
|
+
Return the Lagrange polynomial of the given points if it exists.
|
|
150
|
+
|
|
151
|
+
Otherwise return an unspecified polynomial (internal method).
|
|
152
|
+
|
|
153
|
+
See the documentation for
|
|
154
|
+
:meth:`SkewPolynomialRing.lagrange_polynomial` for a description
|
|
155
|
+
of Lagrange polynomial.
|
|
156
|
+
|
|
157
|
+
INPUT:
|
|
158
|
+
|
|
159
|
+
- ``R`` -- a skew polynomial ring over a field
|
|
160
|
+
|
|
161
|
+
- ``eval_pts`` -- list of evaluation points
|
|
162
|
+
|
|
163
|
+
- ``values`` -- list of values that the Lagrange polynomial takes
|
|
164
|
+
at the respective ``eval_pts``
|
|
165
|
+
|
|
166
|
+
OUTPUT: the Lagrange polynomial
|
|
167
|
+
|
|
168
|
+
EXAMPLES::
|
|
169
|
+
|
|
170
|
+
sage: # needs sage.rings.finite_rings
|
|
171
|
+
sage: from sage.rings.polynomial.skew_polynomial_ring import _lagrange_polynomial
|
|
172
|
+
sage: k.<t> = GF(5^3)
|
|
173
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
174
|
+
sage: S.<x> = k['x', Frob]
|
|
175
|
+
sage: eval_pts = [t , t^2]
|
|
176
|
+
sage: values = [3*t^2 + 4*t + 4, 4*t]
|
|
177
|
+
sage: d = _lagrange_polynomial(S, eval_pts, values); d
|
|
178
|
+
x + t
|
|
179
|
+
sage: d.multi_point_evaluation(eval_pts) == values
|
|
180
|
+
True
|
|
181
|
+
|
|
182
|
+
The following restrictions are impossible to satisfy because the evaluation
|
|
183
|
+
points are linearly dependent over the fixed field of the twisting morphism, and the
|
|
184
|
+
corresponding values do not match::
|
|
185
|
+
|
|
186
|
+
sage: eval_pts = [t, 2*t] # needs sage.rings.finite_rings
|
|
187
|
+
sage: values = [1, 3]
|
|
188
|
+
sage: _lagrange_polynomial(S, eval_pts, values) # needs sage.rings.finite_rings
|
|
189
|
+
Traceback (most recent call last):
|
|
190
|
+
...
|
|
191
|
+
ValueError: the given evaluation points are linearly dependent over the fixed field of the twisting morphism,
|
|
192
|
+
so a Lagrange polynomial could not be determined (and might not exist)
|
|
193
|
+
"""
|
|
194
|
+
l = len(eval_pts)
|
|
195
|
+
if l == 1:
|
|
196
|
+
if eval_pts[0].is_zero():
|
|
197
|
+
# This is due to linear dependence among the eval_pts.
|
|
198
|
+
raise ValueError("the given evaluation points are linearly dependent"
|
|
199
|
+
" over the fixed field of the twisting morphism,"
|
|
200
|
+
" so a Lagrange polynomial could not be determined"
|
|
201
|
+
" (and might not exist)")
|
|
202
|
+
return (values[0] / eval_pts[0]) * R.one()
|
|
203
|
+
else:
|
|
204
|
+
t = l // 2
|
|
205
|
+
A = eval_pts[:t]
|
|
206
|
+
B = eval_pts[t:]
|
|
207
|
+
M_A = _minimal_vanishing_polynomial(R, A)
|
|
208
|
+
M_B = _minimal_vanishing_polynomial(R, B)
|
|
209
|
+
A_ = M_B.multi_point_evaluation(A)
|
|
210
|
+
B_ = M_A.multi_point_evaluation(B)
|
|
211
|
+
I_1 = _lagrange_polynomial(R, A_, values[:t])
|
|
212
|
+
I_2 = _lagrange_polynomial(R, B_, values[t:])
|
|
213
|
+
return I_1 * M_B + I_2 * M_A
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
# Generic implementation of skew polynomial rings
|
|
217
|
+
#################################################
|
|
218
|
+
|
|
219
|
+
class SkewPolynomialRing(OrePolynomialRing):
|
|
220
|
+
def __init__(self, base_ring, morphism, derivation, name, sparse, category=None):
|
|
221
|
+
r"""
|
|
222
|
+
Initialize ``self``.
|
|
223
|
+
|
|
224
|
+
INPUT:
|
|
225
|
+
|
|
226
|
+
- ``base_ring`` -- a commutative ring
|
|
227
|
+
|
|
228
|
+
- ``twisting_morphism`` -- an automorphism of the base ring
|
|
229
|
+
|
|
230
|
+
- ``name`` -- string or list of strings representing the name of
|
|
231
|
+
the variables of ring
|
|
232
|
+
|
|
233
|
+
- ``sparse`` -- boolean (default: ``False``)
|
|
234
|
+
|
|
235
|
+
- ``category`` -- a category
|
|
236
|
+
|
|
237
|
+
EXAMPLES::
|
|
238
|
+
|
|
239
|
+
sage: R.<t> = ZZ[]
|
|
240
|
+
sage: sigma = R.hom([t + 1])
|
|
241
|
+
sage: S.<x> = SkewPolynomialRing(R,sigma)
|
|
242
|
+
sage: S.category()
|
|
243
|
+
Category of algebras over Univariate Polynomial Ring in t over Integer Ring
|
|
244
|
+
sage: S([1]) + S([-1])
|
|
245
|
+
0
|
|
246
|
+
sage: TestSuite(S).run()
|
|
247
|
+
"""
|
|
248
|
+
if derivation is not None:
|
|
249
|
+
raise NotImplementedError
|
|
250
|
+
if self.Element is None:
|
|
251
|
+
import sage.rings.polynomial.skew_polynomial_element
|
|
252
|
+
self.Element = sage.rings.polynomial.skew_polynomial_element.SkewPolynomial_generic_dense
|
|
253
|
+
OrePolynomialRing.__init__(self, base_ring, morphism, None, name, sparse, category)
|
|
254
|
+
|
|
255
|
+
def minimal_vanishing_polynomial(self, eval_pts):
|
|
256
|
+
r"""
|
|
257
|
+
Return the minimal-degree, monic skew polynomial which vanishes at all
|
|
258
|
+
the given evaluation points.
|
|
259
|
+
|
|
260
|
+
The degree of the vanishing polynomial is at most the length of
|
|
261
|
+
``eval_pts``. Equality holds if and only if the elements of
|
|
262
|
+
``eval_pts`` are linearly independent over the fixed field of
|
|
263
|
+
``self.twisting_morphism()``.
|
|
264
|
+
|
|
265
|
+
- ``eval_pts`` -- list of evaluation points which are linearly
|
|
266
|
+
independent over the fixed field of the twisting morphism of
|
|
267
|
+
the associated skew polynomial ring
|
|
268
|
+
|
|
269
|
+
OUTPUT: the minimal vanishing polynomial
|
|
270
|
+
|
|
271
|
+
EXAMPLES::
|
|
272
|
+
|
|
273
|
+
sage: # needs sage.rings.finite_rings
|
|
274
|
+
sage: k.<t> = GF(5^3)
|
|
275
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
276
|
+
sage: S.<x> = k['x', Frob]
|
|
277
|
+
sage: eval_pts = [1, t, t^2]
|
|
278
|
+
sage: b = S.minimal_vanishing_polynomial(eval_pts); b
|
|
279
|
+
x^3 + 4
|
|
280
|
+
|
|
281
|
+
The minimal vanishing polynomial evaluates to 0 at each of
|
|
282
|
+
the evaluation points::
|
|
283
|
+
|
|
284
|
+
sage: eval = b.multi_point_evaluation(eval_pts); eval # needs sage.rings.finite_rings
|
|
285
|
+
[0, 0, 0]
|
|
286
|
+
|
|
287
|
+
If the evaluation points are linearly dependent over the fixed
|
|
288
|
+
field of the twisting morphism, then the returned polynomial has
|
|
289
|
+
lower degree than the number of evaluation points::
|
|
290
|
+
|
|
291
|
+
sage: S.minimal_vanishing_polynomial([t]) # needs sage.rings.finite_rings
|
|
292
|
+
x + 3*t^2 + 3*t
|
|
293
|
+
sage: S.minimal_vanishing_polynomial([t, 3*t]) # needs sage.rings.finite_rings
|
|
294
|
+
x + 3*t^2 + 3*t
|
|
295
|
+
"""
|
|
296
|
+
return _minimal_vanishing_polynomial(_base_ring_to_fraction_field(self), eval_pts)
|
|
297
|
+
|
|
298
|
+
def lagrange_polynomial(self, points):
|
|
299
|
+
r"""
|
|
300
|
+
Return the minimal-degree polynomial which interpolates the given
|
|
301
|
+
points.
|
|
302
|
+
|
|
303
|
+
More precisely, given `n` pairs `(x_1, y_1), \ldots, (x_n, y_n) \in R^2`,
|
|
304
|
+
where `R` is ``self.base_ring()``, compute a skew polynomial `p(x)`
|
|
305
|
+
such that `p(x_i) = y_i` for each `i`, under the condition that
|
|
306
|
+
the `x_i` are linearly independent over the fixed field of
|
|
307
|
+
``self.twisting_morphism()``.
|
|
308
|
+
|
|
309
|
+
If the `x_i` are linearly independent over the fixed field of
|
|
310
|
+
``self.twisting_morphism()`` then such a polynomial is guaranteed
|
|
311
|
+
to exist. Otherwise, it might exist depending on the `y_i`, but
|
|
312
|
+
the algorithm used in this implementation does not support that,
|
|
313
|
+
and so an error is always raised.
|
|
314
|
+
|
|
315
|
+
INPUT:
|
|
316
|
+
|
|
317
|
+
- ``points`` -- list of pairs `(x_1, y_1), \ldots, (x_n, y_n)` of
|
|
318
|
+
elements of the base ring of ``self``; the `x_i` should be linearly
|
|
319
|
+
independent over the fixed field of ``self.twisting_morphism()``
|
|
320
|
+
|
|
321
|
+
OUTPUT: the Lagrange polynomial
|
|
322
|
+
|
|
323
|
+
EXAMPLES::
|
|
324
|
+
|
|
325
|
+
sage: # needs sage.rings.finite_rings
|
|
326
|
+
sage: k.<t> = GF(5^3)
|
|
327
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
328
|
+
sage: S.<x> = k['x', Frob]
|
|
329
|
+
sage: points = [(t, 3*t^2 + 4*t + 4), (t^2, 4*t)]
|
|
330
|
+
sage: d = S.lagrange_polynomial(points); d
|
|
331
|
+
x + t
|
|
332
|
+
|
|
333
|
+
sage: R.<t> = ZZ[]
|
|
334
|
+
sage: sigma = R.hom([t + 1])
|
|
335
|
+
sage: T.<x> = R['x', sigma]
|
|
336
|
+
sage: points = [(1, t^2 + 3*t + 4), (t, 2*t^2 + 3*t + 1), (t^2, t^2 + 3*t + 4)]
|
|
337
|
+
sage: p = T.lagrange_polynomial(points); p
|
|
338
|
+
((-t^4 - 2*t - 3)/-2)*x^2 + (-t^4 - t^3 - t^2 - 3*t - 2)*x
|
|
339
|
+
+ (-t^4 - 2*t^3 - 4*t^2 - 10*t - 9)/-2
|
|
340
|
+
sage: p.multi_point_evaluation([1, t, t^2]) == [t^2 + 3*t + 4, 2*t^2 + 3*t + 1, t^2 + 3*t + 4]
|
|
341
|
+
True
|
|
342
|
+
|
|
343
|
+
If the `x_i` are linearly dependent over the fixed field of
|
|
344
|
+
``self.twisting_morphism()``, then an error is raised::
|
|
345
|
+
|
|
346
|
+
sage: T.lagrange_polynomial([(t, 1), (2*t, 3)])
|
|
347
|
+
Traceback (most recent call last):
|
|
348
|
+
...
|
|
349
|
+
ValueError: the given evaluation points are linearly dependent over the fixed field of the twisting morphism,
|
|
350
|
+
so a Lagrange polynomial could not be determined (and might not exist)
|
|
351
|
+
"""
|
|
352
|
+
l = len(points)
|
|
353
|
+
if not all(len(pair) == 2 for pair in points):
|
|
354
|
+
raise TypeError("supplied points must be pairs of elements of base ring")
|
|
355
|
+
eval_pts = [x for (x, _) in points]
|
|
356
|
+
values = [y for (_, y) in points]
|
|
357
|
+
|
|
358
|
+
if l > len(set(eval_pts)):
|
|
359
|
+
raise TypeError("the evaluation points must be distinct")
|
|
360
|
+
zero_i = [i for i in range(l) if eval_pts[i].is_zero()]
|
|
361
|
+
if zero_i and not values[zero_i[0]].is_zero():
|
|
362
|
+
raise TypeError("a skew polynomial always evaluates to 0 at 0, but a nonzero value was requested")
|
|
363
|
+
|
|
364
|
+
return _lagrange_polynomial(_base_ring_to_fraction_field(self), eval_pts, values)
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
# Special classes for twisting morphisms with finite order
|
|
368
|
+
##########################################################
|
|
369
|
+
|
|
370
|
+
class SectionSkewPolynomialCenterInjection(Section):
|
|
371
|
+
r"""
|
|
372
|
+
Section of the canonical injection of the center of a skew
|
|
373
|
+
polynomial ring into this ring.
|
|
374
|
+
|
|
375
|
+
TESTS::
|
|
376
|
+
|
|
377
|
+
sage: # needs sage.rings.finite_rings
|
|
378
|
+
sage: k.<a> = GF(5^3)
|
|
379
|
+
sage: S.<x> = SkewPolynomialRing(k, k.frobenius_endomorphism())
|
|
380
|
+
sage: Z = S.center()
|
|
381
|
+
sage: iota = S.convert_map_from(Z)
|
|
382
|
+
sage: sigma = iota.section()
|
|
383
|
+
sage: TestSuite(sigma).run(skip=['_test_category'])
|
|
384
|
+
"""
|
|
385
|
+
def _call_(self, x):
|
|
386
|
+
r"""
|
|
387
|
+
Return `x` viewed as an element of the center.
|
|
388
|
+
|
|
389
|
+
EXAMPLES::
|
|
390
|
+
|
|
391
|
+
sage: # needs sage.rings.finite_rings
|
|
392
|
+
sage: k.<a> = GF(5^3)
|
|
393
|
+
sage: S.<x> = SkewPolynomialRing(k, k.frobenius_endomorphism())
|
|
394
|
+
sage: Z = S.center()
|
|
395
|
+
sage: iota = S.convert_map_from(Z)
|
|
396
|
+
sage: sigma = iota.section()
|
|
397
|
+
sage: sigma(x^3)
|
|
398
|
+
z
|
|
399
|
+
sage: sigma(x^2)
|
|
400
|
+
Traceback (most recent call last):
|
|
401
|
+
...
|
|
402
|
+
ValueError: x^2 is not in the center
|
|
403
|
+
"""
|
|
404
|
+
order = self.inverse()._order
|
|
405
|
+
section = self.inverse()._embed.section()
|
|
406
|
+
lx = x.list()
|
|
407
|
+
l = []
|
|
408
|
+
mod = 0
|
|
409
|
+
for c in lx:
|
|
410
|
+
if mod == 0:
|
|
411
|
+
l.append(section(c))
|
|
412
|
+
else:
|
|
413
|
+
if not c.is_zero():
|
|
414
|
+
raise ValueError("%s is not in the center" % x)
|
|
415
|
+
mod += 1
|
|
416
|
+
if mod == order:
|
|
417
|
+
mod = 0
|
|
418
|
+
return self.codomain()(l)
|
|
419
|
+
|
|
420
|
+
def _richcmp_(self, right, op):
|
|
421
|
+
r"""
|
|
422
|
+
Compare this morphism with ``right``.
|
|
423
|
+
|
|
424
|
+
TESTS::
|
|
425
|
+
|
|
426
|
+
sage: # needs sage.rings.finite_rings
|
|
427
|
+
sage: k.<a> = GF(5^3)
|
|
428
|
+
sage: S.<x> = SkewPolynomialRing(k, k.frobenius_endomorphism())
|
|
429
|
+
sage: Z = S.center()
|
|
430
|
+
sage: iota = S.convert_map_from(Z)
|
|
431
|
+
sage: sigma = iota.section()
|
|
432
|
+
sage: s = loads(dumps(sigma))
|
|
433
|
+
sage: s == sigma
|
|
434
|
+
True
|
|
435
|
+
sage: s != sigma
|
|
436
|
+
False
|
|
437
|
+
sage: s is sigma
|
|
438
|
+
False
|
|
439
|
+
"""
|
|
440
|
+
if op == op_EQ:
|
|
441
|
+
return (self.domain() is right.domain()) and (self.codomain() is right.codomain())
|
|
442
|
+
if op == op_NE:
|
|
443
|
+
return (self.domain() is not right.domain()) or (self.codomain() is not right.codomain())
|
|
444
|
+
return NotImplemented
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
class SkewPolynomialCenterInjection(RingHomomorphism):
|
|
448
|
+
r"""
|
|
449
|
+
Canonical injection of the center of a skew polynomial ring
|
|
450
|
+
into this ring.
|
|
451
|
+
|
|
452
|
+
TESTS::
|
|
453
|
+
|
|
454
|
+
sage: # needs sage.rings.finite_rings
|
|
455
|
+
sage: k.<a> = GF(5^3)
|
|
456
|
+
sage: S.<x> = SkewPolynomialRing(k, k.frobenius_endomorphism())
|
|
457
|
+
sage: Z = S.center()
|
|
458
|
+
sage: iota = S.convert_map_from(Z)
|
|
459
|
+
sage: TestSuite(iota).run(skip=['_test_category'])
|
|
460
|
+
"""
|
|
461
|
+
def __init__(self, domain, codomain, embed, order):
|
|
462
|
+
r"""
|
|
463
|
+
Initialize this morphism.
|
|
464
|
+
|
|
465
|
+
EXAMPLES::
|
|
466
|
+
|
|
467
|
+
sage: # needs sage.rings.finite_rings
|
|
468
|
+
sage: k.<a> = GF(5^3)
|
|
469
|
+
sage: S.<x> = SkewPolynomialRing(k, k.frobenius_endomorphism())
|
|
470
|
+
sage: Z = S.center()
|
|
471
|
+
sage: S.convert_map_from(Z) # indirect doctest
|
|
472
|
+
Embedding of the center of Ore Polynomial Ring in x over Finite Field in a of size 5^3 twisted by a |--> a^5 into this ring
|
|
473
|
+
"""
|
|
474
|
+
RingHomomorphism.__init__(self, Hom(domain, codomain))
|
|
475
|
+
self._embed = embed
|
|
476
|
+
self._order = order
|
|
477
|
+
self._codomain = codomain
|
|
478
|
+
self._section = SectionSkewPolynomialCenterInjection(self)
|
|
479
|
+
|
|
480
|
+
def _repr_(self):
|
|
481
|
+
r"""
|
|
482
|
+
Return a string representation of this morphism.
|
|
483
|
+
|
|
484
|
+
EXAMPLES::
|
|
485
|
+
|
|
486
|
+
sage: # needs sage.rings.finite_rings
|
|
487
|
+
sage: k.<a> = GF(5^3)
|
|
488
|
+
sage: S.<x> = SkewPolynomialRing(k, k.frobenius_endomorphism())
|
|
489
|
+
sage: Z = S.center()
|
|
490
|
+
sage: iota = S.convert_map_from(Z)
|
|
491
|
+
sage: iota
|
|
492
|
+
Embedding of the center of Ore Polynomial Ring in x over Finite Field in a of size 5^3 twisted by a |--> a^5 into this ring
|
|
493
|
+
sage: iota._repr_()
|
|
494
|
+
'Embedding of the center of Ore Polynomial Ring in x over Finite Field in a of size 5^3 twisted by a |--> a^5 into this ring'
|
|
495
|
+
"""
|
|
496
|
+
return "Embedding of the center of %s into this ring" % self._codomain
|
|
497
|
+
|
|
498
|
+
def _call_(self, x):
|
|
499
|
+
r"""
|
|
500
|
+
Return the image of `x` by this morphism.
|
|
501
|
+
|
|
502
|
+
TESTS::
|
|
503
|
+
|
|
504
|
+
sage: # needs sage.rings.finite_rings
|
|
505
|
+
sage: k.<a> = GF(5^3)
|
|
506
|
+
sage: S.<x> = SkewPolynomialRing(k, k.frobenius_endomorphism())
|
|
507
|
+
sage: Z.<z> = S.center()
|
|
508
|
+
sage: iota = S.convert_map_from(Z)
|
|
509
|
+
sage: iota(z)
|
|
510
|
+
x^3
|
|
511
|
+
"""
|
|
512
|
+
k = self._codomain.base_ring()
|
|
513
|
+
l = []
|
|
514
|
+
lz = [k(0)] * (self._order - 1)
|
|
515
|
+
for c in x.list():
|
|
516
|
+
l += [self._embed(c)] + lz
|
|
517
|
+
return self._codomain(l)
|
|
518
|
+
|
|
519
|
+
def _richcmp_(self, right, op):
|
|
520
|
+
r"""
|
|
521
|
+
Compare this morphism with ``right``.
|
|
522
|
+
|
|
523
|
+
TESTS::
|
|
524
|
+
|
|
525
|
+
sage: # needs sage.rings.finite_rings
|
|
526
|
+
sage: k.<a> = GF(5^3)
|
|
527
|
+
sage: S.<x> = SkewPolynomialRing(k, k.frobenius_endomorphism())
|
|
528
|
+
sage: Z = S.center()
|
|
529
|
+
sage: iota = S.convert_map_from(Z)
|
|
530
|
+
sage: i = loads(dumps(iota))
|
|
531
|
+
sage: i == iota
|
|
532
|
+
True
|
|
533
|
+
sage: i != iota
|
|
534
|
+
False
|
|
535
|
+
sage: i is iota
|
|
536
|
+
False
|
|
537
|
+
"""
|
|
538
|
+
if op == op_EQ:
|
|
539
|
+
return (self.domain() is right.domain()) and (self.codomain() is right.codomain())
|
|
540
|
+
if op == op_NE:
|
|
541
|
+
return (self.domain() is not right.domain()) or (self.codomain() is not right.codomain())
|
|
542
|
+
return NotImplemented
|
|
543
|
+
|
|
544
|
+
def section(self):
|
|
545
|
+
r"""
|
|
546
|
+
Return a section of this morphism.
|
|
547
|
+
|
|
548
|
+
EXAMPLES::
|
|
549
|
+
|
|
550
|
+
sage: # needs sage.rings.finite_rings
|
|
551
|
+
sage: k.<a> = GF(5^3)
|
|
552
|
+
sage: S.<x> = SkewPolynomialRing(k, k.frobenius_endomorphism())
|
|
553
|
+
sage: Z = S.center()
|
|
554
|
+
sage: iota = S.convert_map_from(Z)
|
|
555
|
+
sage: sigma = iota.section()
|
|
556
|
+
sage: sigma(x^3)
|
|
557
|
+
z
|
|
558
|
+
"""
|
|
559
|
+
return self._section
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
class SkewPolynomialRing_finite_order(SkewPolynomialRing):
|
|
563
|
+
"""
|
|
564
|
+
A specialized class for skew polynomial rings whose twising morphism
|
|
565
|
+
has finite order.
|
|
566
|
+
|
|
567
|
+
.. SEEALSO::
|
|
568
|
+
|
|
569
|
+
- :class:`sage.rings.polynomial.skew_polynomial_ring.SkewPolynomialRing`
|
|
570
|
+
- :mod:`sage.rings.polynomial.skew_polynomial_finite_order`
|
|
571
|
+
"""
|
|
572
|
+
def __init__(self, base_ring, morphism, derivation, name, sparse, category=None):
|
|
573
|
+
r"""
|
|
574
|
+
Initialize this skew polynomial ring.
|
|
575
|
+
|
|
576
|
+
TESTS::
|
|
577
|
+
|
|
578
|
+
sage: # needs sage.rings.finite_rings
|
|
579
|
+
sage: k.<t> = GF(5^3)
|
|
580
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
581
|
+
sage: S.<x> = k['x', Frob]; S
|
|
582
|
+
Ore Polynomial Ring in x over Finite Field in t of size 5^3 twisted by t |--> t^5
|
|
583
|
+
sage: S.category()
|
|
584
|
+
Category of algebras over Finite Field in t of size 5^3
|
|
585
|
+
sage: TestSuite(S).run()
|
|
586
|
+
|
|
587
|
+
We check that a call to the method
|
|
588
|
+
:meth:`sage.rings.polynomial.skew_polynomial_finite_order.SkewPolynomial_finite_order.is_central`
|
|
589
|
+
does not affect the behaviour of default central variable names::
|
|
590
|
+
|
|
591
|
+
sage: # needs sage.rings.finite_rings
|
|
592
|
+
sage: k.<a> = GF(7^4)
|
|
593
|
+
sage: phi = k.frobenius_endomorphism()
|
|
594
|
+
sage: S.<x> = k['x', phi]
|
|
595
|
+
sage: (x^4).is_central()
|
|
596
|
+
True
|
|
597
|
+
sage: Z.<u> = S.center()
|
|
598
|
+
sage: S.center() is Z
|
|
599
|
+
True
|
|
600
|
+
"""
|
|
601
|
+
if self.Element is None:
|
|
602
|
+
import sage.rings.polynomial.skew_polynomial_finite_order
|
|
603
|
+
self.Element = sage.rings.polynomial.skew_polynomial_finite_order.SkewPolynomial_finite_order_dense
|
|
604
|
+
if self._fraction_field_class is None:
|
|
605
|
+
from sage.rings.polynomial.ore_function_field import OreFunctionField_with_large_center
|
|
606
|
+
self._fraction_field_class = OreFunctionField_with_large_center
|
|
607
|
+
SkewPolynomialRing.__init__(self, base_ring, morphism, derivation, name, sparse, category)
|
|
608
|
+
self._order = morphism.order()
|
|
609
|
+
(self._constants, self._embed_constants) = morphism.fixed_field()
|
|
610
|
+
|
|
611
|
+
# Configure and create center
|
|
612
|
+
self._center = {}
|
|
613
|
+
self._center_variable_name = 'z'
|
|
614
|
+
for i in range(WORKING_CENTER_MAX_TRIES):
|
|
615
|
+
try:
|
|
616
|
+
self._working_center = self.center()
|
|
617
|
+
self._center_variable_name = None
|
|
618
|
+
break
|
|
619
|
+
except ValueError:
|
|
620
|
+
self._center_variable_name = "z%s_" % i
|
|
621
|
+
if self._center_variable_name is not None:
|
|
622
|
+
raise NotImplementedError("unable to create the center")
|
|
623
|
+
|
|
624
|
+
def center(self, name=None, names=None, default=False):
|
|
625
|
+
r"""
|
|
626
|
+
Return the center of this skew polynomial ring.
|
|
627
|
+
|
|
628
|
+
.. NOTE::
|
|
629
|
+
|
|
630
|
+
If `F` denotes the subring of `R` fixed by `\sigma` and `\sigma`
|
|
631
|
+
has order `r`, the center of `K[x,\sigma]` is `F[x^r]`, that
|
|
632
|
+
is a univariate polynomial ring over `F`.
|
|
633
|
+
|
|
634
|
+
INPUT:
|
|
635
|
+
|
|
636
|
+
- ``name`` -- string or ``None`` (default: ``None``);
|
|
637
|
+
the name for the central variable (namely `x^r`)
|
|
638
|
+
|
|
639
|
+
- ``default`` -- boolean (default: ``False``); if ``True``,
|
|
640
|
+
set the default variable name for the center to ``name``
|
|
641
|
+
|
|
642
|
+
EXAMPLES::
|
|
643
|
+
|
|
644
|
+
sage: # needs sage.rings.finite_rings
|
|
645
|
+
sage: k.<t> = GF(5^3)
|
|
646
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
647
|
+
sage: S.<x> = k['x',Frob]; S
|
|
648
|
+
Ore Polynomial Ring in x over Finite Field in t of size 5^3
|
|
649
|
+
twisted by t |--> t^5
|
|
650
|
+
sage: Z = S.center(); Z
|
|
651
|
+
Univariate Polynomial Ring in z over Finite Field of size 5
|
|
652
|
+
sage: Z.gen()
|
|
653
|
+
z
|
|
654
|
+
|
|
655
|
+
We can pass in another variable name::
|
|
656
|
+
|
|
657
|
+
sage: S.center(name='y') # needs sage.rings.finite_rings
|
|
658
|
+
Univariate Polynomial Ring in y over Finite Field of size 5
|
|
659
|
+
|
|
660
|
+
or use the bracket notation::
|
|
661
|
+
|
|
662
|
+
sage: Zy.<y> = S.center(); Zy # needs sage.rings.finite_rings
|
|
663
|
+
Univariate Polynomial Ring in y over Finite Field of size 5
|
|
664
|
+
sage: y.parent() is Zy # needs sage.rings.finite_rings
|
|
665
|
+
True
|
|
666
|
+
|
|
667
|
+
A coercion map from the center to the skew polynomial ring is set::
|
|
668
|
+
|
|
669
|
+
sage: # needs sage.rings.finite_rings
|
|
670
|
+
sage: S.has_coerce_map_from(Zy)
|
|
671
|
+
True
|
|
672
|
+
sage: P = y + x; P
|
|
673
|
+
x^3 + x
|
|
674
|
+
sage: P.parent()
|
|
675
|
+
Ore Polynomial Ring in x over Finite Field in t of size 5^3
|
|
676
|
+
twisted by t |--> t^5
|
|
677
|
+
sage: P.parent() is S
|
|
678
|
+
True
|
|
679
|
+
|
|
680
|
+
together with a conversion map in the reverse direction::
|
|
681
|
+
|
|
682
|
+
sage: Zy(x^6 + 2*x^3 + 3) # needs sage.rings.finite_rings
|
|
683
|
+
y^2 + 2*y + 3
|
|
684
|
+
|
|
685
|
+
sage: Zy(x^2) # needs sage.rings.finite_rings
|
|
686
|
+
Traceback (most recent call last):
|
|
687
|
+
...
|
|
688
|
+
ValueError: x^2 is not in the center
|
|
689
|
+
|
|
690
|
+
Two different skew polynomial rings can share the same center::
|
|
691
|
+
|
|
692
|
+
sage: S1.<x1> = k['x1', Frob] # needs sage.rings.finite_rings
|
|
693
|
+
sage: S2.<x2> = k['x2', Frob] # needs sage.rings.finite_rings
|
|
694
|
+
sage: S1.center() is S2.center() # needs sage.rings.finite_rings
|
|
695
|
+
True
|
|
696
|
+
|
|
697
|
+
.. RUBRIC:: About the default name of the central variable
|
|
698
|
+
|
|
699
|
+
A priori, the default is ``z``.
|
|
700
|
+
|
|
701
|
+
However, a variable name is given the first time this method is
|
|
702
|
+
called, the given name become the default for the next calls::
|
|
703
|
+
|
|
704
|
+
sage: # needs sage.rings.finite_rings
|
|
705
|
+
sage: K.<t> = GF(11^3)
|
|
706
|
+
sage: phi = K.frobenius_endomorphism()
|
|
707
|
+
sage: A.<X> = K['X', phi]
|
|
708
|
+
sage: C.<u> = A.center() # first call
|
|
709
|
+
sage: C
|
|
710
|
+
Univariate Polynomial Ring in u over Finite Field of size 11
|
|
711
|
+
sage: A.center() # second call: the variable name is still u
|
|
712
|
+
Univariate Polynomial Ring in u over Finite Field of size 11
|
|
713
|
+
sage: A.center() is C
|
|
714
|
+
True
|
|
715
|
+
|
|
716
|
+
We can update the default variable name by passing in the argument
|
|
717
|
+
``default=True``::
|
|
718
|
+
|
|
719
|
+
sage: # needs sage.rings.finite_rings
|
|
720
|
+
sage: D.<v> = A.center(default=True)
|
|
721
|
+
sage: D
|
|
722
|
+
Univariate Polynomial Ring in v over Finite Field of size 11
|
|
723
|
+
sage: A.center()
|
|
724
|
+
Univariate Polynomial Ring in v over Finite Field of size 11
|
|
725
|
+
sage: A.center() is D
|
|
726
|
+
True
|
|
727
|
+
|
|
728
|
+
TESTS::
|
|
729
|
+
|
|
730
|
+
sage: C.<a,b> = S.center() # needs sage.rings.finite_rings
|
|
731
|
+
Traceback (most recent call last):
|
|
732
|
+
...
|
|
733
|
+
IndexError: the number of names must equal the number of generators
|
|
734
|
+
"""
|
|
735
|
+
if name is not None and names is not None:
|
|
736
|
+
raise ValueError("you must specify the name of the variable")
|
|
737
|
+
if names is None:
|
|
738
|
+
if name is None:
|
|
739
|
+
name = self._center_variable_name
|
|
740
|
+
if name is None:
|
|
741
|
+
name = 'z'
|
|
742
|
+
names = (name,)
|
|
743
|
+
names = normalize_names(1, names)
|
|
744
|
+
name = names[0]
|
|
745
|
+
if name in self._center:
|
|
746
|
+
center = self._center[name]
|
|
747
|
+
else:
|
|
748
|
+
center = PolynomialRing(self._constants, names)
|
|
749
|
+
embed = SkewPolynomialCenterInjection(center, self, self._embed_constants, self._order)
|
|
750
|
+
try:
|
|
751
|
+
assert not self.has_coerce_map_from(center)
|
|
752
|
+
self.register_coercion(embed)
|
|
753
|
+
center.register_conversion(embed.section())
|
|
754
|
+
except AssertionError:
|
|
755
|
+
raise ValueError("creation of coercion map fails; consider using another variable name")
|
|
756
|
+
self._center[name] = center
|
|
757
|
+
if default or (self._center_variable_name is None):
|
|
758
|
+
self._center_variable_name = name
|
|
759
|
+
return center
|
|
760
|
+
|
|
761
|
+
|
|
762
|
+
# Special class for skew polynomial over finite fields
|
|
763
|
+
######################################################
|
|
764
|
+
|
|
765
|
+
class SkewPolynomialRing_finite_field(SkewPolynomialRing_finite_order):
|
|
766
|
+
r"""
|
|
767
|
+
A specialized class for skew polynomial rings over finite fields.
|
|
768
|
+
|
|
769
|
+
.. SEEALSO::
|
|
770
|
+
|
|
771
|
+
- :class:`sage.rings.polynomial.skew_polynomial_ring.SkewPolynomialRing`
|
|
772
|
+
- :mod:`sage.rings.polynomial.skew_polynomial_finite_field`
|
|
773
|
+
|
|
774
|
+
.. TODO::
|
|
775
|
+
|
|
776
|
+
Add methods related to center of skew polynomial ring, irreducibility, karatsuba
|
|
777
|
+
multiplication and factorization.
|
|
778
|
+
"""
|
|
779
|
+
def __init__(self, base_ring, morphism, derivation, names, sparse, category=None):
|
|
780
|
+
r"""
|
|
781
|
+
This method is a constructor for a general, dense univariate skew polynomial ring
|
|
782
|
+
over a finite field.
|
|
783
|
+
|
|
784
|
+
INPUT:
|
|
785
|
+
|
|
786
|
+
- ``base_ring`` -- a commutative ring
|
|
787
|
+
|
|
788
|
+
- ``map`` -- an automorphism of the base ring
|
|
789
|
+
|
|
790
|
+
- ``name`` -- string or list of strings representing the name of the variables of ring
|
|
791
|
+
|
|
792
|
+
- ``sparse`` -- boolean (default: ``False``)
|
|
793
|
+
|
|
794
|
+
- ``element_class`` -- class representing the type of element to be used in ring
|
|
795
|
+
|
|
796
|
+
..NOTE::
|
|
797
|
+
|
|
798
|
+
Multivariate and Sparse rings are not implemented.
|
|
799
|
+
|
|
800
|
+
EXAMPLES::
|
|
801
|
+
|
|
802
|
+
sage: k.<t> = GF(5^3) # needs sage.rings.finite_rings
|
|
803
|
+
sage: Frob = k.frobenius_endomorphism() # needs sage.rings.finite_rings
|
|
804
|
+
sage: T.<x> = k['x', Frob]; T # needs sage.rings.finite_rings
|
|
805
|
+
Ore Polynomial Ring in x over Finite Field in t of size 5^3 twisted by t |--> t^5
|
|
806
|
+
"""
|
|
807
|
+
if self.Element is None:
|
|
808
|
+
import sage.rings.polynomial.skew_polynomial_finite_field
|
|
809
|
+
self.Element = sage.rings.polynomial.skew_polynomial_finite_field.SkewPolynomial_finite_field_dense
|
|
810
|
+
SkewPolynomialRing_finite_order.__init__(self, base_ring, morphism, derivation, names, sparse, category)
|
|
811
|
+
self._matrix_retraction = None
|
|
812
|
+
|
|
813
|
+
def _new_retraction_map(self, seed=None):
|
|
814
|
+
r"""
|
|
815
|
+
Create a retraction map from the ring of coefficient
|
|
816
|
+
of this skew polynomial ring to its fixed subfield under
|
|
817
|
+
the twisting morphism
|
|
818
|
+
|
|
819
|
+
This is an internal function used in factorization.
|
|
820
|
+
|
|
821
|
+
INPUT:
|
|
822
|
+
|
|
823
|
+
- ``seed`` -- an element of the base ring or ``None``
|
|
824
|
+
(default: ``None``); it ``None``, a random element
|
|
825
|
+
is picked
|
|
826
|
+
|
|
827
|
+
TESTS::
|
|
828
|
+
|
|
829
|
+
sage: # needs sage.rings.finite_rings
|
|
830
|
+
sage: k.<a> = GF(11^4)
|
|
831
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
832
|
+
sage: S.<x> = k['x', Frob]
|
|
833
|
+
sage: S._new_retraction_map()
|
|
834
|
+
sage: S._matrix_retraction # random
|
|
835
|
+
[ 9 4 10 4]
|
|
836
|
+
|
|
837
|
+
We can specify a seed::
|
|
838
|
+
|
|
839
|
+
sage: # needs sage.rings.finite_rings
|
|
840
|
+
sage: S._new_retraction_map(seed=a)
|
|
841
|
+
sage: S._matrix_retraction
|
|
842
|
+
[ 0 6 3 10]
|
|
843
|
+
sage: S._new_retraction_map(seed=a)
|
|
844
|
+
sage: S._matrix_retraction
|
|
845
|
+
[ 0 6 3 10]
|
|
846
|
+
"""
|
|
847
|
+
k = self.base_ring()
|
|
848
|
+
section = self._embed_constants.section()
|
|
849
|
+
if seed is None:
|
|
850
|
+
seed = k.random_element()
|
|
851
|
+
self._seed_retraction = seed
|
|
852
|
+
trace = [ ]
|
|
853
|
+
elt = seed
|
|
854
|
+
for _ in range(k.degree()):
|
|
855
|
+
x = elt
|
|
856
|
+
tr = elt
|
|
857
|
+
for _ in range(1, self._order):
|
|
858
|
+
x = self._morphism(x)
|
|
859
|
+
tr += x
|
|
860
|
+
elt *= k.gen()
|
|
861
|
+
trace.append(section(tr))
|
|
862
|
+
self._matrix_retraction = MatrixSpace(self._constants, 1, k.degree())(trace)
|
|
863
|
+
|
|
864
|
+
def _retraction(self, x, newmap=False, seed=None):
|
|
865
|
+
r"""
|
|
866
|
+
Return the image of `x` under the retraction map
|
|
867
|
+
(see also :meth:`_new_retraction_map`)
|
|
868
|
+
|
|
869
|
+
This is an internal function used in factorization.
|
|
870
|
+
|
|
871
|
+
INPUT:
|
|
872
|
+
|
|
873
|
+
- ``newmap`` -- boolean (default: ``False``); whether we
|
|
874
|
+
first create and use a new retraction map
|
|
875
|
+
|
|
876
|
+
- ``seed`` -- an element of the base ring or ``None`` (default:
|
|
877
|
+
``None``); if given, first create a new random retraction map
|
|
878
|
+
with given seed
|
|
879
|
+
|
|
880
|
+
TESTS::
|
|
881
|
+
|
|
882
|
+
sage: # needs sage.rings.finite_rings
|
|
883
|
+
sage: k.<a> = GF(11^4)
|
|
884
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
885
|
+
sage: S.<x> = k['x', Frob]
|
|
886
|
+
sage: S._retraction(a) # random
|
|
887
|
+
6
|
|
888
|
+
|
|
889
|
+
Note that a retraction map has been automatically created::
|
|
890
|
+
|
|
891
|
+
sage: S._matrix_retraction # random # needs sage.rings.finite_rings
|
|
892
|
+
[ 0 6 3 10]
|
|
893
|
+
|
|
894
|
+
If we call again the method :meth:`_retraction`,
|
|
895
|
+
the same retraction map is used::
|
|
896
|
+
|
|
897
|
+
sage: S._retraction(a) # random # needs sage.rings.finite_rings
|
|
898
|
+
6
|
|
899
|
+
|
|
900
|
+
We can specify a seed::
|
|
901
|
+
|
|
902
|
+
sage: S._retraction(a^2, seed=a) # random # needs sage.rings.finite_rings
|
|
903
|
+
10
|
|
904
|
+
"""
|
|
905
|
+
# Better to return the retraction map but more difficult
|
|
906
|
+
if newmap or seed is not None or self._matrix_retraction is None:
|
|
907
|
+
self._new_retraction_map()
|
|
908
|
+
return (self._matrix_retraction*self.base_ring()(x)._vector_())[0]
|