passagemath-modules 10.6.31__cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31.dist-info/RECORD +807 -0
- passagemath_modules-10.6.31.dist-info/WHEEL +6 -0
- passagemath_modules-10.6.31.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgfortran-83c28eba.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-6e109695.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-cda90e79.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7f678fcf.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-ecd7067e.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-2284e583.so.0.0.0 +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,977 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
"""
|
|
3
|
+
Local Density Congruence
|
|
4
|
+
"""
|
|
5
|
+
##########################################################################
|
|
6
|
+
# Methods which compute the local densities for representing a number
|
|
7
|
+
# by a quadratic form at a prime (possibly subject to additional
|
|
8
|
+
# congruence conditions).
|
|
9
|
+
##########################################################################
|
|
10
|
+
from copy import deepcopy
|
|
11
|
+
|
|
12
|
+
from sage.sets.set import Set
|
|
13
|
+
from sage.rings.rational_field import QQ
|
|
14
|
+
from sage.arith.misc import valuation
|
|
15
|
+
from sage.misc.verbose import verbose
|
|
16
|
+
|
|
17
|
+
from sage.quadratic_forms.count_local_2 import count_modp__by_gauss_sum, count_all_local_good_types_normal_form
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def count_modp_solutions__by_Gauss_sum(self, p, m):
|
|
21
|
+
r"""
|
|
22
|
+
Return the number of solutions of `Q(x) = m` (mod `p`) of a
|
|
23
|
+
non-degenerate quadratic form over the finite field `\ZZ/p\ZZ`,
|
|
24
|
+
where `p` is a prime number > 2.
|
|
25
|
+
|
|
26
|
+
.. NOTE::
|
|
27
|
+
|
|
28
|
+
We adopt the useful convention that a zero-dimensional
|
|
29
|
+
quadratic form has exactly one solution always (i.e. the empty
|
|
30
|
+
vector).
|
|
31
|
+
|
|
32
|
+
These are defined in Table 1 on p363 of Hanke's "Local Densities..." paper.
|
|
33
|
+
|
|
34
|
+
INPUT:
|
|
35
|
+
|
|
36
|
+
- ``p`` -- a prime number > 2
|
|
37
|
+
|
|
38
|
+
- ``m`` -- integer
|
|
39
|
+
|
|
40
|
+
OUTPUT: integer `\geq 0`
|
|
41
|
+
|
|
42
|
+
EXAMPLES::
|
|
43
|
+
|
|
44
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1])
|
|
45
|
+
sage: [Q.count_modp_solutions__by_Gauss_sum(3, m) for m in range(3)]
|
|
46
|
+
[9, 6, 12]
|
|
47
|
+
|
|
48
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1,2])
|
|
49
|
+
sage: [Q.count_modp_solutions__by_Gauss_sum(3, m) for m in range(3)]
|
|
50
|
+
[9, 12, 6]
|
|
51
|
+
"""
|
|
52
|
+
if self.dim() == 0:
|
|
53
|
+
return 1
|
|
54
|
+
return count_modp__by_gauss_sum(self.dim(), p, m, self.Gram_det())
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def local_good_density_congruence_odd(self, p, m, Zvec, NZvec):
|
|
58
|
+
"""
|
|
59
|
+
Find the Good-type local density of `Q` representing `m` at `p`.
|
|
60
|
+
(Assuming that `p > 2` and `Q` is given in local diagonal form.)
|
|
61
|
+
|
|
62
|
+
The additional congruence condition arguments ``Zvec`` and ``NZvec`` can
|
|
63
|
+
be either a list of indices or None. ``Zvec=[]`` is equivalent to
|
|
64
|
+
``Zvec=None``, which both impose no additional conditions, but
|
|
65
|
+
``NZvec=[]`` returns no solutions always while ``NZvec=None`` imposes no
|
|
66
|
+
additional condition.
|
|
67
|
+
|
|
68
|
+
.. TODO::
|
|
69
|
+
|
|
70
|
+
Add type checking for ``Zvec``, ``NZvec``, and that `Q` is in local
|
|
71
|
+
normal form.
|
|
72
|
+
|
|
73
|
+
INPUT:
|
|
74
|
+
|
|
75
|
+
- ``self`` -- quadratic form `Q`, assumed to be diagonal and `p`-integral
|
|
76
|
+
|
|
77
|
+
- ``p`` -- a prime number
|
|
78
|
+
|
|
79
|
+
- ``m`` -- integer
|
|
80
|
+
|
|
81
|
+
- ``Zvec``, ``NZvec`` -- non-repeating lists of integers in ``range(self.dim())`` or ``None``
|
|
82
|
+
|
|
83
|
+
OUTPUT: a rational number
|
|
84
|
+
|
|
85
|
+
EXAMPLES::
|
|
86
|
+
|
|
87
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,2,3])
|
|
88
|
+
sage: Q.local_good_density_congruence_odd(3, 1, None, None)
|
|
89
|
+
2/3
|
|
90
|
+
|
|
91
|
+
::
|
|
92
|
+
|
|
93
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1,1])
|
|
94
|
+
sage: Q.local_good_density_congruence_odd(3, 1, None, None)
|
|
95
|
+
8/9
|
|
96
|
+
"""
|
|
97
|
+
n = self.dim()
|
|
98
|
+
|
|
99
|
+
# Put the Zvec congruence condition in a standard form
|
|
100
|
+
if Zvec is None:
|
|
101
|
+
Zvec = []
|
|
102
|
+
|
|
103
|
+
# Sanity Check on Zvec and NZvec:
|
|
104
|
+
# -------------------------------
|
|
105
|
+
Sn = Set(range(n))
|
|
106
|
+
if (Zvec is not None) and (len(Set(Zvec) + Sn) > n):
|
|
107
|
+
raise RuntimeError("Zvec must be a subset of {0, ..., n-1}.")
|
|
108
|
+
if (NZvec is not None) and (len(Set(NZvec) + Sn) > n):
|
|
109
|
+
raise RuntimeError("NZvec must be a subset of {0, ..., n-1}.")
|
|
110
|
+
|
|
111
|
+
# Assuming Q is diagonal, find the indices of the p-unit (diagonal) entries
|
|
112
|
+
UnitVec = Set(i for i in range(n) if self[i, i] % p)
|
|
113
|
+
NonUnitVec = Set(range(n)) - UnitVec
|
|
114
|
+
|
|
115
|
+
# Take cases on the existence of additional nonzero congruence conditions (mod p)
|
|
116
|
+
UnitVec_minus_Zvec = list(UnitVec - Set(Zvec))
|
|
117
|
+
NonUnitVec_minus_Zvec = list(NonUnitVec - Set(Zvec))
|
|
118
|
+
Q_Unit_minus_Zvec = self.extract_variables(UnitVec_minus_Zvec)
|
|
119
|
+
|
|
120
|
+
if NZvec is None:
|
|
121
|
+
if m % p:
|
|
122
|
+
total = Q_Unit_minus_Zvec.count_modp_solutions__by_Gauss_sum(p, m) * p**len(NonUnitVec_minus_Zvec)
|
|
123
|
+
else:
|
|
124
|
+
total = (Q_Unit_minus_Zvec.count_modp_solutions__by_Gauss_sum(p, m) - 1) * p**len(NonUnitVec_minus_Zvec)
|
|
125
|
+
|
|
126
|
+
else:
|
|
127
|
+
UnitVec_minus_ZNZvec = list(UnitVec - (Set(Zvec) + Set(NZvec)))
|
|
128
|
+
NonUnitVec_minus_ZNZvec = list(NonUnitVec - (Set(Zvec) + Set(NZvec)))
|
|
129
|
+
Q_Unit_minus_ZNZvec = self.extract_variables(UnitVec_minus_ZNZvec)
|
|
130
|
+
|
|
131
|
+
if m % p:
|
|
132
|
+
total = Q_Unit_minus_Zvec.count_modp_solutions__by_Gauss_sum(p, m) * p**len(NonUnitVec_minus_Zvec) \
|
|
133
|
+
- Q_Unit_minus_ZNZvec.count_modp_solutions__by_Gauss_sum(p, m) * p**len(NonUnitVec_minus_ZNZvec)
|
|
134
|
+
else:
|
|
135
|
+
total = (Q_Unit_minus_Zvec.count_modp_solutions__by_Gauss_sum(p, m) - 1) * p**len(NonUnitVec_minus_Zvec) \
|
|
136
|
+
- (Q_Unit_minus_ZNZvec.count_modp_solutions__by_Gauss_sum(p, m) - 1) * p**len(NonUnitVec_minus_ZNZvec)
|
|
137
|
+
|
|
138
|
+
# Return the Good-type representation density
|
|
139
|
+
good_density = QQ(total) / p**(n - 1)
|
|
140
|
+
return good_density
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def local_good_density_congruence_even(self, m, Zvec, NZvec):
|
|
144
|
+
r"""
|
|
145
|
+
Find the Good-type local density of `Q` representing `m` at `p=2`.
|
|
146
|
+
(Assuming `Q` is given in local diagonal form.)
|
|
147
|
+
|
|
148
|
+
The additional congruence condition arguments ``Zvec`` and ``NZvec`` can
|
|
149
|
+
be either a list of indices or None. ``Zvec=[]`` is equivalent to
|
|
150
|
+
``Zvec=None`` which both impose no additional conditions, but
|
|
151
|
+
``NZvec=[]`` returns no solutions always while ``NZvec=None`` imposes no
|
|
152
|
+
additional condition.
|
|
153
|
+
|
|
154
|
+
.. WARNING::
|
|
155
|
+
|
|
156
|
+
Here the indices passed in ``Zvec`` and ``NZvec`` represent
|
|
157
|
+
indices of the solution vector `x` of `Q(x) = m` (mod `p^k`), and *not*
|
|
158
|
+
the Jordan components of `Q`. They therefore are required (and
|
|
159
|
+
assumed) to include either all or none of the indices of a given
|
|
160
|
+
Jordan component of `Q`. This is only important when `p=2` since
|
|
161
|
+
otherwise all Jordan blocks are `1 \times 1`, and so there the indices and
|
|
162
|
+
Jordan blocks coincide.
|
|
163
|
+
|
|
164
|
+
.. TODO::
|
|
165
|
+
|
|
166
|
+
Add type checking for ``Zvec`` and ``NZvec``, and that `Q` is in local
|
|
167
|
+
normal form.
|
|
168
|
+
|
|
169
|
+
INPUT:
|
|
170
|
+
|
|
171
|
+
- ``self`` -- quadratic form `Q`, assumed to be block diagonal and 2-integral
|
|
172
|
+
|
|
173
|
+
- ``p`` -- a prime number
|
|
174
|
+
|
|
175
|
+
- ``m`` -- integer
|
|
176
|
+
|
|
177
|
+
- ``Zvec``, ``NZvec`` -- non-repeating lists of integers in ``range(self.dim())`` or ``None``
|
|
178
|
+
|
|
179
|
+
OUTPUT: a rational number
|
|
180
|
+
|
|
181
|
+
EXAMPLES::
|
|
182
|
+
|
|
183
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,2,3])
|
|
184
|
+
sage: Q.local_good_density_congruence_even(1, None, None)
|
|
185
|
+
1
|
|
186
|
+
|
|
187
|
+
::
|
|
188
|
+
|
|
189
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1,1])
|
|
190
|
+
sage: Q.local_good_density_congruence_even(1, None, None)
|
|
191
|
+
1
|
|
192
|
+
sage: Q.local_good_density_congruence_even(2, None, None)
|
|
193
|
+
3/2
|
|
194
|
+
sage: Q.local_good_density_congruence_even(3, None, None)
|
|
195
|
+
1
|
|
196
|
+
sage: Q.local_good_density_congruence_even(4, None, None)
|
|
197
|
+
1/2
|
|
198
|
+
|
|
199
|
+
::
|
|
200
|
+
|
|
201
|
+
sage: Q = QuadraticForm(ZZ, 4, range(10))
|
|
202
|
+
sage: Q[0,0] = 5
|
|
203
|
+
sage: Q[1,1] = 10
|
|
204
|
+
sage: Q[2,2] = 15
|
|
205
|
+
sage: Q[3,3] = 20
|
|
206
|
+
sage: Q
|
|
207
|
+
Quadratic form in 4 variables over Integer Ring with coefficients:
|
|
208
|
+
[ 5 1 2 3 ]
|
|
209
|
+
[ * 10 5 6 ]
|
|
210
|
+
[ * * 15 8 ]
|
|
211
|
+
[ * * * 20 ]
|
|
212
|
+
sage: Q.theta_series(20) # needs sage.libs.pari
|
|
213
|
+
1 + 2*q^5 + 2*q^10 + 2*q^14 + 2*q^15 + 2*q^16 + 2*q^18 + O(q^20)
|
|
214
|
+
sage: Q_local = Q.local_normal_form(2) # needs sage.libs.pari sage.rings.padics
|
|
215
|
+
sage: Q_local.local_good_density_congruence_even(1, None, None) # needs sage.libs.pari sage.rings.padics
|
|
216
|
+
3/4
|
|
217
|
+
sage: Q_local.local_good_density_congruence_even(2, None, None) # needs sage.libs.pari sage.rings.padics
|
|
218
|
+
9/8
|
|
219
|
+
sage: Q_local.local_good_density_congruence_even(5, None, None) # needs sage.libs.pari sage.rings.padics
|
|
220
|
+
3/4
|
|
221
|
+
"""
|
|
222
|
+
n = self.dim()
|
|
223
|
+
|
|
224
|
+
# Put the Zvec congruence condition in a standard form
|
|
225
|
+
if Zvec is None:
|
|
226
|
+
Zvec = []
|
|
227
|
+
|
|
228
|
+
# Sanity Check on Zvec and NZvec:
|
|
229
|
+
# -------------------------------
|
|
230
|
+
Sn = Set(range(n))
|
|
231
|
+
if (Zvec is not None) and (len(Set(Zvec) + Sn) > n):
|
|
232
|
+
raise RuntimeError("Zvec must be a subset of {0, ..., n-1}.")
|
|
233
|
+
if (NZvec is not None) and (len(Set(NZvec) + Sn) > n):
|
|
234
|
+
raise RuntimeError("NZvec must be a subset of {0, ..., n-1}.")
|
|
235
|
+
|
|
236
|
+
# Find the indices of x for which the associated Jordan blocks are nonzero mod 8 TODO: Move this to special Jordan block code separately!
|
|
237
|
+
# -------------------------------------------------------------------------------
|
|
238
|
+
Not8vec = []
|
|
239
|
+
for i in range(n):
|
|
240
|
+
|
|
241
|
+
# DIAGNOSTIC
|
|
242
|
+
verbose(" i = " + str(i))
|
|
243
|
+
verbose(" n = " + str(n))
|
|
244
|
+
verbose(" Not8vec = " + str(Not8vec))
|
|
245
|
+
|
|
246
|
+
nz_flag = False
|
|
247
|
+
|
|
248
|
+
# Check if the diagonal entry isn't divisible 8
|
|
249
|
+
if self[i, i] % 8:
|
|
250
|
+
nz_flag = True
|
|
251
|
+
|
|
252
|
+
# Check appropriate off-diagonal entries aren't divisible by 8
|
|
253
|
+
else:
|
|
254
|
+
|
|
255
|
+
# Special check for first off-diagonal entry
|
|
256
|
+
if i == 0 and self[i, i + 1] % 8:
|
|
257
|
+
nz_flag = True
|
|
258
|
+
|
|
259
|
+
# Special check for last off-diagonal entry
|
|
260
|
+
elif i == n - 1 and self[i - 1, i] % 8:
|
|
261
|
+
nz_flag = True
|
|
262
|
+
|
|
263
|
+
# Check for the middle off-diagonal entries
|
|
264
|
+
else:
|
|
265
|
+
if (i > 0) and (i < n - 1) and (self[i, i + 1] % 8 or
|
|
266
|
+
self[i - 1, i] % 8):
|
|
267
|
+
nz_flag = True
|
|
268
|
+
|
|
269
|
+
# Remember the (vector) index if it's not part of a Jordan block of norm divisible by 8
|
|
270
|
+
if nz_flag:
|
|
271
|
+
Not8vec += [i]
|
|
272
|
+
|
|
273
|
+
# Compute the number of Good-type solutions mod 8:
|
|
274
|
+
# ------------------------------------------------
|
|
275
|
+
|
|
276
|
+
# Setup the indexing sets for additional zero congruence solutions
|
|
277
|
+
Q_Not8 = self.extract_variables(Not8vec)
|
|
278
|
+
Not8 = Set(Not8vec)
|
|
279
|
+
Is8 = Set(range(n)) - Not8
|
|
280
|
+
|
|
281
|
+
Z = Set(Zvec)
|
|
282
|
+
Z_Not8 = Not8.intersection(Z)
|
|
283
|
+
Z_Is8 = Is8.intersection(Z)
|
|
284
|
+
Is8_minus_Z = Is8 - Z_Is8
|
|
285
|
+
|
|
286
|
+
# DIAGNOSTIC
|
|
287
|
+
verbose("Z = " + str(Z))
|
|
288
|
+
verbose("Z_Not8 = " + str(Z_Not8))
|
|
289
|
+
verbose("Z_Is8 = " + str(Z_Is8))
|
|
290
|
+
verbose("Is8_minus_Z = " + str(Is8_minus_Z))
|
|
291
|
+
|
|
292
|
+
# Take cases on the existence of additional nonzero congruence conditions (mod 2)
|
|
293
|
+
if NZvec is None:
|
|
294
|
+
total = (4 ** len(Z_Is8)) * (8 ** len(Is8_minus_Z)) \
|
|
295
|
+
* count_all_local_good_types_normal_form(Q_Not8, 2, 3, m, list(Z_Not8), None)
|
|
296
|
+
else:
|
|
297
|
+
ZNZ = Z + Set(NZvec)
|
|
298
|
+
ZNZ_Not8 = Not8.intersection(ZNZ)
|
|
299
|
+
ZNZ_Is8 = Is8.intersection(ZNZ)
|
|
300
|
+
Is8_minus_ZNZ = Is8 - ZNZ_Is8
|
|
301
|
+
|
|
302
|
+
# DIAGNOSTIC
|
|
303
|
+
verbose("ZNZ = " + str(ZNZ))
|
|
304
|
+
verbose("ZNZ_Not8 = " + str(ZNZ_Not8))
|
|
305
|
+
verbose("ZNZ_Is8 = " + str(ZNZ_Is8))
|
|
306
|
+
verbose("Is8_minus_ZNZ = " + str(Is8_minus_ZNZ))
|
|
307
|
+
|
|
308
|
+
total = (4 ** len(Z_Is8)) * (8 ** len(Is8_minus_Z)) \
|
|
309
|
+
* count_all_local_good_types_normal_form(Q_Not8, 2, 3, m, list(Z_Not8), None) \
|
|
310
|
+
- (4 ** len(ZNZ_Is8)) * (8 ** len(Is8_minus_ZNZ)) \
|
|
311
|
+
* count_all_local_good_types_normal_form(Q_Not8, 2, 3, m, list(ZNZ_Not8), None)
|
|
312
|
+
|
|
313
|
+
# DIAGNOSTIC
|
|
314
|
+
verbose("total = " + str(total))
|
|
315
|
+
|
|
316
|
+
# Return the associated Good-type representation density
|
|
317
|
+
return QQ(total) / 8**(n - 1)
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
def local_good_density_congruence(self, p, m, Zvec=None, NZvec=None):
|
|
321
|
+
"""
|
|
322
|
+
Find the Good-type local density of `Q` representing `m` at `p`.
|
|
323
|
+
(Front end routine for parity specific routines for `p`.)
|
|
324
|
+
|
|
325
|
+
.. TODO::
|
|
326
|
+
|
|
327
|
+
Add documentation about the additional congruence
|
|
328
|
+
conditions ``Zvec`` and ``NZvec``.
|
|
329
|
+
|
|
330
|
+
INPUT:
|
|
331
|
+
|
|
332
|
+
- ``self`` -- quadratic form `Q`, assumed to be block diagonal and `p`-integral
|
|
333
|
+
|
|
334
|
+
- ``p`` -- a prime number
|
|
335
|
+
|
|
336
|
+
- ``m`` -- integer
|
|
337
|
+
|
|
338
|
+
- ``Zvec``, ``NZvec`` -- non-repeating lists of integers in ``range(self.dim())`` or ``None``
|
|
339
|
+
|
|
340
|
+
OUTPUT: a rational number
|
|
341
|
+
|
|
342
|
+
EXAMPLES::
|
|
343
|
+
|
|
344
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,2,3])
|
|
345
|
+
sage: Q.local_good_density_congruence(2, 1, None, None)
|
|
346
|
+
1
|
|
347
|
+
sage: Q.local_good_density_congruence(3, 1, None, None)
|
|
348
|
+
2/3
|
|
349
|
+
|
|
350
|
+
::
|
|
351
|
+
|
|
352
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1,1])
|
|
353
|
+
sage: Q.local_good_density_congruence(2, 1, None, None)
|
|
354
|
+
1
|
|
355
|
+
sage: Q.local_good_density_congruence(3, 1, None, None)
|
|
356
|
+
8/9
|
|
357
|
+
"""
|
|
358
|
+
# DIAGNOSTIC
|
|
359
|
+
verbose(" In local_good_density_congruence with ")
|
|
360
|
+
verbose(" Q is: \n" + str(self))
|
|
361
|
+
verbose(" p = " + str(p))
|
|
362
|
+
verbose(" m = " + str(m))
|
|
363
|
+
verbose(" Zvec = " + str(Zvec))
|
|
364
|
+
verbose(" NZvec = " + str(NZvec))
|
|
365
|
+
|
|
366
|
+
# Put the Zvec congruence condition in a standard form
|
|
367
|
+
if Zvec is None:
|
|
368
|
+
Zvec = []
|
|
369
|
+
|
|
370
|
+
n = self.dim()
|
|
371
|
+
|
|
372
|
+
# Sanity Check on Zvec and NZvec:
|
|
373
|
+
# -------------------------------
|
|
374
|
+
Sn = Set(range(n))
|
|
375
|
+
if (Zvec is not None) and (len(Set(Zvec) + Sn) > n):
|
|
376
|
+
raise RuntimeError("Zvec must be a subset of {0, ..., n-1}.")
|
|
377
|
+
if (NZvec is not None) and (len(Set(NZvec) + Sn) > n):
|
|
378
|
+
raise RuntimeError("NZvec must be a subset of {0, ..., n-1}.")
|
|
379
|
+
|
|
380
|
+
# There was here a commented-out check that Q is in local normal form
|
|
381
|
+
# (it often may not be since the reduction procedure
|
|
382
|
+
# often mixes up the order of the valuations...)
|
|
383
|
+
# This commented-out code was removed in issue #32960
|
|
384
|
+
|
|
385
|
+
# Decide which routine to use to compute the Good-type density
|
|
386
|
+
if p > 2:
|
|
387
|
+
return self.local_good_density_congruence_odd(p, m, Zvec, NZvec)
|
|
388
|
+
|
|
389
|
+
if p == 2:
|
|
390
|
+
return self.local_good_density_congruence_even(m, Zvec, NZvec)
|
|
391
|
+
|
|
392
|
+
raise RuntimeError("\n Error in Local_Good_Density: The 'prime' p = " + str(p) + " is < 2. \n")
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
def local_zero_density_congruence(self, p, m, Zvec=None, NZvec=None):
|
|
396
|
+
"""
|
|
397
|
+
Find the Zero-type local density of `Q` representing `m` at `p`,
|
|
398
|
+
allowing certain congruence conditions mod `p`.
|
|
399
|
+
|
|
400
|
+
INPUT:
|
|
401
|
+
|
|
402
|
+
- ``self`` -- quadratic form `Q`, assumed to be block diagonal and `p`-integral
|
|
403
|
+
|
|
404
|
+
- ``p`` -- a prime number
|
|
405
|
+
|
|
406
|
+
- ``m`` -- integer
|
|
407
|
+
|
|
408
|
+
- ``Zvec``, ``NZvec`` -- non-repeating lists of integers in ``range(self.dim())`` or ``None``
|
|
409
|
+
|
|
410
|
+
OUTPUT: a rational number
|
|
411
|
+
|
|
412
|
+
EXAMPLES::
|
|
413
|
+
|
|
414
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,2,3])
|
|
415
|
+
sage: Q.local_zero_density_congruence(2, 2, None, None)
|
|
416
|
+
0
|
|
417
|
+
sage: Q.local_zero_density_congruence(2, 4, None, None)
|
|
418
|
+
1/2
|
|
419
|
+
sage: Q.local_zero_density_congruence(3, 6, None, None)
|
|
420
|
+
0
|
|
421
|
+
sage: Q.local_zero_density_congruence(3, 9, None, None)
|
|
422
|
+
2/9
|
|
423
|
+
|
|
424
|
+
::
|
|
425
|
+
|
|
426
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1,1])
|
|
427
|
+
sage: Q.local_zero_density_congruence(2, 2, None, None)
|
|
428
|
+
0
|
|
429
|
+
sage: Q.local_zero_density_congruence(2, 4, None, None)
|
|
430
|
+
1/4
|
|
431
|
+
sage: Q.local_zero_density_congruence(3, 6, None, None)
|
|
432
|
+
0
|
|
433
|
+
sage: Q.local_zero_density_congruence(3, 9, None, None)
|
|
434
|
+
8/81
|
|
435
|
+
"""
|
|
436
|
+
# DIAGNOSTIC
|
|
437
|
+
verbose(" In local_zero_density_congruence with ")
|
|
438
|
+
verbose(" Q is: \n" + str(self))
|
|
439
|
+
verbose(" p = " + str(p))
|
|
440
|
+
verbose(" m = " + str(m))
|
|
441
|
+
verbose(" Zvec = " + str(Zvec))
|
|
442
|
+
verbose(" NZvec = " + str(NZvec))
|
|
443
|
+
|
|
444
|
+
# Put the Zvec congruence condition in a standard form
|
|
445
|
+
if Zvec is None:
|
|
446
|
+
Zvec = []
|
|
447
|
+
|
|
448
|
+
n = self.dim()
|
|
449
|
+
|
|
450
|
+
# Sanity Check on Zvec and NZvec:
|
|
451
|
+
# -------------------------------
|
|
452
|
+
Sn = Set(range(n))
|
|
453
|
+
if (Zvec is not None) and (len(Set(Zvec) + Sn) > n):
|
|
454
|
+
raise RuntimeError("Zvec must be a subset of {0, ..., n-1}.")
|
|
455
|
+
if (NZvec is not None) and (len(Set(NZvec) + Sn) > n):
|
|
456
|
+
raise RuntimeError("NZvec must be a subset of {0, ..., n-1}.")
|
|
457
|
+
|
|
458
|
+
p2 = p * p
|
|
459
|
+
|
|
460
|
+
# Check some conditions for no zero-type solutions to exist
|
|
461
|
+
if m % p2 or NZvec is not None:
|
|
462
|
+
return 0
|
|
463
|
+
|
|
464
|
+
# Use the reduction procedure to return the result
|
|
465
|
+
return self.local_density_congruence(p, m / p2, None, None) / p**(self.dim() - 2)
|
|
466
|
+
|
|
467
|
+
|
|
468
|
+
def local_badI_density_congruence(self, p, m, Zvec=None, NZvec=None):
|
|
469
|
+
"""
|
|
470
|
+
Find the Bad-type I local density of `Q` representing `m` at `p`.
|
|
471
|
+
(Assuming that `p > 2` and `Q` is given in local diagonal form.)
|
|
472
|
+
|
|
473
|
+
INPUT:
|
|
474
|
+
|
|
475
|
+
- ``self`` -- quadratic form `Q`, assumed to be block diagonal and `p`-integral
|
|
476
|
+
|
|
477
|
+
- ``p`` -- a prime number
|
|
478
|
+
|
|
479
|
+
- ``m`` -- integer
|
|
480
|
+
|
|
481
|
+
- ``Zvec``, ``NZvec`` -- non-repeating lists of integers in ``range(self.dim())`` or ``None``
|
|
482
|
+
|
|
483
|
+
OUTPUT: a rational number
|
|
484
|
+
|
|
485
|
+
EXAMPLES::
|
|
486
|
+
|
|
487
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,2,3])
|
|
488
|
+
sage: Q.local_badI_density_congruence(2, 1, None, None)
|
|
489
|
+
0
|
|
490
|
+
sage: Q.local_badI_density_congruence(2, 2, None, None)
|
|
491
|
+
1
|
|
492
|
+
sage: Q.local_badI_density_congruence(2, 4, None, None)
|
|
493
|
+
0
|
|
494
|
+
sage: Q.local_badI_density_congruence(3, 1, None, None)
|
|
495
|
+
0
|
|
496
|
+
sage: Q.local_badI_density_congruence(3, 6, None, None)
|
|
497
|
+
0
|
|
498
|
+
sage: Q.local_badI_density_congruence(3, 9, None, None)
|
|
499
|
+
0
|
|
500
|
+
|
|
501
|
+
::
|
|
502
|
+
|
|
503
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1,1])
|
|
504
|
+
sage: Q.local_badI_density_congruence(2, 1, None, None)
|
|
505
|
+
0
|
|
506
|
+
sage: Q.local_badI_density_congruence(2, 2, None, None)
|
|
507
|
+
0
|
|
508
|
+
sage: Q.local_badI_density_congruence(2, 4, None, None)
|
|
509
|
+
0
|
|
510
|
+
sage: Q.local_badI_density_congruence(3, 2, None, None)
|
|
511
|
+
0
|
|
512
|
+
sage: Q.local_badI_density_congruence(3, 6, None, None)
|
|
513
|
+
0
|
|
514
|
+
sage: Q.local_badI_density_congruence(3, 9, None, None)
|
|
515
|
+
0
|
|
516
|
+
|
|
517
|
+
::
|
|
518
|
+
|
|
519
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,3,3,9])
|
|
520
|
+
sage: Q.local_badI_density_congruence(3, 1, None, None)
|
|
521
|
+
0
|
|
522
|
+
sage: Q.local_badI_density_congruence(3, 3, None, None)
|
|
523
|
+
4/3
|
|
524
|
+
sage: Q.local_badI_density_congruence(3, 6, None, None)
|
|
525
|
+
4/3
|
|
526
|
+
sage: Q.local_badI_density_congruence(3, 9, None, None)
|
|
527
|
+
0
|
|
528
|
+
sage: Q.local_badI_density_congruence(3, 18, None, None)
|
|
529
|
+
0
|
|
530
|
+
"""
|
|
531
|
+
# DIAGNOSTIC
|
|
532
|
+
verbose(" In local_badI_density_congruence with ")
|
|
533
|
+
verbose(" Q is: \n" + str(self))
|
|
534
|
+
verbose(" p = " + str(p))
|
|
535
|
+
verbose(" m = " + str(m))
|
|
536
|
+
verbose(" Zvec = " + str(Zvec))
|
|
537
|
+
verbose(" NZvec = " + str(NZvec))
|
|
538
|
+
|
|
539
|
+
# Put the Zvec congruence condition in a standard form
|
|
540
|
+
if Zvec is None:
|
|
541
|
+
Zvec = []
|
|
542
|
+
|
|
543
|
+
n = self.dim()
|
|
544
|
+
|
|
545
|
+
# Sanity Check on Zvec and NZvec:
|
|
546
|
+
# -------------------------------
|
|
547
|
+
Sn = Set(range(n))
|
|
548
|
+
if (Zvec is not None) and (len(Set(Zvec) + Sn) > n):
|
|
549
|
+
raise RuntimeError("Zvec must be a subset of {0, ..., n-1}.")
|
|
550
|
+
if (NZvec is not None) and (len(Set(NZvec) + Sn) > n):
|
|
551
|
+
raise RuntimeError("NZvec must be a subset of {0, ..., n-1}.")
|
|
552
|
+
|
|
553
|
+
# Define the indexing set S_0, and determine if S_1 is empty:
|
|
554
|
+
# -----------------------------------------------------------
|
|
555
|
+
S0 = []
|
|
556
|
+
S1_empty_flag = True
|
|
557
|
+
# This is used to check if we should be computing BI solutions at all!
|
|
558
|
+
# (We should really to this earlier, but S1 must be nonzero to proceed.)
|
|
559
|
+
|
|
560
|
+
# Find the valuation of each variable (which will be the same over 2x2 blocks),
|
|
561
|
+
# remembering those of valuation 0 and if an entry of valuation 1 exists.
|
|
562
|
+
for i in range(n):
|
|
563
|
+
|
|
564
|
+
# Compute the valuation of each index, allowing for off-diagonal terms
|
|
565
|
+
if self[i, i] == 0:
|
|
566
|
+
if i == 0:
|
|
567
|
+
val = valuation(self[i, i + 1], p) # Look at the term to the right
|
|
568
|
+
else:
|
|
569
|
+
if i == n - 1:
|
|
570
|
+
val = valuation(self[i - 1, i], p) # Look at the term above
|
|
571
|
+
else:
|
|
572
|
+
val = valuation(self[i, i + 1] + self[i - 1, i], p) # Finds the valuation of the off-diagonal term since only one isn't zero
|
|
573
|
+
else:
|
|
574
|
+
val = valuation(self[i, i], p)
|
|
575
|
+
|
|
576
|
+
if val == 0:
|
|
577
|
+
S0 += [i]
|
|
578
|
+
elif val == 1:
|
|
579
|
+
S1_empty_flag = False # Need to have a non-empty S1 set to proceed with Bad-type I reduction...
|
|
580
|
+
|
|
581
|
+
# Check that S1 is non-empty and p|m to proceed, otherwise return no solutions.
|
|
582
|
+
if S1_empty_flag or m % p:
|
|
583
|
+
return 0
|
|
584
|
+
|
|
585
|
+
# Check some conditions for no bad-type I solutions to exist
|
|
586
|
+
if (NZvec is not None) and (len(Set(S0).intersection(Set(NZvec))) != 0):
|
|
587
|
+
return 0
|
|
588
|
+
|
|
589
|
+
# Check that the form is primitive... WHY DO WE NEED TO DO THIS?!?
|
|
590
|
+
if not S0:
|
|
591
|
+
print(" Using Q = " + str(self))
|
|
592
|
+
print(" and p = " + str(p))
|
|
593
|
+
raise RuntimeError("the form is not primitive")
|
|
594
|
+
|
|
595
|
+
# DIAGNOSTIC
|
|
596
|
+
verbose(" m = " + str(m) + " p = " + str(p))
|
|
597
|
+
verbose(" S0 = " + str(S0))
|
|
598
|
+
verbose(" len(S0) = " + str(len(S0)))
|
|
599
|
+
|
|
600
|
+
# Make the form Qnew for the reduction procedure:
|
|
601
|
+
# -----------------------------------------------
|
|
602
|
+
Qnew = deepcopy(self) # TODO: DO THIS WITHOUT A copy()
|
|
603
|
+
for i in range(n):
|
|
604
|
+
if i in S0:
|
|
605
|
+
Qnew[i, i] = p * Qnew[i, i]
|
|
606
|
+
if ((p == 2) and (i < n - 1)):
|
|
607
|
+
Qnew[i, i + 1] = p * Qnew[i, i + 1]
|
|
608
|
+
else:
|
|
609
|
+
Qnew[i, i] = Qnew[i, i] / p
|
|
610
|
+
if ((p == 2) and (i < n - 1)):
|
|
611
|
+
Qnew[i, i + 1] = Qnew[i, i + 1] / p
|
|
612
|
+
|
|
613
|
+
# DIAGNOSTIC
|
|
614
|
+
verbose("\n\n Check of Bad-type I reduction: \n")
|
|
615
|
+
verbose(" Q is " + str(self))
|
|
616
|
+
verbose(" Qnew is " + str(Qnew))
|
|
617
|
+
verbose(" p = " + str(p))
|
|
618
|
+
verbose(" m / p = " + str(m / p))
|
|
619
|
+
verbose(" NZvec " + str(NZvec))
|
|
620
|
+
|
|
621
|
+
# Do the reduction
|
|
622
|
+
Zvec_geq_1 = list(Set([i for i in Zvec if i not in S0]))
|
|
623
|
+
if NZvec is None:
|
|
624
|
+
NZvec_geq_1 = NZvec
|
|
625
|
+
else:
|
|
626
|
+
NZvec_geq_1 = list(Set([i for i in NZvec if i not in S0]))
|
|
627
|
+
|
|
628
|
+
return QQ(p**(1 - len(S0))) * Qnew.local_good_density_congruence(p, m / p, Zvec_geq_1, NZvec_geq_1)
|
|
629
|
+
|
|
630
|
+
|
|
631
|
+
def local_badII_density_congruence(self, p, m, Zvec=None, NZvec=None):
|
|
632
|
+
"""
|
|
633
|
+
Find the Bad-type II local density of `Q` representing `m` at `p`.
|
|
634
|
+
(Assuming that `p > 2` and `Q` is given in local diagonal form.)
|
|
635
|
+
|
|
636
|
+
INPUT:
|
|
637
|
+
|
|
638
|
+
- ``self`` -- quadratic form `Q`, assumed to be block diagonal and `p`-integral
|
|
639
|
+
|
|
640
|
+
- ``p`` -- a prime number
|
|
641
|
+
|
|
642
|
+
- ``m`` -- integer
|
|
643
|
+
|
|
644
|
+
- ``Zvec``, ``NZvec`` -- non-repeating lists of integers in ``range(self.dim())`` or ``None``
|
|
645
|
+
|
|
646
|
+
OUTPUT: a rational number
|
|
647
|
+
|
|
648
|
+
EXAMPLES::
|
|
649
|
+
|
|
650
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,2,3])
|
|
651
|
+
sage: Q.local_badII_density_congruence(2, 1, None, None)
|
|
652
|
+
0
|
|
653
|
+
sage: Q.local_badII_density_congruence(2, 2, None, None)
|
|
654
|
+
0
|
|
655
|
+
sage: Q.local_badII_density_congruence(2, 4, None, None)
|
|
656
|
+
0
|
|
657
|
+
sage: Q.local_badII_density_congruence(3, 1, None, None)
|
|
658
|
+
0
|
|
659
|
+
sage: Q.local_badII_density_congruence(3, 6, None, None)
|
|
660
|
+
0
|
|
661
|
+
sage: Q.local_badII_density_congruence(3, 9, None, None)
|
|
662
|
+
0
|
|
663
|
+
sage: Q.local_badII_density_congruence(3, 27, None, None)
|
|
664
|
+
0
|
|
665
|
+
|
|
666
|
+
::
|
|
667
|
+
|
|
668
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,3,3,9,9])
|
|
669
|
+
sage: Q.local_badII_density_congruence(3, 1, None, None)
|
|
670
|
+
0
|
|
671
|
+
sage: Q.local_badII_density_congruence(3, 3, None, None)
|
|
672
|
+
0
|
|
673
|
+
sage: Q.local_badII_density_congruence(3, 6, None, None)
|
|
674
|
+
0
|
|
675
|
+
sage: Q.local_badII_density_congruence(3, 9, None, None)
|
|
676
|
+
4/27
|
|
677
|
+
sage: Q.local_badII_density_congruence(3, 18, None, None)
|
|
678
|
+
4/9
|
|
679
|
+
"""
|
|
680
|
+
# DIAGNOSTIC
|
|
681
|
+
verbose(" In local_badII_density_congruence with ")
|
|
682
|
+
verbose(" Q is: \n" + str(self))
|
|
683
|
+
verbose(" p = " + str(p))
|
|
684
|
+
verbose(" m = " + str(m))
|
|
685
|
+
verbose(" Zvec = " + str(Zvec))
|
|
686
|
+
verbose(" NZvec = " + str(NZvec))
|
|
687
|
+
|
|
688
|
+
# Put the Zvec congruence condition in a standard form
|
|
689
|
+
if Zvec is None:
|
|
690
|
+
Zvec = []
|
|
691
|
+
|
|
692
|
+
n = self.dim()
|
|
693
|
+
|
|
694
|
+
# Sanity Check on Zvec and NZvec:
|
|
695
|
+
# -------------------------------
|
|
696
|
+
Sn = Set(range(n))
|
|
697
|
+
if (Zvec is not None) and (len(Set(Zvec) + Sn) > n):
|
|
698
|
+
raise RuntimeError("Zvec must be a subset of {0, ..., n-1}.")
|
|
699
|
+
if (NZvec is not None) and (len(Set(NZvec) + Sn) > n):
|
|
700
|
+
raise RuntimeError("NZvec must be a subset of {0, ..., n-1}.")
|
|
701
|
+
|
|
702
|
+
# Define the indexing sets S_i:
|
|
703
|
+
# -----------------------------
|
|
704
|
+
S0 = []
|
|
705
|
+
S1 = []
|
|
706
|
+
S2plus = []
|
|
707
|
+
|
|
708
|
+
for i in range(n):
|
|
709
|
+
|
|
710
|
+
# Compute the valuation of each index, allowing for off-diagonal terms
|
|
711
|
+
if self[i, i] == 0:
|
|
712
|
+
if i == 0:
|
|
713
|
+
val = valuation(self[i, i + 1], p) # Look at the term to the right
|
|
714
|
+
elif i == n - 1:
|
|
715
|
+
val = valuation(self[i - 1, i], p) # Look at the term above
|
|
716
|
+
else:
|
|
717
|
+
val = valuation(self[i, i + 1] + self[i - 1, i], p) # Finds the valuation of the off-diagonal term since only one isn't zero
|
|
718
|
+
else:
|
|
719
|
+
val = valuation(self[i, i], p)
|
|
720
|
+
|
|
721
|
+
# Sort the indices into disjoint sets by their valuation
|
|
722
|
+
if (val == 0):
|
|
723
|
+
S0 += [i]
|
|
724
|
+
elif (val == 1):
|
|
725
|
+
S1 += [i]
|
|
726
|
+
elif (val >= 2):
|
|
727
|
+
S2plus += [i]
|
|
728
|
+
|
|
729
|
+
# Check that S2 is non-empty and p^2 divides m to proceed, otherwise return no solutions.
|
|
730
|
+
p2 = p * p
|
|
731
|
+
if not S2plus or m % p2:
|
|
732
|
+
return 0
|
|
733
|
+
|
|
734
|
+
# Check some conditions for no bad-type II solutions to exist
|
|
735
|
+
if (NZvec is not None) and (len(Set(S2plus).intersection(Set(NZvec))) == 0):
|
|
736
|
+
return 0
|
|
737
|
+
|
|
738
|
+
# Check that the form is primitive... WHY IS THIS NECESSARY?
|
|
739
|
+
if not S0:
|
|
740
|
+
print(" Using Q = " + str(self))
|
|
741
|
+
print(" and p = " + str(p))
|
|
742
|
+
raise RuntimeError("the form is not primitive")
|
|
743
|
+
|
|
744
|
+
# DIAGNOSTIC
|
|
745
|
+
verbose("\n Entering BII routine ")
|
|
746
|
+
verbose(" S0 is " + str(S0))
|
|
747
|
+
verbose(" S1 is " + str(S1))
|
|
748
|
+
verbose(" S2plus is " + str(S2plus))
|
|
749
|
+
verbose(" m = " + str(m) + " p = " + str(p))
|
|
750
|
+
|
|
751
|
+
# Make the form Qnew for the reduction procedure:
|
|
752
|
+
# -----------------------------------------------
|
|
753
|
+
Qnew = deepcopy(self) # TODO: DO THIS WITHOUT A copy()
|
|
754
|
+
for i in range(n):
|
|
755
|
+
if i in S2plus:
|
|
756
|
+
Qnew[i, i] = Qnew[i, i] / p2
|
|
757
|
+
if (p == 2) and (i < n - 1):
|
|
758
|
+
Qnew[i, i + 1] = Qnew[i, i + 1] / p2
|
|
759
|
+
|
|
760
|
+
# DIAGNOSTIC
|
|
761
|
+
verbose("\n\n Check of Bad-type II reduction: \n")
|
|
762
|
+
verbose(" Q is " + str(self))
|
|
763
|
+
verbose(" Qnew is " + str(Qnew))
|
|
764
|
+
|
|
765
|
+
# Perform the reduction formula
|
|
766
|
+
Zvec_geq_2 = list(Set([i for i in Zvec if i in S2plus]))
|
|
767
|
+
if NZvec is None:
|
|
768
|
+
NZvec_geq_2 = NZvec
|
|
769
|
+
else:
|
|
770
|
+
NZvec_geq_2 = list(Set([i for i in NZvec if i in S2plus]))
|
|
771
|
+
|
|
772
|
+
diff = Qnew.local_density_congruence(p, m / p2, Zvec_geq_2, NZvec_geq_2)
|
|
773
|
+
diff -= Qnew.local_density_congruence(p, m / p2, S2plus, NZvec_geq_2)
|
|
774
|
+
return QQ(p**(len(S2plus) + 2 - n)) * diff
|
|
775
|
+
|
|
776
|
+
|
|
777
|
+
def local_bad_density_congruence(self, p, m, Zvec=None, NZvec=None):
|
|
778
|
+
"""
|
|
779
|
+
Find the Bad-type local density of `Q` representing
|
|
780
|
+
`m` at `p`, allowing certain congruence conditions mod `p`.
|
|
781
|
+
|
|
782
|
+
INPUT:
|
|
783
|
+
|
|
784
|
+
- ``self`` -- quadratic form `Q`, assumed to be block diagonal and `p`-integral
|
|
785
|
+
|
|
786
|
+
- ``p`` -- a prime number
|
|
787
|
+
|
|
788
|
+
- ``m`` -- integer
|
|
789
|
+
|
|
790
|
+
- ``Zvec``, ``NZvec`` -- non-repeating lists of integers in ``range(self.dim())`` or ``None``
|
|
791
|
+
|
|
792
|
+
OUTPUT: a rational number
|
|
793
|
+
|
|
794
|
+
EXAMPLES::
|
|
795
|
+
|
|
796
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,2,3])
|
|
797
|
+
sage: Q.local_bad_density_congruence(2, 1, None, None)
|
|
798
|
+
0
|
|
799
|
+
sage: Q.local_bad_density_congruence(2, 2, None, None)
|
|
800
|
+
1
|
|
801
|
+
sage: Q.local_bad_density_congruence(2, 4, None, None)
|
|
802
|
+
0
|
|
803
|
+
sage: Q.local_bad_density_congruence(3, 1, None, None)
|
|
804
|
+
0
|
|
805
|
+
sage: Q.local_bad_density_congruence(3, 6, None, None)
|
|
806
|
+
0
|
|
807
|
+
sage: Q.local_bad_density_congruence(3, 9, None, None)
|
|
808
|
+
0
|
|
809
|
+
sage: Q.local_bad_density_congruence(3, 27, None, None)
|
|
810
|
+
0
|
|
811
|
+
|
|
812
|
+
::
|
|
813
|
+
|
|
814
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,3,3,9,9])
|
|
815
|
+
sage: Q.local_bad_density_congruence(3, 1, None, None)
|
|
816
|
+
0
|
|
817
|
+
sage: Q.local_bad_density_congruence(3, 3, None, None)
|
|
818
|
+
4/3
|
|
819
|
+
sage: Q.local_bad_density_congruence(3, 6, None, None)
|
|
820
|
+
4/3
|
|
821
|
+
sage: Q.local_bad_density_congruence(3, 9, None, None)
|
|
822
|
+
4/27
|
|
823
|
+
sage: Q.local_bad_density_congruence(3, 18, None, None)
|
|
824
|
+
4/9
|
|
825
|
+
sage: Q.local_bad_density_congruence(3, 27, None, None)
|
|
826
|
+
8/27
|
|
827
|
+
"""
|
|
828
|
+
return self.local_badI_density_congruence(p, m, Zvec, NZvec) + self.local_badII_density_congruence(p, m, Zvec, NZvec)
|
|
829
|
+
|
|
830
|
+
########################################################
|
|
831
|
+
# local_density and local_density_congruence routines #
|
|
832
|
+
########################################################
|
|
833
|
+
|
|
834
|
+
|
|
835
|
+
def local_density_congruence(self, p, m, Zvec=None, NZvec=None):
|
|
836
|
+
"""
|
|
837
|
+
Find the local density of `Q` representing `m` at `p`,
|
|
838
|
+
allowing certain congruence conditions mod `p`.
|
|
839
|
+
|
|
840
|
+
INPUT:
|
|
841
|
+
|
|
842
|
+
- ``self`` -- quadratic form `Q`, assumed to be block diagonal and `p`-integral
|
|
843
|
+
|
|
844
|
+
- ``p`` -- a prime number
|
|
845
|
+
|
|
846
|
+
- ``m`` -- integer
|
|
847
|
+
|
|
848
|
+
- ``Zvec``, ``NZvec`` -- non-repeating lists of integers in ``range(self.dim())`` or ``None``
|
|
849
|
+
|
|
850
|
+
OUTPUT: a rational number
|
|
851
|
+
|
|
852
|
+
EXAMPLES::
|
|
853
|
+
|
|
854
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1,1])
|
|
855
|
+
sage: Q.local_density_congruence(p=2, m=1, Zvec=None, NZvec=None)
|
|
856
|
+
1
|
|
857
|
+
sage: Q.local_density_congruence(p=3, m=1, Zvec=None, NZvec=None)
|
|
858
|
+
8/9
|
|
859
|
+
sage: Q.local_density_congruence(p=5, m=1, Zvec=None, NZvec=None)
|
|
860
|
+
24/25
|
|
861
|
+
sage: Q.local_density_congruence(p=7, m=1, Zvec=None, NZvec=None)
|
|
862
|
+
48/49
|
|
863
|
+
sage: Q.local_density_congruence(p=11, m=1, Zvec=None, NZvec=None)
|
|
864
|
+
120/121
|
|
865
|
+
|
|
866
|
+
::
|
|
867
|
+
|
|
868
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,2,3])
|
|
869
|
+
sage: Q.local_density_congruence(2, 1, None, None)
|
|
870
|
+
1
|
|
871
|
+
sage: Q.local_density_congruence(2, 2, None, None)
|
|
872
|
+
1
|
|
873
|
+
sage: Q.local_density_congruence(2, 4, None, None)
|
|
874
|
+
3/2
|
|
875
|
+
sage: Q.local_density_congruence(3, 1, None, None)
|
|
876
|
+
2/3
|
|
877
|
+
sage: Q.local_density_congruence(3, 6, None, None)
|
|
878
|
+
4/3
|
|
879
|
+
sage: Q.local_density_congruence(3, 9, None, None)
|
|
880
|
+
14/9
|
|
881
|
+
sage: Q.local_density_congruence(3, 27, None, None)
|
|
882
|
+
2
|
|
883
|
+
|
|
884
|
+
::
|
|
885
|
+
|
|
886
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,3,3,9,9])
|
|
887
|
+
sage: Q.local_density_congruence(3, 1, None, None)
|
|
888
|
+
2
|
|
889
|
+
sage: Q.local_density_congruence(3, 3, None, None)
|
|
890
|
+
4/3
|
|
891
|
+
sage: Q.local_density_congruence(3, 6, None, None)
|
|
892
|
+
4/3
|
|
893
|
+
sage: Q.local_density_congruence(3, 9, None, None)
|
|
894
|
+
2/9
|
|
895
|
+
sage: Q.local_density_congruence(3, 18, None, None)
|
|
896
|
+
4/9
|
|
897
|
+
"""
|
|
898
|
+
return self.local_good_density_congruence(p, m, Zvec, NZvec) \
|
|
899
|
+
+ self.local_zero_density_congruence(p, m, Zvec, NZvec) \
|
|
900
|
+
+ self.local_bad_density_congruence(p, m, Zvec, NZvec)
|
|
901
|
+
|
|
902
|
+
|
|
903
|
+
def local_primitive_density_congruence(self, p, m, Zvec=None, NZvec=None):
|
|
904
|
+
"""
|
|
905
|
+
Find the primitive local density of `Q` representing
|
|
906
|
+
`m` at `p`, allowing certain congruence conditions mod `p`.
|
|
907
|
+
|
|
908
|
+
.. NOTE::
|
|
909
|
+
|
|
910
|
+
The following routine is not used internally, but is included for consistency.
|
|
911
|
+
|
|
912
|
+
INPUT:
|
|
913
|
+
|
|
914
|
+
- ``self`` -- quadratic form `Q`, assumed to be block diagonal and `p`-integral
|
|
915
|
+
|
|
916
|
+
- ``p`` -- a prime number
|
|
917
|
+
|
|
918
|
+
- ``m`` -- integer
|
|
919
|
+
|
|
920
|
+
- ``Zvec``, ``NZvec`` -- non-repeating lists of integers in ``range(self.dim())`` or ``None``
|
|
921
|
+
|
|
922
|
+
OUTPUT: a rational number
|
|
923
|
+
|
|
924
|
+
EXAMPLES::
|
|
925
|
+
|
|
926
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1,1])
|
|
927
|
+
sage: Q.local_primitive_density_congruence(p=2, m=1, Zvec=None, NZvec=None)
|
|
928
|
+
1
|
|
929
|
+
sage: Q.local_primitive_density_congruence(p=3, m=1, Zvec=None, NZvec=None)
|
|
930
|
+
8/9
|
|
931
|
+
sage: Q.local_primitive_density_congruence(p=5, m=1, Zvec=None, NZvec=None)
|
|
932
|
+
24/25
|
|
933
|
+
sage: Q.local_primitive_density_congruence(p=7, m=1, Zvec=None, NZvec=None)
|
|
934
|
+
48/49
|
|
935
|
+
sage: Q.local_primitive_density_congruence(p=11, m=1, Zvec=None, NZvec=None)
|
|
936
|
+
120/121
|
|
937
|
+
|
|
938
|
+
::
|
|
939
|
+
|
|
940
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,2,3])
|
|
941
|
+
sage: Q.local_primitive_density_congruence(2, 1, None, None)
|
|
942
|
+
1
|
|
943
|
+
sage: Q.local_primitive_density_congruence(2, 2, None, None)
|
|
944
|
+
1
|
|
945
|
+
sage: Q.local_primitive_density_congruence(2, 4, None, None)
|
|
946
|
+
1
|
|
947
|
+
sage: Q.local_primitive_density_congruence(3, 1, None, None)
|
|
948
|
+
2/3
|
|
949
|
+
sage: Q.local_primitive_density_congruence(3, 6, None, None)
|
|
950
|
+
4/3
|
|
951
|
+
sage: Q.local_primitive_density_congruence(3, 9, None, None)
|
|
952
|
+
4/3
|
|
953
|
+
sage: Q.local_primitive_density_congruence(3, 27, None, None)
|
|
954
|
+
4/3
|
|
955
|
+
|
|
956
|
+
::
|
|
957
|
+
|
|
958
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,3,3,9,9])
|
|
959
|
+
sage: Q.local_primitive_density_congruence(3, 1, None, None)
|
|
960
|
+
2
|
|
961
|
+
sage: Q.local_primitive_density_congruence(3, 3, None, None)
|
|
962
|
+
4/3
|
|
963
|
+
sage: Q.local_primitive_density_congruence(3, 6, None, None)
|
|
964
|
+
4/3
|
|
965
|
+
sage: Q.local_primitive_density_congruence(3, 9, None, None)
|
|
966
|
+
4/27
|
|
967
|
+
sage: Q.local_primitive_density_congruence(3, 18, None, None)
|
|
968
|
+
4/9
|
|
969
|
+
sage: Q.local_primitive_density_congruence(3, 27, None, None)
|
|
970
|
+
8/27
|
|
971
|
+
sage: Q.local_primitive_density_congruence(3, 81, None, None)
|
|
972
|
+
8/27
|
|
973
|
+
sage: Q.local_primitive_density_congruence(3, 243, None, None)
|
|
974
|
+
8/27
|
|
975
|
+
"""
|
|
976
|
+
return self.local_good_density_congruence(p, m, Zvec, NZvec) \
|
|
977
|
+
+ self.local_bad_density_congruence(p, m, Zvec, NZvec)
|