passagemath-modules 10.6.31__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.31.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31.dist-info/RECORD +808 -0
- passagemath_modules-10.6.31.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31.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,748 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.libs.pari
|
|
3
|
+
r"""
|
|
4
|
+
Class groups of binary quadratic forms
|
|
5
|
+
|
|
6
|
+
EXAMPLES:
|
|
7
|
+
|
|
8
|
+
Constructing the class of a given binary quadratic form is straightforward::
|
|
9
|
+
|
|
10
|
+
sage: F1 = BinaryQF([22, 91, 99])
|
|
11
|
+
sage: cl1 = F1.form_class(); cl1
|
|
12
|
+
Class of 5*x^2 - 3*x*y + 22*y^2
|
|
13
|
+
|
|
14
|
+
Every class is represented by a reduced form in it::
|
|
15
|
+
|
|
16
|
+
sage: cl1.form()
|
|
17
|
+
5*x^2 - 3*x*y + 22*y^2
|
|
18
|
+
sage: cl1.form() == F1.reduced_form()
|
|
19
|
+
True
|
|
20
|
+
|
|
21
|
+
Addition of form classes and derived operations are defined by composition
|
|
22
|
+
of binary quadratic forms::
|
|
23
|
+
|
|
24
|
+
sage: F2 = BinaryQF([4, 1, 27])
|
|
25
|
+
sage: cl2 = F2.form_class(); cl2
|
|
26
|
+
Class of 4*x^2 + x*y + 27*y^2
|
|
27
|
+
sage: cl1 + cl2
|
|
28
|
+
Class of 9*x^2 + x*y + 12*y^2
|
|
29
|
+
sage: cl1 + cl2 == (F1 * F2).form_class()
|
|
30
|
+
True
|
|
31
|
+
sage: -cl1
|
|
32
|
+
Class of 5*x^2 + 3*x*y + 22*y^2
|
|
33
|
+
sage: cl1 - cl1
|
|
34
|
+
Class of x^2 + x*y + 108*y^2
|
|
35
|
+
|
|
36
|
+
The form class group can be constructed as an explicit parent object::
|
|
37
|
+
|
|
38
|
+
sage: F1.discriminant()
|
|
39
|
+
-431
|
|
40
|
+
sage: Cl = BQFClassGroup(-431); Cl
|
|
41
|
+
Form Class Group of Discriminant -431
|
|
42
|
+
sage: cl1.parent() is Cl
|
|
43
|
+
True
|
|
44
|
+
sage: Cl(F1) == cl1
|
|
45
|
+
True
|
|
46
|
+
|
|
47
|
+
Structural properties of the form class group, such as the class number,
|
|
48
|
+
the group invariants, and element orders, can be computed::
|
|
49
|
+
|
|
50
|
+
sage: # needs sage.rings.number_field
|
|
51
|
+
sage: Cl.order()
|
|
52
|
+
21
|
|
53
|
+
sage: cl1 * Cl.order() == Cl.zero()
|
|
54
|
+
True
|
|
55
|
+
sage: cl2 * Cl.order() == Cl.zero()
|
|
56
|
+
True
|
|
57
|
+
sage: cl2.order()
|
|
58
|
+
7
|
|
59
|
+
sage: cl2 * cl2.order() == Cl.zero()
|
|
60
|
+
True
|
|
61
|
+
sage: Cl.abelian_group()
|
|
62
|
+
Additive abelian group isomorphic to Z/21 embedded in Form Class Group of Discriminant -431
|
|
63
|
+
sage: Cl.gens() # random
|
|
64
|
+
[Class of 5*x^2 + 3*x*y + 22*y^2]
|
|
65
|
+
sage: Cl.gens()[0].order()
|
|
66
|
+
21
|
|
67
|
+
|
|
68
|
+
AUTHORS:
|
|
69
|
+
|
|
70
|
+
- Lorenz Panny (2023)
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
# ****************************************************************************
|
|
74
|
+
# Copyright (C) 2023 Lorenz Panny
|
|
75
|
+
#
|
|
76
|
+
# This program is free software: you can redistribute it and/or modify
|
|
77
|
+
# it under the terms of the GNU General Public License as published by
|
|
78
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
79
|
+
# (at your option) any later version.
|
|
80
|
+
# https://www.gnu.org/licenses/
|
|
81
|
+
# ****************************************************************************
|
|
82
|
+
|
|
83
|
+
from sage.misc.cachefunc import cached_method
|
|
84
|
+
from sage.misc.lazy_import import lazy_import
|
|
85
|
+
|
|
86
|
+
from sage.structure.parent import Parent
|
|
87
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
88
|
+
from sage.structure.element import AdditiveGroupElement
|
|
89
|
+
from sage.categories.morphism import Morphism
|
|
90
|
+
|
|
91
|
+
from sage.misc.prandom import randrange
|
|
92
|
+
from sage.rings.integer_ring import ZZ
|
|
93
|
+
from sage.rings.finite_rings.integer_mod_ring import Zmod
|
|
94
|
+
from sage.rings.finite_rings.integer_mod import Mod
|
|
95
|
+
from sage.rings.polynomial.polynomial_ring import polygen
|
|
96
|
+
from sage.arith.misc import random_prime
|
|
97
|
+
from sage.matrix.constructor import matrix
|
|
98
|
+
from sage.groups.generic import order_from_multiple, multiple
|
|
99
|
+
from sage.groups.additive_abelian.additive_abelian_wrapper import AdditiveAbelianGroupWrapper
|
|
100
|
+
from sage.quadratic_forms.binary_qf import BinaryQF
|
|
101
|
+
|
|
102
|
+
lazy_import('sage.libs.pari', 'pari')
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class BQFClassGroup(Parent, UniqueRepresentation):
|
|
106
|
+
r"""
|
|
107
|
+
This type represents the class group for a given discriminant `D`.
|
|
108
|
+
|
|
109
|
+
- For `D < 0`, the group is the class group of *positive definite*
|
|
110
|
+
binary quadratic forms. The "full" form class group is the direct
|
|
111
|
+
sum of two isomorphic copies of this group (one for positive
|
|
112
|
+
definite forms and one for negative definite forms).
|
|
113
|
+
|
|
114
|
+
- For `D > 0`, this functionality is currently not implemented.
|
|
115
|
+
|
|
116
|
+
EXAMPLES::
|
|
117
|
+
|
|
118
|
+
sage: BQFClassGroup(-4)
|
|
119
|
+
Form Class Group of Discriminant -4
|
|
120
|
+
sage: BQFClassGroup(-6)
|
|
121
|
+
Traceback (most recent call last):
|
|
122
|
+
...
|
|
123
|
+
ValueError: not a discriminant
|
|
124
|
+
|
|
125
|
+
The discriminant need not be fundamental::
|
|
126
|
+
|
|
127
|
+
sage: BQFClassGroup(-22^2)
|
|
128
|
+
Form Class Group of Discriminant -484
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
def __init__(self, D, *, check=True):
|
|
132
|
+
r"""
|
|
133
|
+
Construct the class group for a given discriminant `D`.
|
|
134
|
+
|
|
135
|
+
TESTS:
|
|
136
|
+
|
|
137
|
+
Check that positive discriminants are rejected until code is
|
|
138
|
+
written for them::
|
|
139
|
+
|
|
140
|
+
sage: BQFClassGroup(101)
|
|
141
|
+
Traceback (most recent call last):
|
|
142
|
+
...
|
|
143
|
+
NotImplementedError: positive discriminants are not yet supported
|
|
144
|
+
"""
|
|
145
|
+
self._disc = ZZ(D)
|
|
146
|
+
if check:
|
|
147
|
+
if not self._disc or self._disc % 4 not in (0, 1):
|
|
148
|
+
raise ValueError('not a discriminant')
|
|
149
|
+
if self._disc > 0:
|
|
150
|
+
raise NotImplementedError('positive discriminants are not yet supported')
|
|
151
|
+
super().__init__()
|
|
152
|
+
|
|
153
|
+
def _element_constructor_(self, F, *, check=True):
|
|
154
|
+
r"""
|
|
155
|
+
Construct an element of this form class group as a :class:`BQFClassGroup_element`.
|
|
156
|
+
|
|
157
|
+
EXAMPLES::
|
|
158
|
+
|
|
159
|
+
sage: Cl = BQFClassGroup(-999)
|
|
160
|
+
sage: Cl(0) # indirect doctest
|
|
161
|
+
Class of x^2 + x*y + 250*y^2
|
|
162
|
+
sage: Cl(BinaryQF([16, 5, 16])) # indirect doctest
|
|
163
|
+
Class of 16*x^2 + 5*x*y + 16*y^2
|
|
164
|
+
"""
|
|
165
|
+
if isinstance(F, BQFClassGroup_element):
|
|
166
|
+
if check and F.parent() is not self: # class group is unique parent
|
|
167
|
+
raise ValueError('quadratic form has incorrect discriminant')
|
|
168
|
+
return F
|
|
169
|
+
if F == 0:
|
|
170
|
+
return self.zero()
|
|
171
|
+
if check and not isinstance(F, BinaryQF):
|
|
172
|
+
raise TypeError('not a binary quadratic form')
|
|
173
|
+
return BQFClassGroup_element(F, parent=self, check=check)
|
|
174
|
+
|
|
175
|
+
def zero(self):
|
|
176
|
+
r"""
|
|
177
|
+
Return the neutral element of this group, i.e., the class of the
|
|
178
|
+
principal binary quadratic form of the respective discriminant.
|
|
179
|
+
|
|
180
|
+
EXAMPLES::
|
|
181
|
+
|
|
182
|
+
sage: Cl = BQFClassGroup(-999)
|
|
183
|
+
sage: cl = Cl.zero(); cl
|
|
184
|
+
Class of x^2 + x*y + 250*y^2
|
|
185
|
+
sage: cl + cl == cl
|
|
186
|
+
True
|
|
187
|
+
"""
|
|
188
|
+
return self(BinaryQF.principal(self._disc))
|
|
189
|
+
|
|
190
|
+
def random_element(self):
|
|
191
|
+
r"""
|
|
192
|
+
Return a somewhat random element of this form class group.
|
|
193
|
+
|
|
194
|
+
ALGORITHM:
|
|
195
|
+
|
|
196
|
+
Sample random odd primes `a` until `b^2 = D \pmod{4a}` has a
|
|
197
|
+
solution `b \in \ZZ` and set `c = (b^2-D)/(4a)`. Flip a coin
|
|
198
|
+
to choose the sign of `b`. Then return the class of `[a,b,c]`.
|
|
199
|
+
|
|
200
|
+
.. NOTE::
|
|
201
|
+
|
|
202
|
+
No strict guarantees are being made about the distribution of
|
|
203
|
+
classes sampled by this function. Heuristically, however, it
|
|
204
|
+
should be fairly close to uniform.
|
|
205
|
+
|
|
206
|
+
EXAMPLES::
|
|
207
|
+
|
|
208
|
+
sage: Cl = BQFClassGroup(-999); Cl
|
|
209
|
+
Form Class Group of Discriminant -999
|
|
210
|
+
sage: cl = Cl.random_element(); cl # random
|
|
211
|
+
Class of 10*x^2 + x*y + 25*y^2
|
|
212
|
+
sage: cl.form().discriminant()
|
|
213
|
+
-999
|
|
214
|
+
"""
|
|
215
|
+
B = self._disc.abs() * 100 + 9999
|
|
216
|
+
while True:
|
|
217
|
+
a = random_prime(B, proof=False, lbound=3)
|
|
218
|
+
if self._disc.kronecker(a) == 1:
|
|
219
|
+
break
|
|
220
|
+
b = ZZ(Mod(self._disc, 4*a).sqrt())
|
|
221
|
+
c = (b**2 - self._disc) // (4*a)
|
|
222
|
+
if randrange(2):
|
|
223
|
+
b = -b
|
|
224
|
+
return self(BinaryQF([a, b, c]))
|
|
225
|
+
|
|
226
|
+
def __hash__(self):
|
|
227
|
+
r"""
|
|
228
|
+
Return a hash value for this form class group.
|
|
229
|
+
|
|
230
|
+
EXAMPLES::
|
|
231
|
+
|
|
232
|
+
sage: hash(BQFClassGroup(-999)) # random
|
|
233
|
+
-4246560339810542104
|
|
234
|
+
"""
|
|
235
|
+
return hash(('BQFClassGroup', self._disc))
|
|
236
|
+
|
|
237
|
+
def _repr_(self):
|
|
238
|
+
r"""
|
|
239
|
+
Return a string describing this form class group.
|
|
240
|
+
|
|
241
|
+
EXAMPLES::
|
|
242
|
+
|
|
243
|
+
sage: BQFClassGroup(-999) # indirect doctest
|
|
244
|
+
Form Class Group of Discriminant -999
|
|
245
|
+
"""
|
|
246
|
+
return f'Form Class Group of Discriminant {self._disc}'
|
|
247
|
+
|
|
248
|
+
def discriminant(self):
|
|
249
|
+
r"""
|
|
250
|
+
Return the discriminant of the forms in this form class group.
|
|
251
|
+
|
|
252
|
+
EXAMPLES::
|
|
253
|
+
|
|
254
|
+
sage: BQFClassGroup(-999).discriminant()
|
|
255
|
+
-999
|
|
256
|
+
"""
|
|
257
|
+
return self._disc
|
|
258
|
+
|
|
259
|
+
@cached_method
|
|
260
|
+
def order(self):
|
|
261
|
+
r"""
|
|
262
|
+
Return the order of this form class group (the *class number*).
|
|
263
|
+
|
|
264
|
+
ALGORITHM: :func:`sage.rings.number_field.order.quadratic_order_class_number`.
|
|
265
|
+
|
|
266
|
+
EXAMPLES::
|
|
267
|
+
|
|
268
|
+
sage: # needs sage.rings.number_field
|
|
269
|
+
sage: BQFClassGroup(-4).order()
|
|
270
|
+
1
|
|
271
|
+
sage: BQFClassGroup(-11).order()
|
|
272
|
+
1
|
|
273
|
+
sage: BQFClassGroup(-67).order()
|
|
274
|
+
1
|
|
275
|
+
sage: BQFClassGroup(-163).order()
|
|
276
|
+
1
|
|
277
|
+
sage: BQFClassGroup(-999).order()
|
|
278
|
+
24
|
|
279
|
+
sage: BQFClassGroup(-9999).order()
|
|
280
|
+
88
|
|
281
|
+
sage: BQFClassGroup(-99999).order()
|
|
282
|
+
224
|
|
283
|
+
"""
|
|
284
|
+
# Beware: If this code is ever generalized to positive
|
|
285
|
+
# discriminants, care must be taken to use the correct
|
|
286
|
+
# notion of class number. We may need the *narrow* class
|
|
287
|
+
# number here; see PARI's documentation for qfbclassno().
|
|
288
|
+
from sage.rings.number_field.order import quadratic_order_class_number
|
|
289
|
+
return quadratic_order_class_number(self._disc)
|
|
290
|
+
|
|
291
|
+
cardinality = order
|
|
292
|
+
|
|
293
|
+
@cached_method
|
|
294
|
+
def abelian_group(self):
|
|
295
|
+
r"""
|
|
296
|
+
Return the structure of this form class group as an
|
|
297
|
+
:class:`AdditiveAbelianGroupWrapper` object.
|
|
298
|
+
|
|
299
|
+
ALGORITHM: :pari:`quadclassunit`
|
|
300
|
+
|
|
301
|
+
EXAMPLES::
|
|
302
|
+
|
|
303
|
+
sage: Cl = BQFClassGroup(-4*777)
|
|
304
|
+
sage: Cl.order() # needs sage.rings.number_field
|
|
305
|
+
16
|
|
306
|
+
sage: G = Cl.abelian_group(); G
|
|
307
|
+
Additive abelian group isomorphic to Z/4 + Z/2 + Z/2 embedded in Form Class Group of Discriminant -3108
|
|
308
|
+
sage: G.gens() # random
|
|
309
|
+
(Class of 11*x^2 + 4*x*y + 71*y^2,
|
|
310
|
+
Class of 6*x^2 + 6*x*y + 131*y^2,
|
|
311
|
+
Class of 2*x^2 + 2*x*y + 389*y^2)
|
|
312
|
+
sage: [g.order() for g in G.gens()]
|
|
313
|
+
[4, 2, 2]
|
|
314
|
+
sage: G.discrete_log(Cl.random_element()) # random
|
|
315
|
+
(3, 0, 1)
|
|
316
|
+
"""
|
|
317
|
+
h, ords, gens, reg = pari.quadclassunit(self._disc)
|
|
318
|
+
ords = [ZZ(o) for o in ords]
|
|
319
|
+
gens = [BinaryQF(g) for g in gens]
|
|
320
|
+
return AdditiveAbelianGroupWrapper(self, gens, ords)
|
|
321
|
+
|
|
322
|
+
def gens(self) -> list:
|
|
323
|
+
r"""
|
|
324
|
+
Return a generating set of this form class group.
|
|
325
|
+
|
|
326
|
+
EXAMPLES::
|
|
327
|
+
|
|
328
|
+
sage: Cl = BQFClassGroup(-4*419)
|
|
329
|
+
sage: Cl.gens()
|
|
330
|
+
[Class of 3*x^2 + 2*x*y + 140*y^2]
|
|
331
|
+
|
|
332
|
+
::
|
|
333
|
+
|
|
334
|
+
sage: Cl = BQFClassGroup(-4*777)
|
|
335
|
+
sage: Cl.gens() # random
|
|
336
|
+
[Class of 11*x^2 + 4*x*y + 71*y^2,
|
|
337
|
+
Class of 6*x^2 + 6*x*y + 131*y^2,
|
|
338
|
+
Class of 2*x^2 + 2*x*y + 389*y^2]
|
|
339
|
+
"""
|
|
340
|
+
return [g.element() for g in self.abelian_group().gens()]
|
|
341
|
+
|
|
342
|
+
def _coerce_map_from_(self, other):
|
|
343
|
+
r"""
|
|
344
|
+
Return the natural projection map between two class groups
|
|
345
|
+
of binary quadratic forms when it is defined.
|
|
346
|
+
|
|
347
|
+
.. SEEALSO:: :class:`BQFClassGroupQuotientMorphism`
|
|
348
|
+
|
|
349
|
+
EXAMPLES::
|
|
350
|
+
|
|
351
|
+
sage: G = BQFClassGroup(-4*117117)
|
|
352
|
+
sage: H = BQFClassGroup(-4*77)
|
|
353
|
+
sage: proj = G.hom(H); proj # implicit doctest
|
|
354
|
+
Coercion morphism:
|
|
355
|
+
From: Form Class Group of Discriminant -468468
|
|
356
|
+
To: Form Class Group of Discriminant -308
|
|
357
|
+
sage: elt = G(BinaryQF(333, 306, 422)); elt
|
|
358
|
+
Class of 333*x^2 + 306*x*y + 422*y^2
|
|
359
|
+
sage: proj(elt)
|
|
360
|
+
Class of 9*x^2 + 4*x*y + 9*y^2
|
|
361
|
+
"""
|
|
362
|
+
if not isinstance(other, BQFClassGroup):
|
|
363
|
+
return super()._coerce_map_from_(other)
|
|
364
|
+
try:
|
|
365
|
+
proj = BQFClassGroupQuotientMorphism(other, self)
|
|
366
|
+
except (TypeError, ValueError):
|
|
367
|
+
return super()._coerce_map_from_(other)
|
|
368
|
+
return proj
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
class BQFClassGroup_element(AdditiveGroupElement):
|
|
372
|
+
r"""
|
|
373
|
+
This type represents elements of class groups of binary quadratic forms.
|
|
374
|
+
|
|
375
|
+
Users should not need to construct objects of this type directly; it can
|
|
376
|
+
be accessed via either the :class:`BQFClassGroup` parent object or the
|
|
377
|
+
:meth:`~BinaryQF.form_class` method associated to binary quadratic forms.
|
|
378
|
+
|
|
379
|
+
Currently only classes of positive definite forms are supported.
|
|
380
|
+
|
|
381
|
+
EXAMPLES::
|
|
382
|
+
|
|
383
|
+
sage: F = BinaryQF([22, 91, 99])
|
|
384
|
+
sage: F.form_class() # implicit doctest
|
|
385
|
+
Class of 5*x^2 - 3*x*y + 22*y^2
|
|
386
|
+
|
|
387
|
+
::
|
|
388
|
+
|
|
389
|
+
sage: Cl = BQFClassGroup(-4*419)
|
|
390
|
+
sage: Cl.zero()
|
|
391
|
+
Class of x^2 + 419*y^2
|
|
392
|
+
sage: Cl.gens()[0] # implicit doctest
|
|
393
|
+
Class of 3*x^2 + 2*x*y + 140*y^2
|
|
394
|
+
"""
|
|
395
|
+
|
|
396
|
+
def __init__(self, F, parent, *, check=True, reduce=True):
|
|
397
|
+
r"""
|
|
398
|
+
Constructor for classes of binary quadratic forms.
|
|
399
|
+
|
|
400
|
+
EXAMPLES::
|
|
401
|
+
|
|
402
|
+
sage: Cl = BQFClassGroup(-431)
|
|
403
|
+
sage: F = BinaryQF([22, 91, 99])
|
|
404
|
+
sage: from sage.quadratic_forms.bqf_class_group import BQFClassGroup_element
|
|
405
|
+
sage: BQFClassGroup_element(F, parent=Cl)
|
|
406
|
+
Class of 5*x^2 - 3*x*y + 22*y^2
|
|
407
|
+
"""
|
|
408
|
+
if check:
|
|
409
|
+
if not isinstance(F, BinaryQF):
|
|
410
|
+
raise TypeError('not a binary quadratic form')
|
|
411
|
+
if F.discriminant() != parent.discriminant():
|
|
412
|
+
raise ValueError('given quadratic form has wrong discriminant')
|
|
413
|
+
if not F.is_primitive():
|
|
414
|
+
raise ValueError('given quadratic form is not primitive')
|
|
415
|
+
if not F.is_positive_definite():
|
|
416
|
+
raise NotImplementedError('only positive definite forms are currently supported')
|
|
417
|
+
if reduce:
|
|
418
|
+
F = F.reduced_form()
|
|
419
|
+
self._form = F
|
|
420
|
+
super().__init__(parent=parent)
|
|
421
|
+
|
|
422
|
+
def form(self):
|
|
423
|
+
r"""
|
|
424
|
+
Return a reduced quadratic form in this class.
|
|
425
|
+
|
|
426
|
+
(For `D < 0`, each class contains a *unique* reduced form.)
|
|
427
|
+
|
|
428
|
+
EXAMPLES::
|
|
429
|
+
|
|
430
|
+
sage: F = BinaryQF([3221, 2114, 350])
|
|
431
|
+
sage: cl = F.form_class()
|
|
432
|
+
sage: cl.form()
|
|
433
|
+
29*x^2 + 14*x*y + 350*y^2
|
|
434
|
+
sage: cl.form() == F.reduced_form()
|
|
435
|
+
True
|
|
436
|
+
"""
|
|
437
|
+
return self._form
|
|
438
|
+
|
|
439
|
+
def _neg_(self):
|
|
440
|
+
r"""
|
|
441
|
+
Return the inverse of this form class.
|
|
442
|
+
|
|
443
|
+
The inverse class of a form `[a,b,c]` is represented by `[a,-b,c]`.
|
|
444
|
+
|
|
445
|
+
EXAMPLES::
|
|
446
|
+
|
|
447
|
+
sage: F = BinaryQF([11,21,31])
|
|
448
|
+
sage: cl = F.form_class(); cl
|
|
449
|
+
Class of 11*x^2 - x*y + 21*y^2
|
|
450
|
+
sage: -cl # indirect doctest
|
|
451
|
+
Class of 11*x^2 + x*y + 21*y^2
|
|
452
|
+
sage: cl + (-cl) == cl.parent().zero() # indirect doctest
|
|
453
|
+
True
|
|
454
|
+
"""
|
|
455
|
+
a, b, c = self._form
|
|
456
|
+
F = BinaryQF([a, -b, c])
|
|
457
|
+
return BQFClassGroup_element(F, parent=self.parent())
|
|
458
|
+
|
|
459
|
+
def _add_(self, other):
|
|
460
|
+
r"""
|
|
461
|
+
Return the composition of two form classes.
|
|
462
|
+
|
|
463
|
+
EXAMPLES::
|
|
464
|
+
|
|
465
|
+
sage: cl1 = BinaryQF([11,21,31]).form_class(); cl1
|
|
466
|
+
Class of 11*x^2 - x*y + 21*y^2
|
|
467
|
+
sage: cl2 = BinaryQF([7,55,141]).form_class(); cl2
|
|
468
|
+
Class of 7*x^2 - x*y + 33*y^2
|
|
469
|
+
sage: cl1 + cl2 # indirect doctest
|
|
470
|
+
Class of 3*x^2 + x*y + 77*y^2
|
|
471
|
+
"""
|
|
472
|
+
F = self._form * other._form
|
|
473
|
+
return BQFClassGroup_element(F, parent=self.parent())
|
|
474
|
+
|
|
475
|
+
def _sub_(self, other):
|
|
476
|
+
r"""
|
|
477
|
+
Return the composition of a form class with the inverse of another.
|
|
478
|
+
|
|
479
|
+
EXAMPLES::
|
|
480
|
+
|
|
481
|
+
sage: cl1 = BinaryQF([11,21,31]).form_class(); cl1
|
|
482
|
+
Class of 11*x^2 - x*y + 21*y^2
|
|
483
|
+
sage: cl2 = BinaryQF([7,55,141]).form_class(); cl2
|
|
484
|
+
Class of 7*x^2 - x*y + 33*y^2
|
|
485
|
+
sage: cl1 - cl2 # indirect doctest
|
|
486
|
+
Class of 9*x^2 - 7*x*y + 27*y^2
|
|
487
|
+
sage: cl1 - cl2 == cl1 + (-cl2) # indirect doctest
|
|
488
|
+
True
|
|
489
|
+
"""
|
|
490
|
+
return self + (-other)
|
|
491
|
+
|
|
492
|
+
def __mul__(self, other):
|
|
493
|
+
r"""
|
|
494
|
+
Return an integer multiple of this form class with respect to
|
|
495
|
+
repeated composition.
|
|
496
|
+
|
|
497
|
+
ALGORITHM: :func:`multiple`
|
|
498
|
+
|
|
499
|
+
EXAMPLES::
|
|
500
|
+
|
|
501
|
+
sage: F = BinaryQF([11,21,31])
|
|
502
|
+
sage: cl = F.form_class(); cl
|
|
503
|
+
Class of 11*x^2 - x*y + 21*y^2
|
|
504
|
+
sage: cl*0 == cl.parent().zero() # indirect doctest
|
|
505
|
+
True
|
|
506
|
+
sage: cl*1 == cl # indirect doctest
|
|
507
|
+
True
|
|
508
|
+
sage: cl*(-1) == -cl # indirect doctest
|
|
509
|
+
True
|
|
510
|
+
sage: cl*2 == cl + cl # indirect doctest
|
|
511
|
+
True
|
|
512
|
+
sage: cl*5 == cl + cl + cl + cl + cl # indirect doctest
|
|
513
|
+
True
|
|
514
|
+
sage: 5*cl == cl*5 # indirect doctest
|
|
515
|
+
True
|
|
516
|
+
sage: cl*(-5) == -(5*cl) # indirect doctest
|
|
517
|
+
True
|
|
518
|
+
"""
|
|
519
|
+
return multiple(self, other, operation='+')
|
|
520
|
+
|
|
521
|
+
__rmul__ = __mul__
|
|
522
|
+
|
|
523
|
+
def __eq__(self, other):
|
|
524
|
+
r"""
|
|
525
|
+
Test two form classes for equality.
|
|
526
|
+
|
|
527
|
+
EXAMPLES::
|
|
528
|
+
|
|
529
|
+
sage: F = BinaryQF([11,21,31])
|
|
530
|
+
sage: cl = F.form_class(); cl
|
|
531
|
+
Class of 11*x^2 - x*y + 21*y^2
|
|
532
|
+
sage: cl == cl # indirect doctest
|
|
533
|
+
True
|
|
534
|
+
sage: -cl == cl # indirect doctest
|
|
535
|
+
False
|
|
536
|
+
"""
|
|
537
|
+
# When generalizing to positive discriminants in the future, keep
|
|
538
|
+
# in mind that for indefinite forms there can be multiple reduced
|
|
539
|
+
# forms per class. This also affects the other comparison methods
|
|
540
|
+
# as well as hashing.
|
|
541
|
+
return self._form == other._form
|
|
542
|
+
|
|
543
|
+
def __ne__(self, other):
|
|
544
|
+
r"""
|
|
545
|
+
Test two form classes for inequality.
|
|
546
|
+
|
|
547
|
+
EXAMPLES::
|
|
548
|
+
|
|
549
|
+
sage: F = BinaryQF([11,21,31])
|
|
550
|
+
sage: cl = F.form_class(); cl
|
|
551
|
+
Class of 11*x^2 - x*y + 21*y^2
|
|
552
|
+
sage: cl != cl # indirect doctest
|
|
553
|
+
False
|
|
554
|
+
sage: -cl != cl # indirect doctest
|
|
555
|
+
True
|
|
556
|
+
"""
|
|
557
|
+
return self._form != other._form
|
|
558
|
+
|
|
559
|
+
def __lt__(self, other):
|
|
560
|
+
r"""
|
|
561
|
+
Compare two form classes according to the lexicographic ordering
|
|
562
|
+
on their coefficient lists.
|
|
563
|
+
|
|
564
|
+
EXAMPLES::
|
|
565
|
+
|
|
566
|
+
sage: cl1 = BinaryQF([7,55,141]).form_class(); cl1
|
|
567
|
+
Class of 7*x^2 - x*y + 33*y^2
|
|
568
|
+
sage: cl2 = BinaryQF([11,21,31]).form_class(); cl2
|
|
569
|
+
Class of 11*x^2 - x*y + 21*y^2
|
|
570
|
+
sage: cl1 < cl2 # indirect doctest
|
|
571
|
+
True
|
|
572
|
+
sage: cl1 > cl2 # indirect doctest
|
|
573
|
+
False
|
|
574
|
+
"""
|
|
575
|
+
return self._form < other._form
|
|
576
|
+
|
|
577
|
+
def __bool__(self) -> bool:
|
|
578
|
+
r"""
|
|
579
|
+
Return ``True`` if this form class is *not* the principal class
|
|
580
|
+
and ``False`` otherwise.
|
|
581
|
+
|
|
582
|
+
EXAMPLES::
|
|
583
|
+
|
|
584
|
+
sage: cl = BinaryQF([11,21,31]).form_class()
|
|
585
|
+
sage: bool(cl)
|
|
586
|
+
True
|
|
587
|
+
sage: bool(0*cl)
|
|
588
|
+
False
|
|
589
|
+
"""
|
|
590
|
+
return self != self.parent().zero()
|
|
591
|
+
|
|
592
|
+
def is_zero(self) -> bool:
|
|
593
|
+
r"""
|
|
594
|
+
Return ``True`` if this form class is the principal class and
|
|
595
|
+
``False`` otherwise.
|
|
596
|
+
|
|
597
|
+
EXAMPLES::
|
|
598
|
+
|
|
599
|
+
sage: cl = BinaryQF([11,21,31]).form_class()
|
|
600
|
+
sage: cl.is_zero()
|
|
601
|
+
False
|
|
602
|
+
sage: (0*cl).is_zero()
|
|
603
|
+
True
|
|
604
|
+
"""
|
|
605
|
+
return not self
|
|
606
|
+
|
|
607
|
+
def __repr__(self) -> str:
|
|
608
|
+
r"""
|
|
609
|
+
Return a string representation of this form class.
|
|
610
|
+
|
|
611
|
+
EXAMPLES::
|
|
612
|
+
|
|
613
|
+
sage: F = BinaryQF([11,21,31])
|
|
614
|
+
sage: F.form_class() # indirect doctest
|
|
615
|
+
Class of 11*x^2 - x*y + 21*y^2
|
|
616
|
+
"""
|
|
617
|
+
return f'Class of {self._form}'
|
|
618
|
+
|
|
619
|
+
def __hash__(self):
|
|
620
|
+
r"""
|
|
621
|
+
Return a hash value for this form class.
|
|
622
|
+
|
|
623
|
+
EXAMPLES::
|
|
624
|
+
|
|
625
|
+
sage: cl = BinaryQF([11,21,31]).form_class()
|
|
626
|
+
sage: hash(cl) # random
|
|
627
|
+
-7760578299759721732
|
|
628
|
+
"""
|
|
629
|
+
return hash(('BQFClassGroup_element', self._form))
|
|
630
|
+
|
|
631
|
+
@cached_method
|
|
632
|
+
def order(self):
|
|
633
|
+
r"""
|
|
634
|
+
Return the order of this form class in its class group.
|
|
635
|
+
|
|
636
|
+
ALGORITHM: :meth:`BQFClassGroup.order` and :func:`order_from_multiple`
|
|
637
|
+
|
|
638
|
+
EXAMPLES::
|
|
639
|
+
|
|
640
|
+
sage: # needs sage.rings.number_field
|
|
641
|
+
sage: cl = BinaryQF([11,21,31]).form_class()
|
|
642
|
+
sage: cl.order()
|
|
643
|
+
10
|
|
644
|
+
sage: (cl+cl).order()
|
|
645
|
+
5
|
|
646
|
+
sage: (cl+cl+cl).order()
|
|
647
|
+
10
|
|
648
|
+
sage: (5*cl).order()
|
|
649
|
+
2
|
|
650
|
+
"""
|
|
651
|
+
return order_from_multiple(self, self.parent().cardinality())
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
class BQFClassGroupQuotientMorphism(Morphism):
|
|
655
|
+
r"""
|
|
656
|
+
Let `D` be a discriminant and `f > 0` an integer.
|
|
657
|
+
|
|
658
|
+
Given the class groups `G` and `H` of discriminants `f^2 D` and `D`,
|
|
659
|
+
this class represents the natural projection morphism `G \to H` which
|
|
660
|
+
is defined by composing the class representative `[a,b,c]` with the
|
|
661
|
+
principal form of the target discriminant.
|
|
662
|
+
|
|
663
|
+
Alternatively, evaluating this map can be characterized as finding a
|
|
664
|
+
class representative `[a,b,c]` satisfying `f^2 \mid a` and `f \mid b`
|
|
665
|
+
and substituting `x \mapsto x/f`.
|
|
666
|
+
|
|
667
|
+
This map is a well-defined group homomorphism.
|
|
668
|
+
|
|
669
|
+
EXAMPLES::
|
|
670
|
+
|
|
671
|
+
sage: from sage.quadratic_forms.bqf_class_group import BQFClassGroupQuotientMorphism
|
|
672
|
+
sage: G = BQFClassGroup(-4*117117)
|
|
673
|
+
sage: H = BQFClassGroup(-4*77)
|
|
674
|
+
sage: proj = BQFClassGroupQuotientMorphism(G, H)
|
|
675
|
+
sage: elt = G(BinaryQF(333, 306, 422))
|
|
676
|
+
sage: proj(elt)
|
|
677
|
+
Class of 9*x^2 + 4*x*y + 9*y^2
|
|
678
|
+
|
|
679
|
+
TESTS:
|
|
680
|
+
|
|
681
|
+
Check that it is really a group homomorphism::
|
|
682
|
+
|
|
683
|
+
sage: D = -randrange(1, 10^4)
|
|
684
|
+
sage: D *= 4 if D%4 not in (0,1) else 1
|
|
685
|
+
sage: f = randrange(1, 10^3)
|
|
686
|
+
sage: G = BQFClassGroup(f^2*D)
|
|
687
|
+
sage: H = BQFClassGroup(D)
|
|
688
|
+
sage: proj = G.hom(H)
|
|
689
|
+
sage: proj(G.zero()) == H.zero()
|
|
690
|
+
True
|
|
691
|
+
sage: elt1 = G.random_element()
|
|
692
|
+
sage: elt2 = G.random_element()
|
|
693
|
+
sage: proj(elt1 + elt2) == proj(elt1) + proj(elt2)
|
|
694
|
+
True
|
|
695
|
+
|
|
696
|
+
Check that it satisfies compatibility::
|
|
697
|
+
|
|
698
|
+
sage: ff = f * randrange(1, 10^3)
|
|
699
|
+
sage: F = BQFClassGroup(ff^2*D)
|
|
700
|
+
sage: proj = F.hom(H)
|
|
701
|
+
sage: proj1 = F.hom(G)
|
|
702
|
+
sage: proj2 = G.hom(H)
|
|
703
|
+
sage: elt = F.random_element()
|
|
704
|
+
sage: proj(elt) == proj2(proj1(elt))
|
|
705
|
+
True
|
|
706
|
+
"""
|
|
707
|
+
def __init__(self, G, H):
|
|
708
|
+
r"""
|
|
709
|
+
Initialize this morphism between class groups of binary
|
|
710
|
+
quadratic forms.
|
|
711
|
+
|
|
712
|
+
EXAMPLES::
|
|
713
|
+
|
|
714
|
+
sage: from sage.quadratic_forms.bqf_class_group import BQFClassGroupQuotientMorphism
|
|
715
|
+
sage: G = BQFClassGroup(-4*117117)
|
|
716
|
+
sage: H = BQFClassGroup(-4*77)
|
|
717
|
+
sage: f = BQFClassGroupQuotientMorphism(G, H)
|
|
718
|
+
sage: TestSuite(f).run(skip='_test_category')
|
|
719
|
+
"""
|
|
720
|
+
if not isinstance(G, BQFClassGroup):
|
|
721
|
+
raise TypeError('G needs to be a BQFClassGroup')
|
|
722
|
+
if not isinstance(H, BQFClassGroup):
|
|
723
|
+
raise TypeError('H needs to be a BQFClassGroup')
|
|
724
|
+
f2 = ZZ(G.discriminant() / H.discriminant())
|
|
725
|
+
if not f2.is_square():
|
|
726
|
+
raise ValueError('morphism only defined when disc(G) = f^2 * disc(H)')
|
|
727
|
+
super().__init__(G, H)
|
|
728
|
+
|
|
729
|
+
def _call_(self, elt):
|
|
730
|
+
r"""
|
|
731
|
+
Evaluate this morphism.
|
|
732
|
+
|
|
733
|
+
EXAMPLES::
|
|
734
|
+
|
|
735
|
+
sage: from sage.quadratic_forms.bqf_class_group import BQFClassGroupQuotientMorphism
|
|
736
|
+
sage: G = BQFClassGroup(-4*117117)
|
|
737
|
+
sage: H = BQFClassGroup(-4*77)
|
|
738
|
+
sage: proj = BQFClassGroupQuotientMorphism(G, H)
|
|
739
|
+
sage: elt = G(BinaryQF(333, 306, 422))
|
|
740
|
+
sage: proj(elt)
|
|
741
|
+
Class of 9*x^2 + 4*x*y + 9*y^2
|
|
742
|
+
|
|
743
|
+
ALGORITHM: [Buell89]_, Theorem 7.9
|
|
744
|
+
"""
|
|
745
|
+
one = BinaryQF.principal(self.codomain().discriminant())
|
|
746
|
+
bqf = elt.form()
|
|
747
|
+
bqf *= one
|
|
748
|
+
return self.codomain()(bqf)
|