passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-0cd532bd.so.1 +0 -0
- passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-x86_64-linux-musl.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-x86_64-linux-musl.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
sage/crypto/stream.py
ADDED
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.rings.finite_rings
|
|
3
|
+
"""
|
|
4
|
+
Stream Cryptosystems
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
#*****************************************************************************
|
|
8
|
+
# Copyright (C) 2007 David Kohel <kohel@maths.usyd.edu.au>
|
|
9
|
+
#
|
|
10
|
+
# This program is free software: you can redistribute it and/or modify
|
|
11
|
+
# it under the terms of the GNU General Public License as published by
|
|
12
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
13
|
+
# (at your option) any later version.
|
|
14
|
+
# http://www.gnu.org/licenses/
|
|
15
|
+
#*****************************************************************************
|
|
16
|
+
|
|
17
|
+
from sage.arith.misc import gcd, power_mod
|
|
18
|
+
from sage.crypto.cryptosystem import SymmetricKeyCryptosystem
|
|
19
|
+
from sage.crypto.stream_cipher import LFSRCipher, ShrinkingGeneratorCipher
|
|
20
|
+
from sage.crypto.util import random_blum_prime
|
|
21
|
+
from sage.monoids.string_monoid import BinaryStrings
|
|
22
|
+
from sage.rings.finite_rings.finite_field_constructor import FiniteField
|
|
23
|
+
from sage.rings.finite_rings.integer_mod_ring import IntegerModFactory
|
|
24
|
+
from sage.rings.polynomial.polynomial_element import Polynomial
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
IntegerModRing = IntegerModFactory("IntegerModRing")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class LFSRCryptosystem(SymmetricKeyCryptosystem):
|
|
31
|
+
"""
|
|
32
|
+
Linear feedback shift register cryptosystem class
|
|
33
|
+
"""
|
|
34
|
+
def __init__(self, field=None):
|
|
35
|
+
"""
|
|
36
|
+
Create a linear feedback shift cryptosystem.
|
|
37
|
+
|
|
38
|
+
INPUT:
|
|
39
|
+
|
|
40
|
+
- ``field`` -- (default: ``None``) string monoid over a binary alphabet
|
|
41
|
+
|
|
42
|
+
EXAMPLES::
|
|
43
|
+
|
|
44
|
+
sage: E = LFSRCryptosystem(FiniteField(2))
|
|
45
|
+
sage: E
|
|
46
|
+
LFSR cryptosystem over Finite Field of size 2
|
|
47
|
+
|
|
48
|
+
TESTS::
|
|
49
|
+
|
|
50
|
+
sage: E = LFSRCryptosystem(FiniteField(2))
|
|
51
|
+
sage: E == loads(dumps(E))
|
|
52
|
+
True
|
|
53
|
+
|
|
54
|
+
TODO: Implement LFSR cryptosystem for arbitrary rings. The current
|
|
55
|
+
implementation is limited to the finite field of 2 elements only
|
|
56
|
+
because of the dependence on binary strings.
|
|
57
|
+
"""
|
|
58
|
+
if field is None:
|
|
59
|
+
field = FiniteField(2)
|
|
60
|
+
if field.cardinality() != 2:
|
|
61
|
+
raise NotImplementedError("Not yet implemented.")
|
|
62
|
+
S = BinaryStrings()
|
|
63
|
+
SymmetricKeyCryptosystem.__init__(self, S, S, None)
|
|
64
|
+
self._field = field
|
|
65
|
+
|
|
66
|
+
def __eq__(self, right):
|
|
67
|
+
return type(self) is type(right) and self._field == right._field
|
|
68
|
+
|
|
69
|
+
def __call__(self, key):
|
|
70
|
+
"""
|
|
71
|
+
Create a LFSR cipher.
|
|
72
|
+
|
|
73
|
+
INPUT:
|
|
74
|
+
|
|
75
|
+
- ``key`` -- a polynomial and initial state of the LFSR
|
|
76
|
+
"""
|
|
77
|
+
if not isinstance(key, (list, tuple)) and len(key) == 2:
|
|
78
|
+
raise TypeError("Argument key (= %s) must be a list of tuple of length 2" % key)
|
|
79
|
+
poly, IS = key
|
|
80
|
+
if not isinstance(poly, Polynomial):
|
|
81
|
+
raise TypeError("poly (= %s) must be a polynomial." % poly)
|
|
82
|
+
if not isinstance(IS, (list, tuple)):
|
|
83
|
+
raise TypeError("IS (= %s) must be an initial in the key space." % IS)
|
|
84
|
+
if len(IS) != poly.degree():
|
|
85
|
+
raise TypeError("The length of IS (= %s) must equal the degree of poly (= %s)" % (IS, poly))
|
|
86
|
+
return LFSRCipher(self, poly, IS)
|
|
87
|
+
|
|
88
|
+
def _repr_(self):
|
|
89
|
+
r"""
|
|
90
|
+
Return the string representation of this LFSR cryptosystem.
|
|
91
|
+
|
|
92
|
+
EXAMPLES::
|
|
93
|
+
|
|
94
|
+
sage: LFSRCryptosystem(FiniteField(2))
|
|
95
|
+
LFSR cryptosystem over Finite Field of size 2
|
|
96
|
+
"""
|
|
97
|
+
return "LFSR cryptosystem over %s" % self._field
|
|
98
|
+
|
|
99
|
+
def encoding(self, M):
|
|
100
|
+
S = self.cipher_domain()
|
|
101
|
+
try:
|
|
102
|
+
return S.encoding(M)
|
|
103
|
+
except Exception:
|
|
104
|
+
raise TypeError("Argument M = %s does not encode in the cipher domain" % M)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class ShrinkingGeneratorCryptosystem(SymmetricKeyCryptosystem):
|
|
108
|
+
"""
|
|
109
|
+
Shrinking generator cryptosystem class
|
|
110
|
+
"""
|
|
111
|
+
def __init__(self, field=None):
|
|
112
|
+
"""
|
|
113
|
+
Create a shrinking generator cryptosystem.
|
|
114
|
+
|
|
115
|
+
INPUT:
|
|
116
|
+
|
|
117
|
+
- ``field`` -- (default: ``None``) string monoid over a binary alphabet
|
|
118
|
+
|
|
119
|
+
EXAMPLES::
|
|
120
|
+
|
|
121
|
+
sage: E = ShrinkingGeneratorCryptosystem()
|
|
122
|
+
sage: E
|
|
123
|
+
Shrinking generator cryptosystem over Finite Field of size 2
|
|
124
|
+
"""
|
|
125
|
+
if field is None:
|
|
126
|
+
field = FiniteField(2)
|
|
127
|
+
if field.cardinality() != 2:
|
|
128
|
+
raise NotImplementedError("Not yet implemented.")
|
|
129
|
+
S = BinaryStrings()
|
|
130
|
+
SymmetricKeyCryptosystem.__init__(self, S, S, None)
|
|
131
|
+
self._field = field
|
|
132
|
+
|
|
133
|
+
def __call__(self, key):
|
|
134
|
+
"""
|
|
135
|
+
Create a Shrinking generator cipher.
|
|
136
|
+
|
|
137
|
+
INPUT:
|
|
138
|
+
|
|
139
|
+
- ``key`` -- list or tuple consisting of two LFSR ciphers (e1,e2)
|
|
140
|
+
|
|
141
|
+
OUTPUT: the shrinking generator cipher with key stream generator e1
|
|
142
|
+
and decimating cipher e2
|
|
143
|
+
"""
|
|
144
|
+
if not isinstance(key, (list, tuple)) and len(key) == 2:
|
|
145
|
+
raise TypeError("Argument key (= %s) must be a list of tuple of length 2" % key)
|
|
146
|
+
e1 = key[0]
|
|
147
|
+
e2 = key[1]
|
|
148
|
+
if not isinstance(e1, LFSRCipher) or not isinstance(e2, LFSRCipher):
|
|
149
|
+
raise TypeError("The key (= (%s,%s)) must be a tuple of two LFSR ciphers." % key)
|
|
150
|
+
return ShrinkingGeneratorCipher(self, e1, e2)
|
|
151
|
+
|
|
152
|
+
def _repr_(self):
|
|
153
|
+
r"""
|
|
154
|
+
Return the string representation of this shrinking generator
|
|
155
|
+
cryptosystem.
|
|
156
|
+
|
|
157
|
+
EXAMPLES::
|
|
158
|
+
|
|
159
|
+
sage: ShrinkingGeneratorCryptosystem()
|
|
160
|
+
Shrinking generator cryptosystem over Finite Field of size 2
|
|
161
|
+
"""
|
|
162
|
+
return "Shrinking generator cryptosystem over %s" % self._field
|
|
163
|
+
|
|
164
|
+
def encoding(self, M):
|
|
165
|
+
S = self.cipher_domain()
|
|
166
|
+
try:
|
|
167
|
+
return S.encoding(M)
|
|
168
|
+
except Exception:
|
|
169
|
+
raise TypeError("Argument M = %s does not encode in the cipher domain" % M)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def blum_blum_shub(length, seed=None, p=None, q=None,
|
|
173
|
+
lbound=None, ubound=None, ntries=100):
|
|
174
|
+
r"""
|
|
175
|
+
The Blum-Blum-Shub (BBS) pseudorandom bit generator.
|
|
176
|
+
|
|
177
|
+
See the original paper by Blum, Blum and Shub [BBS1986]_. The
|
|
178
|
+
BBS algorithm is also discussed in section 5.5.2 of [MvOV1996]_.
|
|
179
|
+
|
|
180
|
+
INPUT:
|
|
181
|
+
|
|
182
|
+
- ``length`` -- positive integer; the number of bits in the output
|
|
183
|
+
pseudorandom bit sequence
|
|
184
|
+
|
|
185
|
+
- ``seed`` -- (default: ``None``) if `p` and `q` are Blum primes, then
|
|
186
|
+
``seed`` is a quadratic residue in the multiplicative group
|
|
187
|
+
`(\ZZ/n\ZZ)^{\ast}` where `n = pq`. If ``seed=None``, then the function
|
|
188
|
+
would generate its own random quadratic residue in `(\ZZ/n\ZZ)^{\ast}`.
|
|
189
|
+
If you provide a value for ``seed``, then it is your responsibility to
|
|
190
|
+
ensure that the seed is a quadratic residue in the multiplicative group
|
|
191
|
+
`(\ZZ/n\ZZ)^{\ast}`.
|
|
192
|
+
|
|
193
|
+
- ``p`` -- (default: ``None``) a large positive prime congruent to 3
|
|
194
|
+
modulo 4. Both ``p`` and ``q`` must be distinct. If ``p=None``, then
|
|
195
|
+
a value for ``p`` will be generated, where
|
|
196
|
+
``0 < lower_bound <= p <= upper_bound``.
|
|
197
|
+
|
|
198
|
+
- ``q`` -- (default: ``None``) a large positive prime congruence to 3
|
|
199
|
+
modulo 4. Both ``p`` and ``q`` must be distinct. If ``q=None``, then
|
|
200
|
+
a value for ``q`` will be generated, where
|
|
201
|
+
``0 < lower_bound <= q <= upper_bound``.
|
|
202
|
+
|
|
203
|
+
- ``lbound`` -- (positive integer, default: ``None``) the lower
|
|
204
|
+
bound on how small each random primes `p` and `q` can be. So we
|
|
205
|
+
have ``0 < lbound <= p, q <= ubound``. The lower bound must be
|
|
206
|
+
distinct from the upper bound.
|
|
207
|
+
|
|
208
|
+
- ``ubound`` -- (positive integer, default: ``None``) the upper
|
|
209
|
+
bound on how large each random primes `p` and `q` can be. So we have
|
|
210
|
+
``0 < lbound <= p, q <= ubound``. The lower bound must be distinct
|
|
211
|
+
from the upper bound.
|
|
212
|
+
|
|
213
|
+
- ``ntries`` -- (default: ``100``) the number of attempts to generate
|
|
214
|
+
a random Blum prime. If ``ntries`` is a positive integer, then
|
|
215
|
+
perform that many attempts at generating a random Blum prime. This
|
|
216
|
+
might or might not result in a Blum prime.
|
|
217
|
+
|
|
218
|
+
OUTPUT: a pseudorandom bit sequence whose length is specified by ``length``
|
|
219
|
+
|
|
220
|
+
Here is a common use case for this function. If you want this
|
|
221
|
+
function to use pre-computed values for `p` and `q`, you should pass
|
|
222
|
+
those pre-computed values to this function. In that case, you only need
|
|
223
|
+
to specify values for ``length``, ``p`` and ``q``, and you do not need
|
|
224
|
+
to worry about doing anything with the parameters ``lbound`` and
|
|
225
|
+
``ubound``. The pre-computed values `p` and `q` must be Blum primes.
|
|
226
|
+
It is your responsibility to check that both `p` and `q` are Blum primes.
|
|
227
|
+
|
|
228
|
+
Here is another common use case. If you want the function to generate
|
|
229
|
+
its own values for `p` and `q`, you must specify the lower and upper
|
|
230
|
+
bounds within which these two primes must lie. In that case, you must
|
|
231
|
+
specify values for ``length``, ``lbound`` and ``ubound``, and you do
|
|
232
|
+
not need to worry about values for the parameters ``p`` and ``q``. The
|
|
233
|
+
parameter ``ntries`` is only relevant when you want this function to
|
|
234
|
+
generate ``p`` and ``q``.
|
|
235
|
+
|
|
236
|
+
.. NOTE::
|
|
237
|
+
|
|
238
|
+
Beware that there might not be any primes between the lower and
|
|
239
|
+
upper bounds. So make sure that these two bounds are
|
|
240
|
+
"sufficiently" far apart from each other for there to be primes
|
|
241
|
+
congruent to 3 modulo 4. In particular, there should be at least
|
|
242
|
+
two distinct primes within these bounds, each prime being congruent
|
|
243
|
+
to 3 modulo 4. This function uses the function
|
|
244
|
+
:func:`random_blum_prime() <sage.crypto.util.random_blum_prime>` to
|
|
245
|
+
generate random primes that are congruent to 3 modulo 4.
|
|
246
|
+
|
|
247
|
+
ALGORITHM:
|
|
248
|
+
|
|
249
|
+
The BBS algorithm as described below is adapted from the presentation
|
|
250
|
+
in Algorithm 5.40, page 186 of [MvOV1996]_.
|
|
251
|
+
|
|
252
|
+
#. Let `L` be the desired number of bits in the output bit sequence.
|
|
253
|
+
That is, `L` is the desired length of the bit string.
|
|
254
|
+
#. Let `p` and `q` be two large distinct primes, each congruent to 3
|
|
255
|
+
modulo 4.
|
|
256
|
+
#. Let `n = pq` be the product of `p` and `q`.
|
|
257
|
+
#. Select a random seed value `s \in (\ZZ/n\ZZ)^{\ast}`, where
|
|
258
|
+
`(\ZZ/n\ZZ)^{\ast}` is the multiplicative group of `\ZZ/n\ZZ`.
|
|
259
|
+
#. Let `x_0 = s^2 \bmod n`.
|
|
260
|
+
#. For `i` from 1 to `L`, do
|
|
261
|
+
|
|
262
|
+
#. Let `x_i = x_{i-1}^2 \bmod n`.
|
|
263
|
+
#. Let `z_i` be the least significant bit of `x_i`.
|
|
264
|
+
|
|
265
|
+
#. The output pseudorandom bit sequence is `z_1, z_2, \dots, z_L`.
|
|
266
|
+
|
|
267
|
+
EXAMPLES:
|
|
268
|
+
|
|
269
|
+
A BBS pseudorandom bit sequence with a specified seed::
|
|
270
|
+
|
|
271
|
+
sage: from sage.crypto.stream import blum_blum_shub
|
|
272
|
+
sage: blum_blum_shub(length=6, seed=3, p=11, q=19)
|
|
273
|
+
110000
|
|
274
|
+
|
|
275
|
+
You could specify the length of the bit string, with given values for
|
|
276
|
+
``p`` and ``q``::
|
|
277
|
+
|
|
278
|
+
sage: blum_blum_shub(length=6, p=11, q=19) # random
|
|
279
|
+
001011
|
|
280
|
+
|
|
281
|
+
Or you could specify the length of the bit string, with given values for
|
|
282
|
+
the lower and upper bounds::
|
|
283
|
+
|
|
284
|
+
sage: blum_blum_shub(length=6, lbound=10**4, ubound=10**5) # random
|
|
285
|
+
110111
|
|
286
|
+
|
|
287
|
+
Under some reasonable hypotheses, Blum-Blum-Shub [BBS1982]_
|
|
288
|
+
sketch a proof that the period of the BBS stream cipher is equal to
|
|
289
|
+
`\lambda(\lambda(n))`, where `\lambda(n)` is the Carmichael function of
|
|
290
|
+
`n`. This is verified below in a few examples by using the function
|
|
291
|
+
:func:`lfsr_connection_polynomial() <sage.crypto.lfsr.lfsr_connection_polynomial>`
|
|
292
|
+
(written by Tim Brock) which computes the connection polynomial of a
|
|
293
|
+
linear feedback shift register sequence. The degree of that polynomial
|
|
294
|
+
is the period. ::
|
|
295
|
+
|
|
296
|
+
sage: from sage.crypto.stream import blum_blum_shub
|
|
297
|
+
sage: from sage.arith.misc import carmichael_lambda
|
|
298
|
+
sage: carmichael_lambda(carmichael_lambda(7*11))
|
|
299
|
+
4
|
|
300
|
+
sage: s = [GF(2)(int(str(x))) for x in blum_blum_shub(60, p=7, q=11, seed=13)]
|
|
301
|
+
sage: lfsr_connection_polynomial(s)
|
|
302
|
+
x^3 + x^2 + x + 1
|
|
303
|
+
sage: carmichael_lambda(carmichael_lambda(11*23))
|
|
304
|
+
20
|
|
305
|
+
sage: s = [GF(2)(int(str(x))) for x in blum_blum_shub(60, p=11, q=23, seed=13)]
|
|
306
|
+
sage: lfsr_connection_polynomial(s)
|
|
307
|
+
x^19 + x^18 + x^17 + x^16 + x^15 + x^14 + x^13 + x^12 + x^11 + x^10 + x^9 + x^8 + x^7 + x^6 + x^5 + x^4 + x^3 + x^2 + x + 1
|
|
308
|
+
|
|
309
|
+
TESTS:
|
|
310
|
+
|
|
311
|
+
Make sure that there is at least one Blum prime between the lower and
|
|
312
|
+
upper bounds. In the following example, we have ``lbound=24`` and
|
|
313
|
+
``ubound=30`` with 29 being the only prime within those bounds. But 29
|
|
314
|
+
is not a Blum prime. ::
|
|
315
|
+
|
|
316
|
+
sage: from sage.crypto.stream import blum_blum_shub
|
|
317
|
+
sage: blum_blum_shub(6, lbound=24, ubound=30, ntries=10)
|
|
318
|
+
Traceback (most recent call last):
|
|
319
|
+
...
|
|
320
|
+
ValueError: No Blum primes within the specified closed interval.
|
|
321
|
+
|
|
322
|
+
Both the lower and upper bounds must be greater than 2::
|
|
323
|
+
|
|
324
|
+
sage: blum_blum_shub(6, lbound=2, ubound=3)
|
|
325
|
+
Traceback (most recent call last):
|
|
326
|
+
...
|
|
327
|
+
ValueError: Both the lower and upper bounds must be > 2.
|
|
328
|
+
sage: blum_blum_shub(6, lbound=3, ubound=2)
|
|
329
|
+
Traceback (most recent call last):
|
|
330
|
+
...
|
|
331
|
+
ValueError: Both the lower and upper bounds must be > 2.
|
|
332
|
+
sage: blum_blum_shub(6, lbound=2, ubound=2)
|
|
333
|
+
Traceback (most recent call last):
|
|
334
|
+
...
|
|
335
|
+
ValueError: Both the lower and upper bounds must be > 2.
|
|
336
|
+
|
|
337
|
+
The lower and upper bounds must be distinct from each other::
|
|
338
|
+
|
|
339
|
+
sage: blum_blum_shub(6, lbound=3, ubound=3)
|
|
340
|
+
Traceback (most recent call last):
|
|
341
|
+
...
|
|
342
|
+
ValueError: The lower and upper bounds must be distinct.
|
|
343
|
+
|
|
344
|
+
The lower bound must be less than the upper bound::
|
|
345
|
+
|
|
346
|
+
sage: blum_blum_shub(6, lbound=4, ubound=3)
|
|
347
|
+
Traceback (most recent call last):
|
|
348
|
+
...
|
|
349
|
+
ValueError: The lower bound must be less than the upper bound.
|
|
350
|
+
"""
|
|
351
|
+
# sanity checks
|
|
352
|
+
if length < 0:
|
|
353
|
+
raise ValueError("The length of the bit string must be positive.")
|
|
354
|
+
if (p is None) and (p == q == lbound == ubound):
|
|
355
|
+
raise ValueError("Either specify values for p and q, or specify values for the lower and upper bounds.")
|
|
356
|
+
# Use pre-computed Blum primes. Both the parameters p and q are
|
|
357
|
+
# assumed to be Blum primes. No attempts are made to ensure that they
|
|
358
|
+
# are indeed Blum primes.
|
|
359
|
+
randp = 0
|
|
360
|
+
randq = 0
|
|
361
|
+
if (p is not None) and (q is not None):
|
|
362
|
+
randp = p
|
|
363
|
+
randq = q
|
|
364
|
+
# generate random Blum primes within specified bounds
|
|
365
|
+
elif (lbound is not None) and (ubound is not None):
|
|
366
|
+
randp = random_blum_prime(lbound, ubound, ntries=ntries)
|
|
367
|
+
randq = random_blum_prime(lbound, ubound, ntries=ntries)
|
|
368
|
+
while randp == randq:
|
|
369
|
+
randq = random_blum_prime(lbound, ubound, ntries=ntries)
|
|
370
|
+
# no pre-computed primes given, and no appropriate bounds given
|
|
371
|
+
else:
|
|
372
|
+
raise ValueError("Either specify values for p and q, or specify values for the lower and upper bounds.")
|
|
373
|
+
# By now, we should have two distinct Blum primes.
|
|
374
|
+
n = randp * randq
|
|
375
|
+
# If no seed is provided, select a random seed.
|
|
376
|
+
x0 = seed
|
|
377
|
+
if seed is None:
|
|
378
|
+
zmod = IntegerModRing(n)
|
|
379
|
+
s = zmod.random_element().lift()
|
|
380
|
+
while gcd(s, n) != 1:
|
|
381
|
+
s = zmod.random_element().lift()
|
|
382
|
+
x0 = power_mod(s, 2, n)
|
|
383
|
+
# start generating pseudorandom bits
|
|
384
|
+
z = []
|
|
385
|
+
for i in range(length):
|
|
386
|
+
x1 = power_mod(x0, 2, n)
|
|
387
|
+
z.append(x1 % 2)
|
|
388
|
+
x0 = x1
|
|
389
|
+
bin = BinaryStrings()
|
|
390
|
+
return bin(z)
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.rings.finite_rings
|
|
3
|
+
"""
|
|
4
|
+
Stream Ciphers
|
|
5
|
+
"""
|
|
6
|
+
#*****************************************************************************
|
|
7
|
+
# Copyright (C) 2007 David Kohel <kohel@maths.usyd.edu.au>
|
|
8
|
+
#
|
|
9
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
10
|
+
#
|
|
11
|
+
# http://www.gnu.org/licenses/
|
|
12
|
+
#*****************************************************************************
|
|
13
|
+
|
|
14
|
+
from .lfsr import lfsr_sequence
|
|
15
|
+
from .cipher import SymmetricKeyCipher
|
|
16
|
+
from sage.monoids.string_monoid_element import StringMonoidElement
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class LFSRCipher(SymmetricKeyCipher):
|
|
20
|
+
def __init__(self, parent, poly, IS):
|
|
21
|
+
"""
|
|
22
|
+
Create a linear feedback shift register (LFSR) cipher.
|
|
23
|
+
|
|
24
|
+
INPUT:
|
|
25
|
+
|
|
26
|
+
- ``parent`` -- parent
|
|
27
|
+
|
|
28
|
+
- ``poly`` -- connection polynomial
|
|
29
|
+
|
|
30
|
+
- ``IS`` -- initial state
|
|
31
|
+
|
|
32
|
+
EXAMPLES::
|
|
33
|
+
|
|
34
|
+
sage: FF = FiniteField(2)
|
|
35
|
+
sage: P.<x> = PolynomialRing(FF)
|
|
36
|
+
sage: E = LFSRCryptosystem(FF)
|
|
37
|
+
sage: E
|
|
38
|
+
LFSR cryptosystem over Finite Field of size 2
|
|
39
|
+
sage: IS = [ FF(a) for a in [0,1,1,1,0,1,1] ]
|
|
40
|
+
sage: g = x^7 + x + 1
|
|
41
|
+
sage: e = E((g,IS))
|
|
42
|
+
sage: B = BinaryStrings()
|
|
43
|
+
sage: m = B.encoding("THECATINTHEHAT")
|
|
44
|
+
sage: e(m)
|
|
45
|
+
0010001101111010111010101010001100000000110100010101011100001011110010010000011111100100100011001101101000001111
|
|
46
|
+
sage: FF = FiniteField(2)
|
|
47
|
+
sage: P.<x> = PolynomialRing(FF)
|
|
48
|
+
sage: LFSR = LFSRCryptosystem(FF)
|
|
49
|
+
sage: e = LFSR((x^2+x+1,[FF(0),FF(1)]))
|
|
50
|
+
sage: B = e.domain()
|
|
51
|
+
sage: m = B.encoding("The cat in the hat.")
|
|
52
|
+
sage: e(m)
|
|
53
|
+
00111001110111101011111001001101110101011011101000011001100101101011001000000011100101101010111100000101110100111111101100000101110101111010111101000011
|
|
54
|
+
sage: m == e(e(m))
|
|
55
|
+
True
|
|
56
|
+
|
|
57
|
+
TESTS::
|
|
58
|
+
|
|
59
|
+
sage: FF = FiniteField(2)
|
|
60
|
+
sage: P.<x> = PolynomialRing(FF)
|
|
61
|
+
sage: E = LFSRCryptosystem(FF)
|
|
62
|
+
sage: E == loads(dumps(E))
|
|
63
|
+
True
|
|
64
|
+
"""
|
|
65
|
+
SymmetricKeyCipher.__init__(self, parent, key=(poly, IS))
|
|
66
|
+
|
|
67
|
+
def __call__(self, M, mode='ECB'):
|
|
68
|
+
r"""
|
|
69
|
+
Generate key stream from the binary string ``M``.
|
|
70
|
+
|
|
71
|
+
INPUT:
|
|
72
|
+
|
|
73
|
+
- ``M`` -- a StringMonoidElement
|
|
74
|
+
|
|
75
|
+
- ``mode`` -- ignored (default: ``'ECB'``)
|
|
76
|
+
|
|
77
|
+
EXAMPLES::
|
|
78
|
+
|
|
79
|
+
sage: k = GF(2)
|
|
80
|
+
sage: P.<x> = PolynomialRing( k )
|
|
81
|
+
sage: LFSR = LFSRCryptosystem( k )
|
|
82
|
+
sage: e = LFSR((x^2+x+1,[k(0), k(1)]))
|
|
83
|
+
sage: B = e.domain()
|
|
84
|
+
sage: m = B.encoding('The cat in the hat.')
|
|
85
|
+
sage: e(m)
|
|
86
|
+
00111001110111101011111001001101110101011011101000011001100101101011001000000011100101101010111100000101110100111111101100000101110101111010111101000011
|
|
87
|
+
"""
|
|
88
|
+
B = self.domain() # = plaintext_space = ciphertext_space
|
|
89
|
+
if not isinstance(M, StringMonoidElement) and M.parent() == B:
|
|
90
|
+
raise TypeError("Argument M (= %s) must be a string in the plaintext space." % M)
|
|
91
|
+
(poly, IS) = self.key()
|
|
92
|
+
n = B.ngens() # two for binary strings
|
|
93
|
+
N = len(M)
|
|
94
|
+
Melt = M._element_list
|
|
95
|
+
Kelt = lfsr_sequence(poly.list(), IS, N)
|
|
96
|
+
return B([ (Melt[i]+int(Kelt[i])) % n for i in range(N) ])
|
|
97
|
+
|
|
98
|
+
def _repr_(self):
|
|
99
|
+
r"""
|
|
100
|
+
Return the string representation of this LFSR cipher.
|
|
101
|
+
|
|
102
|
+
EXAMPLES::
|
|
103
|
+
|
|
104
|
+
sage: FF = FiniteField(2)
|
|
105
|
+
sage: P.<x> = PolynomialRing(FF)
|
|
106
|
+
sage: LFSR = LFSRCryptosystem(FF)
|
|
107
|
+
sage: IS_1 = [ FF(a) for a in [0,1,0,1,0,0,0] ]
|
|
108
|
+
sage: e1 = LFSR((x^7 + x + 1,IS_1))
|
|
109
|
+
sage: IS_2 = [ FF(a) for a in [0,0,1,0,0,0,1,0,1] ]
|
|
110
|
+
sage: e2 = LFSR((x^9 + x^3 + 1,IS_2))
|
|
111
|
+
sage: E = ShrinkingGeneratorCryptosystem()
|
|
112
|
+
sage: e = E((e1,e2))
|
|
113
|
+
sage: e.keystream_cipher()
|
|
114
|
+
LFSR cipher on Free binary string monoid
|
|
115
|
+
"""
|
|
116
|
+
return "LFSR cipher on %s" % self.domain()
|
|
117
|
+
|
|
118
|
+
def connection_polynomial(self):
|
|
119
|
+
"""
|
|
120
|
+
The connection polynomial defining the LFSR of the cipher.
|
|
121
|
+
|
|
122
|
+
EXAMPLES::
|
|
123
|
+
|
|
124
|
+
sage: k = GF(2)
|
|
125
|
+
sage: P.<x> = PolynomialRing( k )
|
|
126
|
+
sage: LFSR = LFSRCryptosystem( k )
|
|
127
|
+
sage: e = LFSR((x^2+x+1,[k(0), k(1)]))
|
|
128
|
+
sage: e.connection_polynomial()
|
|
129
|
+
x^2 + x + 1
|
|
130
|
+
"""
|
|
131
|
+
return self.key()[0]
|
|
132
|
+
|
|
133
|
+
def initial_state(self):
|
|
134
|
+
"""
|
|
135
|
+
The initial state of the LFSR cipher.
|
|
136
|
+
|
|
137
|
+
EXAMPLES::
|
|
138
|
+
|
|
139
|
+
sage: k = GF(2)
|
|
140
|
+
sage: P.<x> = PolynomialRing( k )
|
|
141
|
+
sage: LFSR = LFSRCryptosystem( k )
|
|
142
|
+
sage: e = LFSR((x^2+x+1,[k(0), k(1)]))
|
|
143
|
+
sage: e.initial_state()
|
|
144
|
+
[0, 1]
|
|
145
|
+
"""
|
|
146
|
+
return self.key()[1]
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class ShrinkingGeneratorCipher(SymmetricKeyCipher):
|
|
150
|
+
def __init__(self, parent, e1, e2):
|
|
151
|
+
"""
|
|
152
|
+
Create a shrinking generator cipher.
|
|
153
|
+
|
|
154
|
+
INPUT:
|
|
155
|
+
|
|
156
|
+
- ``parent`` -- parent
|
|
157
|
+
|
|
158
|
+
- ``poly`` -- connection polynomial
|
|
159
|
+
|
|
160
|
+
- ``IS`` -- initial state
|
|
161
|
+
|
|
162
|
+
EXAMPLES::
|
|
163
|
+
|
|
164
|
+
sage: FF = FiniteField(2)
|
|
165
|
+
sage: P.<x> = PolynomialRing(FF)
|
|
166
|
+
sage: LFSR = LFSRCryptosystem(FF)
|
|
167
|
+
sage: IS_1 = [ FF(a) for a in [0,1,0,1,0,0,0] ]
|
|
168
|
+
sage: e1 = LFSR((x^7 + x + 1,IS_1))
|
|
169
|
+
sage: IS_2 = [ FF(a) for a in [0,0,1,0,0,0,1,0,1] ]
|
|
170
|
+
sage: e2 = LFSR((x^9 + x^3 + 1,IS_2))
|
|
171
|
+
sage: E = ShrinkingGeneratorCryptosystem()
|
|
172
|
+
sage: e = E((e1,e2))
|
|
173
|
+
sage: e
|
|
174
|
+
Shrinking generator cipher on Free binary string monoid
|
|
175
|
+
"""
|
|
176
|
+
if not isinstance(e1, LFSRCipher):
|
|
177
|
+
raise TypeError("Argument e1 (= %s) must be a LFSR cipher." % e1)
|
|
178
|
+
if not isinstance(e2, LFSRCipher):
|
|
179
|
+
raise TypeError("Argument e2 (= %s) must be a LFSR cipher." % e2)
|
|
180
|
+
SymmetricKeyCipher.__init__(self, parent, key=(e1, e2))
|
|
181
|
+
|
|
182
|
+
def keystream_cipher(self):
|
|
183
|
+
"""
|
|
184
|
+
The LFSR cipher generating the output key stream.
|
|
185
|
+
|
|
186
|
+
EXAMPLES::
|
|
187
|
+
|
|
188
|
+
sage: FF = FiniteField(2)
|
|
189
|
+
sage: P.<x> = PolynomialRing(FF)
|
|
190
|
+
sage: LFSR = LFSRCryptosystem(FF)
|
|
191
|
+
sage: IS_1 = [ FF(a) for a in [0,1,0,1,0,0,0] ]
|
|
192
|
+
sage: e1 = LFSR((x^7 + x + 1,IS_1))
|
|
193
|
+
sage: IS_2 = [ FF(a) for a in [0,0,1,0,0,0,1,0,1] ]
|
|
194
|
+
sage: e2 = LFSR((x^9 + x^3 + 1,IS_2))
|
|
195
|
+
sage: E = ShrinkingGeneratorCryptosystem()
|
|
196
|
+
sage: e = E((e1,e2))
|
|
197
|
+
sage: e.keystream_cipher()
|
|
198
|
+
LFSR cipher on Free binary string monoid
|
|
199
|
+
"""
|
|
200
|
+
return self.key()[0]
|
|
201
|
+
|
|
202
|
+
def decimating_cipher(self):
|
|
203
|
+
"""
|
|
204
|
+
The LFSR cipher generating the decimating key stream.
|
|
205
|
+
|
|
206
|
+
EXAMPLES::
|
|
207
|
+
|
|
208
|
+
sage: FF = FiniteField(2)
|
|
209
|
+
sage: P.<x> = PolynomialRing(FF)
|
|
210
|
+
sage: LFSR = LFSRCryptosystem(FF)
|
|
211
|
+
sage: IS_1 = [ FF(a) for a in [0,1,0,1,0,0,0] ]
|
|
212
|
+
sage: e1 = LFSR((x^7 + x + 1,IS_1))
|
|
213
|
+
sage: IS_2 = [ FF(a) for a in [0,0,1,0,0,0,1,0,1] ]
|
|
214
|
+
sage: e2 = LFSR((x^9 + x^3 + 1,IS_2))
|
|
215
|
+
sage: E = ShrinkingGeneratorCryptosystem()
|
|
216
|
+
sage: e = E((e1,e2))
|
|
217
|
+
sage: e.decimating_cipher()
|
|
218
|
+
LFSR cipher on Free binary string monoid
|
|
219
|
+
"""
|
|
220
|
+
return self.key()[1]
|
|
221
|
+
|
|
222
|
+
def __call__(self, M, mode='ECB'):
|
|
223
|
+
r"""
|
|
224
|
+
INPUT:
|
|
225
|
+
|
|
226
|
+
- ``M`` -- a StringMonoidElement
|
|
227
|
+
|
|
228
|
+
- ``mode`` -- ignored (default: ``'ECB'``)
|
|
229
|
+
|
|
230
|
+
EXAMPLES::
|
|
231
|
+
|
|
232
|
+
sage: FF = FiniteField(2)
|
|
233
|
+
sage: P.<x> = PolynomialRing(FF)
|
|
234
|
+
sage: LFSR = LFSRCryptosystem(FF)
|
|
235
|
+
sage: IS_1 = [ FF(a) for a in [0,1,0,1,0,0,0] ]
|
|
236
|
+
sage: e1 = LFSR((x^7 + x + 1,IS_1))
|
|
237
|
+
sage: IS_2 = [ FF(a) for a in [0,0,1,0,0,0,1,0,1] ]
|
|
238
|
+
sage: e2 = LFSR((x^9 + x^3 + 1,IS_2))
|
|
239
|
+
sage: E = ShrinkingGeneratorCryptosystem()
|
|
240
|
+
sage: e = E((e1,e2))
|
|
241
|
+
sage: B = BinaryStrings()
|
|
242
|
+
sage: m = B.encoding("THECATINTHEHAT")
|
|
243
|
+
sage: c = e(m)
|
|
244
|
+
sage: c.decoding()
|
|
245
|
+
"t\xb6\xc1'\x83\x17\xae\xc9ZO\x84V\x7fX"
|
|
246
|
+
sage: e(e(m)) == m
|
|
247
|
+
True
|
|
248
|
+
sage: m.decoding()
|
|
249
|
+
'THECATINTHEHAT'
|
|
250
|
+
"""
|
|
251
|
+
B = self.domain() # = plaintext_space = ciphertext_space
|
|
252
|
+
if not isinstance(M, StringMonoidElement) and M.parent() == B:
|
|
253
|
+
raise TypeError("Argument M (= %s) must be a string in the plaintext space." % M)
|
|
254
|
+
(e1, e2) = self.key()
|
|
255
|
+
MStream = M._element_list
|
|
256
|
+
g1 = e1.connection_polynomial()
|
|
257
|
+
n1 = g1.degree()
|
|
258
|
+
IS_1 = e1.initial_state()
|
|
259
|
+
g2 = e2.connection_polynomial()
|
|
260
|
+
n2 = g2.degree()
|
|
261
|
+
IS_2 = e2.initial_state()
|
|
262
|
+
k = 0
|
|
263
|
+
N = len(M)
|
|
264
|
+
n = max(n1, n2)
|
|
265
|
+
CStream = []
|
|
266
|
+
while k < N:
|
|
267
|
+
r = max(N-k,2*n)
|
|
268
|
+
KStream = lfsr_sequence(g1.list(), IS_1, r)
|
|
269
|
+
DStream = lfsr_sequence(g2.list(), IS_2, r)
|
|
270
|
+
for i in range(r - n):
|
|
271
|
+
if DStream[i] != 0:
|
|
272
|
+
CStream.append(int(MStream[k] + KStream[i]))
|
|
273
|
+
k += 1
|
|
274
|
+
if k == N:
|
|
275
|
+
break
|
|
276
|
+
IS_1 = KStream[r-n-1:r-n+n1]
|
|
277
|
+
IS_2 = DStream[r-n-1:r-n+n2]
|
|
278
|
+
return B(CStream)
|
|
279
|
+
|
|
280
|
+
def _repr_(self):
|
|
281
|
+
r"""
|
|
282
|
+
Return the string representation of this shrinking generator cipher.
|
|
283
|
+
|
|
284
|
+
EXAMPLES::
|
|
285
|
+
|
|
286
|
+
sage: FF = FiniteField(2)
|
|
287
|
+
sage: P.<x> = PolynomialRing(FF)
|
|
288
|
+
sage: LFSR = LFSRCryptosystem(FF)
|
|
289
|
+
sage: IS_1 = [ FF(a) for a in [0,1,0,1,0,0,0] ]
|
|
290
|
+
sage: e1 = LFSR((x^7 + x + 1,IS_1))
|
|
291
|
+
sage: IS_2 = [ FF(a) for a in [0,0,1,0,0,0,1,0,1] ]
|
|
292
|
+
sage: e2 = LFSR((x^9 + x^3 + 1,IS_2))
|
|
293
|
+
sage: E = ShrinkingGeneratorCryptosystem()
|
|
294
|
+
sage: e = E((e1,e2)); e
|
|
295
|
+
Shrinking generator cipher on Free binary string monoid
|
|
296
|
+
"""
|
|
297
|
+
return "Shrinking generator cipher on %s" % self.domain()
|