passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +807 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_modules.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-23768756.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7897025b.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-e34bb864.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-503f0c35.3.29.so +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-aarch64-linux-musl.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-aarch64-linux-musl.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-aarch64-linux-musl.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-musl.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-aarch64-linux-musl.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-aarch64-linux-musl.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-aarch64-linux-musl.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-aarch64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-aarch64-linux-musl.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-aarch64-linux-musl.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-aarch64-linux-musl.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-aarch64-linux-musl.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-musl.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-musl.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-aarch64-linux-musl.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,857 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.libs.pari
|
|
3
|
+
r"""
|
|
4
|
+
Wrapper class for abelian groups
|
|
5
|
+
|
|
6
|
+
This class is intended as a template for anything in Sage that needs the
|
|
7
|
+
functionality of abelian groups. One can create an ``AdditiveAbelianGroupWrapper``
|
|
8
|
+
object from any given set of elements in some given parent, as long as an
|
|
9
|
+
``_add_`` method has been defined.
|
|
10
|
+
|
|
11
|
+
EXAMPLES:
|
|
12
|
+
|
|
13
|
+
We create a toy example based on the Mordell-Weil group of an elliptic curve over `\QQ`::
|
|
14
|
+
|
|
15
|
+
sage: # needs database_cremona_mini_ellcurve sage.schemes
|
|
16
|
+
sage: E = EllipticCurve('30a2')
|
|
17
|
+
sage: pts = [E(4,-7,1), E(7/4, -11/8, 1), E(3, -2, 1)]
|
|
18
|
+
sage: M = AdditiveAbelianGroupWrapper(pts[0].parent(), pts, [3, 2, 2]); M
|
|
19
|
+
Additive abelian group isomorphic to Z/3 + Z/2 + Z/2 embedded in Abelian
|
|
20
|
+
group of points on Elliptic Curve defined by y^2 + x*y + y = x^3 - 19*x + 26
|
|
21
|
+
over Rational Field
|
|
22
|
+
sage: M.gens()
|
|
23
|
+
((4 : -7 : 1), (7/4 : -11/8 : 1), (3 : -2 : 1))
|
|
24
|
+
sage: 3*M.0
|
|
25
|
+
(0 : 1 : 0)
|
|
26
|
+
sage: 3000000000000001 * M.0
|
|
27
|
+
(4 : -7 : 1)
|
|
28
|
+
sage: M == loads(dumps(M)) # known bug (https://github.com/sagemath/sage/issues/11599#comment:7)
|
|
29
|
+
True
|
|
30
|
+
|
|
31
|
+
TESTS:
|
|
32
|
+
|
|
33
|
+
We check that ridiculous operations are being avoided::
|
|
34
|
+
|
|
35
|
+
sage: from sage.misc.verbose import set_verbose
|
|
36
|
+
sage: set_verbose(2, 'additive_abelian_wrapper.py')
|
|
37
|
+
sage: 300001 * M.0 # needs database_cremona_mini_ellcurve sage.schemes
|
|
38
|
+
verbose 1 (...: additive_abelian_wrapper.py, discrete_exp) Calling discrete exp on (1, 0, 0)
|
|
39
|
+
(4 : -7 : 1)
|
|
40
|
+
sage: set_verbose(0, 'additive_abelian_wrapper.py')
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
.. TODO::
|
|
44
|
+
|
|
45
|
+
Think about subgroups and quotients, which probably won't work
|
|
46
|
+
in the current implementation -- some fiddly adjustments will be
|
|
47
|
+
needed in order to be able to pass extra arguments to the
|
|
48
|
+
subquotient's init method.
|
|
49
|
+
|
|
50
|
+
AUTHORS:
|
|
51
|
+
|
|
52
|
+
- David Loeffler (2010)
|
|
53
|
+
- Lorenz Panny (2017): :meth:`AdditiveAbelianGroupWrapper.discrete_log`
|
|
54
|
+
- Lorenz Panny (2023): :meth:`AdditiveAbelianGroupWrapper.from_generators`
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
# ****************************************************************************
|
|
58
|
+
# Copyright (C) 2010 David Loeffler
|
|
59
|
+
#
|
|
60
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
61
|
+
#
|
|
62
|
+
# This code is distributed in the hope that it will be useful,
|
|
63
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
64
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
65
|
+
# General Public License for more details.
|
|
66
|
+
#
|
|
67
|
+
# The full text of the GPL is available at:
|
|
68
|
+
#
|
|
69
|
+
# https://www.gnu.org/licenses/
|
|
70
|
+
# ****************************************************************************
|
|
71
|
+
|
|
72
|
+
from . import additive_abelian_group as addgp
|
|
73
|
+
from sage.rings.integer_ring import ZZ
|
|
74
|
+
from sage.categories.morphism import Morphism
|
|
75
|
+
from sage.structure.element import parent
|
|
76
|
+
from sage.structure.sequence import Sequence
|
|
77
|
+
from sage.modules.free_module_element import vector
|
|
78
|
+
|
|
79
|
+
from sage.misc.superseded import deprecated_function_alias
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class UnwrappingMorphism(Morphism):
|
|
83
|
+
r"""
|
|
84
|
+
The embedding into the ambient group. Used by the coercion framework.
|
|
85
|
+
"""
|
|
86
|
+
def __init__(self, domain):
|
|
87
|
+
r"""
|
|
88
|
+
EXAMPLES::
|
|
89
|
+
|
|
90
|
+
sage: G = AdditiveAbelianGroupWrapper(QQbar, # needs sage.rings.number_field
|
|
91
|
+
....: [sqrt(QQbar(2)), sqrt(QQbar(3))], [0, 0])
|
|
92
|
+
sage: F = QQbar.coerce_map_from(G); F # needs sage.rings.number_field
|
|
93
|
+
Generic morphism:
|
|
94
|
+
From: Additive abelian group isomorphic to Z + Z embedded in Algebraic Field
|
|
95
|
+
To: Algebraic Field
|
|
96
|
+
sage: type(F) # needs sage.rings.number_field
|
|
97
|
+
<class 'sage.groups.additive_abelian.additive_abelian_wrapper.UnwrappingMorphism'>
|
|
98
|
+
"""
|
|
99
|
+
Morphism.__init__(self, domain.Hom(domain.universe()))
|
|
100
|
+
|
|
101
|
+
def _call_(self, x):
|
|
102
|
+
r"""
|
|
103
|
+
TESTS::
|
|
104
|
+
|
|
105
|
+
sage: # needs database_cremona_mini_ellcurve sage.schemes
|
|
106
|
+
sage: E = EllipticCurve("65a1")
|
|
107
|
+
sage: G = E.torsion_subgroup()
|
|
108
|
+
sage: isinstance(G, sage.groups.additive_abelian.additive_abelian_wrapper.AdditiveAbelianGroupWrapper)
|
|
109
|
+
True
|
|
110
|
+
sage: P1 = E([1,-1,1])
|
|
111
|
+
sage: P2 = E([0,1,0])
|
|
112
|
+
sage: P1 in G # indirect doctest
|
|
113
|
+
False
|
|
114
|
+
sage: P2 in G
|
|
115
|
+
True
|
|
116
|
+
sage: (G(P2) + P1) in G
|
|
117
|
+
False
|
|
118
|
+
sage: (G(P2) + P1).parent()
|
|
119
|
+
Abelian group of points on Elliptic Curve defined by y^2 + x*y = x^3 - x over Rational Field
|
|
120
|
+
"""
|
|
121
|
+
return self.codomain()(x.element())
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
class AdditiveAbelianGroupWrapperElement(addgp.AdditiveAbelianGroupElement):
|
|
125
|
+
"""
|
|
126
|
+
An element of an :class:`AdditiveAbelianGroupWrapper`.
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
def __init__(self, parent, vector, element=None, check=False):
|
|
130
|
+
r"""
|
|
131
|
+
EXAMPLES::
|
|
132
|
+
|
|
133
|
+
sage: from sage.groups.additive_abelian.additive_abelian_wrapper import AdditiveAbelianGroupWrapper
|
|
134
|
+
sage: G = AdditiveAbelianGroupWrapper(QQbar, # needs sage.rings.number_field
|
|
135
|
+
....: [sqrt(QQbar(2)), sqrt(QQbar(3))], [0, 0])
|
|
136
|
+
sage: G.0 # indirect doctest # needs sage.rings.number_field
|
|
137
|
+
1.414213562373095?
|
|
138
|
+
"""
|
|
139
|
+
addgp.AdditiveAbelianGroupElement.__init__(self, parent, vector, check)
|
|
140
|
+
if element is not None:
|
|
141
|
+
element = self.parent().universe()(element)
|
|
142
|
+
self._element = element
|
|
143
|
+
|
|
144
|
+
def element(self):
|
|
145
|
+
r"""
|
|
146
|
+
Return the underlying object that this element wraps.
|
|
147
|
+
|
|
148
|
+
EXAMPLES::
|
|
149
|
+
|
|
150
|
+
sage: # needs database_cremona_mini_ellcurve sage
|
|
151
|
+
sage: T = EllipticCurve('65a').torsion_subgroup().gen(0)
|
|
152
|
+
sage: T; type(T)
|
|
153
|
+
(0 : 0 : 1)
|
|
154
|
+
<class 'sage.schemes.elliptic_curves.ell_torsion.EllipticCurveTorsionSubgroup_with_category.element_class'>
|
|
155
|
+
sage: T.element(); type(T.element())
|
|
156
|
+
(0 : 0 : 1)
|
|
157
|
+
<class 'sage.schemes.elliptic_curves.ell_point.EllipticCurvePoint_number_field'>
|
|
158
|
+
"""
|
|
159
|
+
if self._element is None:
|
|
160
|
+
self._element = self.parent().discrete_exp(self._hermite_lift())
|
|
161
|
+
return self._element
|
|
162
|
+
|
|
163
|
+
def _repr_(self):
|
|
164
|
+
r"""
|
|
165
|
+
String representation of ``self``.
|
|
166
|
+
|
|
167
|
+
EXAMPLES::
|
|
168
|
+
|
|
169
|
+
sage: # needs database_cremona_mini_ellcurve sage
|
|
170
|
+
sage: T = EllipticCurve('65a').torsion_subgroup().gen(0)
|
|
171
|
+
sage: repr(T) # indirect doctest
|
|
172
|
+
'(0 : 0 : 1)'
|
|
173
|
+
"""
|
|
174
|
+
return repr(self.element())
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class AdditiveAbelianGroupWrapper(addgp.AdditiveAbelianGroup_fixed_gens):
|
|
178
|
+
"""
|
|
179
|
+
This class is used to wrap a subgroup of an existing
|
|
180
|
+
additive abelian group as a new additive abelian group.
|
|
181
|
+
|
|
182
|
+
EXAMPLES::
|
|
183
|
+
|
|
184
|
+
sage: G2 = AdditiveAbelianGroupWrapper(Zmod(42), [2], [21]); G2
|
|
185
|
+
Additive abelian group isomorphic to Z/21 embedded in Ring of integers modulo 42
|
|
186
|
+
sage: G6 = AdditiveAbelianGroupWrapper(Zmod(42), [6], [7]); G6
|
|
187
|
+
Additive abelian group isomorphic to Z/7 embedded in Ring of integers modulo 42
|
|
188
|
+
sage: G = AdditiveAbelianGroupWrapper(Zmod(42), [21,14,6], [2,3,7]); G
|
|
189
|
+
Additive abelian group isomorphic to Z/2 + Z/3 + Z/7 embedded in
|
|
190
|
+
Ring of integers modulo 42
|
|
191
|
+
sage: G.invariants()
|
|
192
|
+
(42,)
|
|
193
|
+
|
|
194
|
+
::
|
|
195
|
+
|
|
196
|
+
sage: AdditiveAbelianGroupWrapper(QQbar, [sqrt(2), sqrt(3)], [0, 0]) # needs sage.rings.number_field sage.symbolic
|
|
197
|
+
Additive abelian group isomorphic to Z + Z embedded in Algebraic Field
|
|
198
|
+
|
|
199
|
+
::
|
|
200
|
+
|
|
201
|
+
sage: EllipticCurve(GF(419**2), [1,0]).abelian_group() # indirect doctest # needs sage.rings.finite_rings sage.schemes
|
|
202
|
+
Additive abelian group isomorphic to Z/420 + Z/420 embedded in
|
|
203
|
+
Abelian group of points on Elliptic Curve
|
|
204
|
+
defined by y^2 = x^3 + x over Finite Field in z2 of size 419^2
|
|
205
|
+
"""
|
|
206
|
+
|
|
207
|
+
Element = AdditiveAbelianGroupWrapperElement
|
|
208
|
+
|
|
209
|
+
def __init__(self, universe, gens, invariants):
|
|
210
|
+
r"""
|
|
211
|
+
EXAMPLES::
|
|
212
|
+
|
|
213
|
+
sage: AdditiveAbelianGroupWrapper(QQbar, # indirect doctest # needs sage.rings.number_field
|
|
214
|
+
....: [sqrt(QQbar(2)), sqrt(QQbar(3))], [0, 0])
|
|
215
|
+
Additive abelian group isomorphic to Z + Z embedded in Algebraic Field
|
|
216
|
+
"""
|
|
217
|
+
self._universe = universe
|
|
218
|
+
self._gen_elements = tuple(universe(x) for x in gens)
|
|
219
|
+
self._gen_orders = invariants
|
|
220
|
+
cover, rels = addgp.cover_and_relations_from_invariants(invariants)
|
|
221
|
+
addgp.AdditiveAbelianGroup_fixed_gens.__init__(self, cover, rels, cover.gens())
|
|
222
|
+
self._unset_coercions_used()
|
|
223
|
+
self.register_embedding(UnwrappingMorphism(self))
|
|
224
|
+
|
|
225
|
+
def universe(self):
|
|
226
|
+
r"""
|
|
227
|
+
The ambient group in which this abelian group lives.
|
|
228
|
+
|
|
229
|
+
EXAMPLES::
|
|
230
|
+
|
|
231
|
+
sage: G = AdditiveAbelianGroupWrapper(QQbar, # needs sage.rings.number_field
|
|
232
|
+
....: [sqrt(QQbar(2)), sqrt(QQbar(3))],
|
|
233
|
+
....: [0, 0])
|
|
234
|
+
sage: G.universe() # needs sage.rings.number_field
|
|
235
|
+
Algebraic Field
|
|
236
|
+
"""
|
|
237
|
+
return self._universe
|
|
238
|
+
|
|
239
|
+
def generator_orders(self):
|
|
240
|
+
r"""
|
|
241
|
+
The orders of the generators with which this group was initialised.
|
|
242
|
+
(Note that these are not necessarily a minimal set of generators.)
|
|
243
|
+
Generators of infinite order are returned as 0. Compare
|
|
244
|
+
``self.invariants()``, which returns the orders of a minimal set of
|
|
245
|
+
generators.
|
|
246
|
+
|
|
247
|
+
EXAMPLES::
|
|
248
|
+
|
|
249
|
+
sage: V = Zmod(6)**2
|
|
250
|
+
sage: G = AdditiveAbelianGroupWrapper(V, [2*V.0, 3*V.1], [3, 2])
|
|
251
|
+
sage: G.generator_orders()
|
|
252
|
+
(3, 2)
|
|
253
|
+
sage: G.invariants()
|
|
254
|
+
(6,)
|
|
255
|
+
"""
|
|
256
|
+
return tuple(self._gen_orders)
|
|
257
|
+
|
|
258
|
+
def _repr_(self):
|
|
259
|
+
r"""
|
|
260
|
+
EXAMPLES::
|
|
261
|
+
|
|
262
|
+
sage: G = AdditiveAbelianGroupWrapper(QQbar, # needs sage.rings.number_field
|
|
263
|
+
....: [sqrt(QQbar(2)), sqrt(QQbar(3))], [0, 0])
|
|
264
|
+
sage: repr(G) # indirect doctest # needs sage.rings.number_field
|
|
265
|
+
'Additive abelian group isomorphic to Z + Z embedded in Algebraic Field'
|
|
266
|
+
"""
|
|
267
|
+
return addgp.AdditiveAbelianGroup_fixed_gens._repr_(self) + " embedded in " + self.universe()._repr_()
|
|
268
|
+
|
|
269
|
+
def _element_constructor_(self, x, check=False):
|
|
270
|
+
r"""
|
|
271
|
+
Create an element from ``x``.
|
|
272
|
+
|
|
273
|
+
This may be either an element of self, an element of the ambient
|
|
274
|
+
group, or an iterable (in which case the result is the corresponding
|
|
275
|
+
product of the generators of self).
|
|
276
|
+
|
|
277
|
+
EXAMPLES::
|
|
278
|
+
|
|
279
|
+
sage: V = Zmod(8)**2
|
|
280
|
+
sage: G = AdditiveAbelianGroupWrapper(V, [[2,2],[4,0]], [4, 2])
|
|
281
|
+
sage: G(V([6,2]))
|
|
282
|
+
(6, 2)
|
|
283
|
+
sage: G([1,1])
|
|
284
|
+
(6, 2)
|
|
285
|
+
sage: G(G([1,1]))
|
|
286
|
+
(6, 2)
|
|
287
|
+
"""
|
|
288
|
+
if parent(x) is self.universe():
|
|
289
|
+
return self.element_class(self, self.discrete_log(x), element=x)
|
|
290
|
+
return addgp.AdditiveAbelianGroup_fixed_gens._element_constructor_(self, x, check)
|
|
291
|
+
|
|
292
|
+
def discrete_exp(self, v):
|
|
293
|
+
r"""
|
|
294
|
+
Given a list (or other iterable) of length equal to the number of
|
|
295
|
+
generators of this group, compute the element of the ambient group
|
|
296
|
+
with those exponents in terms of the generators of ``self``.
|
|
297
|
+
|
|
298
|
+
EXAMPLES::
|
|
299
|
+
|
|
300
|
+
sage: G = AdditiveAbelianGroupWrapper(QQbar, # needs sage.rings.number_field
|
|
301
|
+
....: [sqrt(QQbar(2)), -1], [0, 0])
|
|
302
|
+
sage: v = G.discrete_exp([3, 5]); v # needs sage.rings.number_field
|
|
303
|
+
-0.7573593128807148?
|
|
304
|
+
sage: v.parent() is QQbar # needs sage.rings.number_field
|
|
305
|
+
True
|
|
306
|
+
|
|
307
|
+
This method is an inverse of :meth:`discrete_log`::
|
|
308
|
+
|
|
309
|
+
sage: orders = [2, 2*3, 2*3*5, 2*3*5*7, 2*3*5*7*11]
|
|
310
|
+
sage: G = AdditiveAbelianGroup(orders)
|
|
311
|
+
sage: A = AdditiveAbelianGroupWrapper(G.0.parent(), G.gens(), orders)
|
|
312
|
+
sage: el = A.random_element()
|
|
313
|
+
sage: A.discrete_exp(A.discrete_log(el)) == el
|
|
314
|
+
True
|
|
315
|
+
|
|
316
|
+
TESTS:
|
|
317
|
+
|
|
318
|
+
Check that :meth:`_discrete_exp` still works (for now)::
|
|
319
|
+
|
|
320
|
+
sage: A._discrete_exp(list(range(1,6)))
|
|
321
|
+
doctest:warning ...
|
|
322
|
+
DeprecationWarning: _discrete_exp is deprecated. ...
|
|
323
|
+
(1, 2, 3, 4, 5)
|
|
324
|
+
"""
|
|
325
|
+
from sage.misc.verbose import verbose
|
|
326
|
+
v = self.V()(v)
|
|
327
|
+
verbose("Calling discrete exp on %s" % v)
|
|
328
|
+
# DUMB IMPLEMENTATION!
|
|
329
|
+
return sum([self._gen_elements[i] * ZZ(v[i]) for i in range(len(v))], self.universe()(0))
|
|
330
|
+
|
|
331
|
+
_discrete_exp = deprecated_function_alias(32384, discrete_exp)
|
|
332
|
+
|
|
333
|
+
def discrete_log(self, x, gens=None):
|
|
334
|
+
r"""
|
|
335
|
+
Given an element of the ambient group, attempt to express it in terms
|
|
336
|
+
of the generators of this group or the given generators of a subgroup.
|
|
337
|
+
|
|
338
|
+
ALGORITHM:
|
|
339
|
+
|
|
340
|
+
This reduces to p-groups, then calls :func:`_discrete_log_pgroup` which
|
|
341
|
+
implements a basic version of the recursive algorithm from [Suth2008]_.
|
|
342
|
+
|
|
343
|
+
AUTHORS:
|
|
344
|
+
|
|
345
|
+
- Lorenz Panny (2017)
|
|
346
|
+
|
|
347
|
+
EXAMPLES::
|
|
348
|
+
|
|
349
|
+
sage: G = AdditiveAbelianGroup([2, 2*3, 2*3*5, 2*3*5*7, 2*3*5*7*11])
|
|
350
|
+
sage: A = AdditiveAbelianGroupWrapper(G.0.parent(), G.gens(),
|
|
351
|
+
....: [g.order() for g in G.gens()])
|
|
352
|
+
sage: A.discrete_log(A.discrete_exp([1,5,23,127,539]))
|
|
353
|
+
(1, 5, 23, 127, 539)
|
|
354
|
+
|
|
355
|
+
::
|
|
356
|
+
|
|
357
|
+
sage: x = polygen(ZZ, 'x')
|
|
358
|
+
sage: F.<t> = GF(1009**2, modulus=x**2+11); E = EllipticCurve(j=F(940)) # needs sage.rings.finite_rings sage.schemes
|
|
359
|
+
sage: P, Q = E(900*t + 228, 974*t + 185), E(1007*t + 214, 865*t + 802) # needs sage.rings.finite_rings sage.schemes
|
|
360
|
+
sage: E.abelian_group().discrete_log(123 * P + 777 * Q, [P, Q]) # needs sage.rings.finite_rings sage.schemes
|
|
361
|
+
(123, 777)
|
|
362
|
+
|
|
363
|
+
::
|
|
364
|
+
|
|
365
|
+
sage: V = Zmod(8)**2
|
|
366
|
+
sage: G = AdditiveAbelianGroupWrapper(V, [[2,2],[4,0]], [4, 2])
|
|
367
|
+
sage: G.discrete_log(V([6, 2]))
|
|
368
|
+
(1, 1)
|
|
369
|
+
sage: G.discrete_log(V([6, 4]))
|
|
370
|
+
Traceback (most recent call last):
|
|
371
|
+
...
|
|
372
|
+
ValueError: not in group
|
|
373
|
+
|
|
374
|
+
::
|
|
375
|
+
|
|
376
|
+
sage: G = AdditiveAbelianGroupWrapper(QQbar, [sqrt(2)], [0]) # needs sage.rings.number_field sage.symbolic
|
|
377
|
+
sage: G.discrete_log(QQbar(2*sqrt(2))) # needs sage.rings.number_field sage.symbolic
|
|
378
|
+
Traceback (most recent call last):
|
|
379
|
+
...
|
|
380
|
+
NotImplementedError: No black-box discrete log for infinite abelian groups
|
|
381
|
+
|
|
382
|
+
TESTS:
|
|
383
|
+
|
|
384
|
+
Check that :meth:`_discrete_log` still works (for now)::
|
|
385
|
+
|
|
386
|
+
sage: orders = [2, 2*3, 2*3*5, 2*3*5*7, 2*3*5*7*11]
|
|
387
|
+
sage: G = AdditiveAbelianGroup(orders)
|
|
388
|
+
sage: A = AdditiveAbelianGroupWrapper(G.0.parent(), G.gens(), orders)
|
|
389
|
+
sage: A._discrete_log(sum(i*g for i,g in enumerate(G.gens(),1)))
|
|
390
|
+
doctest:warning ...
|
|
391
|
+
DeprecationWarning: _discrete_log is deprecated. ...
|
|
392
|
+
(1, 2, 3, 4, 5)
|
|
393
|
+
"""
|
|
394
|
+
from sage.arith.misc import CRT_list
|
|
395
|
+
from sage.rings.infinity import Infinity
|
|
396
|
+
|
|
397
|
+
if self.order() == Infinity:
|
|
398
|
+
raise NotImplementedError("No black-box discrete log for infinite abelian groups")
|
|
399
|
+
|
|
400
|
+
if gens is None:
|
|
401
|
+
gens = self.gens()
|
|
402
|
+
ords = self.generator_orders()
|
|
403
|
+
else:
|
|
404
|
+
ords = [g.order() for g in gens]
|
|
405
|
+
|
|
406
|
+
gens = [self._universe(g.element() if parent(g) is self else g) for g in gens]
|
|
407
|
+
x = self._universe(x.element() if parent(x) is self else x)
|
|
408
|
+
|
|
409
|
+
crt_data = [[] for _ in gens]
|
|
410
|
+
for p in self.exponent().prime_factors():
|
|
411
|
+
cofactor = self.exponent().prime_to_m_part(p)
|
|
412
|
+
pgens = [cofactor * g for g in gens]
|
|
413
|
+
y = cofactor * x
|
|
414
|
+
|
|
415
|
+
pvals = [o.valuation(p) for o in ords]
|
|
416
|
+
if not any(pvals):
|
|
417
|
+
continue
|
|
418
|
+
|
|
419
|
+
plog = _discrete_log_pgroup(p, pvals, pgens, y)
|
|
420
|
+
|
|
421
|
+
for i, (r, v) in enumerate(zip(plog, pvals)):
|
|
422
|
+
crt_data[i].append((r, p**v))
|
|
423
|
+
|
|
424
|
+
res = vector(CRT_list(*map(list, zip(*l))) for l in crt_data)
|
|
425
|
+
assert x == sum(r * g for r, g in zip(res, gens))
|
|
426
|
+
return res
|
|
427
|
+
|
|
428
|
+
_discrete_log = deprecated_function_alias(32384, discrete_log)
|
|
429
|
+
|
|
430
|
+
def torsion_subgroup(self, n=None):
|
|
431
|
+
r"""
|
|
432
|
+
Return the `n`-torsion subgroup of this additive abelian group
|
|
433
|
+
when `n` is given, and the torsion subgroup otherwise.
|
|
434
|
+
|
|
435
|
+
The [`n`-]torsion subgroup consists of all elements whose order
|
|
436
|
+
is finite [and divides `n`].
|
|
437
|
+
|
|
438
|
+
EXAMPLES::
|
|
439
|
+
|
|
440
|
+
sage: ords = [2, 2*3, 2*3*5, 0, 2*3*5*7, 2*3*5*7*11]
|
|
441
|
+
sage: G = AdditiveAbelianGroup(ords)
|
|
442
|
+
sage: A = AdditiveAbelianGroupWrapper(G.0.parent(), G.gens(), ords)
|
|
443
|
+
sage: T = A.torsion_subgroup(5)
|
|
444
|
+
sage: T
|
|
445
|
+
Additive abelian group isomorphic to Z/5 + Z/5 + Z/5 embedded in
|
|
446
|
+
Additive abelian group isomorphic to Z/2 + Z/6 + Z/30 + Z + Z/210 + Z/2310
|
|
447
|
+
sage: T.gens()
|
|
448
|
+
((0, 0, 6, 0, 0, 0), (0, 0, 0, 0, 42, 0), (0, 0, 0, 0, 0, 462))
|
|
449
|
+
|
|
450
|
+
::
|
|
451
|
+
|
|
452
|
+
sage: # needs database_cremona_mini_ellcurve sage.rings.finite_rings sage.schemes
|
|
453
|
+
sage: E = EllipticCurve(GF(487^2), [311,205])
|
|
454
|
+
sage: T = E.abelian_group().torsion_subgroup(42); T
|
|
455
|
+
Additive abelian group isomorphic to Z/42 + Z/6 embedded in
|
|
456
|
+
Abelian group of points on Elliptic Curve
|
|
457
|
+
defined by y^2 = x^3 + 311*x + 205 over Finite Field in z2 of size 487^2
|
|
458
|
+
sage: [P.order() for P in T.gens()]
|
|
459
|
+
[42, 6]
|
|
460
|
+
|
|
461
|
+
::
|
|
462
|
+
|
|
463
|
+
sage: # needs database_cremona_mini_ellcurve sage.schemes
|
|
464
|
+
sage: E = EllipticCurve('574i1')
|
|
465
|
+
sage: pts = [E(103,172), E(61,18)]
|
|
466
|
+
sage: assert pts[0].order() == 7 and pts[1].order() == infinity
|
|
467
|
+
sage: M = AdditiveAbelianGroupWrapper(pts[0].parent(), pts, [7,0]); M
|
|
468
|
+
Additive abelian group isomorphic to Z/7 + Z embedded in
|
|
469
|
+
Abelian group of points on Elliptic Curve defined by
|
|
470
|
+
y^2 + x*y + y = x^3 - x^2 - 19353*x + 958713 over Rational Field
|
|
471
|
+
sage: M.torsion_subgroup()
|
|
472
|
+
Additive abelian group isomorphic to Z/7 embedded in
|
|
473
|
+
Abelian group of points on Elliptic Curve defined by
|
|
474
|
+
y^2 + x*y + y = x^3 - x^2 - 19353*x + 958713 over Rational Field
|
|
475
|
+
sage: M.torsion_subgroup(7)
|
|
476
|
+
Additive abelian group isomorphic to Z/7 embedded in
|
|
477
|
+
Abelian group of points on Elliptic Curve defined by
|
|
478
|
+
y^2 + x*y + y = x^3 - x^2 - 19353*x + 958713 over Rational Field
|
|
479
|
+
sage: M.torsion_subgroup(5)
|
|
480
|
+
Trivial group embedded in Abelian group of points on Elliptic Curve
|
|
481
|
+
defined by y^2 + x*y + y = x^3 - x^2 - 19353*x + 958713 over Rational Field
|
|
482
|
+
|
|
483
|
+
AUTHORS:
|
|
484
|
+
|
|
485
|
+
- Lorenz Panny (2022)
|
|
486
|
+
"""
|
|
487
|
+
genords = zip(self._gen_elements, self._gen_orders)
|
|
488
|
+
if n is None:
|
|
489
|
+
gens, ords = zip(*(t for t in genords if t[1]))
|
|
490
|
+
else:
|
|
491
|
+
n = ZZ(n)
|
|
492
|
+
if n <= 0:
|
|
493
|
+
raise ValueError('n must be a positive integer')
|
|
494
|
+
gens, ords = [], []
|
|
495
|
+
for g, o in genords:
|
|
496
|
+
if not o:
|
|
497
|
+
continue
|
|
498
|
+
d = n.gcd(o)
|
|
499
|
+
if d == 1:
|
|
500
|
+
continue
|
|
501
|
+
gens.append(o // d * g)
|
|
502
|
+
ords.append(d)
|
|
503
|
+
return AdditiveAbelianGroupWrapper(self.universe(), gens, ords)
|
|
504
|
+
|
|
505
|
+
@staticmethod
|
|
506
|
+
def from_generators(gens, universe=None):
|
|
507
|
+
r"""
|
|
508
|
+
This method constructs the subgroup generated by a sequence
|
|
509
|
+
of *finite-order* elements in an additive abelian group.
|
|
510
|
+
|
|
511
|
+
The elements need not be independent, hence this can be used
|
|
512
|
+
to perform tasks such as finding relations between some given
|
|
513
|
+
elements of an abelian group, computing the structure of the
|
|
514
|
+
generated subgroup, enumerating all elements of the subgroup,
|
|
515
|
+
and solving discrete-logarithm problems.
|
|
516
|
+
|
|
517
|
+
EXAMPLES::
|
|
518
|
+
|
|
519
|
+
sage: G = AdditiveAbelianGroup([15, 30, 45])
|
|
520
|
+
sage: gs = [G((1,2,3)), G((4,5,6)), G((7,7,7)), G((3,2,1))]
|
|
521
|
+
sage: H = AdditiveAbelianGroupWrapper.from_generators(gs); H
|
|
522
|
+
Additive abelian group isomorphic to Z/90 + Z/15 embedded in
|
|
523
|
+
Additive abelian group isomorphic to Z/15 + Z/30 + Z/45
|
|
524
|
+
sage: H.gens()
|
|
525
|
+
((12, 13, 14), (1, 26, 21))
|
|
526
|
+
|
|
527
|
+
TESTS:
|
|
528
|
+
|
|
529
|
+
Random testing::
|
|
530
|
+
|
|
531
|
+
sage: invs = []
|
|
532
|
+
sage: while not 1 < prod(invs) < 10^4:
|
|
533
|
+
....: invs = [randrange(1,100) for _ in range(randrange(1,20))]
|
|
534
|
+
sage: G = AdditiveAbelianGroup(invs)
|
|
535
|
+
sage: gs = [G.random_element() for _ in range(randrange(1,10))]
|
|
536
|
+
sage: H = AdditiveAbelianGroupWrapper.from_generators(gs)
|
|
537
|
+
sage: os = H.generator_orders()
|
|
538
|
+
sage: vecs = cartesian_product_iterator(list(map(range, os)))
|
|
539
|
+
sage: els = {sum(i*g for i,g in zip(vec, H.gens())) for vec in vecs}
|
|
540
|
+
sage: len(els) == prod(os)
|
|
541
|
+
True
|
|
542
|
+
"""
|
|
543
|
+
if not gens:
|
|
544
|
+
if universe is None:
|
|
545
|
+
raise ValueError('need universe if no generators are given')
|
|
546
|
+
return AdditiveAbelianGroupWrapper(universe, [], [])
|
|
547
|
+
|
|
548
|
+
if universe is None:
|
|
549
|
+
universe = Sequence(gens).universe()
|
|
550
|
+
|
|
551
|
+
basis, ords = basis_from_generators(gens)
|
|
552
|
+
return AdditiveAbelianGroupWrapper(universe, basis, ords)
|
|
553
|
+
|
|
554
|
+
|
|
555
|
+
def _discrete_log_pgroup(p, vals, aa, b):
|
|
556
|
+
r"""
|
|
557
|
+
Attempt to express an element of p-power order in terms of
|
|
558
|
+
generators of a nontrivial p-subgroup of this group.
|
|
559
|
+
|
|
560
|
+
Used as a subroutine in :meth:`discrete_log`.
|
|
561
|
+
|
|
562
|
+
ALGORITHM:
|
|
563
|
+
|
|
564
|
+
This implements a basic version of the recursive algorithm
|
|
565
|
+
from [Suth2008]_.
|
|
566
|
+
The base cases are handled using a variant of Shanks'
|
|
567
|
+
baby-step giant-step algorithm for products of cyclic groups.
|
|
568
|
+
|
|
569
|
+
EXAMPLES::
|
|
570
|
+
|
|
571
|
+
sage: G = AdditiveAbelianGroup([5, 5**2, 5**4, 5**4])
|
|
572
|
+
sage: (a, b, c, d) = gs = G.gens()
|
|
573
|
+
sage: A = AdditiveAbelianGroupWrapper(a.parent(), gs, [g.order() for g in gs])
|
|
574
|
+
sage: from sage.groups.additive_abelian.additive_abelian_wrapper import _discrete_log_pgroup
|
|
575
|
+
sage: _discrete_log_pgroup(5, [1,2,4,4], gs, a + 17*b + 123*c + 456*d)
|
|
576
|
+
(1, 17, 123, 456)
|
|
577
|
+
|
|
578
|
+
TESTS:
|
|
579
|
+
|
|
580
|
+
Check for :issue:`34716`::
|
|
581
|
+
|
|
582
|
+
sage: # needs sage.rings.finite_rings sage.schemes
|
|
583
|
+
sage: E = EllipticCurve(GF(487^2), [311,205])
|
|
584
|
+
sage: G = E.abelian_group().torsion_subgroup(42)
|
|
585
|
+
sage: G.invariants()
|
|
586
|
+
(6, 42)
|
|
587
|
+
sage: P, Q = G.torsion_subgroup(6).gens()
|
|
588
|
+
sage: G.discrete_log(2*P + 3*Q, [P, Q]) # indirect doctest # needs sage.groups
|
|
589
|
+
(2, 3)
|
|
590
|
+
"""
|
|
591
|
+
from itertools import product as iproduct
|
|
592
|
+
|
|
593
|
+
qq = lambda j, k: vector(p ** (j + max(0, v - k)) for a, v in zip(aa, vals))
|
|
594
|
+
subbasis = lambda j, k: [q * a for q, a in zip(qq(j, k), aa)]
|
|
595
|
+
dotprod = lambda xs, ys: sum(x * y for x, y in zip(xs, ys))
|
|
596
|
+
|
|
597
|
+
def _base(j, k, c):
|
|
598
|
+
|
|
599
|
+
assert k - j == 1
|
|
600
|
+
aajk = subbasis(j, k)
|
|
601
|
+
assert not any(p*a for a in aajk) # orders are in {1,p}
|
|
602
|
+
idxs = [i for i, a in enumerate(aajk) if a]
|
|
603
|
+
|
|
604
|
+
rs = [([0], [0]) for i in range(len(aajk))]
|
|
605
|
+
for i in range(len(idxs)):
|
|
606
|
+
rs[idxs[i]] = (range(p), [0]) if i % 2 else ([0], range(p))
|
|
607
|
+
if len(idxs) % 2:
|
|
608
|
+
m = p.isqrt() + 1 # hence m^2 >= p
|
|
609
|
+
rs[idxs[-1]] = range(0, p, m), range(m)
|
|
610
|
+
|
|
611
|
+
tab = {}
|
|
612
|
+
for x in iproduct(*(r for r, _ in rs)):
|
|
613
|
+
key = dotprod(x, aajk)
|
|
614
|
+
if hasattr(key, 'set_immutable'):
|
|
615
|
+
key.set_immutable()
|
|
616
|
+
tab[key] = vector(x)
|
|
617
|
+
for y in iproduct(*(r for _, r in rs)):
|
|
618
|
+
key = c - dotprod(y, aajk)
|
|
619
|
+
if hasattr(key, 'set_immutable'):
|
|
620
|
+
key.set_immutable()
|
|
621
|
+
if key in tab:
|
|
622
|
+
return tab[key] + vector(y)
|
|
623
|
+
|
|
624
|
+
raise ValueError('not in group')
|
|
625
|
+
|
|
626
|
+
def _rec(j, k, c):
|
|
627
|
+
|
|
628
|
+
assert 0 <= j < k
|
|
629
|
+
|
|
630
|
+
if k - j <= 1: # base case
|
|
631
|
+
return _base(j, k, c)
|
|
632
|
+
|
|
633
|
+
w = 2
|
|
634
|
+
js = list(range(j, k, (k-j+w-1) // w)) + [k]
|
|
635
|
+
assert len(js) == w + 1
|
|
636
|
+
|
|
637
|
+
x = vector([0] * len(aa))
|
|
638
|
+
for i in reversed(range(w)):
|
|
639
|
+
|
|
640
|
+
gamma = p ** (js[i] - j) * c - dotprod(x, subbasis(js[i], k))
|
|
641
|
+
|
|
642
|
+
v = _rec(js[i], js[i+1], gamma)
|
|
643
|
+
|
|
644
|
+
assert not any(q1 % q2 for q1, q2 in zip(qq(js[i], js[i+1]), qq(js[i], k)))
|
|
645
|
+
x += vector(q1 // q2 * r for q1, q2, r in zip(qq(js[i], js[i+1]), qq(js[i], k), v))
|
|
646
|
+
|
|
647
|
+
return x
|
|
648
|
+
|
|
649
|
+
return _rec(0, max(vals), b)
|
|
650
|
+
|
|
651
|
+
|
|
652
|
+
def _expand_basis_pgroup(p, alphas, vals, beta, h, rel):
|
|
653
|
+
r"""
|
|
654
|
+
Given a basis of a `p`-subgroup of a finite abelian group
|
|
655
|
+
and an element lying outside the subgroup, extend the basis
|
|
656
|
+
to the subgroup spanned jointly by the original subgroup and
|
|
657
|
+
the new element.
|
|
658
|
+
|
|
659
|
+
Used as a subroutine in :func:`basis_from_generators`.
|
|
660
|
+
|
|
661
|
+
This function modifies ``alphas`` and ``vals`` in place.
|
|
662
|
+
|
|
663
|
+
ALGORITHM: [Suth2007]_, Algorithm 9.2
|
|
664
|
+
|
|
665
|
+
INPUT:
|
|
666
|
+
|
|
667
|
+
- ``p`` -- prime integer `p`
|
|
668
|
+
- ``alphas`` -- list; basis for a `p`-subgroup of an abelian group
|
|
669
|
+
- ``vals`` -- list; valuation at `p` of the orders of the ``alphas``
|
|
670
|
+
- ``beta`` -- element of the same abelian group as the ``alphas``
|
|
671
|
+
- ``h`` -- integer; valuation at `p` of the order of ``beta``
|
|
672
|
+
- ``rel`` -- list of integers; relation on ``alphas + [beta]``
|
|
673
|
+
|
|
674
|
+
OUTPUT: basis of the subgroup generated by ``alphas + [beta]``
|
|
675
|
+
|
|
676
|
+
EXAMPLES::
|
|
677
|
+
|
|
678
|
+
sage: from sage.groups.additive_abelian.additive_abelian_wrapper import _expand_basis_pgroup
|
|
679
|
+
sage: A = AdditiveAbelianGroup([9,3])
|
|
680
|
+
sage: alphas = [A((5,2))]
|
|
681
|
+
sage: beta = A((1,0))
|
|
682
|
+
sage: vals = [2]
|
|
683
|
+
sage: rel = next([ZZ(r),ZZ(s)] for s in range(9) for r in range(9) if s > 1 and not r*alphas[0] + s*beta)
|
|
684
|
+
sage: _expand_basis_pgroup(3, alphas, vals, beta, 2, rel)
|
|
685
|
+
sage: alphas
|
|
686
|
+
[(5, 2), (6, 2)]
|
|
687
|
+
sage: vals
|
|
688
|
+
[2, 1]
|
|
689
|
+
sage: len({i*alphas[0] + j*alphas[1] for i in range(3^2) for j in range(3^1)})
|
|
690
|
+
27
|
|
691
|
+
"""
|
|
692
|
+
# The given assertions should hold, but were commented out for speed.
|
|
693
|
+
|
|
694
|
+
k = len(rel)
|
|
695
|
+
if not (isinstance(alphas, list) and isinstance(vals, list)):
|
|
696
|
+
raise TypeError('alphas and vals must be lists for mutability')
|
|
697
|
+
if not len(alphas) == len(vals) == k - 1:
|
|
698
|
+
raise ValueError('alphas and/or vals have incorrect length')
|
|
699
|
+
# assert not sum(r*a for r,a in zip(rel, alphas+[beta]))
|
|
700
|
+
# assert all(a.order() == p**v for a,v in zip(alphas,vals))
|
|
701
|
+
|
|
702
|
+
if rel[-1] < 0:
|
|
703
|
+
raise ValueError('rel must have nonnegative entries')
|
|
704
|
+
|
|
705
|
+
# step 1
|
|
706
|
+
min_r = rel[-1] or float('inf')
|
|
707
|
+
for i in range(k-1):
|
|
708
|
+
if not rel[i]:
|
|
709
|
+
continue
|
|
710
|
+
if rel[i] < 0:
|
|
711
|
+
raise ValueError('rel must have nonnegative entries')
|
|
712
|
+
q = rel[i].p_primary_part(p)
|
|
713
|
+
alphas[i] *= rel[i] // q
|
|
714
|
+
rel[i] = q
|
|
715
|
+
min_r = min(q, min_r)
|
|
716
|
+
if min_r == float('inf'):
|
|
717
|
+
raise ValueError('rel must have at least one nonzero entry')
|
|
718
|
+
val_rlast = rel[-1].valuation(p)
|
|
719
|
+
# assert rel[-1] == p ** val_rlast
|
|
720
|
+
# assert not sum(r*a for r,a in zip(rel, alphas+[beta]))
|
|
721
|
+
|
|
722
|
+
# step 2
|
|
723
|
+
if rel[-1] == min_r:
|
|
724
|
+
for i in range(k-1):
|
|
725
|
+
beta += alphas[i] * (rel[i]//rel[-1])
|
|
726
|
+
alphas.append(beta)
|
|
727
|
+
vals.append(val_rlast)
|
|
728
|
+
# assert alphas[-1].order() == p**vals[-1]
|
|
729
|
+
return
|
|
730
|
+
|
|
731
|
+
# step 3
|
|
732
|
+
j = next(j for j, r in enumerate(rel) if r == min_r)
|
|
733
|
+
alphas[j] = sum(a * (r // rel[j]) for a, r in zip(alphas + [beta], rel))
|
|
734
|
+
|
|
735
|
+
# step 4
|
|
736
|
+
if not alphas[j]:
|
|
737
|
+
del alphas[j], vals[j]
|
|
738
|
+
if not alphas:
|
|
739
|
+
alphas.append(beta)
|
|
740
|
+
vals.append(val_rlast)
|
|
741
|
+
# assert alphas[-1].order() == p**vals[-1]
|
|
742
|
+
return
|
|
743
|
+
|
|
744
|
+
# step 5
|
|
745
|
+
beta_q = beta
|
|
746
|
+
for v in range(1, h):
|
|
747
|
+
beta_q *= p
|
|
748
|
+
try:
|
|
749
|
+
e = _discrete_log_pgroup(p, vals, alphas, -beta_q)
|
|
750
|
+
except ValueError:
|
|
751
|
+
continue
|
|
752
|
+
# step 6
|
|
753
|
+
_expand_basis_pgroup(p, alphas, vals, beta, h, list(e) + [p**v])
|
|
754
|
+
break
|
|
755
|
+
else:
|
|
756
|
+
alphas.append(beta)
|
|
757
|
+
vals.append(h)
|
|
758
|
+
# assert alphas[-1].order() == p**vals[-1]
|
|
759
|
+
|
|
760
|
+
|
|
761
|
+
def basis_from_generators(gens, ords=None):
|
|
762
|
+
r"""
|
|
763
|
+
Given a generating set of some finite abelian group
|
|
764
|
+
(additively written), compute and return a basis of
|
|
765
|
+
the group.
|
|
766
|
+
|
|
767
|
+
.. NOTE::
|
|
768
|
+
|
|
769
|
+
A *basis* of a finite abelian group is a generating
|
|
770
|
+
set `\{g_1, \ldots, g_n\}` such that each element of the
|
|
771
|
+
group can be written as a unique linear combination
|
|
772
|
+
`\alpha_1 g_1 + \cdots + \alpha_n g_n` with each
|
|
773
|
+
`\alpha_i \in \{0, \ldots, \mathrm{ord}(g_i)-1\}`.
|
|
774
|
+
|
|
775
|
+
ALGORITHM: [Suth2007]_, Algorithm 9.1 & Remark 9.1
|
|
776
|
+
|
|
777
|
+
EXAMPLES::
|
|
778
|
+
|
|
779
|
+
sage: # needs sage.groups sage.rings.finite_rings sage.schemes
|
|
780
|
+
sage: from sage.groups.additive_abelian.additive_abelian_wrapper import basis_from_generators
|
|
781
|
+
sage: E = EllipticCurve(GF(31337^6,'a'), j=37)
|
|
782
|
+
sage: E.order()
|
|
783
|
+
946988065073788930380545280
|
|
784
|
+
sage: (R,S), (ordR,ordS) = basis_from_generators(E.gens())
|
|
785
|
+
sage: ordR, ordS
|
|
786
|
+
(313157428926517503432720, 3024)
|
|
787
|
+
sage: R.order() == ordR
|
|
788
|
+
True
|
|
789
|
+
sage: S.order() == ordS
|
|
790
|
+
True
|
|
791
|
+
sage: ordR * ordS == E.order()
|
|
792
|
+
True
|
|
793
|
+
sage: R.weil_pairing(S, ordR).multiplicative_order() == ordS
|
|
794
|
+
True
|
|
795
|
+
sage: E.abelian_group().invariants()
|
|
796
|
+
(3024, 313157428926517503432720)
|
|
797
|
+
"""
|
|
798
|
+
if not gens:
|
|
799
|
+
return [], []
|
|
800
|
+
if ords is None:
|
|
801
|
+
ords = [g.order() for g in gens]
|
|
802
|
+
|
|
803
|
+
from sage.arith.functions import lcm
|
|
804
|
+
lam = lcm(ords)
|
|
805
|
+
ps = sorted(lam.prime_factors(), key=lam.valuation)
|
|
806
|
+
|
|
807
|
+
gammas = []
|
|
808
|
+
ms = []
|
|
809
|
+
for p in ps:
|
|
810
|
+
pgens = [(o.prime_to_m_part(p) * g, o.p_primary_part(p))
|
|
811
|
+
for g, o in zip(gens, ords) if not o % p]
|
|
812
|
+
assert pgens
|
|
813
|
+
pgens.sort(key=lambda tup: tup[1])
|
|
814
|
+
|
|
815
|
+
alpha, ord_alpha = pgens.pop()
|
|
816
|
+
vals = [ord_alpha.valuation(p)]
|
|
817
|
+
alphas = [alpha]
|
|
818
|
+
|
|
819
|
+
while pgens:
|
|
820
|
+
beta, ord_beta = pgens.pop()
|
|
821
|
+
try:
|
|
822
|
+
_ = _discrete_log_pgroup(p, vals, alphas, beta)
|
|
823
|
+
except ValueError:
|
|
824
|
+
pass
|
|
825
|
+
else:
|
|
826
|
+
continue
|
|
827
|
+
|
|
828
|
+
# step 4
|
|
829
|
+
val_beta = ord_beta.valuation(p)
|
|
830
|
+
beta_q = beta
|
|
831
|
+
for v in range(1, val_beta):
|
|
832
|
+
beta_q *= p
|
|
833
|
+
# assert beta_q == beta * p**v
|
|
834
|
+
try:
|
|
835
|
+
e = _discrete_log_pgroup(p, vals, alphas, -beta_q)
|
|
836
|
+
except ValueError:
|
|
837
|
+
continue
|
|
838
|
+
_expand_basis_pgroup(p, alphas, vals, beta, val_beta, list(e) + [p**v])
|
|
839
|
+
# assert all(a.order() == p**v for a,v in zip(alphas, vals))
|
|
840
|
+
break
|
|
841
|
+
else:
|
|
842
|
+
alphas.append(beta)
|
|
843
|
+
vals.append(val_beta)
|
|
844
|
+
|
|
845
|
+
for i, (v, a) in enumerate(sorted(zip(vals, alphas), reverse=True)):
|
|
846
|
+
if i < len(gammas):
|
|
847
|
+
gammas[i] += a
|
|
848
|
+
ms[i] *= p ** v
|
|
849
|
+
else:
|
|
850
|
+
gammas.append(a)
|
|
851
|
+
ms.append(p ** v)
|
|
852
|
+
|
|
853
|
+
# assert len({sum(i*g for i,g in zip(vec,gammas))
|
|
854
|
+
# for vec in __import__('itertools').product(*map(range,ms))}) \
|
|
855
|
+
# == __import__('sage').misc.misc_c.prod(ms)
|
|
856
|
+
|
|
857
|
+
return gammas, ms
|