passagemath-modules 10.6.31rc3__cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +807 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +6 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgfortran-83c28eba.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-6e109695.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-cda90e79.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7f678fcf.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-82690d50.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-2284e583.so.0.0.0 +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,1093 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.rings.finite_rings
|
|
3
|
+
r"""
|
|
4
|
+
Univariate dense skew polynomials over finite fields
|
|
5
|
+
|
|
6
|
+
This module provides the
|
|
7
|
+
class:`~sage.rings.polynomial.skew_polynomial_finite_field.SkewPolynomial_finite_field_dense`,
|
|
8
|
+
which constructs a single univariate skew polynomial over a finite field
|
|
9
|
+
equipped with the Frobenius endomorphism. Among other things, it implements
|
|
10
|
+
the fast factorization algorithm designed in [CL2017]_.
|
|
11
|
+
|
|
12
|
+
AUTHOR::
|
|
13
|
+
|
|
14
|
+
- Xavier Caruso (2012-06-29): initial version
|
|
15
|
+
|
|
16
|
+
- Arpit Merchant (2016-08-04): improved docstrings, fixed doctests and
|
|
17
|
+
refactored classes and methods
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
# ***************************************************************************
|
|
21
|
+
# Copyright (C) 2012 Xavier Caruso <xavier.caruso@normalesup.org>
|
|
22
|
+
#
|
|
23
|
+
# This program is free software: you can redistribute it and/or modify
|
|
24
|
+
# it under the terms of the GNU General Public License as published by
|
|
25
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
26
|
+
# (at your option) any later version.
|
|
27
|
+
# https://www.gnu.org/licenses/
|
|
28
|
+
#****************************************************************************
|
|
29
|
+
|
|
30
|
+
from sage.structure.element cimport parent
|
|
31
|
+
from sage.rings.integer_ring import ZZ
|
|
32
|
+
from sage.rings.integer cimport Integer
|
|
33
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
34
|
+
from sage.matrix.matrix2 import NotFullRankError
|
|
35
|
+
|
|
36
|
+
from sage.rings.polynomial.polynomial_element cimport Polynomial
|
|
37
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
38
|
+
from sage.rings.polynomial.skew_polynomial_finite_order cimport SkewPolynomial_finite_order_dense
|
|
39
|
+
|
|
40
|
+
from sage.structure.factorization import Factorization
|
|
41
|
+
from sage.misc.mrange import xmrange_iter
|
|
42
|
+
from sage.misc.prandom import sample
|
|
43
|
+
from sage.arith.misc import factorial
|
|
44
|
+
from sage.combinat.q_analogues import q_jordan
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
cdef class SkewPolynomial_finite_field_dense(SkewPolynomial_finite_order_dense):
|
|
48
|
+
cdef inline _reduced_norm_factored(self):
|
|
49
|
+
"""
|
|
50
|
+
Return the reduced norm of this polynomial factorized in the center.
|
|
51
|
+
"""
|
|
52
|
+
if self._norm_factor is None:
|
|
53
|
+
N = self._parent._working_center(self.reduced_norm(var=False))
|
|
54
|
+
self._norm_factor = N.factor()
|
|
55
|
+
return self._norm_factor
|
|
56
|
+
|
|
57
|
+
def is_irreducible(self):
|
|
58
|
+
r"""
|
|
59
|
+
Return ``True`` if this skew polynomial is irreducible.
|
|
60
|
+
|
|
61
|
+
EXAMPLES::
|
|
62
|
+
|
|
63
|
+
sage: k.<t> = GF(5^3)
|
|
64
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
65
|
+
sage: S.<x> = k['x',Frob]
|
|
66
|
+
|
|
67
|
+
sage: a = x^2 + t*x + 1
|
|
68
|
+
sage: a.is_irreducible()
|
|
69
|
+
False
|
|
70
|
+
sage: a.factor()
|
|
71
|
+
(x + 4*t^2 + 4*t + 1) * (x + 3*t + 2)
|
|
72
|
+
|
|
73
|
+
sage: a = x^2 + t*x + t + 1
|
|
74
|
+
sage: a.is_irreducible()
|
|
75
|
+
True
|
|
76
|
+
sage: a.factor()
|
|
77
|
+
x^2 + t*x + t + 1
|
|
78
|
+
|
|
79
|
+
Skew polynomials of degree `1` are of course irreducible::
|
|
80
|
+
|
|
81
|
+
sage: a = x + t
|
|
82
|
+
sage: a.is_irreducible()
|
|
83
|
+
True
|
|
84
|
+
|
|
85
|
+
A random irreducible skew polynomial is irreducible::
|
|
86
|
+
|
|
87
|
+
sage: a = S.random_irreducible(degree=4,monic=True); a # random
|
|
88
|
+
x^4 + (t + 1)*x^3 + (3*t^2 + 2*t + 3)*x^2 + 3*t*x + 3*t
|
|
89
|
+
sage: a.is_irreducible()
|
|
90
|
+
True
|
|
91
|
+
|
|
92
|
+
By convention, constant skew polynomials are not irreducible::
|
|
93
|
+
|
|
94
|
+
sage: S(1).is_irreducible()
|
|
95
|
+
False
|
|
96
|
+
sage: S(0).is_irreducible()
|
|
97
|
+
False
|
|
98
|
+
"""
|
|
99
|
+
if self._norm_factor is not None:
|
|
100
|
+
return len(self._norm_factor) == 1 and self._norm_factor[0][1] == 1
|
|
101
|
+
N = self._parent._working_center(self.reduced_norm(var=False))
|
|
102
|
+
return N.is_irreducible()
|
|
103
|
+
|
|
104
|
+
def type(self, N):
|
|
105
|
+
r"""
|
|
106
|
+
Return the `N`-type of this skew polynomial (see definition below).
|
|
107
|
+
|
|
108
|
+
INPUT:
|
|
109
|
+
|
|
110
|
+
- ``N`` -- an irreducible polynomial in the
|
|
111
|
+
center of the underlying skew polynomial ring
|
|
112
|
+
|
|
113
|
+
.. NOTE::
|
|
114
|
+
|
|
115
|
+
The result is cached.
|
|
116
|
+
|
|
117
|
+
DEFINITION:
|
|
118
|
+
|
|
119
|
+
The `N`-type of a skew polynomial `a` is the Partition
|
|
120
|
+
`(t_0, t_1, t_2, \ldots)` defined by
|
|
121
|
+
|
|
122
|
+
.. MATH::
|
|
123
|
+
|
|
124
|
+
t_0 + \cdots + t_i = \frac{\deg gcd(a,N^i)}{\deg N},
|
|
125
|
+
|
|
126
|
+
where `\deg N` is the degree of `N` considered as an
|
|
127
|
+
element in the center.
|
|
128
|
+
|
|
129
|
+
This notion has an important mathematical interest because
|
|
130
|
+
it corresponds to the Jordan type of the `N`-typical part
|
|
131
|
+
of the associated Galois representation.
|
|
132
|
+
|
|
133
|
+
EXAMPLES::
|
|
134
|
+
|
|
135
|
+
sage: k.<t> = GF(5^3)
|
|
136
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
137
|
+
sage: S.<x> = k['x',Frob]
|
|
138
|
+
sage: Z = S.center(); x3 = Z.gen()
|
|
139
|
+
|
|
140
|
+
sage: a = x^4 + x^3 + (4*t^2 + 4)*x^2 + (t^2 + 2)*x + 4*t^2
|
|
141
|
+
sage: N = x3^2 + x3 + 1
|
|
142
|
+
sage: a.type(N)
|
|
143
|
+
[1]
|
|
144
|
+
sage: N = x3 + 1
|
|
145
|
+
sage: a.type(N)
|
|
146
|
+
[2]
|
|
147
|
+
|
|
148
|
+
sage: a = x^3 + (3*t^2 + 1)*x^2 + (3*t^2 + t + 1)*x + t + 1
|
|
149
|
+
sage: N = x3 + 1
|
|
150
|
+
sage: a.type(N)
|
|
151
|
+
[2, 1]
|
|
152
|
+
|
|
153
|
+
If `N` does not divide the reduced map of `a`, the type
|
|
154
|
+
is empty::
|
|
155
|
+
|
|
156
|
+
sage: N = x3 + 2
|
|
157
|
+
sage: a.type(N)
|
|
158
|
+
[]
|
|
159
|
+
|
|
160
|
+
If `a = N`, the type is just `[r]` where `r` is the order
|
|
161
|
+
of the twisting morphism ``Frob``::
|
|
162
|
+
|
|
163
|
+
sage: N = x3^2 + x3 + 1
|
|
164
|
+
sage: S(N).type(N)
|
|
165
|
+
[3]
|
|
166
|
+
|
|
167
|
+
`N` must be irreducible::
|
|
168
|
+
|
|
169
|
+
sage: N = (x3 + 1) * (x3 + 2)
|
|
170
|
+
sage: a.type(N)
|
|
171
|
+
Traceback (most recent call last):
|
|
172
|
+
...
|
|
173
|
+
ValueError: N is not irreducible
|
|
174
|
+
"""
|
|
175
|
+
cdef SkewPolynomial_finite_field_dense P, d, NS
|
|
176
|
+
cdef Py_ssize_t deg, degN, m
|
|
177
|
+
cdef list type
|
|
178
|
+
skew_ring = self._parent
|
|
179
|
+
if parent(N) is not skew_ring._working_center:
|
|
180
|
+
N = skew_ring._working_center(N)
|
|
181
|
+
if self._types is None:
|
|
182
|
+
self._types = dict()
|
|
183
|
+
elif N in self._types:
|
|
184
|
+
return self._types[N]
|
|
185
|
+
if not N.is_irreducible():
|
|
186
|
+
raise ValueError("N is not irreducible")
|
|
187
|
+
if self._norm_factor is None:
|
|
188
|
+
m = -1
|
|
189
|
+
else:
|
|
190
|
+
for n, m in self._norm_factor:
|
|
191
|
+
if n == N:
|
|
192
|
+
break
|
|
193
|
+
NS = skew_ring(N)
|
|
194
|
+
type = [ ]
|
|
195
|
+
degN = N.degree()
|
|
196
|
+
P = self
|
|
197
|
+
d = P.right_gcd(NS)
|
|
198
|
+
deg = d.degree() // degN
|
|
199
|
+
while deg > 0:
|
|
200
|
+
if m >= 0:
|
|
201
|
+
if deg == 1:
|
|
202
|
+
type += m * [1]
|
|
203
|
+
break
|
|
204
|
+
m -= deg
|
|
205
|
+
P = P // d
|
|
206
|
+
type.append(deg)
|
|
207
|
+
d = P.right_gcd(NS)
|
|
208
|
+
deg = d.degree() // degN
|
|
209
|
+
self._types[N] = type
|
|
210
|
+
return type
|
|
211
|
+
|
|
212
|
+
# Finding divisors
|
|
213
|
+
# ----------------
|
|
214
|
+
|
|
215
|
+
cdef SkewPolynomial_finite_field_dense _rdivisor_c(self, N):
|
|
216
|
+
r"""
|
|
217
|
+
Return a right divisor of this skew polynomial whose
|
|
218
|
+
reduced norm is `N`.
|
|
219
|
+
|
|
220
|
+
.. WARNING::
|
|
221
|
+
|
|
222
|
+
`N` needs to be an irreducible factor of the
|
|
223
|
+
reduced norm. This function does not check
|
|
224
|
+
this (and his behaviour is not defined if the
|
|
225
|
+
require property doesn't hold).
|
|
226
|
+
"""
|
|
227
|
+
cdef skew_ring = self._parent
|
|
228
|
+
cdef SkewPolynomial_finite_field_dense NS = <SkewPolynomial_finite_field_dense>skew_ring(N)
|
|
229
|
+
cdef SkewPolynomial_finite_field_dense P = self.right_gcd(NS)
|
|
230
|
+
cdef Py_ssize_t d = N.degree()
|
|
231
|
+
cdef Py_ssize_t e = P.degree() // d
|
|
232
|
+
if e == 1:
|
|
233
|
+
return P.right_monic()
|
|
234
|
+
|
|
235
|
+
cdef SkewPolynomial_finite_field_dense D
|
|
236
|
+
cdef SkewPolynomial_finite_field_dense Q = <SkewPolynomial_finite_field_dense>(NS // P)
|
|
237
|
+
cdef SkewPolynomial_finite_field_dense R, X
|
|
238
|
+
cdef Py_ssize_t i, j, t, r = skew_ring._order
|
|
239
|
+
cdef Polynomial dd, xx, yy, zz
|
|
240
|
+
cdef Integer exp
|
|
241
|
+
cdef list lM
|
|
242
|
+
cdef bint char2
|
|
243
|
+
|
|
244
|
+
center = parent(N)
|
|
245
|
+
E = center.quo(N)
|
|
246
|
+
PE = PolynomialRing(E, name='T')
|
|
247
|
+
char2 = skew_ring.characteristic() != 2
|
|
248
|
+
if not char2:
|
|
249
|
+
exp = <Integer>((E.cardinality()-1) // 2)
|
|
250
|
+
while True:
|
|
251
|
+
R = <SkewPolynomial_finite_field_dense>skew_ring.random_element((e*r-1, e*r-1))
|
|
252
|
+
R = Q*R
|
|
253
|
+
X = <SkewPolynomial_finite_field_dense>Q._new_c(list(Q._coeffs), Q._parent)
|
|
254
|
+
lM = [ None ] * (e**2)
|
|
255
|
+
for j in range(e):
|
|
256
|
+
for i in range(e):
|
|
257
|
+
coeffs = [skew_ring._retraction(X[t*r+i]) for t in range(d)]
|
|
258
|
+
value = E(coeffs)
|
|
259
|
+
lM[i*e+j] = value
|
|
260
|
+
X = (R*X) % NS
|
|
261
|
+
M = MatrixSpace(E,e,e)(lM)
|
|
262
|
+
V = MatrixSpace(E,e,1)([ E([skew_ring._retraction(X[t*r+i]) for t in range(d)]) for i in range(e) ])
|
|
263
|
+
try:
|
|
264
|
+
W = M._solve_right_nonsingular_square(V)
|
|
265
|
+
except NotFullRankError:
|
|
266
|
+
skew_ring._new_retraction_map()
|
|
267
|
+
continue
|
|
268
|
+
xx = PE(<list>W.list() + [E(-1)])
|
|
269
|
+
if char2:
|
|
270
|
+
zz = yy = PE.gen()
|
|
271
|
+
for i in range(1,d):
|
|
272
|
+
zz = (zz*zz) % xx
|
|
273
|
+
yy += zz
|
|
274
|
+
dd = xx.gcd(yy)
|
|
275
|
+
if dd.degree() != 1:
|
|
276
|
+
continue
|
|
277
|
+
else:
|
|
278
|
+
yy = PE.gen().__pow__(exp,xx) - 1
|
|
279
|
+
dd = xx.gcd(yy)
|
|
280
|
+
if dd.degree() != 1:
|
|
281
|
+
yy += 2
|
|
282
|
+
dd = xx.gcd(yy)
|
|
283
|
+
if dd.degree() != 1:
|
|
284
|
+
continue
|
|
285
|
+
D = P.right_gcd(R + skew_ring(center((dd[0]/dd[1]).list())))
|
|
286
|
+
if D.degree() == 0:
|
|
287
|
+
continue
|
|
288
|
+
return D
|
|
289
|
+
|
|
290
|
+
def _reduced_norm_factor_uniform(self):
|
|
291
|
+
r"""
|
|
292
|
+
Return a factor of the reduced norm of this skew
|
|
293
|
+
polynomial, the probability of a given factor to
|
|
294
|
+
show up being proportional to the number of irreducible
|
|
295
|
+
divisors of ``self`` having this norm.
|
|
296
|
+
|
|
297
|
+
This method is an helper function; it is not supposed
|
|
298
|
+
to be called directly.
|
|
299
|
+
|
|
300
|
+
EXAMPLES::
|
|
301
|
+
|
|
302
|
+
sage: k.<a> = GF(5^3)
|
|
303
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
304
|
+
sage: S.<x> = k['x', Frob]
|
|
305
|
+
sage: Z.<z> = S.center()
|
|
306
|
+
|
|
307
|
+
In the two examples below, the reduced norms of `P` and `Q`
|
|
308
|
+
have a unique factor::
|
|
309
|
+
|
|
310
|
+
sage: P = x + a
|
|
311
|
+
sage: P.reduced_norm().factor()
|
|
312
|
+
z + 2
|
|
313
|
+
sage: P._reduced_norm_factor_uniform()
|
|
314
|
+
z + 2
|
|
315
|
+
|
|
316
|
+
sage: Q = x^3 + 1
|
|
317
|
+
sage: Q.reduced_norm().factor()
|
|
318
|
+
(z + 1)^3
|
|
319
|
+
sage: Q._reduced_norm_factor_uniform()
|
|
320
|
+
z + 1
|
|
321
|
+
|
|
322
|
+
Now, we consider the product `R = P \cdot Q`; it admits `32`
|
|
323
|
+
irreducible divisors but among them, only one has norm `z + 2`,
|
|
324
|
+
the others having norm `z + 1`.
|
|
325
|
+
Therefore this method outputs `z + 2` with probability `1 / 32`
|
|
326
|
+
and `z + 1` with probability `31 / 32`::
|
|
327
|
+
|
|
328
|
+
sage: R = P*Q
|
|
329
|
+
sage: counts = { z+1: 0, z+2: 0 }
|
|
330
|
+
sage: for _ in range(1000):
|
|
331
|
+
....: N = R._reduced_norm_factor_uniform()
|
|
332
|
+
....: counts[N] += 1
|
|
333
|
+
sage: counts # random
|
|
334
|
+
{z + 1: 969, z + 2: 31}
|
|
335
|
+
"""
|
|
336
|
+
skew_ring = self._parent
|
|
337
|
+
F = self._reduced_norm_factored()
|
|
338
|
+
center = F[0][0].parent()
|
|
339
|
+
cardcenter = center.base_ring().cardinality()
|
|
340
|
+
gencenter = center.gen()
|
|
341
|
+
count = [ ]
|
|
342
|
+
total = 0
|
|
343
|
+
for n, _ in F:
|
|
344
|
+
if n == gencenter:
|
|
345
|
+
total += 1
|
|
346
|
+
else:
|
|
347
|
+
degn = n.degree()
|
|
348
|
+
P = self.right_gcd(skew_ring(n))
|
|
349
|
+
m = P.degree() // degn
|
|
350
|
+
cardL = cardcenter**degn
|
|
351
|
+
total += (cardL**m - 1) / (cardL - 1)
|
|
352
|
+
count.append(total)
|
|
353
|
+
random = ZZ.random_element(total)
|
|
354
|
+
for i in range(len(F)):
|
|
355
|
+
if random < count[i]:
|
|
356
|
+
return F[i][0]
|
|
357
|
+
|
|
358
|
+
def _irreducible_divisors(self, bint right):
|
|
359
|
+
r"""
|
|
360
|
+
Return an iterator over all irreducible monic
|
|
361
|
+
divisors of this skew polynomial.
|
|
362
|
+
|
|
363
|
+
Do not use this function. Use instead
|
|
364
|
+
:meth:`right_irreducible_divisors` and
|
|
365
|
+
:meth:`left_irreducible_divisors`.
|
|
366
|
+
|
|
367
|
+
INPUT:
|
|
368
|
+
|
|
369
|
+
- ``right`` -- boolean; if ``True``, return right divisors,
|
|
370
|
+
otherwise, return left divisors
|
|
371
|
+
|
|
372
|
+
TESTS::
|
|
373
|
+
|
|
374
|
+
sage: k.<a> = GF(7^4)
|
|
375
|
+
sage: Frob = k.frobenius_endomorphism(2)
|
|
376
|
+
sage: S.<x> = k['x', Frob]
|
|
377
|
+
|
|
378
|
+
sage: P = S.random_element(degree=10)
|
|
379
|
+
sage: rightdiv = [ f for f in P.right_irreducible_divisors() ] # indirect doctest
|
|
380
|
+
sage: len(rightdiv) == P.count_irreducible_divisors()
|
|
381
|
+
True
|
|
382
|
+
sage: len(rightdiv) == Set(rightdiv).cardinality() # check no duplicates
|
|
383
|
+
True
|
|
384
|
+
sage: for D in rightdiv:
|
|
385
|
+
....: assert P.is_right_divisible_by(D), "not right divisible"
|
|
386
|
+
....: assert D.is_irreducible(), "not irreducible"
|
|
387
|
+
|
|
388
|
+
sage: P = S.random_element(degree=10)
|
|
389
|
+
sage: leftdiv = [ f for f in P.left_irreducible_divisors() ] # indirect doctest
|
|
390
|
+
sage: len(leftdiv) == P.count_irreducible_divisors()
|
|
391
|
+
True
|
|
392
|
+
sage: len(leftdiv) == Set(leftdiv).cardinality() # check no duplicates
|
|
393
|
+
True
|
|
394
|
+
sage: for D in leftdiv:
|
|
395
|
+
....: assert P.is_left_divisible_by(D), "not left divisible"
|
|
396
|
+
....: assert D.is_irreducible(), "not irreducible"
|
|
397
|
+
"""
|
|
398
|
+
cdef SkewPolynomial_finite_field_dense NS, P, Q, R, P1, Q1, L, V, g, d
|
|
399
|
+
cdef Py_ssize_t i, m, degrandom
|
|
400
|
+
if not self:
|
|
401
|
+
return
|
|
402
|
+
if right:
|
|
403
|
+
quo_rem = SkewPolynomial_finite_field_dense.right_quo_rem
|
|
404
|
+
quo_rem2 = SkewPolynomial_finite_field_dense.left_quo_rem
|
|
405
|
+
gcd = SkewPolynomial_finite_field_dense.right_gcd
|
|
406
|
+
gcd2 = SkewPolynomial_finite_field_dense.left_gcd
|
|
407
|
+
mul = SkewPolynomial_finite_field_dense.__mul__ # why _mul_ doesn't work?
|
|
408
|
+
else:
|
|
409
|
+
quo_rem = SkewPolynomial_finite_field_dense.left_quo_rem
|
|
410
|
+
quo_rem2 = SkewPolynomial_finite_field_dense.right_quo_rem
|
|
411
|
+
gcd = SkewPolynomial_finite_field_dense.left_gcd
|
|
412
|
+
gcd2 = SkewPolynomial_finite_field_dense.right_gcd
|
|
413
|
+
mul = mul_op
|
|
414
|
+
skew_ring = self._parent
|
|
415
|
+
center = skew_ring._working_center
|
|
416
|
+
kfixed = center.base_ring()
|
|
417
|
+
F = self._reduced_norm_factored()
|
|
418
|
+
for N, _ in F:
|
|
419
|
+
if N == center.gen():
|
|
420
|
+
yield skew_ring.gen()
|
|
421
|
+
continue
|
|
422
|
+
degN = N.degree()
|
|
423
|
+
NS = skew_ring(N)
|
|
424
|
+
P = gcd(self, NS)
|
|
425
|
+
m = P.degree()/degN
|
|
426
|
+
if m == 1:
|
|
427
|
+
yield P
|
|
428
|
+
continue
|
|
429
|
+
Q,_ = quo_rem(NS, P)
|
|
430
|
+
if right:
|
|
431
|
+
P1 = self._rdivisor_c(N)
|
|
432
|
+
else:
|
|
433
|
+
D = self._rdivisor_c(N)
|
|
434
|
+
degrandom = NS.degree() - 1
|
|
435
|
+
while True:
|
|
436
|
+
P1 = P // P.right_gcd(NS // D)
|
|
437
|
+
if P1.degree() == degN:
|
|
438
|
+
break
|
|
439
|
+
while True:
|
|
440
|
+
R = skew_ring.random_element((degrandom,degrandom))
|
|
441
|
+
if NS.right_gcd(R) == 1:
|
|
442
|
+
break
|
|
443
|
+
D = NS.right_gcd(D*R)
|
|
444
|
+
Q1,_ = quo_rem(P, P1)
|
|
445
|
+
degrandom = P.degree() - 1
|
|
446
|
+
while True:
|
|
447
|
+
R = skew_ring.random_element((degrandom, degrandom))
|
|
448
|
+
_, g = quo_rem2(mul(R,Q), P)
|
|
449
|
+
if gcd2(g,P) != 1:
|
|
450
|
+
continue
|
|
451
|
+
L = Q1
|
|
452
|
+
V = L
|
|
453
|
+
for i in range(1,m):
|
|
454
|
+
L = gcd2(mul(g,L), P)
|
|
455
|
+
V = gcd2(V,L)
|
|
456
|
+
if V == 1:
|
|
457
|
+
break
|
|
458
|
+
rng = xmrange_iter([kfixed]*degN, center)
|
|
459
|
+
for i in range(m):
|
|
460
|
+
for pol in xmrange_iter([rng]*i):
|
|
461
|
+
f = skew_ring.one()
|
|
462
|
+
for j in range(i):
|
|
463
|
+
coeff = pol.pop()
|
|
464
|
+
_, f = quo_rem2(g*f + coeff, P)
|
|
465
|
+
d = gcd2(mul(f,Q1), P)
|
|
466
|
+
d, _ = quo_rem2(P, d)
|
|
467
|
+
yield d
|
|
468
|
+
|
|
469
|
+
def right_irreducible_divisor(self, uniform=False):
|
|
470
|
+
r"""
|
|
471
|
+
Return a right irreducible divisor of this skew polynomial.
|
|
472
|
+
|
|
473
|
+
INPUT:
|
|
474
|
+
|
|
475
|
+
- ``uniform`` -- boolean (default: ``False``); whether the
|
|
476
|
+
output irreducible divisor should be uniformly distributed
|
|
477
|
+
among all possibilities
|
|
478
|
+
|
|
479
|
+
EXAMPLES::
|
|
480
|
+
|
|
481
|
+
sage: k.<t> = GF(5^3)
|
|
482
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
483
|
+
sage: S.<x> = k['x',Frob]
|
|
484
|
+
sage: a = x^6 + 3*t*x^5 + (3*t + 1)*x^3 + (4*t^2 + 3*t + 4)*x^2 + (t^2 + 2)*x + 4*t^2 + 3*t + 3
|
|
485
|
+
|
|
486
|
+
sage: dr = a.right_irreducible_divisor(); dr # random
|
|
487
|
+
x^3 + (2*t^2 + t + 4)*x^2 + (4*t + 1)*x + 4*t^2 + t + 1
|
|
488
|
+
sage: a.is_right_divisible_by(dr)
|
|
489
|
+
True
|
|
490
|
+
|
|
491
|
+
Right divisors are cached. Hence, if we ask again for a
|
|
492
|
+
right divisor, we will get the same answer::
|
|
493
|
+
|
|
494
|
+
sage: a.right_irreducible_divisor() # random
|
|
495
|
+
x^3 + (2*t^2 + t + 4)*x^2 + (4*t + 1)*x + 4*t^2 + t + 1
|
|
496
|
+
|
|
497
|
+
However the algorithm is probabilistic. Hence, if we first
|
|
498
|
+
reinitialize `a`, we may get a different answer::
|
|
499
|
+
|
|
500
|
+
sage: a = x^6 + 3*t*x^5 + (3*t + 1)*x^3 + (4*t^2 + 3*t + 4)*x^2 + (t^2 + 2)*x + 4*t^2 + 3*t + 3
|
|
501
|
+
sage: a.right_irreducible_divisor() # random
|
|
502
|
+
x^3 + (t^2 + 3*t + 4)*x^2 + (t + 2)*x + 4*t^2 + t + 1
|
|
503
|
+
|
|
504
|
+
We can also generate uniformly distributed irreducible monic
|
|
505
|
+
divisors as follows::
|
|
506
|
+
|
|
507
|
+
sage: a.right_irreducible_divisor(uniform=True) # random
|
|
508
|
+
x^3 + (4*t + 2)*x^2 + (2*t^2 + 2*t + 2)*x + 2*t^2 + 2
|
|
509
|
+
sage: a.right_irreducible_divisor(uniform=True) # random
|
|
510
|
+
x^3 + (t^2 + 2)*x^2 + (3*t^2 + 1)*x + 4*t^2 + 2*t
|
|
511
|
+
sage: a.right_irreducible_divisor(uniform=True) # random
|
|
512
|
+
x^3 + x^2 + (4*t^2 + 2*t + 4)*x + t^2 + 3
|
|
513
|
+
|
|
514
|
+
By convention, the zero skew polynomial has no irreducible
|
|
515
|
+
divisor::
|
|
516
|
+
|
|
517
|
+
sage: S(0).right_irreducible_divisor()
|
|
518
|
+
Traceback (most recent call last):
|
|
519
|
+
...
|
|
520
|
+
ValueError: 0 has no irreducible divisor
|
|
521
|
+
"""
|
|
522
|
+
if self.is_zero():
|
|
523
|
+
raise ValueError("0 has no irreducible divisor")
|
|
524
|
+
skew_ring = self._parent
|
|
525
|
+
if uniform:
|
|
526
|
+
N = self._reduced_norm_factor_uniform()
|
|
527
|
+
else:
|
|
528
|
+
N = self._reduced_norm_factored()[0][0]
|
|
529
|
+
NS = skew_ring(N)
|
|
530
|
+
degN = N.degree()
|
|
531
|
+
D = self._rdivisor_c(N)
|
|
532
|
+
if uniform:
|
|
533
|
+
P1 = self.right_gcd(NS)
|
|
534
|
+
if P1.degree() != degN:
|
|
535
|
+
Q1 = NS // P1
|
|
536
|
+
deg = P1.degree() - 1
|
|
537
|
+
while True:
|
|
538
|
+
R = Q1 * skew_ring.random_element((deg,deg))
|
|
539
|
+
if P1.right_gcd(R) == 1:
|
|
540
|
+
break
|
|
541
|
+
D = P1.right_gcd(D*R)
|
|
542
|
+
return D
|
|
543
|
+
|
|
544
|
+
def left_irreducible_divisor(self, uniform=False):
|
|
545
|
+
r"""
|
|
546
|
+
Return a left irreducible divisor of this skew polynomial.
|
|
547
|
+
|
|
548
|
+
INPUT:
|
|
549
|
+
|
|
550
|
+
- ``uniform`` -- boolean (default: ``False``); whether the
|
|
551
|
+
output irreducible divisor should be uniformly distributed
|
|
552
|
+
among all possibilities
|
|
553
|
+
|
|
554
|
+
EXAMPLES::
|
|
555
|
+
|
|
556
|
+
sage: k.<t> = GF(5^3)
|
|
557
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
558
|
+
sage: S.<x> = k['x',Frob]
|
|
559
|
+
sage: a = x^6 + 3*t*x^5 + (3*t + 1)*x^3 + (4*t^2 + 3*t + 4)*x^2 + (t^2 + 2)*x + 4*t^2 + 3*t + 3
|
|
560
|
+
sage: dl = a.left_irreducible_divisor(); dl # random
|
|
561
|
+
x^3 + (t^2 + t + 2)*x^2 + (t + 2)*x + 3*t^2 + t + 4
|
|
562
|
+
sage: a.is_left_divisible_by(dl)
|
|
563
|
+
True
|
|
564
|
+
|
|
565
|
+
The algorithm is probabilistic. Hence, if we ask again for
|
|
566
|
+
a left irreducible divisor of `a`, we may get a different
|
|
567
|
+
answer::
|
|
568
|
+
|
|
569
|
+
sage: a.left_irreducible_divisor() # random
|
|
570
|
+
x^3 + (4*t + 3)*x^2 + (2*t^2 + 3*t + 4)*x + 4*t^2 + 2*t
|
|
571
|
+
|
|
572
|
+
We can also generate uniformly distributed irreducible monic
|
|
573
|
+
divisors as follows::
|
|
574
|
+
|
|
575
|
+
sage: a.left_irreducible_divisor(uniform=True) # random
|
|
576
|
+
x^3 + (4*t^2 + 3*t + 4)*x^2 + (t^2 + t + 3)*x + 2*t^2 + 3
|
|
577
|
+
sage: a.left_irreducible_divisor(uniform=True) # random
|
|
578
|
+
x^3 + (2*t^2 + t + 4)*x^2 + (2*t^2 + 4*t + 4)*x + 2*t + 3
|
|
579
|
+
sage: a.left_irreducible_divisor(uniform=True) # random
|
|
580
|
+
x^3 + (t^2 + t + 2)*x^2 + (3*t^2 + t)*x + 2*t + 1
|
|
581
|
+
|
|
582
|
+
By convention, the zero skew polynomial has no irreducible
|
|
583
|
+
divisor::
|
|
584
|
+
|
|
585
|
+
sage: S(0).left_irreducible_divisor()
|
|
586
|
+
Traceback (most recent call last):
|
|
587
|
+
...
|
|
588
|
+
ValueError: 0 has no irreducible divisor
|
|
589
|
+
"""
|
|
590
|
+
if self.is_zero():
|
|
591
|
+
raise ValueError("0 has no irreducible divisor")
|
|
592
|
+
if uniform:
|
|
593
|
+
N = self._reduced_norm_factor_uniform()
|
|
594
|
+
else:
|
|
595
|
+
N = self._reduced_norm_factored()[0][0]
|
|
596
|
+
skew_ring = self._parent
|
|
597
|
+
NS = skew_ring(N)
|
|
598
|
+
degN = N.degree()
|
|
599
|
+
D = self._rdivisor_c(N)
|
|
600
|
+
deg = NS.degree() - 1
|
|
601
|
+
P1 = self.left_gcd(NS)
|
|
602
|
+
if not uniform:
|
|
603
|
+
LD = P1 // P1.right_gcd(NS // D)
|
|
604
|
+
if LD.degree() == degN:
|
|
605
|
+
return LD
|
|
606
|
+
while True:
|
|
607
|
+
while True:
|
|
608
|
+
R = skew_ring.random_element((deg,deg))
|
|
609
|
+
if NS.right_gcd(R) == 1:
|
|
610
|
+
break
|
|
611
|
+
D = NS.right_gcd(D*R)
|
|
612
|
+
LD = P1 // P1.right_gcd(NS // D)
|
|
613
|
+
if LD.degree() == degN:
|
|
614
|
+
return LD
|
|
615
|
+
|
|
616
|
+
def right_irreducible_divisors(self):
|
|
617
|
+
r"""
|
|
618
|
+
Return an iterator over all irreducible monic right divisors
|
|
619
|
+
of this skew polynomial.
|
|
620
|
+
|
|
621
|
+
EXAMPLES::
|
|
622
|
+
|
|
623
|
+
sage: k.<t> = GF(5^3)
|
|
624
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
625
|
+
sage: S.<x> = k['x',Frob]
|
|
626
|
+
sage: a = x^4 + 2*t*x^3 + 3*t^2*x^2 + (t^2 + t + 1)*x + 4*t + 3
|
|
627
|
+
sage: iter = a.right_irreducible_divisors(); iter
|
|
628
|
+
<...generator object at 0x...>
|
|
629
|
+
sage: next(iter) # random
|
|
630
|
+
x + 2*t^2 + 4*t + 4
|
|
631
|
+
sage: next(iter) # random
|
|
632
|
+
x + 3*t^2 + 4*t + 1
|
|
633
|
+
|
|
634
|
+
We can use this function to build the list of all monic
|
|
635
|
+
irreducible divisors of `a`::
|
|
636
|
+
|
|
637
|
+
sage: rightdiv = [ d for d in a.right_irreducible_divisors() ]
|
|
638
|
+
|
|
639
|
+
Note that the algorithm is probabilistic. As a consequence, if we
|
|
640
|
+
build again the list of right monic irreducible divisors of `a`, we
|
|
641
|
+
may get a different ordering::
|
|
642
|
+
|
|
643
|
+
sage: rightdiv2 = [ d for d in a.right_irreducible_divisors() ]
|
|
644
|
+
sage: rightdiv == rightdiv2
|
|
645
|
+
False
|
|
646
|
+
sage: Set(rightdiv) == Set(rightdiv2)
|
|
647
|
+
True
|
|
648
|
+
"""
|
|
649
|
+
return self._irreducible_divisors(True)
|
|
650
|
+
|
|
651
|
+
def left_irreducible_divisors(self):
|
|
652
|
+
r"""
|
|
653
|
+
Return an iterator over all irreducible monic left divisors
|
|
654
|
+
of this skew polynomial.
|
|
655
|
+
|
|
656
|
+
EXAMPLES::
|
|
657
|
+
|
|
658
|
+
sage: k.<t> = GF(5^3)
|
|
659
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
660
|
+
sage: S.<x> = k['x',Frob]
|
|
661
|
+
sage: a = x^4 + 2*t*x^3 + 3*t^2*x^2 + (t^2 + t + 1)*x + 4*t + 3
|
|
662
|
+
sage: iter = a.left_irreducible_divisors(); iter
|
|
663
|
+
<...generator object at 0x...>
|
|
664
|
+
sage: next(iter) # random
|
|
665
|
+
x + 3*t + 3
|
|
666
|
+
sage: next(iter) # random
|
|
667
|
+
x + 4*t + 2
|
|
668
|
+
|
|
669
|
+
We can use this function to build the list of all monic
|
|
670
|
+
irreducible divisors of `a`::
|
|
671
|
+
|
|
672
|
+
sage: leftdiv = [ d for d in a.left_irreducible_divisors() ]
|
|
673
|
+
|
|
674
|
+
Note that the algorithm is probabilistic. As a consequence, if we
|
|
675
|
+
build again the list of left monic irreducible divisors of `a`, we
|
|
676
|
+
may get a different ordering::
|
|
677
|
+
|
|
678
|
+
sage: leftdiv2 = [ d for d in a.left_irreducible_divisors() ]
|
|
679
|
+
sage: Set(leftdiv) == Set(leftdiv2)
|
|
680
|
+
True
|
|
681
|
+
"""
|
|
682
|
+
return self._irreducible_divisors(False)
|
|
683
|
+
|
|
684
|
+
def count_irreducible_divisors(self):
|
|
685
|
+
r"""
|
|
686
|
+
Return the number of irreducible monic divisors of
|
|
687
|
+
this skew polynomial.
|
|
688
|
+
|
|
689
|
+
.. NOTE::
|
|
690
|
+
|
|
691
|
+
One can prove that there are always as many left
|
|
692
|
+
irreducible monic divisors as right irreducible
|
|
693
|
+
monic divisors.
|
|
694
|
+
|
|
695
|
+
EXAMPLES::
|
|
696
|
+
|
|
697
|
+
sage: k.<t> = GF(5^3)
|
|
698
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
699
|
+
sage: S.<x> = k['x',Frob]
|
|
700
|
+
|
|
701
|
+
We illustrate that a skew polynomial may have a number of irreducible
|
|
702
|
+
divisors greater than its degree::
|
|
703
|
+
|
|
704
|
+
sage: a = x^4 + (4*t + 3)*x^3 + t^2*x^2 + (4*t^2 + 3*t)*x + 3*t
|
|
705
|
+
sage: a.count_irreducible_divisors()
|
|
706
|
+
12
|
|
707
|
+
|
|
708
|
+
We illustrate that an irreducible polynomial in the center have
|
|
709
|
+
in general a lot of irreducible divisors in the skew polynomial
|
|
710
|
+
ring::
|
|
711
|
+
|
|
712
|
+
sage: Z.<x3> = S.center()
|
|
713
|
+
sage: N = x3^5 + 4*x3^4 + 4*x3^2 + 4*x3 + 3; N
|
|
714
|
+
x3^5 + 4*x3^4 + 4*x3^2 + 4*x3 + 3
|
|
715
|
+
sage: N.is_irreducible()
|
|
716
|
+
True
|
|
717
|
+
sage: S(N).count_irreducible_divisors()
|
|
718
|
+
9768751
|
|
719
|
+
"""
|
|
720
|
+
if self.is_zero():
|
|
721
|
+
return 0
|
|
722
|
+
skew_ring = self.parent()
|
|
723
|
+
cardcenter = skew_ring._working_center.base_ring().cardinality()
|
|
724
|
+
gencenter = skew_ring._working_center.gen()
|
|
725
|
+
F = self._reduced_norm_factored()
|
|
726
|
+
val = self.valuation()
|
|
727
|
+
self >>= val
|
|
728
|
+
count = 0
|
|
729
|
+
if val > 0:
|
|
730
|
+
count = 1
|
|
731
|
+
for N,_ in F:
|
|
732
|
+
if N == gencenter:
|
|
733
|
+
continue
|
|
734
|
+
degN = N.degree()
|
|
735
|
+
P = self.right_gcd(skew_ring(N))
|
|
736
|
+
m = P.degree() // degN
|
|
737
|
+
cardL = cardcenter**degN
|
|
738
|
+
count += (cardL**m - 1) // (cardL - 1)
|
|
739
|
+
return count
|
|
740
|
+
|
|
741
|
+
# Finding factorizations
|
|
742
|
+
# ----------------------
|
|
743
|
+
|
|
744
|
+
cdef _factor_c(self):
|
|
745
|
+
r"""
|
|
746
|
+
Compute a factorization of ``self``.
|
|
747
|
+
|
|
748
|
+
This is the low level implementation of :meth:`factor`.
|
|
749
|
+
"""
|
|
750
|
+
cdef skew_ring = self._parent
|
|
751
|
+
cdef SkewPolynomial_finite_field_dense poly = self.right_monic()
|
|
752
|
+
cdef list a = poly._coeffs
|
|
753
|
+
cdef Py_ssize_t val = 0
|
|
754
|
+
while not a[0]:
|
|
755
|
+
del a[0]
|
|
756
|
+
val += 1
|
|
757
|
+
|
|
758
|
+
cdef Py_ssize_t degrandom, m, mP, i
|
|
759
|
+
cdef N
|
|
760
|
+
cdef list factors = [ (skew_ring.gen(), val) ]
|
|
761
|
+
cdef SkewPolynomial_finite_field_dense P, Q, P1, NS, g, right, Pn
|
|
762
|
+
cdef unit = self.leading_coefficient()
|
|
763
|
+
cdef Polynomial gencenter = skew_ring._working_center.gen()
|
|
764
|
+
cdef F = self._reduced_norm_factored()
|
|
765
|
+
|
|
766
|
+
for N, m in F:
|
|
767
|
+
if N == gencenter:
|
|
768
|
+
continue
|
|
769
|
+
degN = N.degree()
|
|
770
|
+
if poly.degree() == degN:
|
|
771
|
+
factors.append((poly, 1))
|
|
772
|
+
break
|
|
773
|
+
NS = <SkewPolynomial_finite_field_dense>skew_ring(N)
|
|
774
|
+
P1 = None
|
|
775
|
+
while True:
|
|
776
|
+
P = <SkewPolynomial_finite_field_dense>poly.right_gcd(NS)
|
|
777
|
+
mP = P.degree() / degN
|
|
778
|
+
if mP == 0: break
|
|
779
|
+
if mP == 1:
|
|
780
|
+
factors.append((P, 1))
|
|
781
|
+
poly = poly // P
|
|
782
|
+
for i in range(1, m):
|
|
783
|
+
if poly.degree() == degN:
|
|
784
|
+
factors.append((poly,1))
|
|
785
|
+
break
|
|
786
|
+
P = poly.right_gcd(NS)
|
|
787
|
+
factors.append((P, 1))
|
|
788
|
+
poly = poly // P
|
|
789
|
+
break
|
|
790
|
+
if P1 is None:
|
|
791
|
+
P1 = P._rdivisor_c(N)
|
|
792
|
+
Q = <SkewPolynomial_finite_field_dense>NS._new_c(NS._coeffs[:], NS._parent)
|
|
793
|
+
Q = P1 * (Q // P)
|
|
794
|
+
factors.append((P1, 1))
|
|
795
|
+
right = <SkewPolynomial_finite_field_dense>P1._new_c(P1._coeffs[:], P1._parent)
|
|
796
|
+
m -= (mP-1)
|
|
797
|
+
degrandom = P.degree()
|
|
798
|
+
while mP > 2:
|
|
799
|
+
while True:
|
|
800
|
+
g = <SkewPolynomial_finite_field_dense>skew_ring.random_element((degrandom, degrandom))
|
|
801
|
+
g = (Q*g).right_gcd(P)
|
|
802
|
+
Pn = right._left_lcm_cofactor(g)
|
|
803
|
+
if Pn.degree() == degN: break
|
|
804
|
+
Pn = Pn.right_monic()
|
|
805
|
+
factors.append((Pn, 1))
|
|
806
|
+
right = Pn * right
|
|
807
|
+
degrandom -= degN
|
|
808
|
+
mP -= 1
|
|
809
|
+
poly = poly // right
|
|
810
|
+
P1, _ = P.right_quo_rem(right)
|
|
811
|
+
factors.reverse()
|
|
812
|
+
return Factorization(factors, sort=False, unit=unit)
|
|
813
|
+
|
|
814
|
+
cdef _factor_uniform_c(self):
|
|
815
|
+
r"""
|
|
816
|
+
Compute a uniformly distributed factorization of ``self``.
|
|
817
|
+
|
|
818
|
+
This is the low level implementation of :meth:`factor`.
|
|
819
|
+
"""
|
|
820
|
+
skew_ring = self._parent
|
|
821
|
+
cdef Integer cardE, cardcenter = skew_ring._working_center.base_ring().cardinality()
|
|
822
|
+
cdef gencenter = skew_ring._working_center.gen()
|
|
823
|
+
cdef SkewPolynomial_finite_field_dense gen = <SkewPolynomial_finite_field_dense>skew_ring.gen()
|
|
824
|
+
|
|
825
|
+
cdef list factorsN = [ ]
|
|
826
|
+
cdef dict dict_divisor = { }
|
|
827
|
+
cdef dict dict_type = { }
|
|
828
|
+
cdef dict dict_right = { }
|
|
829
|
+
cdef Py_ssize_t m
|
|
830
|
+
cdef list type
|
|
831
|
+
|
|
832
|
+
for N, m in self._reduced_norm_factored():
|
|
833
|
+
factorsN += m * [N]
|
|
834
|
+
if N == gencenter:
|
|
835
|
+
continue
|
|
836
|
+
type = list(self.type(N))
|
|
837
|
+
dict_type[N] = type
|
|
838
|
+
if <Py_ssize_t>(type[0]) > 1:
|
|
839
|
+
dict_divisor[N] = self._rdivisor_c(N)
|
|
840
|
+
dict_right[N] = skew_ring.one()
|
|
841
|
+
m = len(factorsN)
|
|
842
|
+
cdef list indices = <list>sample(range(1, m+1), m)
|
|
843
|
+
|
|
844
|
+
cdef unit = self.leading_coefficient()
|
|
845
|
+
cdef SkewPolynomial_finite_field_dense left = self._new_c(self._coeffs[:], skew_ring)
|
|
846
|
+
left = left.right_monic()
|
|
847
|
+
cdef SkewPolynomial_finite_field_dense right = <SkewPolynomial_finite_field_dense>skew_ring.one()
|
|
848
|
+
cdef SkewPolynomial_finite_field_dense L, R
|
|
849
|
+
cdef SkewPolynomial_finite_field_dense NS, P, Q, D, D1, D2, d
|
|
850
|
+
cdef list factors = [ ]
|
|
851
|
+
cdef list maxtype
|
|
852
|
+
cdef Py_ssize_t i, j, degN, deg
|
|
853
|
+
cdef count, maxcount
|
|
854
|
+
|
|
855
|
+
for i in indices:
|
|
856
|
+
N = factorsN[i-1]
|
|
857
|
+
if N == gencenter:
|
|
858
|
+
D1 = gen
|
|
859
|
+
else:
|
|
860
|
+
type = dict_type[N]
|
|
861
|
+
NS = skew_ring(N)
|
|
862
|
+
P = left.right_gcd(NS)
|
|
863
|
+
if <Py_ssize_t>(type[0]) == 1:
|
|
864
|
+
D1 = P
|
|
865
|
+
else:
|
|
866
|
+
R = right._new_c(right._coeffs[:],skew_ring)
|
|
867
|
+
R = R // dict_right[N]
|
|
868
|
+
D = R._left_lcm_cofactor(dict_divisor[N])
|
|
869
|
+
maxtype = list(type)
|
|
870
|
+
maxtype[-1] -= 1
|
|
871
|
+
degN = N.degree()
|
|
872
|
+
cardE = cardcenter ** degN
|
|
873
|
+
maxcount = q_jordan(maxtype, cardE)
|
|
874
|
+
Q = NS // P
|
|
875
|
+
deg = P.degree()-1
|
|
876
|
+
while True:
|
|
877
|
+
while True:
|
|
878
|
+
R = <SkewPolynomial_finite_field_dense>skew_ring.random_element((deg,deg))
|
|
879
|
+
R = Q * R
|
|
880
|
+
if P.right_gcd(R).degree() == 0:
|
|
881
|
+
break
|
|
882
|
+
D1 = P.right_gcd(D*R)
|
|
883
|
+
|
|
884
|
+
L = left._new_c(list(left._coeffs),skew_ring)
|
|
885
|
+
L = L // D1
|
|
886
|
+
degN = N.degree()
|
|
887
|
+
for j in range(len(type)):
|
|
888
|
+
if <Py_ssize_t>(type[j]) == 1:
|
|
889
|
+
newtype = type[:-1]
|
|
890
|
+
break
|
|
891
|
+
d = L.right_gcd(NS)
|
|
892
|
+
deg = d.degree() / degN
|
|
893
|
+
if deg < <Py_ssize_t>(type[j]):
|
|
894
|
+
newtype = list(type)
|
|
895
|
+
newtype[j] = deg
|
|
896
|
+
break
|
|
897
|
+
L = L // d
|
|
898
|
+
count = q_jordan(newtype, cardE)
|
|
899
|
+
if ZZ.random_element(maxcount) < count:
|
|
900
|
+
break
|
|
901
|
+
dict_type[N] = newtype
|
|
902
|
+
|
|
903
|
+
D2 = D._new_c(list(D._coeffs), skew_ring)
|
|
904
|
+
D2 = D2.right_monic()
|
|
905
|
+
while D2 == D1:
|
|
906
|
+
while True:
|
|
907
|
+
R = <SkewPolynomial_finite_field_dense>skew_ring.random_element((deg,deg))
|
|
908
|
+
R = Q * R
|
|
909
|
+
if P.right_gcd(R).degree() == 0:
|
|
910
|
+
break
|
|
911
|
+
D2 = P.right_gcd(D*R)
|
|
912
|
+
dict_divisor[N] = D1.left_lcm(D2)
|
|
913
|
+
factors.append((D1,1))
|
|
914
|
+
left = left // D1
|
|
915
|
+
right = D1 * right
|
|
916
|
+
dict_right[N] = right._new_c(list(right._coeffs), skew_ring)
|
|
917
|
+
|
|
918
|
+
factors.reverse()
|
|
919
|
+
return Factorization(factors, sort=False, unit=unit)
|
|
920
|
+
|
|
921
|
+
def factor(self, uniform=False):
|
|
922
|
+
r"""
|
|
923
|
+
Return a factorization of this skew polynomial.
|
|
924
|
+
|
|
925
|
+
INPUT:
|
|
926
|
+
|
|
927
|
+
- ``uniform`` -- boolean (default: ``False``); whether the
|
|
928
|
+
output irreducible divisor should be uniformly distributed
|
|
929
|
+
among all possibilities
|
|
930
|
+
|
|
931
|
+
EXAMPLES::
|
|
932
|
+
|
|
933
|
+
sage: k.<t> = GF(5^3)
|
|
934
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
935
|
+
sage: S.<x> = k['x',Frob]
|
|
936
|
+
sage: a = x^3 + (t^2 + 4*t + 2)*x^2 + (3*t + 3)*x + t^2 + 1
|
|
937
|
+
sage: F = a.factor(); F # random
|
|
938
|
+
(x + t^2 + 4) * (x + t + 3) * (x + t)
|
|
939
|
+
sage: F.value() == a
|
|
940
|
+
True
|
|
941
|
+
|
|
942
|
+
The result of the factorization is cached. Hence, if we try
|
|
943
|
+
again to factor `a`, we will get the same answer::
|
|
944
|
+
|
|
945
|
+
sage: a.factor() # random
|
|
946
|
+
(x + t^2 + 4) * (x + t + 3) * (x + t)
|
|
947
|
+
|
|
948
|
+
However, the algorithm is probabilistic. Hence if we first
|
|
949
|
+
reinitialize `a`, we may get a different answer::
|
|
950
|
+
|
|
951
|
+
sage: a = x^3 + (t^2 + 4*t + 2)*x^2 + (3*t + 3)*x + t^2 + 1
|
|
952
|
+
sage: F = a.factor(); F # random
|
|
953
|
+
(x + t^2 + t + 2) * (x + 2*t^2 + t + 4) * (x + t)
|
|
954
|
+
sage: F.value() == a
|
|
955
|
+
True
|
|
956
|
+
|
|
957
|
+
There is a priori no guarantee on the distribution of the
|
|
958
|
+
factorizations we get. Passing in the keyword ``uniform=True``
|
|
959
|
+
ensures the output is uniformly distributed among all
|
|
960
|
+
factorizations::
|
|
961
|
+
|
|
962
|
+
sage: a.factor(uniform=True) # random
|
|
963
|
+
(x + t^2 + 4) * (x + t) * (x + t + 3)
|
|
964
|
+
sage: a.factor(uniform=True) # random
|
|
965
|
+
(x + 2*t^2) * (x + t^2 + t + 1) * (x + t^2 + t + 2)
|
|
966
|
+
sage: a.factor(uniform=True) # random
|
|
967
|
+
(x + 2*t^2 + 3*t) * (x + 4*t + 2) * (x + 2*t + 2)
|
|
968
|
+
|
|
969
|
+
By convention, the zero skew polynomial has no factorization::
|
|
970
|
+
|
|
971
|
+
sage: S(0).factor()
|
|
972
|
+
Traceback (most recent call last):
|
|
973
|
+
...
|
|
974
|
+
ValueError: factorization of 0 not defined
|
|
975
|
+
"""
|
|
976
|
+
if self.is_zero():
|
|
977
|
+
raise ValueError("factorization of 0 not defined")
|
|
978
|
+
if uniform:
|
|
979
|
+
F = self._factor_uniform_c()
|
|
980
|
+
if self._factorization is None:
|
|
981
|
+
self._factorization = F
|
|
982
|
+
else:
|
|
983
|
+
if self._factorization is None:
|
|
984
|
+
self._factorization = self._factor_c()
|
|
985
|
+
F = self._factorization
|
|
986
|
+
return F
|
|
987
|
+
|
|
988
|
+
def count_factorizations(self):
|
|
989
|
+
r"""
|
|
990
|
+
Return the number of factorizations (as a product of a
|
|
991
|
+
unit and a product of irreducible monic factors) of this
|
|
992
|
+
skew polynomial.
|
|
993
|
+
|
|
994
|
+
EXAMPLES::
|
|
995
|
+
|
|
996
|
+
sage: k.<t> = GF(5^3)
|
|
997
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
998
|
+
sage: S.<x> = k['x',Frob]
|
|
999
|
+
sage: a = x^4 + (4*t + 3)*x^3 + t^2*x^2 + (4*t^2 + 3*t)*x + 3*t
|
|
1000
|
+
sage: a.count_factorizations()
|
|
1001
|
+
216
|
|
1002
|
+
|
|
1003
|
+
We illustrate that an irreducible polynomial in the center have
|
|
1004
|
+
in general a lot of distinct factorizations in the skew polynomial
|
|
1005
|
+
ring::
|
|
1006
|
+
|
|
1007
|
+
sage: Z.<x3> = S.center()
|
|
1008
|
+
sage: N = x3^5 + 4*x3^4 + 4*x3^2 + 4*x3 + 3
|
|
1009
|
+
sage: N.is_irreducible()
|
|
1010
|
+
True
|
|
1011
|
+
sage: S(N).count_factorizations()
|
|
1012
|
+
30537115626
|
|
1013
|
+
"""
|
|
1014
|
+
if self.is_zero():
|
|
1015
|
+
raise ValueError("factorization of 0 not defined")
|
|
1016
|
+
cardcenter = self._parent._working_center.base_ring().cardinality()
|
|
1017
|
+
gencenter = self._parent._working_center.gen()
|
|
1018
|
+
F = self._reduced_norm_factored()
|
|
1019
|
+
summ = 0
|
|
1020
|
+
count = 1
|
|
1021
|
+
for N, m in F:
|
|
1022
|
+
summ += m
|
|
1023
|
+
if m == 1:
|
|
1024
|
+
continue
|
|
1025
|
+
if N != gencenter:
|
|
1026
|
+
count *= q_jordan(self.type(N), cardcenter**N.degree())
|
|
1027
|
+
count /= factorial(m)
|
|
1028
|
+
return count * factorial(summ)
|
|
1029
|
+
|
|
1030
|
+
# Not optimized:
|
|
1031
|
+
# many calls to reduced_norm, reduced_norm_factor, _rdivisor_c, which are slow
|
|
1032
|
+
|
|
1033
|
+
def factorizations(self):
|
|
1034
|
+
r"""
|
|
1035
|
+
Return an iterator over all factorizations (as a product
|
|
1036
|
+
of a unit and a product of irreducible monic factors) of
|
|
1037
|
+
this skew polynomial.
|
|
1038
|
+
|
|
1039
|
+
EXAMPLES::
|
|
1040
|
+
|
|
1041
|
+
sage: k.<t> = GF(5^3)
|
|
1042
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
1043
|
+
sage: S.<x> = k['x',Frob]
|
|
1044
|
+
sage: a = x^3 + (t^2 + 1)*x^2 + (2*t + 3)*x + t^2 + t + 2
|
|
1045
|
+
sage: iter = a.factorizations(); iter
|
|
1046
|
+
<...generator object at 0x...>
|
|
1047
|
+
sage: next(iter) # random
|
|
1048
|
+
(x + 3*t^2 + 4*t) * (x + 2*t^2) * (x + 4*t^2 + 4*t + 2)
|
|
1049
|
+
sage: next(iter) # random
|
|
1050
|
+
(x + 3*t^2 + 4*t) * (x + 3*t^2 + 2*t + 2) * (x + 4*t^2 + t + 2)
|
|
1051
|
+
|
|
1052
|
+
We can use this function to build the list of factorizations
|
|
1053
|
+
of `a`::
|
|
1054
|
+
|
|
1055
|
+
sage: factorizations = [ F for F in a.factorizations() ]
|
|
1056
|
+
|
|
1057
|
+
We do some checks::
|
|
1058
|
+
|
|
1059
|
+
sage: len(factorizations) == a.count_factorizations()
|
|
1060
|
+
True
|
|
1061
|
+
sage: len(factorizations) == Set(factorizations).cardinality() # check no duplicates
|
|
1062
|
+
True
|
|
1063
|
+
sage: for F in factorizations:
|
|
1064
|
+
....: assert F.value() == a, "factorization has a different value"
|
|
1065
|
+
....: for d,_ in F:
|
|
1066
|
+
....: assert d.is_irreducible(), "a factor is not irreducible"
|
|
1067
|
+
|
|
1068
|
+
Note that the algorithm used in this method is probabilistic.
|
|
1069
|
+
As a consequence, if we call it two times with the same input,
|
|
1070
|
+
we can get different orderings::
|
|
1071
|
+
|
|
1072
|
+
sage: factorizations2 = [ F for F in a.factorizations() ]
|
|
1073
|
+
sage: factorizations == factorizations2 # random
|
|
1074
|
+
False
|
|
1075
|
+
sage: sorted(factorizations) == sorted(factorizations2)
|
|
1076
|
+
True
|
|
1077
|
+
"""
|
|
1078
|
+
if self.is_zero():
|
|
1079
|
+
raise ValueError("factorization of 0 not defined")
|
|
1080
|
+
|
|
1081
|
+
def factorizations_rec(P):
|
|
1082
|
+
if P.is_irreducible():
|
|
1083
|
+
yield [(P, 1)]
|
|
1084
|
+
else:
|
|
1085
|
+
for div in P._irreducible_divisors(True):
|
|
1086
|
+
Q = P // div
|
|
1087
|
+
# Here, we should update Q._norm, Q._norm_factor
|
|
1088
|
+
for factors in factorizations_rec(Q):
|
|
1089
|
+
factors.append((div, 1))
|
|
1090
|
+
yield factors
|
|
1091
|
+
unit = self.leading_coefficient()
|
|
1092
|
+
for factors in factorizations_rec(~unit * self):
|
|
1093
|
+
yield Factorization(factors, sort=False, unit=unit)
|