passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-0cd532bd.so.1 +0 -0
- passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-x86_64-linux-musl.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-x86_64-linux-musl.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,896 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs fpylll
|
|
3
|
+
"""
|
|
4
|
+
Discrete subgroups of `\\ZZ^n`
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- Martin Albrecht (2014-03): initial version
|
|
9
|
+
|
|
10
|
+
- Jan Pöschko (2012-08): some code in this module was taken from Jan Pöschko's
|
|
11
|
+
2012 GSoC project
|
|
12
|
+
|
|
13
|
+
TESTS::
|
|
14
|
+
|
|
15
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
16
|
+
sage: L = IntegerLattice(random_matrix(ZZ, 10, 10))
|
|
17
|
+
sage: TestSuite(L).run()
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
##############################################################################
|
|
21
|
+
# Copyright (C) 2012 Jan Poeschko <jan@poeschko.com>
|
|
22
|
+
# Copyright (C) 2014 Martin Albrecht <martinralbrecht@googlemail.com>
|
|
23
|
+
#
|
|
24
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
25
|
+
#
|
|
26
|
+
# This code is distributed in the hope that it will be useful,
|
|
27
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
28
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
29
|
+
# General Public License for more details.
|
|
30
|
+
#
|
|
31
|
+
# The full text of the GPL is available at:
|
|
32
|
+
#
|
|
33
|
+
# https://www.gnu.org/licenses/
|
|
34
|
+
##############################################################################
|
|
35
|
+
|
|
36
|
+
from sage.rings.integer_ring import ZZ
|
|
37
|
+
from sage.rings.rational_field import QQ
|
|
38
|
+
from sage.matrix.constructor import matrix
|
|
39
|
+
from sage.misc.cachefunc import cached_method
|
|
40
|
+
from sage.modules.free_module import FreeModule_submodule_with_basis_pid, FreeModule_ambient_pid
|
|
41
|
+
from sage.modules.free_module_element import vector
|
|
42
|
+
|
|
43
|
+
try:
|
|
44
|
+
from sage.rings.number_field.number_field_element import OrderElement_absolute
|
|
45
|
+
except ImportError:
|
|
46
|
+
OrderElement_absolute = ()
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def IntegerLattice(basis, lll_reduce=True):
|
|
50
|
+
r"""
|
|
51
|
+
Construct a new integer lattice from ``basis``.
|
|
52
|
+
|
|
53
|
+
INPUT:
|
|
54
|
+
|
|
55
|
+
- ``basis`` -- can be one of the following:
|
|
56
|
+
|
|
57
|
+
- a list of vectors
|
|
58
|
+
|
|
59
|
+
- a matrix over the integers
|
|
60
|
+
|
|
61
|
+
- an element of an absolute order
|
|
62
|
+
|
|
63
|
+
- ``lll_reduce`` -- boolean (default: ``True``); run LLL reduction on the basis
|
|
64
|
+
on construction
|
|
65
|
+
|
|
66
|
+
EXAMPLES:
|
|
67
|
+
|
|
68
|
+
We construct a lattice from a list of rows::
|
|
69
|
+
|
|
70
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
71
|
+
sage: IntegerLattice([[1,0,3], [0,2,1], [0,2,7]])
|
|
72
|
+
Free module of degree 3 and rank 3 over Integer Ring
|
|
73
|
+
User basis matrix:
|
|
74
|
+
[-2 0 0]
|
|
75
|
+
[ 0 2 1]
|
|
76
|
+
[ 1 -2 2]
|
|
77
|
+
|
|
78
|
+
Sage includes a generator for hard lattices from cryptography::
|
|
79
|
+
|
|
80
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
81
|
+
sage: A = sage.crypto.gen_lattice(type='modular', m=10, seed=1337, dual=True)
|
|
82
|
+
sage: IntegerLattice(A)
|
|
83
|
+
Free module of degree 10 and rank 10 over Integer Ring
|
|
84
|
+
User basis matrix:
|
|
85
|
+
[-1 1 2 -2 0 1 0 -1 2 1]
|
|
86
|
+
[ 1 0 0 -1 -2 1 -2 3 -1 0]
|
|
87
|
+
[ 1 2 0 2 -1 1 -2 2 2 0]
|
|
88
|
+
[ 1 0 -1 0 2 3 0 0 -1 -2]
|
|
89
|
+
[ 1 -3 0 0 2 1 -2 -1 0 0]
|
|
90
|
+
[-3 0 -1 0 -1 2 -2 0 0 2]
|
|
91
|
+
[ 0 0 0 1 0 2 -3 -3 -2 -1]
|
|
92
|
+
[ 0 -1 -4 -1 -1 1 2 -1 0 1]
|
|
93
|
+
[ 1 1 -2 1 1 2 1 1 -2 3]
|
|
94
|
+
[ 2 -1 1 2 -3 2 2 1 0 1]
|
|
95
|
+
|
|
96
|
+
You can also construct the lattice directly::
|
|
97
|
+
|
|
98
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
99
|
+
sage: sage.crypto.gen_lattice(type='modular', m=10, seed=1337, dual=True, lattice=True)
|
|
100
|
+
Free module of degree 10 and rank 10 over Integer Ring
|
|
101
|
+
User basis matrix:
|
|
102
|
+
[-1 1 2 -2 0 1 0 -1 2 1]
|
|
103
|
+
[ 1 0 0 -1 -2 1 -2 3 -1 0]
|
|
104
|
+
[ 1 2 0 2 -1 1 -2 2 2 0]
|
|
105
|
+
[ 1 0 -1 0 2 3 0 0 -1 -2]
|
|
106
|
+
[ 1 -3 0 0 2 1 -2 -1 0 0]
|
|
107
|
+
[-3 0 -1 0 -1 2 -2 0 0 2]
|
|
108
|
+
[ 0 0 0 1 0 2 -3 -3 -2 -1]
|
|
109
|
+
[ 0 -1 -4 -1 -1 1 2 -1 0 1]
|
|
110
|
+
[ 1 1 -2 1 1 2 1 1 -2 3]
|
|
111
|
+
[ 2 -1 1 2 -3 2 2 1 0 1]
|
|
112
|
+
|
|
113
|
+
We construct an ideal lattice from an element of an absolute order::
|
|
114
|
+
|
|
115
|
+
sage: # needs sage.rings.number_field
|
|
116
|
+
sage: K.<a> = CyclotomicField(17)
|
|
117
|
+
sage: O = K.ring_of_integers()
|
|
118
|
+
sage: f = O(-a^15 + a^13 + 4*a^12 - 12*a^11 - 256*a^10 + a^9 - a^7
|
|
119
|
+
....: - 4*a^6 + a^5 + 210*a^4 + 2*a^3 - 2*a^2 + 2*a - 2)
|
|
120
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
121
|
+
sage: IntegerLattice(f)
|
|
122
|
+
Free module of degree 16 and rank 16 over Integer Ring
|
|
123
|
+
User basis matrix:
|
|
124
|
+
[ -2 2 -2 2 210 1 -4 -1 0 1 -256 -12 4 1 0 -1]
|
|
125
|
+
[ 33 48 44 48 256 -209 28 51 45 49 -1 35 44 48 44 48]
|
|
126
|
+
[ 1 -1 3 -1 3 211 2 -3 0 1 2 -255 -11 5 2 1]
|
|
127
|
+
[-223 34 50 47 258 0 29 45 46 47 2 -11 33 48 44 48]
|
|
128
|
+
[ -13 31 46 42 46 -2 -225 32 48 45 256 -2 27 43 44 45]
|
|
129
|
+
[ -16 33 42 46 254 1 -19 32 44 45 0 -13 -225 32 48 45]
|
|
130
|
+
[ -15 -223 30 50 255 1 -20 32 42 47 -2 -11 -15 33 44 44]
|
|
131
|
+
[ -11 -11 33 48 256 3 -17 -222 32 53 1 -9 -14 35 44 48]
|
|
132
|
+
[ -12 -13 32 45 257 0 -16 -13 32 48 -1 -10 -14 -222 31 51]
|
|
133
|
+
[ -9 -13 -221 32 52 1 -11 -12 33 46 258 1 -15 -12 33 49]
|
|
134
|
+
[ -5 -2 -1 0 -257 -13 3 0 -1 -2 -1 -3 1 -3 1 209]
|
|
135
|
+
[ -15 -11 -15 33 256 -1 -17 -14 -225 33 4 -12 -13 -14 31 44]
|
|
136
|
+
[ 11 11 11 11 -245 -3 17 10 13 220 12 5 12 9 14 -35]
|
|
137
|
+
[ -18 -15 -20 29 250 -3 -23 -16 -19 30 -4 -17 -17 -17 -229 28]
|
|
138
|
+
[ -15 -11 -15 -223 242 5 -18 -12 -16 34 -2 -11 -15 -11 -15 33]
|
|
139
|
+
[ 378 120 92 147 152 462 136 96 99 144 -52 412 133 91 -107 138]
|
|
140
|
+
|
|
141
|
+
We construct `\ZZ^n`::
|
|
142
|
+
|
|
143
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
144
|
+
sage: IntegerLattice(ZZ^10)
|
|
145
|
+
Free module of degree 10 and rank 10 over Integer Ring
|
|
146
|
+
User basis matrix:
|
|
147
|
+
[1 0 0 0 0 0 0 0 0 0]
|
|
148
|
+
[0 1 0 0 0 0 0 0 0 0]
|
|
149
|
+
[0 0 1 0 0 0 0 0 0 0]
|
|
150
|
+
[0 0 0 1 0 0 0 0 0 0]
|
|
151
|
+
[0 0 0 0 1 0 0 0 0 0]
|
|
152
|
+
[0 0 0 0 0 1 0 0 0 0]
|
|
153
|
+
[0 0 0 0 0 0 1 0 0 0]
|
|
154
|
+
[0 0 0 0 0 0 0 1 0 0]
|
|
155
|
+
[0 0 0 0 0 0 0 0 1 0]
|
|
156
|
+
[0 0 0 0 0 0 0 0 0 1]
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
Sage also interfaces with fpylll's lattice generator::
|
|
160
|
+
|
|
161
|
+
sage: # needs fpylll
|
|
162
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
163
|
+
sage: from fpylll import IntegerMatrix
|
|
164
|
+
sage: A = IntegerMatrix.random(8, "simdioph", bits=20, bits2=10)
|
|
165
|
+
sage: A = A.to_matrix(matrix(ZZ, 8, 8))
|
|
166
|
+
sage: IntegerLattice(A, lll_reduce=False)
|
|
167
|
+
Free module of degree 8 and rank 8 over Integer Ring
|
|
168
|
+
User basis matrix:
|
|
169
|
+
[ 1024 829556 161099 11567 521155 769480 639201 689979]
|
|
170
|
+
[ 0 1048576 0 0 0 0 0 0]
|
|
171
|
+
[ 0 0 1048576 0 0 0 0 0]
|
|
172
|
+
[ 0 0 0 1048576 0 0 0 0]
|
|
173
|
+
[ 0 0 0 0 1048576 0 0 0]
|
|
174
|
+
[ 0 0 0 0 0 1048576 0 0]
|
|
175
|
+
[ 0 0 0 0 0 0 1048576 0]
|
|
176
|
+
[ 0 0 0 0 0 0 0 1048576]
|
|
177
|
+
"""
|
|
178
|
+
|
|
179
|
+
if isinstance(basis, OrderElement_absolute):
|
|
180
|
+
basis = basis.matrix()
|
|
181
|
+
elif isinstance(basis, FreeModule_ambient_pid):
|
|
182
|
+
basis = basis.basis_matrix()
|
|
183
|
+
|
|
184
|
+
try:
|
|
185
|
+
basis = matrix(ZZ, basis)
|
|
186
|
+
except TypeError:
|
|
187
|
+
raise NotImplementedError("only integer lattices supported")
|
|
188
|
+
|
|
189
|
+
return FreeModule_submodule_with_basis_integer(ZZ**basis.ncols(),
|
|
190
|
+
basis=basis,
|
|
191
|
+
lll_reduce=lll_reduce)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
class FreeModule_submodule_with_basis_integer(FreeModule_submodule_with_basis_pid):
|
|
195
|
+
r"""
|
|
196
|
+
This class represents submodules of `\ZZ^n` with a distinguished basis.
|
|
197
|
+
|
|
198
|
+
However, most functionality in excess of standard submodules over PID
|
|
199
|
+
is for these submodules considered as discrete subgroups of `\ZZ^n`, i.e.
|
|
200
|
+
as lattices. That is, this class provides functions for computing LLL
|
|
201
|
+
and BKZ reduced bases for this free module with respect to the standard
|
|
202
|
+
Euclidean norm.
|
|
203
|
+
|
|
204
|
+
EXAMPLES::
|
|
205
|
+
|
|
206
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
207
|
+
sage: L = IntegerLattice(sage.crypto.gen_lattice(type='modular', m=10,
|
|
208
|
+
....: seed=1337, dual=True)); L
|
|
209
|
+
Free module of degree 10 and rank 10 over Integer Ring
|
|
210
|
+
User basis matrix:
|
|
211
|
+
[-1 1 2 -2 0 1 0 -1 2 1]
|
|
212
|
+
[ 1 0 0 -1 -2 1 -2 3 -1 0]
|
|
213
|
+
[ 1 2 0 2 -1 1 -2 2 2 0]
|
|
214
|
+
[ 1 0 -1 0 2 3 0 0 -1 -2]
|
|
215
|
+
[ 1 -3 0 0 2 1 -2 -1 0 0]
|
|
216
|
+
[-3 0 -1 0 -1 2 -2 0 0 2]
|
|
217
|
+
[ 0 0 0 1 0 2 -3 -3 -2 -1]
|
|
218
|
+
[ 0 -1 -4 -1 -1 1 2 -1 0 1]
|
|
219
|
+
[ 1 1 -2 1 1 2 1 1 -2 3]
|
|
220
|
+
[ 2 -1 1 2 -3 2 2 1 0 1]
|
|
221
|
+
sage: L.shortest_vector()
|
|
222
|
+
(-1, 1, 2, -2, 0, 1, 0, -1, 2, 1)
|
|
223
|
+
"""
|
|
224
|
+
def __init__(self, ambient, basis, check=True, echelonize=False,
|
|
225
|
+
echelonized_basis=None, already_echelonized=False,
|
|
226
|
+
lll_reduce=True):
|
|
227
|
+
r"""
|
|
228
|
+
Construct a new submodule of `\ZZ^n` with a distinguished basis.
|
|
229
|
+
|
|
230
|
+
INPUT:
|
|
231
|
+
|
|
232
|
+
- ``ambient`` -- ambient free module over a principal ideal domain
|
|
233
|
+
`\ZZ`, i.e. `\ZZ^n`
|
|
234
|
+
|
|
235
|
+
- ``basis`` -- either a list of vectors or a matrix over the integers
|
|
236
|
+
|
|
237
|
+
- ``check`` -- boolean (default: ``True``); if ``False``, correctness
|
|
238
|
+
of the input will not be checked and type conversion may be omitted,
|
|
239
|
+
use with care
|
|
240
|
+
|
|
241
|
+
- ``echelonize`` -- (default: ``False``) if ``True``, ``basis`` will be
|
|
242
|
+
echelonized and the result will be used as the default basis of the
|
|
243
|
+
constructed submodule
|
|
244
|
+
|
|
245
|
+
- ``echelonized_basis`` -- (default: ``None``) if not ``None``, must
|
|
246
|
+
be the echelonized basis spanning the same submodule as ``basis``
|
|
247
|
+
|
|
248
|
+
- ``already_echelonized`` -- boolean (default: ``False``); if ``True``,
|
|
249
|
+
``basis`` must be already given in the echelonized form
|
|
250
|
+
|
|
251
|
+
- ``lll_reduce`` -- boolean (default: ``True``); run LLL reduction on the basis
|
|
252
|
+
on construction
|
|
253
|
+
|
|
254
|
+
EXAMPLES::
|
|
255
|
+
|
|
256
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
257
|
+
sage: IntegerLattice([[1,0,-2], [0,2,5], [0,0,7]])
|
|
258
|
+
Free module of degree 3 and rank 3 over Integer Ring
|
|
259
|
+
User basis matrix:
|
|
260
|
+
[ 1 0 -2]
|
|
261
|
+
[ 1 -2 0]
|
|
262
|
+
[ 2 2 1]
|
|
263
|
+
|
|
264
|
+
sage: M = random_matrix(ZZ, 5, 5, x=-2^20, y=2^20)
|
|
265
|
+
sage: L = IntegerLattice(M)
|
|
266
|
+
sage: M.row_space() == L.matrix().row_space()
|
|
267
|
+
True
|
|
268
|
+
|
|
269
|
+
sage: # needs sage.rings.number_field
|
|
270
|
+
sage: x = polygen(ZZ, 'x')
|
|
271
|
+
sage: K.<a> = NumberField(x^8 + 1)
|
|
272
|
+
sage: O = K.ring_of_integers()
|
|
273
|
+
sage: f = O(a^7 - a^6 + 4*a^5 - a^4 + a^3 + 1)
|
|
274
|
+
sage: IntegerLattice(f)
|
|
275
|
+
Free module of degree 8 and rank 8 over Integer Ring
|
|
276
|
+
User basis matrix:
|
|
277
|
+
[ 0 1 0 1 0 3 3 0]
|
|
278
|
+
[ 1 0 0 1 -1 4 -1 1]
|
|
279
|
+
[ 0 0 1 0 1 0 3 3]
|
|
280
|
+
[-4 1 -1 1 0 0 1 -1]
|
|
281
|
+
[ 1 -3 0 0 0 3 0 -2]
|
|
282
|
+
[ 0 -1 1 -4 1 -1 1 0]
|
|
283
|
+
[ 2 0 -3 -1 0 -3 0 0]
|
|
284
|
+
[-1 0 -1 0 -3 -3 0 0]
|
|
285
|
+
"""
|
|
286
|
+
basis = matrix(ZZ, basis)
|
|
287
|
+
self._basis_is_LLL_reduced = False
|
|
288
|
+
|
|
289
|
+
if lll_reduce:
|
|
290
|
+
basis = matrix([v for v in basis.LLL() if v])
|
|
291
|
+
self._basis_is_LLL_reduced = True
|
|
292
|
+
|
|
293
|
+
basis.set_immutable()
|
|
294
|
+
FreeModule_submodule_with_basis_pid.__init__(self,
|
|
295
|
+
ambient=ambient,
|
|
296
|
+
basis=basis,
|
|
297
|
+
check=check,
|
|
298
|
+
echelonize=echelonize,
|
|
299
|
+
echelonized_basis=echelonized_basis,
|
|
300
|
+
already_echelonized=already_echelonized)
|
|
301
|
+
|
|
302
|
+
self._reduced_basis = basis.change_ring(ZZ)
|
|
303
|
+
|
|
304
|
+
@property
|
|
305
|
+
def reduced_basis(self):
|
|
306
|
+
"""
|
|
307
|
+
This attribute caches the currently best known reduced basis for
|
|
308
|
+
``self``, where "best" is defined by the Euclidean norm of the
|
|
309
|
+
first row vector.
|
|
310
|
+
|
|
311
|
+
EXAMPLES::
|
|
312
|
+
|
|
313
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
314
|
+
sage: M = random_matrix(ZZ, 10, 10)
|
|
315
|
+
sage: while M.rank() < 10:
|
|
316
|
+
....: M = random_matrix(ZZ, 10, 10)
|
|
317
|
+
sage: L = IntegerLattice(M, lll_reduce=False)
|
|
318
|
+
sage: L.reduced_basis == M
|
|
319
|
+
True
|
|
320
|
+
|
|
321
|
+
sage: LLL = L.LLL()
|
|
322
|
+
sage: LLL == L.reduced_basis or bool(LLL[0].norm() >= M[0].norm()) # needs sage.symbolic
|
|
323
|
+
True
|
|
324
|
+
"""
|
|
325
|
+
return self._reduced_basis
|
|
326
|
+
|
|
327
|
+
def LLL(self, *args, **kwds):
|
|
328
|
+
r"""
|
|
329
|
+
Return an LLL reduced basis for ``self``.
|
|
330
|
+
|
|
331
|
+
A lattice basis `(b_1, b_2, ..., b_d)` is `(\delta, \eta)`-LLL-reduced
|
|
332
|
+
if the two following conditions hold:
|
|
333
|
+
|
|
334
|
+
- For any `i > j`, we have `\lvert \mu_{i, j} \rvert \leq \eta`.
|
|
335
|
+
|
|
336
|
+
- For any `i < d`, we have
|
|
337
|
+
`\delta \lvert b_i^* \rvert^2 \leq \lvert b_{i+1}^* +
|
|
338
|
+
\mu_{i+1, i} b_i^* \rvert^2`,
|
|
339
|
+
|
|
340
|
+
where `\mu_{i,j} = \langle b_i, b_j^* \rangle / \langle b_j^*,b_j^*
|
|
341
|
+
\rangle` and `b_i^*` is the `i`-th vector of the Gram-Schmidt
|
|
342
|
+
orthogonalisation of `(b_1, b_2, \ldots, b_d)`.
|
|
343
|
+
|
|
344
|
+
The default reduction parameters are `\delta = 0.99` and
|
|
345
|
+
`\eta = 0.501`.
|
|
346
|
+
|
|
347
|
+
The parameters `\delta` and `\eta` must satisfy:
|
|
348
|
+
`0.25 < \delta \leq 1.0` and `0.5 \leq \eta < \sqrt{\delta}`.
|
|
349
|
+
Polynomial time complexity is only guaranteed for `\delta < 1`.
|
|
350
|
+
Not every algorithm admits the case `\delta = 1`.
|
|
351
|
+
|
|
352
|
+
INPUT:
|
|
353
|
+
|
|
354
|
+
- ``*args`` -- passed through to
|
|
355
|
+
:meth:`sage.matrix.matrix_integer_dense.Matrix_integer_dense.LLL`
|
|
356
|
+
|
|
357
|
+
- ``**kwds`` -- passed through to
|
|
358
|
+
:meth:`sage.matrix.matrix_integer_dense.Matrix_integer_dense.LLL`
|
|
359
|
+
|
|
360
|
+
OUTPUT: integer matrix which is an LLL-reduced basis for this lattice
|
|
361
|
+
|
|
362
|
+
EXAMPLES::
|
|
363
|
+
|
|
364
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
365
|
+
sage: A = random_matrix(ZZ, 10, 10, x=-2000, y=2000)
|
|
366
|
+
sage: while A.rank() < 10:
|
|
367
|
+
....: A = random_matrix(ZZ, 10, 10)
|
|
368
|
+
sage: L = IntegerLattice(A, lll_reduce=False); L
|
|
369
|
+
Free module of degree 10 and rank 10 over Integer Ring
|
|
370
|
+
User basis matrix:
|
|
371
|
+
...
|
|
372
|
+
sage: L.reduced_basis == A
|
|
373
|
+
True
|
|
374
|
+
sage: old = L.reduced_basis[0].norm().n() # needs sage.symbolic
|
|
375
|
+
sage: _ = L.LLL()
|
|
376
|
+
sage: new = L.reduced_basis[0].norm().n() # needs sage.symbolic
|
|
377
|
+
sage: new <= old # needs sage.symbolic
|
|
378
|
+
True
|
|
379
|
+
"""
|
|
380
|
+
basis = self.reduced_basis
|
|
381
|
+
basis = [v for v in basis.LLL(*args, **kwds) if v]
|
|
382
|
+
basis = matrix(ZZ, len(basis), len(basis[0]), basis)
|
|
383
|
+
basis.set_immutable()
|
|
384
|
+
|
|
385
|
+
b0 = basis[0]
|
|
386
|
+
rb0 = self.reduced_basis[0]
|
|
387
|
+
|
|
388
|
+
if rb0.dot_product(rb0) > b0.dot_product(b0):
|
|
389
|
+
self._reduced_basis = basis
|
|
390
|
+
return basis
|
|
391
|
+
|
|
392
|
+
def BKZ(self, *args, **kwds):
|
|
393
|
+
"""
|
|
394
|
+
Return a Block Korkine-Zolotareff reduced basis for ``self``.
|
|
395
|
+
|
|
396
|
+
INPUT:
|
|
397
|
+
|
|
398
|
+
- ``*args`` -- passed through to
|
|
399
|
+
:meth:`sage.matrix.matrix_integer_dense.Matrix_integer_dense.BKZ`
|
|
400
|
+
|
|
401
|
+
- ``*kwds`` -- passed through to
|
|
402
|
+
:meth:`sage.matrix.matrix_integer_dense.Matrix_integer_dense.BKZ`
|
|
403
|
+
|
|
404
|
+
OUTPUT: integer matrix which is a BKZ-reduced basis for this lattice
|
|
405
|
+
|
|
406
|
+
EXAMPLES::
|
|
407
|
+
|
|
408
|
+
sage: # needs sage.libs.linbox (o/w timeout)
|
|
409
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
410
|
+
sage: A = sage.crypto.gen_lattice(type='random', n=1, m=60, q=2^60, seed=42)
|
|
411
|
+
sage: L = IntegerLattice(A, lll_reduce=False)
|
|
412
|
+
sage: min(v.norm().n() for v in L.reduced_basis) # needs sage.symbolic
|
|
413
|
+
4.17330740711759e15
|
|
414
|
+
sage: L.LLL()
|
|
415
|
+
60 x 60 dense matrix over Integer Ring (use the '.str()' method to see the entries)
|
|
416
|
+
sage: min(v.norm().n() for v in L.reduced_basis) # needs sage.symbolic
|
|
417
|
+
5.19615242270663
|
|
418
|
+
sage: L.BKZ(block_size=10)
|
|
419
|
+
60 x 60 dense matrix over Integer Ring (use the '.str()' method to see the entries)
|
|
420
|
+
sage: min(v.norm().n() for v in L.reduced_basis) # needs sage.symbolic
|
|
421
|
+
4.12310562561766
|
|
422
|
+
|
|
423
|
+
.. NOTE::
|
|
424
|
+
|
|
425
|
+
If ``block_size == L.rank()`` where ``L`` is this lattice, then
|
|
426
|
+
this function performs Hermite-Korkine-Zolotareff (HKZ) reduction.
|
|
427
|
+
"""
|
|
428
|
+
basis = self.reduced_basis
|
|
429
|
+
basis = [v for v in basis.BKZ(*args, **kwds) if v]
|
|
430
|
+
basis = matrix(ZZ, len(basis), len(basis[0]), basis)
|
|
431
|
+
basis.set_immutable()
|
|
432
|
+
|
|
433
|
+
if self.reduced_basis[0].dot_product(self.reduced_basis[0]) > basis[0].dot_product(basis[0]):
|
|
434
|
+
self._reduced_basis = basis
|
|
435
|
+
return basis
|
|
436
|
+
|
|
437
|
+
def HKZ(self, *args, **kwds):
|
|
438
|
+
r"""
|
|
439
|
+
Hermite-Korkine-Zolotarev (HKZ) reduce the basis.
|
|
440
|
+
|
|
441
|
+
A basis `B` of a lattice `L`, with orthogonalized basis `B^*` such
|
|
442
|
+
that `B = M \cdot B^*` is HKZ reduced, if and only if, the following
|
|
443
|
+
properties are satisfied:
|
|
444
|
+
|
|
445
|
+
#. The basis `B` is size-reduced, i.e., all off-diagonal
|
|
446
|
+
coefficients of `M` satisfy `|\mu_{i,j}| \leq 1/2`
|
|
447
|
+
|
|
448
|
+
#. The vector `b_1` realizes the first minimum `\lambda_1(L)`.
|
|
449
|
+
|
|
450
|
+
#. The projection of the vectors `b_2, \ldots,b_r` orthogonally to
|
|
451
|
+
`b_1` form an HKZ reduced basis.
|
|
452
|
+
|
|
453
|
+
.. NOTE::
|
|
454
|
+
|
|
455
|
+
This is realized by calling
|
|
456
|
+
:func:`sage.modules.free_module_integer.FreeModule_submodule_with_basis_integer.BKZ` with
|
|
457
|
+
``block_size == self.rank()``.
|
|
458
|
+
|
|
459
|
+
INPUT:
|
|
460
|
+
|
|
461
|
+
- ``*args`` -- passed through to :meth:`BKZ`
|
|
462
|
+
|
|
463
|
+
- ``*kwds`` -- passed through to :meth:`BKZ`
|
|
464
|
+
|
|
465
|
+
OUTPUT: integer matrix which is a HKZ-reduced basis for this lattice
|
|
466
|
+
|
|
467
|
+
EXAMPLES::
|
|
468
|
+
|
|
469
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
470
|
+
sage: L = sage.crypto.gen_lattice(type='random', n=1, m=40, q=2^60, seed=1337, lattice=True)
|
|
471
|
+
sage: L.HKZ()
|
|
472
|
+
40 x 40 dense matrix over Integer Ring (use the '.str()' method to see the entries)
|
|
473
|
+
|
|
474
|
+
sage: L.reduced_basis[0]
|
|
475
|
+
(0, 0, -1, -1, 0, 0, -1, 1, 0, 0, -1, 1, 1, 0, 0, 1, 1, 1, -1, 0, 0, 1, -1, 0, 0, -1, 0, 0, 1, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, -2)
|
|
476
|
+
"""
|
|
477
|
+
return self.BKZ(block_size=self.rank())
|
|
478
|
+
|
|
479
|
+
@cached_method
|
|
480
|
+
def volume(self):
|
|
481
|
+
r"""
|
|
482
|
+
Return `vol(L)` which is `\sqrt{\det(B \cdot B^T)}` for any basis `B`.
|
|
483
|
+
|
|
484
|
+
OUTPUT: integer
|
|
485
|
+
|
|
486
|
+
EXAMPLES::
|
|
487
|
+
|
|
488
|
+
sage: L = sage.crypto.gen_lattice(m=10, seed=1337, lattice=True)
|
|
489
|
+
sage: L.volume()
|
|
490
|
+
14641
|
|
491
|
+
"""
|
|
492
|
+
if self.rank() == self.degree():
|
|
493
|
+
return abs(self.reduced_basis.determinant())
|
|
494
|
+
else:
|
|
495
|
+
return self.gram_matrix().determinant().sqrt()
|
|
496
|
+
|
|
497
|
+
@cached_method
|
|
498
|
+
def discriminant(self):
|
|
499
|
+
r"""
|
|
500
|
+
Return `|\det(G)|`, i.e. the absolute value of the determinant of the
|
|
501
|
+
Gram matrix `B \cdot B^T` for any basis `B`.
|
|
502
|
+
|
|
503
|
+
OUTPUT: integer
|
|
504
|
+
|
|
505
|
+
EXAMPLES::
|
|
506
|
+
|
|
507
|
+
sage: L = sage.crypto.gen_lattice(m=10, seed=1337, lattice=True)
|
|
508
|
+
sage: L.discriminant()
|
|
509
|
+
214358881
|
|
510
|
+
"""
|
|
511
|
+
return abs(self.gram_matrix().determinant())
|
|
512
|
+
|
|
513
|
+
@cached_method
|
|
514
|
+
def is_unimodular(self) -> bool:
|
|
515
|
+
"""
|
|
516
|
+
Return ``True`` if this lattice is unimodular.
|
|
517
|
+
|
|
518
|
+
OUTPUT: boolean
|
|
519
|
+
|
|
520
|
+
EXAMPLES::
|
|
521
|
+
|
|
522
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
523
|
+
sage: L = IntegerLattice([[1, 0], [0, 1]])
|
|
524
|
+
sage: L.is_unimodular()
|
|
525
|
+
True
|
|
526
|
+
sage: IntegerLattice([[2, 0], [0, 3]]).is_unimodular()
|
|
527
|
+
False
|
|
528
|
+
"""
|
|
529
|
+
return self.volume() == 1
|
|
530
|
+
|
|
531
|
+
@cached_method
|
|
532
|
+
def shortest_vector(self, update_reduced_basis=True, algorithm='fplll', *args, **kwds):
|
|
533
|
+
r"""
|
|
534
|
+
Return a shortest vector.
|
|
535
|
+
|
|
536
|
+
INPUT:
|
|
537
|
+
|
|
538
|
+
- ``update_reduced_basis`` -- boolean (default: ``True``); set this
|
|
539
|
+
flag if the found vector should be used to improve the basis
|
|
540
|
+
|
|
541
|
+
- ``algorithm`` -- (default: ``'fplll'``) either ``'fplll'`` or
|
|
542
|
+
``'pari'``
|
|
543
|
+
|
|
544
|
+
- ``*args`` -- passed through to underlying implementation
|
|
545
|
+
|
|
546
|
+
- ``**kwds`` -- passed through to underlying implementation
|
|
547
|
+
|
|
548
|
+
OUTPUT: a shortest nonzero vector for this lattice
|
|
549
|
+
|
|
550
|
+
EXAMPLES::
|
|
551
|
+
|
|
552
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
553
|
+
sage: A = sage.crypto.gen_lattice(type='random', n=1, m=30, q=2^40, seed=42)
|
|
554
|
+
sage: L = IntegerLattice(A, lll_reduce=False)
|
|
555
|
+
sage: min(v.norm().n() for v in L.reduced_basis) # needs sage.symbolic
|
|
556
|
+
6.03890756700000e10
|
|
557
|
+
|
|
558
|
+
sage: L.shortest_vector().norm().n() # needs sage.symbolic
|
|
559
|
+
3.74165738677394
|
|
560
|
+
|
|
561
|
+
sage: L = IntegerLattice(A, lll_reduce=False)
|
|
562
|
+
sage: min(v.norm().n() for v in L.reduced_basis) # needs sage.symbolic
|
|
563
|
+
6.03890756700000e10
|
|
564
|
+
|
|
565
|
+
sage: L.shortest_vector(algorithm='pari').norm().n() # needs sage.symbolic
|
|
566
|
+
3.74165738677394
|
|
567
|
+
|
|
568
|
+
sage: L = IntegerLattice(A, lll_reduce=True)
|
|
569
|
+
sage: L.shortest_vector(algorithm='pari').norm().n() # needs sage.symbolic
|
|
570
|
+
3.74165738677394
|
|
571
|
+
"""
|
|
572
|
+
if algorithm == "pari":
|
|
573
|
+
if self._basis_is_LLL_reduced:
|
|
574
|
+
B = self.basis_matrix().change_ring(ZZ)
|
|
575
|
+
qf = self.gram_matrix()
|
|
576
|
+
else:
|
|
577
|
+
B = self.reduced_basis.LLL()
|
|
578
|
+
qf = B*B.transpose()
|
|
579
|
+
|
|
580
|
+
count, length, vectors = qf.__pari__().qfminim()
|
|
581
|
+
v = vectors.sage().columns()[0]
|
|
582
|
+
w = v*B
|
|
583
|
+
elif algorithm == "fplll":
|
|
584
|
+
from fpylll import IntegerMatrix, SVP
|
|
585
|
+
L = IntegerMatrix.from_matrix(self.reduced_basis)
|
|
586
|
+
w = vector(ZZ, SVP.shortest_vector(L, *args, **kwds))
|
|
587
|
+
|
|
588
|
+
else:
|
|
589
|
+
raise ValueError("algorithm '{}' unknown".format(algorithm))
|
|
590
|
+
|
|
591
|
+
if update_reduced_basis:
|
|
592
|
+
self.update_reduced_basis(w)
|
|
593
|
+
return w
|
|
594
|
+
|
|
595
|
+
def update_reduced_basis(self, w):
|
|
596
|
+
"""
|
|
597
|
+
Inject the vector ``w`` and run LLL to update the basis.
|
|
598
|
+
|
|
599
|
+
INPUT:
|
|
600
|
+
|
|
601
|
+
- ``w`` -- a vector
|
|
602
|
+
|
|
603
|
+
OUTPUT: nothing is returned but the internal state is modified
|
|
604
|
+
|
|
605
|
+
EXAMPLES::
|
|
606
|
+
|
|
607
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
608
|
+
sage: A = sage.crypto.gen_lattice(type='random', n=1, m=30, q=2^40, seed=42)
|
|
609
|
+
sage: L = IntegerLattice(A)
|
|
610
|
+
sage: B = L.reduced_basis
|
|
611
|
+
sage: v = L.shortest_vector(update_reduced_basis=False)
|
|
612
|
+
sage: L.update_reduced_basis(v)
|
|
613
|
+
sage: bool(L.reduced_basis[0].norm() < B[0].norm()) # needs sage.symbolic
|
|
614
|
+
True
|
|
615
|
+
"""
|
|
616
|
+
w = matrix(ZZ, w)
|
|
617
|
+
L = w.stack(self.reduced_basis).LLL()
|
|
618
|
+
assert L[0] == 0
|
|
619
|
+
self._reduced_basis = L.matrix_from_rows(range(1, L.nrows()))
|
|
620
|
+
|
|
621
|
+
@cached_method
|
|
622
|
+
def voronoi_cell(self, radius=None):
|
|
623
|
+
"""
|
|
624
|
+
Compute the Voronoi cell of a lattice, returning a Polyhedron.
|
|
625
|
+
|
|
626
|
+
INPUT:
|
|
627
|
+
|
|
628
|
+
- ``radius`` -- (default: automatic determination) radius of ball
|
|
629
|
+
containing considered vertices
|
|
630
|
+
|
|
631
|
+
OUTPUT: the Voronoi cell as a Polyhedron instance
|
|
632
|
+
|
|
633
|
+
The result is cached so that subsequent calls to this function
|
|
634
|
+
return instantly.
|
|
635
|
+
|
|
636
|
+
EXAMPLES::
|
|
637
|
+
|
|
638
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
639
|
+
sage: L = IntegerLattice([[1, 0], [0, 1]])
|
|
640
|
+
sage: V = L.voronoi_cell()
|
|
641
|
+
sage: V.Vrepresentation()
|
|
642
|
+
(A vertex at (1/2, -1/2),
|
|
643
|
+
A vertex at (1/2, 1/2),
|
|
644
|
+
A vertex at (-1/2, 1/2),
|
|
645
|
+
A vertex at (-1/2, -1/2))
|
|
646
|
+
|
|
647
|
+
The volume of the Voronoi cell is the square root of the
|
|
648
|
+
discriminant of the lattice::
|
|
649
|
+
|
|
650
|
+
sage: L = IntegerLattice(Matrix(ZZ, 4, 4, [[0,0,1,-1], [1,-1,2,1],
|
|
651
|
+
....: [-6,0,3,3,], [-6,-24,-6,-5]])); L
|
|
652
|
+
Free module of degree 4 and rank 4 over Integer Ring
|
|
653
|
+
User basis matrix:
|
|
654
|
+
[ 0 0 1 -1]
|
|
655
|
+
[ 1 -1 2 1]
|
|
656
|
+
[ -6 0 3 3]
|
|
657
|
+
[ -6 -24 -6 -5]
|
|
658
|
+
sage: V = L.voronoi_cell() # long time
|
|
659
|
+
sage: V.volume() # long time
|
|
660
|
+
678
|
|
661
|
+
sage: sqrt(L.discriminant())
|
|
662
|
+
678
|
|
663
|
+
|
|
664
|
+
Lattices not having full dimension are handled as well::
|
|
665
|
+
|
|
666
|
+
sage: L = IntegerLattice([[2, 0, 0], [0, 2, 0]])
|
|
667
|
+
sage: V = L.voronoi_cell()
|
|
668
|
+
sage: V.Hrepresentation()
|
|
669
|
+
(An inequality (-1, 0, 0) x + 1 >= 0,
|
|
670
|
+
An inequality (0, -1, 0) x + 1 >= 0,
|
|
671
|
+
An inequality (1, 0, 0) x + 1 >= 0,
|
|
672
|
+
An inequality (0, 1, 0) x + 1 >= 0)
|
|
673
|
+
|
|
674
|
+
ALGORITHM:
|
|
675
|
+
|
|
676
|
+
Uses parts of the algorithm from [VB1996]_.
|
|
677
|
+
"""
|
|
678
|
+
if not self._basis_is_LLL_reduced:
|
|
679
|
+
self.LLL()
|
|
680
|
+
|
|
681
|
+
B = self.reduced_basis
|
|
682
|
+
|
|
683
|
+
from .diamond_cutting import calculate_voronoi_cell
|
|
684
|
+
return calculate_voronoi_cell(B, radius=radius)
|
|
685
|
+
|
|
686
|
+
def voronoi_relevant_vectors(self):
|
|
687
|
+
"""
|
|
688
|
+
Compute the embedded vectors inducing the Voronoi cell.
|
|
689
|
+
|
|
690
|
+
OUTPUT: the list of Voronoi relevant vectors
|
|
691
|
+
|
|
692
|
+
EXAMPLES::
|
|
693
|
+
|
|
694
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
695
|
+
sage: L = IntegerLattice([[3, 0], [4, 0]])
|
|
696
|
+
sage: L.voronoi_relevant_vectors()
|
|
697
|
+
[(-1, 0), (1, 0)]
|
|
698
|
+
"""
|
|
699
|
+
V = self.voronoi_cell()
|
|
700
|
+
|
|
701
|
+
def defining_point(ieq):
|
|
702
|
+
"""
|
|
703
|
+
Compute the point defining an inequality.
|
|
704
|
+
|
|
705
|
+
INPUT:
|
|
706
|
+
|
|
707
|
+
- ``ieq`` -- an inequality in the form [c, a1, a2, ...]
|
|
708
|
+
meaning a1 * x1 + a2 * x2 + ... ≦ c
|
|
709
|
+
|
|
710
|
+
OUTPUT:
|
|
711
|
+
|
|
712
|
+
The point orthogonal to the hyperplane defined by ``ieq``
|
|
713
|
+
in twice the distance from the origin.
|
|
714
|
+
"""
|
|
715
|
+
c = ieq[0]
|
|
716
|
+
a = ieq[1:]
|
|
717
|
+
n = sum(y ** 2 for y in a)
|
|
718
|
+
return vector([2 * y * c / n for y in a])
|
|
719
|
+
|
|
720
|
+
return [defining_point(ieq) for ieq in V.inequality_generator()]
|
|
721
|
+
|
|
722
|
+
def closest_vector(self, t):
|
|
723
|
+
"""
|
|
724
|
+
Compute the closest vector in the embedded lattice to a given vector.
|
|
725
|
+
|
|
726
|
+
INPUT:
|
|
727
|
+
|
|
728
|
+
- ``t`` -- the target vector to compute the closest vector to
|
|
729
|
+
|
|
730
|
+
OUTPUT: the vector in the lattice closest to ``t``
|
|
731
|
+
|
|
732
|
+
EXAMPLES::
|
|
733
|
+
|
|
734
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
735
|
+
sage: L = IntegerLattice([[1, 0], [0, 1]])
|
|
736
|
+
sage: L.closest_vector((-6, 5/3))
|
|
737
|
+
(-6, 2)
|
|
738
|
+
|
|
739
|
+
ALGORITHM:
|
|
740
|
+
|
|
741
|
+
Uses the algorithm from [MV2010]_.
|
|
742
|
+
|
|
743
|
+
TESTS:
|
|
744
|
+
|
|
745
|
+
Check that the example from :issue:`29866` works::
|
|
746
|
+
|
|
747
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
748
|
+
sage: M = matrix(ZZ, [[20957228, -4966110], [9411844, 19625639]])
|
|
749
|
+
sage: L = IntegerLattice(M)
|
|
750
|
+
sage: u = vector([-423434678248195, -18882583298608161305227077482])
|
|
751
|
+
sage: L.closest_vector(u) in L
|
|
752
|
+
True
|
|
753
|
+
|
|
754
|
+
Check that the example, of non-maximal rank, from :issue:`32486` works::
|
|
755
|
+
|
|
756
|
+
from sage.modules.free_module_integer import IntegerLattice
|
|
757
|
+
L = IntegerLattice([[-1, 0, 1],[1,0,2]])
|
|
758
|
+
L.closest_vector((1,1,1))
|
|
759
|
+
(2, 0, 1)
|
|
760
|
+
"""
|
|
761
|
+
voronoi_cell = self.voronoi_cell()
|
|
762
|
+
|
|
763
|
+
def projection(M, v):
|
|
764
|
+
Mt = M.transpose()
|
|
765
|
+
P = Mt * (M * Mt) ** (-1) * M
|
|
766
|
+
return P * v
|
|
767
|
+
|
|
768
|
+
t = projection(matrix(self.reduced_basis), vector(t))
|
|
769
|
+
|
|
770
|
+
def CVPP_2V(t, V, voronoi_cell):
|
|
771
|
+
t_new = t
|
|
772
|
+
while not voronoi_cell.contains(t_new.list()):
|
|
773
|
+
v = max(V, key=lambda v: t_new * v / v.dot_product(v))
|
|
774
|
+
t_new = t_new - v
|
|
775
|
+
return t - t_new
|
|
776
|
+
|
|
777
|
+
V = self.voronoi_relevant_vectors()
|
|
778
|
+
t = vector(t)
|
|
779
|
+
p = 0
|
|
780
|
+
while not (ZZ(2 ** p) * voronoi_cell).contains(t):
|
|
781
|
+
p += 1
|
|
782
|
+
t_new = t
|
|
783
|
+
i = p
|
|
784
|
+
while i >= 1:
|
|
785
|
+
V_scaled = [v * (2 ** (i - 1)) for v in V]
|
|
786
|
+
t_new = t_new - CVPP_2V(t_new, V_scaled, ZZ(2 ** (i - 1)) * voronoi_cell)
|
|
787
|
+
i -= 1
|
|
788
|
+
return t - t_new
|
|
789
|
+
|
|
790
|
+
def approximate_closest_vector(self, t, delta=None, algorithm='embedding', *args, **kwargs):
|
|
791
|
+
r"""
|
|
792
|
+
Compute a vector `w` in this lattice which is close to the target vector `t`.
|
|
793
|
+
The ratio `\frac{|t-w|}{|t-u|}`, where `u` is the closest lattice vector to `t`,
|
|
794
|
+
is exponential in the dimension of the lattice.
|
|
795
|
+
|
|
796
|
+
This will check whether the basis is already `\delta`-LLL-reduced
|
|
797
|
+
and otherwise it will run LLL to make sure that it is. For more
|
|
798
|
+
information about ``delta`` see :meth:`LLL`.
|
|
799
|
+
|
|
800
|
+
INPUT:
|
|
801
|
+
|
|
802
|
+
- ``t`` -- the target vector to compute a close vector to
|
|
803
|
+
|
|
804
|
+
- ``delta`` -- (default: ``0.99``) the LLL reduction parameter
|
|
805
|
+
|
|
806
|
+
- ``algorithm`` -- string (default: 'embedding'):
|
|
807
|
+
|
|
808
|
+
- ``'embedding'`` -- embeds the lattice in a d+1 dimensional space
|
|
809
|
+
and seeks short vectors using LLL. This calls LLL twice but is
|
|
810
|
+
usually still quick.
|
|
811
|
+
|
|
812
|
+
- ``'nearest_plane'`` -- uses the "NEAREST PLANE" algorithm from [Bab86]_
|
|
813
|
+
|
|
814
|
+
- ``'rounding_off'`` -- uses the "ROUNDING OFF" algorithm from [Bab86]_.
|
|
815
|
+
This yields slightly worse results than the other algorithms but is
|
|
816
|
+
at least faster than ``'nearest_plane'``.
|
|
817
|
+
|
|
818
|
+
- ``*args`` -- passed through to :meth:`LLL`
|
|
819
|
+
|
|
820
|
+
- ``**kwds`` -- passed through to :meth:`LLL`
|
|
821
|
+
|
|
822
|
+
OUTPUT: the vector `w` described above
|
|
823
|
+
|
|
824
|
+
EXAMPLES::
|
|
825
|
+
|
|
826
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
827
|
+
sage: L = IntegerLattice([[1, 0], [0, 1]])
|
|
828
|
+
sage: L.approximate_closest_vector((-6, 5/3))
|
|
829
|
+
(-6, 2)
|
|
830
|
+
|
|
831
|
+
The quality of the approximation depends on ``delta``::
|
|
832
|
+
|
|
833
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
834
|
+
sage: L = IntegerLattice([[101, 0, 0, 0], [0, 101, 0, 0],
|
|
835
|
+
....: [0, 0, 101, 0], [-28, 39, 45, 1]], lll_reduce=False)
|
|
836
|
+
sage: t = vector([1337]*4)
|
|
837
|
+
sage: L.approximate_closest_vector(t, delta=0.26)
|
|
838
|
+
(1331, 1324, 1349, 1334)
|
|
839
|
+
sage: L.approximate_closest_vector(t, delta=0.99)
|
|
840
|
+
(1326, 1349, 1339, 1345)
|
|
841
|
+
sage: L.closest_vector(t)
|
|
842
|
+
(1326, 1349, 1339, 1345)
|
|
843
|
+
|
|
844
|
+
sage: # Checking that the other algorithms work
|
|
845
|
+
sage: L.approximate_closest_vector(t, algorithm='nearest_plane')
|
|
846
|
+
(1326, 1349, 1339, 1345)
|
|
847
|
+
sage: L.approximate_closest_vector(t, algorithm='rounding_off')
|
|
848
|
+
(1331, 1324, 1349, 1334)
|
|
849
|
+
"""
|
|
850
|
+
if delta is None:
|
|
851
|
+
delta = ZZ(99)/ZZ(100)
|
|
852
|
+
|
|
853
|
+
# Bound checks on delta are performed in is_LLL_reduced
|
|
854
|
+
if not self._reduced_basis.is_LLL_reduced(delta=delta):
|
|
855
|
+
self.LLL(*args, delta=delta, **kwargs)
|
|
856
|
+
|
|
857
|
+
B = self._reduced_basis
|
|
858
|
+
t = vector(t)
|
|
859
|
+
|
|
860
|
+
if algorithm == 'embedding':
|
|
861
|
+
L = matrix(QQ, B.nrows()+1, B.ncols()+1)
|
|
862
|
+
L.set_block(0, 0, B)
|
|
863
|
+
L.set_block(B.nrows(), 0, matrix(t))
|
|
864
|
+
weight = (B[-1]*B[-1]).isqrt()+1 # Norm of the largest vector
|
|
865
|
+
L[-1, -1] = weight
|
|
866
|
+
|
|
867
|
+
# The vector should be the last row but we iterate just in case
|
|
868
|
+
for v in reversed(L.LLL(delta=delta, *args, **kwargs).rows()):
|
|
869
|
+
if abs(v[-1]) == weight:
|
|
870
|
+
return t - v[:-1]*v[-1].sign()
|
|
871
|
+
raise ValueError('No suitable vector found in basis.'
|
|
872
|
+
'This is a bug, please report it.')
|
|
873
|
+
|
|
874
|
+
elif algorithm == 'nearest_plane':
|
|
875
|
+
G = B.gram_schmidt()[0]
|
|
876
|
+
|
|
877
|
+
b = t
|
|
878
|
+
for i in reversed(range(G.nrows())):
|
|
879
|
+
b -= B[i] * ((b * G[i]) / (G[i] * G[i])).round("even")
|
|
880
|
+
return (t - b).change_ring(ZZ)
|
|
881
|
+
|
|
882
|
+
elif algorithm == 'rounding_off':
|
|
883
|
+
# t = x*B might not have a solution over QQ so we instead solve
|
|
884
|
+
# the system x*B*B^T = t*B^T which will be the "closest" solution
|
|
885
|
+
# if it does not exist, same effect as using the psuedo-inverse
|
|
886
|
+
sol = (B*B.T).solve_left(t*B.T)
|
|
887
|
+
return vector(ZZ, [QQ(x).round('even') for x in sol])*B
|
|
888
|
+
|
|
889
|
+
else:
|
|
890
|
+
raise ValueError("algorithm must be one of 'embedding', 'nearest_plane' or 'rounding_off'")
|
|
891
|
+
|
|
892
|
+
def babai(self, *args, **kwargs):
|
|
893
|
+
"""
|
|
894
|
+
Alias for :meth:`approximate_closest_vector`.
|
|
895
|
+
"""
|
|
896
|
+
return self.approximate_closest_vector(*args, **kwargs)
|