passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-0cd532bd.so.1 +0 -0
- passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-x86_64-linux-musl.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-x86_64-linux-musl.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,1072 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
"""
|
|
3
|
+
Local Field Invariants
|
|
4
|
+
|
|
5
|
+
This contains routines to compute local (`p`-adic) invariants of
|
|
6
|
+
quadratic forms over the rationals.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
# ****************************************************************************
|
|
10
|
+
# Copyright (C) 2007 William Stein and Jonathan Hanke
|
|
11
|
+
# Copyright (C) 2015 Jeroen Demeyer <jdemeyer@cage.ugent.be>
|
|
12
|
+
#
|
|
13
|
+
# This program is free software: you can redistribute it and/or modify
|
|
14
|
+
# it under the terms of the GNU General Public License as published by
|
|
15
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
16
|
+
# (at your option) any later version.
|
|
17
|
+
# https://www.gnu.org/licenses/
|
|
18
|
+
# ****************************************************************************
|
|
19
|
+
|
|
20
|
+
###########################################################################
|
|
21
|
+
# TO DO: Add routines for Hasse invariants at all places, anisotropic
|
|
22
|
+
# places, is_semi_definite, and support for number fields.
|
|
23
|
+
###########################################################################
|
|
24
|
+
|
|
25
|
+
from copy import deepcopy
|
|
26
|
+
|
|
27
|
+
from sage.arith.misc import hilbert_symbol, prime_divisors
|
|
28
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
29
|
+
from sage.misc.cachefunc import cached_method
|
|
30
|
+
from sage.rings.integer_ring import ZZ
|
|
31
|
+
from sage.rings.rational_field import QQ
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def rational_diagonal_form(self, return_matrix=False):
|
|
35
|
+
"""
|
|
36
|
+
Return a diagonal form equivalent to the given quadratic from
|
|
37
|
+
over the fraction field of its defining ring.
|
|
38
|
+
|
|
39
|
+
INPUT:
|
|
40
|
+
|
|
41
|
+
- ``return_matrix`` -- boolean (default: ``False``); also return the
|
|
42
|
+
transformation matrix
|
|
43
|
+
|
|
44
|
+
OUTPUT: either the diagonal quadratic form `D` (if ``return_matrix`` is false)
|
|
45
|
+
or the pair `(D, T)` (if ``return_matrix`` is true) where
|
|
46
|
+
|
|
47
|
+
- ``D`` -- the diagonalized form of this quadratic form
|
|
48
|
+
|
|
49
|
+
- ``T`` -- transformation matrix. This is such that
|
|
50
|
+
``T.transpose() * self.matrix() * T`` gives ``D.matrix()``
|
|
51
|
+
|
|
52
|
+
Both `D` and `T` are defined over the fraction field of the
|
|
53
|
+
base ring of the given form.
|
|
54
|
+
|
|
55
|
+
EXAMPLES::
|
|
56
|
+
|
|
57
|
+
sage: Q = QuadraticForm(ZZ, 2, [0,1,-1])
|
|
58
|
+
sage: Q
|
|
59
|
+
Quadratic form in 2 variables over Integer Ring with coefficients:
|
|
60
|
+
[ 0 1 ]
|
|
61
|
+
[ * -1 ]
|
|
62
|
+
sage: Q.rational_diagonal_form()
|
|
63
|
+
Quadratic form in 2 variables over Rational Field with coefficients:
|
|
64
|
+
[ 1/4 0 ]
|
|
65
|
+
[ * -1 ]
|
|
66
|
+
|
|
67
|
+
If we start with a diagonal form, we get back the same form defined
|
|
68
|
+
over the fraction field::
|
|
69
|
+
|
|
70
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,3,5,7])
|
|
71
|
+
sage: Q.rational_diagonal_form()
|
|
72
|
+
Quadratic form in 4 variables over Rational Field with coefficients:
|
|
73
|
+
[ 1 0 0 0 ]
|
|
74
|
+
[ * 3 0 0 ]
|
|
75
|
+
[ * * 5 0 ]
|
|
76
|
+
[ * * * 7 ]
|
|
77
|
+
|
|
78
|
+
In the following example, we check the consistency of the
|
|
79
|
+
transformation matrix::
|
|
80
|
+
|
|
81
|
+
sage: Q = QuadraticForm(ZZ, 4, range(10))
|
|
82
|
+
sage: D, T = Q.rational_diagonal_form(return_matrix=True)
|
|
83
|
+
sage: D
|
|
84
|
+
Quadratic form in 4 variables over Rational Field with coefficients:
|
|
85
|
+
[ -1/16 0 0 0 ]
|
|
86
|
+
[ * 4 0 0 ]
|
|
87
|
+
[ * * 13 0 ]
|
|
88
|
+
[ * * * 563/52 ]
|
|
89
|
+
sage: T
|
|
90
|
+
[ 1 0 11 149/26]
|
|
91
|
+
[ -1/8 1 -2 -10/13]
|
|
92
|
+
[ 0 0 1 -29/26]
|
|
93
|
+
[ 0 0 0 1]
|
|
94
|
+
sage: T.transpose() * Q.matrix() * T
|
|
95
|
+
[ -1/8 0 0 0]
|
|
96
|
+
[ 0 8 0 0]
|
|
97
|
+
[ 0 0 26 0]
|
|
98
|
+
[ 0 0 0 563/26]
|
|
99
|
+
sage: D.matrix()
|
|
100
|
+
[ -1/8 0 0 0]
|
|
101
|
+
[ 0 8 0 0]
|
|
102
|
+
[ 0 0 26 0]
|
|
103
|
+
[ 0 0 0 563/26]
|
|
104
|
+
|
|
105
|
+
::
|
|
106
|
+
|
|
107
|
+
sage: Q1 = QuadraticForm(ZZ, 4, [1, 1, 0, 0, 1, 0, 0, 1, 0, 18])
|
|
108
|
+
sage: Q1
|
|
109
|
+
Quadratic form in 4 variables over Integer Ring with coefficients:
|
|
110
|
+
[ 1 1 0 0 ]
|
|
111
|
+
[ * 1 0 0 ]
|
|
112
|
+
[ * * 1 0 ]
|
|
113
|
+
[ * * * 18 ]
|
|
114
|
+
sage: Q1.rational_diagonal_form(return_matrix=True)
|
|
115
|
+
(
|
|
116
|
+
Quadratic form in 4 variables over Rational Field with coefficients:
|
|
117
|
+
[ 1 0 0 0 ]
|
|
118
|
+
[ * 3/4 0 0 ]
|
|
119
|
+
[ * * 1 0 ]
|
|
120
|
+
[ * * * 18 ] ,
|
|
121
|
+
<BLANKLINE>
|
|
122
|
+
[ 1 -1/2 0 0]
|
|
123
|
+
[ 0 1 0 0]
|
|
124
|
+
[ 0 0 1 0]
|
|
125
|
+
[ 0 0 0 1]
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
PARI returns a singular transformation matrix for this case::
|
|
129
|
+
|
|
130
|
+
sage: Q = QuadraticForm(QQ, 2, [1/2, 1, 1/2])
|
|
131
|
+
sage: Q.rational_diagonal_form()
|
|
132
|
+
Quadratic form in 2 variables over Rational Field with coefficients:
|
|
133
|
+
[ 1/2 0 ]
|
|
134
|
+
[ * 0 ]
|
|
135
|
+
|
|
136
|
+
This example cannot be computed by PARI::
|
|
137
|
+
|
|
138
|
+
sage: # needs sage.rings.real_interval_field
|
|
139
|
+
sage: Q = QuadraticForm(RIF, 4, range(10))
|
|
140
|
+
sage: Q.__pari__()
|
|
141
|
+
Traceback (most recent call last):
|
|
142
|
+
...
|
|
143
|
+
TypeError
|
|
144
|
+
sage: Q.rational_diagonal_form()
|
|
145
|
+
Quadratic form in 4 variables over Real Interval Field with 53 bits of precision
|
|
146
|
+
with coefficients:
|
|
147
|
+
[ 5 0.?e-14 0.?e-13 0.?e-13 ]
|
|
148
|
+
[ * -0.05000000000000? 0.?e-12 0.?e-12 ]
|
|
149
|
+
[ * * 13.00000000000? 0.?e-10 ]
|
|
150
|
+
[ * * * 10.8269230769? ]
|
|
151
|
+
|
|
152
|
+
TESTS:
|
|
153
|
+
|
|
154
|
+
Changing the output quadratic form does not affect the caching::
|
|
155
|
+
|
|
156
|
+
sage: Q, T = Q1.rational_diagonal_form(return_matrix=True)
|
|
157
|
+
sage: Q[0,0] = 13
|
|
158
|
+
sage: Q1.rational_diagonal_form()
|
|
159
|
+
Quadratic form in 4 variables over Rational Field with coefficients:
|
|
160
|
+
[ 1 0 0 0 ]
|
|
161
|
+
[ * 3/4 0 0 ]
|
|
162
|
+
[ * * 1 0 ]
|
|
163
|
+
[ * * * 18 ]
|
|
164
|
+
|
|
165
|
+
The transformation matrix is immutable::
|
|
166
|
+
|
|
167
|
+
sage: T[0,0] = 13
|
|
168
|
+
Traceback (most recent call last):
|
|
169
|
+
...
|
|
170
|
+
ValueError: matrix is immutable; please change a copy instead
|
|
171
|
+
(i.e., use copy(M) to change a copy of M).
|
|
172
|
+
|
|
173
|
+
Test for a singular form::
|
|
174
|
+
|
|
175
|
+
sage: m = matrix(GF(11), [[1,5,0,0], [5,1,9,0], [0,9,1,5], [0,0,5,1]])
|
|
176
|
+
sage: qf = QuadraticForm(m)
|
|
177
|
+
sage: Q, T = qf.rational_diagonal_form(return_matrix=True)
|
|
178
|
+
sage: T
|
|
179
|
+
[ 1 6 5 10]
|
|
180
|
+
[ 0 1 10 9]
|
|
181
|
+
[ 0 0 1 2]
|
|
182
|
+
[ 0 0 0 1]
|
|
183
|
+
"""
|
|
184
|
+
Q, T = self._rational_diagonal_form_and_transformation()
|
|
185
|
+
T.set_immutable()
|
|
186
|
+
|
|
187
|
+
# Quadratic forms do not support immutability, so we need to make
|
|
188
|
+
# a copy to be safe.
|
|
189
|
+
Q = deepcopy(Q)
|
|
190
|
+
return (Q, T) if return_matrix else Q
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
@cached_method
|
|
194
|
+
def _rational_diagonal_form_and_transformation(self):
|
|
195
|
+
"""
|
|
196
|
+
Return a diagonal form equivalent to the given quadratic from and
|
|
197
|
+
the corresponding transformation matrix.
|
|
198
|
+
|
|
199
|
+
This is over the fraction field of the base ring of the given
|
|
200
|
+
quadratic form.
|
|
201
|
+
|
|
202
|
+
OUTPUT: a tuple `(D,T)` where
|
|
203
|
+
|
|
204
|
+
- ``D`` -- the diagonalized form of this quadratic form
|
|
205
|
+
|
|
206
|
+
- ``T`` -- transformation matrix. This is such that
|
|
207
|
+
``T.transpose() * self.matrix() * T`` gives ``D.matrix()``
|
|
208
|
+
|
|
209
|
+
Both `D` and `T` are defined over the fraction field of the
|
|
210
|
+
base ring of the given form.
|
|
211
|
+
|
|
212
|
+
EXAMPLES::
|
|
213
|
+
|
|
214
|
+
sage: Q = QuadraticForm(ZZ, 4, [1, 1, 0, 0, 1, 0, 0, 1, 0, 18])
|
|
215
|
+
sage: Q
|
|
216
|
+
Quadratic form in 4 variables over Integer Ring with coefficients:
|
|
217
|
+
[ 1 1 0 0 ]
|
|
218
|
+
[ * 1 0 0 ]
|
|
219
|
+
[ * * 1 0 ]
|
|
220
|
+
[ * * * 18 ]
|
|
221
|
+
sage: Q._rational_diagonal_form_and_transformation()
|
|
222
|
+
(
|
|
223
|
+
Quadratic form in 4 variables over Rational Field with coefficients:
|
|
224
|
+
[ 1 0 0 0 ]
|
|
225
|
+
[ * 3/4 0 0 ]
|
|
226
|
+
[ * * 1 0 ]
|
|
227
|
+
[ * * * 18 ] ,
|
|
228
|
+
<BLANKLINE>
|
|
229
|
+
[ 1 -1/2 0 0]
|
|
230
|
+
[ 0 1 0 0]
|
|
231
|
+
[ 0 0 1 0]
|
|
232
|
+
[ 0 0 0 1]
|
|
233
|
+
)
|
|
234
|
+
"""
|
|
235
|
+
n = self.dim()
|
|
236
|
+
K = self.base_ring().fraction_field()
|
|
237
|
+
Q = self.change_ring(K)
|
|
238
|
+
MS = MatrixSpace(K, n, n)
|
|
239
|
+
|
|
240
|
+
try:
|
|
241
|
+
# Try PARI if the type is supported
|
|
242
|
+
pariself = self.__pari__()
|
|
243
|
+
# Check that conversion back works
|
|
244
|
+
MS(pariself.sage())
|
|
245
|
+
except Exception:
|
|
246
|
+
pass
|
|
247
|
+
else:
|
|
248
|
+
R = pariself.qfgaussred()
|
|
249
|
+
# Diagonal matrix
|
|
250
|
+
D = MS()
|
|
251
|
+
for i in range(n):
|
|
252
|
+
D[i, i] = R[i, i]
|
|
253
|
+
newQ = Q.parent()(D)
|
|
254
|
+
# Transformation matrix (inverted)
|
|
255
|
+
T = MS(R.sage())
|
|
256
|
+
for i in range(n):
|
|
257
|
+
T[i, i] = K.one()
|
|
258
|
+
try:
|
|
259
|
+
return newQ, ~T
|
|
260
|
+
except ZeroDivisionError:
|
|
261
|
+
# Singular case is not fully supported by PARI
|
|
262
|
+
pass
|
|
263
|
+
|
|
264
|
+
# General case if conversion to/from PARI failed
|
|
265
|
+
T = MS(1)
|
|
266
|
+
|
|
267
|
+
# Clear the entries one row at a time.
|
|
268
|
+
for i in range(n):
|
|
269
|
+
|
|
270
|
+
# Deal with rows where the diagonal entry is zero.
|
|
271
|
+
if Q[i, i] == 0:
|
|
272
|
+
|
|
273
|
+
# Look for a nonzero entry and use it to make the diagonal nonzero (if it exists)
|
|
274
|
+
for j in range(i + 1, n):
|
|
275
|
+
if Q[i, j] != 0:
|
|
276
|
+
temp = MS(1)
|
|
277
|
+
if Q[i, j] + Q[j, j] == 0:
|
|
278
|
+
temp[j, i] = -1
|
|
279
|
+
else:
|
|
280
|
+
temp[j, i] = 1
|
|
281
|
+
|
|
282
|
+
# Apply the transformation
|
|
283
|
+
Q = Q(temp)
|
|
284
|
+
T = T * temp
|
|
285
|
+
break
|
|
286
|
+
|
|
287
|
+
# Create a matrix which deals with off-diagonal entries (all at once for each row)
|
|
288
|
+
temp = MS(1)
|
|
289
|
+
for j in range(i + 1, n):
|
|
290
|
+
if Q[i, j] != 0:
|
|
291
|
+
temp[i, j] = -Q[i, j] / (Q[i, i] * 2)
|
|
292
|
+
# This should only occur when Q[i,i] != 0, which the above step guarantees.
|
|
293
|
+
|
|
294
|
+
Q = Q(temp)
|
|
295
|
+
T = T * temp
|
|
296
|
+
|
|
297
|
+
return Q, T
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def signature_vector(self):
|
|
301
|
+
r"""
|
|
302
|
+
Return the triple `(p, n, z)` of integers where
|
|
303
|
+
|
|
304
|
+
- `p` = number of positive eigenvalues
|
|
305
|
+
- `n` = number of negative eigenvalues
|
|
306
|
+
- `z` = number of zero eigenvalues
|
|
307
|
+
|
|
308
|
+
for the symmetric matrix associated to `Q`.
|
|
309
|
+
|
|
310
|
+
OUTPUT: a triple of integers `\geq 0`
|
|
311
|
+
|
|
312
|
+
EXAMPLES::
|
|
313
|
+
|
|
314
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,0,0,-4])
|
|
315
|
+
sage: Q.signature_vector()
|
|
316
|
+
(1, 1, 2)
|
|
317
|
+
|
|
318
|
+
::
|
|
319
|
+
|
|
320
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,2,-3,-4])
|
|
321
|
+
sage: Q.signature_vector()
|
|
322
|
+
(2, 2, 0)
|
|
323
|
+
|
|
324
|
+
::
|
|
325
|
+
|
|
326
|
+
sage: Q = QuadraticForm(ZZ, 4, range(10)); Q
|
|
327
|
+
Quadratic form in 4 variables over Integer Ring with coefficients:
|
|
328
|
+
[ 0 1 2 3 ]
|
|
329
|
+
[ * 4 5 6 ]
|
|
330
|
+
[ * * 7 8 ]
|
|
331
|
+
[ * * * 9 ]
|
|
332
|
+
sage: Q.signature_vector()
|
|
333
|
+
(3, 1, 0)
|
|
334
|
+
"""
|
|
335
|
+
diag = self.rational_diagonal_form()
|
|
336
|
+
p = 0
|
|
337
|
+
n = 0
|
|
338
|
+
z = 0
|
|
339
|
+
for i in range(diag.dim()):
|
|
340
|
+
if diag[i, i] > 0:
|
|
341
|
+
p += 1
|
|
342
|
+
elif diag[i, i] < 0:
|
|
343
|
+
n += 1
|
|
344
|
+
else:
|
|
345
|
+
z += 1
|
|
346
|
+
|
|
347
|
+
return (p, n, z)
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
def signature(self):
|
|
351
|
+
"""
|
|
352
|
+
Return the signature of the quadratic form, defined as:
|
|
353
|
+
|
|
354
|
+
number of positive eigenvalues `-` number of negative eigenvalues
|
|
355
|
+
|
|
356
|
+
of the matrix of the quadratic form.
|
|
357
|
+
|
|
358
|
+
OUTPUT: integer
|
|
359
|
+
|
|
360
|
+
EXAMPLES::
|
|
361
|
+
|
|
362
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,0,0,-4,3,11,3])
|
|
363
|
+
sage: Q.signature()
|
|
364
|
+
3
|
|
365
|
+
|
|
366
|
+
::
|
|
367
|
+
|
|
368
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,2,-3,-4])
|
|
369
|
+
sage: Q.signature()
|
|
370
|
+
0
|
|
371
|
+
|
|
372
|
+
::
|
|
373
|
+
|
|
374
|
+
sage: Q = QuadraticForm(ZZ, 4, range(10)); Q
|
|
375
|
+
Quadratic form in 4 variables over Integer Ring with coefficients:
|
|
376
|
+
[ 0 1 2 3 ]
|
|
377
|
+
[ * 4 5 6 ]
|
|
378
|
+
[ * * 7 8 ]
|
|
379
|
+
[ * * * 9 ]
|
|
380
|
+
sage: Q.signature()
|
|
381
|
+
2
|
|
382
|
+
"""
|
|
383
|
+
p, n, _ = self.signature_vector()
|
|
384
|
+
return p - n
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
def hasse_invariant(self, p):
|
|
388
|
+
r"""
|
|
389
|
+
Compute the Hasse invariant at a prime `p` or at infinity, as given on p55 of
|
|
390
|
+
Cassels's book. If `Q` is diagonal with coefficients `a_i`, then the
|
|
391
|
+
(Cassels) Hasse invariant is given by
|
|
392
|
+
|
|
393
|
+
.. MATH::
|
|
394
|
+
|
|
395
|
+
c_p = \prod_{i < j} (a_i, a_j)_p
|
|
396
|
+
|
|
397
|
+
where `(a,b)_p` is the Hilbert symbol at `p`. The underlying
|
|
398
|
+
quadratic form must be non-degenerate over `\QQ_p` for this to make
|
|
399
|
+
sense.
|
|
400
|
+
|
|
401
|
+
.. WARNING::
|
|
402
|
+
|
|
403
|
+
This is different from the O'Meara Hasse invariant, which
|
|
404
|
+
allows `i \leq j` in the product. That is given by the method
|
|
405
|
+
:meth:`hasse_invariant__OMeara`.
|
|
406
|
+
|
|
407
|
+
.. NOTE::
|
|
408
|
+
|
|
409
|
+
We should really rename this ``hasse_invariant__Cassels``, and
|
|
410
|
+
set :meth:`hasse_invariant` as a front-end to it.
|
|
411
|
+
|
|
412
|
+
INPUT:
|
|
413
|
+
|
|
414
|
+
- ``p`` -- a prime number > 0 or `-1` for the infinite place
|
|
415
|
+
|
|
416
|
+
OUTPUT: `1` or `-1`
|
|
417
|
+
|
|
418
|
+
EXAMPLES::
|
|
419
|
+
|
|
420
|
+
sage: Q = QuadraticForm(ZZ, 2, [1,2,3])
|
|
421
|
+
sage: Q.rational_diagonal_form()
|
|
422
|
+
Quadratic form in 2 variables over Rational Field with coefficients:
|
|
423
|
+
[ 1 0 ]
|
|
424
|
+
[ * 2 ]
|
|
425
|
+
sage: [Q.hasse_invariant(p) for p in prime_range(20)] # needs sage.libs.pari
|
|
426
|
+
[1, 1, 1, 1, 1, 1, 1, 1]
|
|
427
|
+
sage: [Q.hasse_invariant__OMeara(p) for p in prime_range(20)] # needs sage.libs.pari
|
|
428
|
+
[1, 1, 1, 1, 1, 1, 1, 1]
|
|
429
|
+
|
|
430
|
+
::
|
|
431
|
+
|
|
432
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,-1])
|
|
433
|
+
sage: [Q.hasse_invariant(p) for p in prime_range(20)] # needs sage.libs.pari
|
|
434
|
+
[1, 1, 1, 1, 1, 1, 1, 1]
|
|
435
|
+
sage: [Q.hasse_invariant__OMeara(p) for p in prime_range(20)] # needs sage.libs.pari
|
|
436
|
+
[-1, 1, 1, 1, 1, 1, 1, 1]
|
|
437
|
+
|
|
438
|
+
::
|
|
439
|
+
|
|
440
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,-1,5])
|
|
441
|
+
sage: [Q.hasse_invariant(p) for p in prime_range(20)] # needs sage.libs.pari
|
|
442
|
+
[1, 1, 1, 1, 1, 1, 1, 1]
|
|
443
|
+
sage: [Q.hasse_invariant__OMeara(p) for p in prime_range(20)] # needs sage.libs.pari
|
|
444
|
+
[-1, 1, 1, 1, 1, 1, 1, 1]
|
|
445
|
+
|
|
446
|
+
::
|
|
447
|
+
|
|
448
|
+
sage: x = polygen(ZZ, 'x')
|
|
449
|
+
sage: K.<a> = NumberField(x^2 - 23) # needs sage.rings.number_field
|
|
450
|
+
sage: Q = DiagonalQuadraticForm(K, [-a, a + 2]) # needs sage.rings.number_field
|
|
451
|
+
sage: [Q.hasse_invariant(p) for p in K.primes_above(19)] # needs sage.rings.number_field
|
|
452
|
+
[-1, 1]
|
|
453
|
+
"""
|
|
454
|
+
# TO DO: Need to deal with the case n=1 separately somewhere!
|
|
455
|
+
|
|
456
|
+
Diag = self.rational_diagonal_form()
|
|
457
|
+
R = Diag.base_ring()
|
|
458
|
+
|
|
459
|
+
hasse_temp = 1
|
|
460
|
+
n = Diag.dim()
|
|
461
|
+
|
|
462
|
+
if R == QQ:
|
|
463
|
+
for j in range(n - 1):
|
|
464
|
+
for k in range(j + 1, n):
|
|
465
|
+
hasse_temp = hasse_temp * hilbert_symbol(Diag[j, j],
|
|
466
|
+
Diag[k, k], p)
|
|
467
|
+
|
|
468
|
+
else:
|
|
469
|
+
for j in range(n - 1):
|
|
470
|
+
for k in range(j + 1, n):
|
|
471
|
+
hasse_temp = hasse_temp * R.hilbert_symbol(Diag[j, j],
|
|
472
|
+
Diag[k, k], p)
|
|
473
|
+
|
|
474
|
+
return hasse_temp
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
def hasse_invariant__OMeara(self, p):
|
|
478
|
+
r"""
|
|
479
|
+
Compute the O'Meara Hasse invariant at a prime `p`.
|
|
480
|
+
|
|
481
|
+
This is defined on
|
|
482
|
+
p167 of O'Meara's book. If `Q` is diagonal with coefficients `a_i`,
|
|
483
|
+
then the (Cassels) Hasse invariant is given by
|
|
484
|
+
|
|
485
|
+
.. MATH::
|
|
486
|
+
|
|
487
|
+
c_p = \prod_{i \leq j} (a_i, a_j)_p
|
|
488
|
+
|
|
489
|
+
where `(a,b)_p` is the Hilbert symbol at `p`.
|
|
490
|
+
|
|
491
|
+
.. WARNING::
|
|
492
|
+
|
|
493
|
+
This is different from the (Cassels) Hasse invariant, which
|
|
494
|
+
only allows `i < j` in the product. That is given by the method
|
|
495
|
+
hasse_invariant(p).
|
|
496
|
+
|
|
497
|
+
INPUT:
|
|
498
|
+
|
|
499
|
+
- ``p`` -- a prime number > 0 or `-1` for the infinite place
|
|
500
|
+
|
|
501
|
+
OUTPUT: `1` or `-1`
|
|
502
|
+
|
|
503
|
+
EXAMPLES::
|
|
504
|
+
|
|
505
|
+
sage: Q = QuadraticForm(ZZ, 2, [1,2,3])
|
|
506
|
+
sage: Q.rational_diagonal_form()
|
|
507
|
+
Quadratic form in 2 variables over Rational Field with coefficients:
|
|
508
|
+
[ 1 0 ]
|
|
509
|
+
[ * 2 ]
|
|
510
|
+
sage: [Q.hasse_invariant(p) for p in prime_range(20)] # needs sage.libs.pari
|
|
511
|
+
[1, 1, 1, 1, 1, 1, 1, 1]
|
|
512
|
+
sage: [Q.hasse_invariant__OMeara(p) for p in prime_range(20)] # needs sage.libs.pari
|
|
513
|
+
[1, 1, 1, 1, 1, 1, 1, 1]
|
|
514
|
+
|
|
515
|
+
::
|
|
516
|
+
|
|
517
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,-1])
|
|
518
|
+
sage: [Q.hasse_invariant(p) for p in prime_range(20)] # needs sage.libs.pari
|
|
519
|
+
[1, 1, 1, 1, 1, 1, 1, 1]
|
|
520
|
+
sage: [Q.hasse_invariant__OMeara(p) for p in prime_range(20)] # needs sage.libs.pari
|
|
521
|
+
[-1, 1, 1, 1, 1, 1, 1, 1]
|
|
522
|
+
|
|
523
|
+
::
|
|
524
|
+
|
|
525
|
+
sage: Q = DiagonalQuadraticForm(ZZ,[1,-1,-1])
|
|
526
|
+
sage: [Q.hasse_invariant(p) for p in prime_range(20)] # needs sage.libs.pari
|
|
527
|
+
[-1, 1, 1, 1, 1, 1, 1, 1]
|
|
528
|
+
sage: [Q.hasse_invariant__OMeara(p) for p in prime_range(20)] # needs sage.libs.pari
|
|
529
|
+
[-1, 1, 1, 1, 1, 1, 1, 1]
|
|
530
|
+
|
|
531
|
+
::
|
|
532
|
+
|
|
533
|
+
sage: x = polygen(ZZ, 'x')
|
|
534
|
+
sage: K.<a> = NumberField(x^2 - 23) # needs sage.rings.number_field
|
|
535
|
+
sage: Q = DiagonalQuadraticForm(K, [-a, a + 2]) # needs sage.rings.number_field
|
|
536
|
+
sage: [Q.hasse_invariant__OMeara(p) for p in K.primes_above(19)] # needs sage.rings.number_field
|
|
537
|
+
[1, 1]
|
|
538
|
+
"""
|
|
539
|
+
# TO DO: Need to deal with the case n=1 separately somewhere!
|
|
540
|
+
|
|
541
|
+
Diag = self.rational_diagonal_form()
|
|
542
|
+
R = Diag.base_ring()
|
|
543
|
+
|
|
544
|
+
hasse_temp = 1
|
|
545
|
+
n = Diag.dim()
|
|
546
|
+
if R == QQ:
|
|
547
|
+
for j in range(n):
|
|
548
|
+
for k in range(j, n):
|
|
549
|
+
hasse_temp = hasse_temp * hilbert_symbol(Diag[j, j],
|
|
550
|
+
Diag[k, k], p)
|
|
551
|
+
|
|
552
|
+
else:
|
|
553
|
+
for j in range(n):
|
|
554
|
+
for k in range(j, n):
|
|
555
|
+
hasse_temp = hasse_temp * R.hilbert_symbol(Diag[j, j],
|
|
556
|
+
Diag[k, k], p)
|
|
557
|
+
|
|
558
|
+
return hasse_temp
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
def is_hyperbolic(self, p) -> bool:
|
|
562
|
+
r"""
|
|
563
|
+
Check if the quadratic form is a sum of hyperbolic planes over
|
|
564
|
+
the `p`-adic numbers `\QQ_p` or over the real numbers `\RR`.
|
|
565
|
+
|
|
566
|
+
REFERENCES:
|
|
567
|
+
|
|
568
|
+
This criterion follows from Cassels's "Rational Quadratic Forms":
|
|
569
|
+
|
|
570
|
+
- local invariants for hyperbolic plane (Lemma 2.4, p58)
|
|
571
|
+
- direct sum formulas (Lemma 2.3, p58)
|
|
572
|
+
|
|
573
|
+
INPUT:
|
|
574
|
+
|
|
575
|
+
- ``p`` -- a prime number > 0 or `-1` for the infinite place
|
|
576
|
+
|
|
577
|
+
OUTPUT: boolean
|
|
578
|
+
|
|
579
|
+
EXAMPLES::
|
|
580
|
+
|
|
581
|
+
sage: # needs sage.libs.pari
|
|
582
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1])
|
|
583
|
+
sage: Q.is_hyperbolic(-1)
|
|
584
|
+
False
|
|
585
|
+
sage: Q.is_hyperbolic(2)
|
|
586
|
+
False
|
|
587
|
+
sage: Q.is_hyperbolic(3)
|
|
588
|
+
False
|
|
589
|
+
sage: Q.is_hyperbolic(5) # Here -1 is a square, so it's true.
|
|
590
|
+
True
|
|
591
|
+
sage: Q.is_hyperbolic(7)
|
|
592
|
+
False
|
|
593
|
+
sage: Q.is_hyperbolic(13) # Here -1 is a square, so it's true.
|
|
594
|
+
True
|
|
595
|
+
"""
|
|
596
|
+
# False for odd-dim'l forms
|
|
597
|
+
if self.dim() % 2:
|
|
598
|
+
return False
|
|
599
|
+
|
|
600
|
+
# True for the zero form
|
|
601
|
+
if not self.dim():
|
|
602
|
+
return True
|
|
603
|
+
|
|
604
|
+
# Compare local invariants
|
|
605
|
+
# Note: since the dimension is even, the extra powers of 2 in
|
|
606
|
+
# self.det() := Det(2*Q) don't affect the answer!
|
|
607
|
+
m = ZZ(self.dim() // 2)
|
|
608
|
+
if p == -1:
|
|
609
|
+
return self.signature() == 0
|
|
610
|
+
|
|
611
|
+
if p == 2:
|
|
612
|
+
return (QQ(self.det() * (-1) ** m).is_padic_square(p) and
|
|
613
|
+
self.hasse_invariant(p) ==
|
|
614
|
+
(-1) ** m.binomial(2)) # here -1 is hilbert_symbol(-1,-1,2)
|
|
615
|
+
|
|
616
|
+
return (QQ(self.det() * (-1) ** m).is_padic_square(p) and
|
|
617
|
+
self.hasse_invariant(p) == 1)
|
|
618
|
+
|
|
619
|
+
|
|
620
|
+
def is_anisotropic(self, p) -> bool:
|
|
621
|
+
r"""
|
|
622
|
+
Check if the quadratic form is anisotropic over the `p`-adic numbers `\QQ_p` or `\RR`.
|
|
623
|
+
|
|
624
|
+
INPUT:
|
|
625
|
+
|
|
626
|
+
- ``p`` -- a prime number > 0 or `-1` for the infinite place
|
|
627
|
+
|
|
628
|
+
OUTPUT: boolean
|
|
629
|
+
|
|
630
|
+
EXAMPLES::
|
|
631
|
+
|
|
632
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1])
|
|
633
|
+
sage: Q.is_anisotropic(2) # needs sage.libs.pari
|
|
634
|
+
True
|
|
635
|
+
sage: Q.is_anisotropic(3) # needs sage.libs.pari
|
|
636
|
+
True
|
|
637
|
+
sage: Q.is_anisotropic(5) # needs sage.libs.pari
|
|
638
|
+
False
|
|
639
|
+
|
|
640
|
+
::
|
|
641
|
+
|
|
642
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,-1])
|
|
643
|
+
sage: Q.is_anisotropic(2) # needs sage.libs.pari
|
|
644
|
+
False
|
|
645
|
+
sage: Q.is_anisotropic(3) # needs sage.libs.pari
|
|
646
|
+
False
|
|
647
|
+
sage: Q.is_anisotropic(5) # needs sage.libs.pari
|
|
648
|
+
False
|
|
649
|
+
|
|
650
|
+
::
|
|
651
|
+
|
|
652
|
+
sage: [DiagonalQuadraticForm(ZZ, # needs sage.libs.pari
|
|
653
|
+
....: [1, -least_quadratic_nonresidue(p)]).is_anisotropic(p)
|
|
654
|
+
....: for p in prime_range(3, 30)]
|
|
655
|
+
[True, True, True, True, True, True, True, True, True]
|
|
656
|
+
|
|
657
|
+
::
|
|
658
|
+
|
|
659
|
+
sage: [DiagonalQuadraticForm(ZZ, [1, -least_quadratic_nonresidue(p), # needs sage.libs.pari
|
|
660
|
+
....: p, -p*least_quadratic_nonresidue(p)]).is_anisotropic(p)
|
|
661
|
+
....: for p in prime_range(3, 30)]
|
|
662
|
+
[True, True, True, True, True, True, True, True, True]
|
|
663
|
+
"""
|
|
664
|
+
# TO DO: Should check that p is prime
|
|
665
|
+
if p == -1:
|
|
666
|
+
return self.is_definite()
|
|
667
|
+
|
|
668
|
+
n = self.dim()
|
|
669
|
+
D = self.det()
|
|
670
|
+
|
|
671
|
+
if n >= 5:
|
|
672
|
+
return False
|
|
673
|
+
|
|
674
|
+
if n == 4:
|
|
675
|
+
return (QQ(D).is_padic_square(p) and
|
|
676
|
+
(self.hasse_invariant(p) == - hilbert_symbol(-1, -1, p)))
|
|
677
|
+
|
|
678
|
+
if n == 3:
|
|
679
|
+
return self.hasse_invariant(p) != hilbert_symbol(-1, -D, p)
|
|
680
|
+
|
|
681
|
+
if n == 2:
|
|
682
|
+
return not QQ(-D).is_padic_square(p)
|
|
683
|
+
|
|
684
|
+
if n == 1:
|
|
685
|
+
return self[0, 0] != 0
|
|
686
|
+
|
|
687
|
+
raise NotImplementedError("we have not established a convention for 0-dim'l quadratic forms")
|
|
688
|
+
|
|
689
|
+
|
|
690
|
+
def is_isotropic(self, p) -> bool:
|
|
691
|
+
r"""
|
|
692
|
+
Check if `Q` is isotropic over the `p`-adic numbers `\QQ_p` or `\RR`.
|
|
693
|
+
|
|
694
|
+
INPUT:
|
|
695
|
+
|
|
696
|
+
- ``p`` -- a prime number > 0 or `-1` for the infinite place
|
|
697
|
+
|
|
698
|
+
OUTPUT: boolean
|
|
699
|
+
|
|
700
|
+
EXAMPLES::
|
|
701
|
+
|
|
702
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1])
|
|
703
|
+
sage: Q.is_isotropic(2) # needs sage.libs.pari
|
|
704
|
+
False
|
|
705
|
+
sage: Q.is_isotropic(3) # needs sage.libs.pari
|
|
706
|
+
False
|
|
707
|
+
sage: Q.is_isotropic(5) # needs sage.libs.pari
|
|
708
|
+
True
|
|
709
|
+
|
|
710
|
+
::
|
|
711
|
+
|
|
712
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,-1])
|
|
713
|
+
sage: Q.is_isotropic(2) # needs sage.libs.pari
|
|
714
|
+
True
|
|
715
|
+
sage: Q.is_isotropic(3) # needs sage.libs.pari
|
|
716
|
+
True
|
|
717
|
+
sage: Q.is_isotropic(5) # needs sage.libs.pari
|
|
718
|
+
True
|
|
719
|
+
|
|
720
|
+
::
|
|
721
|
+
|
|
722
|
+
sage: [DiagonalQuadraticForm(ZZ, # needs sage.libs.pari
|
|
723
|
+
....: [1, -least_quadratic_nonresidue(p)]).is_isotropic(p)
|
|
724
|
+
....: for p in prime_range(3, 30)]
|
|
725
|
+
[False, False, False, False, False, False, False, False, False]
|
|
726
|
+
|
|
727
|
+
::
|
|
728
|
+
|
|
729
|
+
sage: [DiagonalQuadraticForm(ZZ, [1, -least_quadratic_nonresidue(p), # needs sage.libs.pari
|
|
730
|
+
....: p, -p*least_quadratic_nonresidue(p)]).is_isotropic(p)
|
|
731
|
+
....: for p in prime_range(3, 30)]
|
|
732
|
+
[False, False, False, False, False, False, False, False, False]
|
|
733
|
+
"""
|
|
734
|
+
return not self.is_anisotropic(p)
|
|
735
|
+
|
|
736
|
+
|
|
737
|
+
def anisotropic_primes(self):
|
|
738
|
+
"""
|
|
739
|
+
Return a list with all of the anisotropic primes of the quadratic form.
|
|
740
|
+
|
|
741
|
+
The infinite place is denoted by `-1`.
|
|
742
|
+
|
|
743
|
+
EXAMPLES::
|
|
744
|
+
|
|
745
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1])
|
|
746
|
+
sage: Q.anisotropic_primes() # needs sage.libs.pari
|
|
747
|
+
[2, -1]
|
|
748
|
+
|
|
749
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1,1])
|
|
750
|
+
sage: Q.anisotropic_primes() # needs sage.libs.pari
|
|
751
|
+
[2, -1]
|
|
752
|
+
|
|
753
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1,1,1])
|
|
754
|
+
sage: Q.anisotropic_primes() # needs sage.libs.pari
|
|
755
|
+
[-1]
|
|
756
|
+
"""
|
|
757
|
+
# Look at all prime divisors of 2 * Det(Q) to find the
|
|
758
|
+
# anisotropic primes...
|
|
759
|
+
possible_primes = prime_divisors(2 * self.det()) + [-1]
|
|
760
|
+
return [p for p in possible_primes if self.is_anisotropic(p)]
|
|
761
|
+
|
|
762
|
+
|
|
763
|
+
def compute_definiteness(self):
|
|
764
|
+
"""
|
|
765
|
+
Compute whether the given quadratic form is positive-definite,
|
|
766
|
+
negative-definite, indefinite, degenerate, or the zero form.
|
|
767
|
+
|
|
768
|
+
This caches one of the following strings in ``self.__definiteness_string``:
|
|
769
|
+
"pos_def", "neg_def", "indef", "zero", "degenerate". It is called
|
|
770
|
+
from all routines like: :meth:`is_positive_definite`, :meth:`is_negative_definite`,
|
|
771
|
+
:meth:`is_indefinite`, etc.
|
|
772
|
+
|
|
773
|
+
.. NOTE::
|
|
774
|
+
|
|
775
|
+
A degenerate form is considered neither definite nor indefinite.
|
|
776
|
+
|
|
777
|
+
.. NOTE::
|
|
778
|
+
|
|
779
|
+
The zero-dimensional form is considered both positive definite and negative definite.
|
|
780
|
+
|
|
781
|
+
OUTPUT: boolean
|
|
782
|
+
|
|
783
|
+
EXAMPLES::
|
|
784
|
+
|
|
785
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1,1,1])
|
|
786
|
+
sage: Q.compute_definiteness()
|
|
787
|
+
sage: Q.is_positive_definite()
|
|
788
|
+
True
|
|
789
|
+
sage: Q.is_negative_definite()
|
|
790
|
+
False
|
|
791
|
+
sage: Q.is_indefinite()
|
|
792
|
+
False
|
|
793
|
+
sage: Q.is_definite()
|
|
794
|
+
True
|
|
795
|
+
|
|
796
|
+
::
|
|
797
|
+
|
|
798
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [])
|
|
799
|
+
sage: Q.compute_definiteness()
|
|
800
|
+
sage: Q.is_positive_definite()
|
|
801
|
+
True
|
|
802
|
+
sage: Q.is_negative_definite()
|
|
803
|
+
True
|
|
804
|
+
sage: Q.is_indefinite()
|
|
805
|
+
False
|
|
806
|
+
sage: Q.is_definite()
|
|
807
|
+
True
|
|
808
|
+
|
|
809
|
+
::
|
|
810
|
+
|
|
811
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,0,-1])
|
|
812
|
+
sage: Q.compute_definiteness()
|
|
813
|
+
sage: Q.is_positive_definite()
|
|
814
|
+
False
|
|
815
|
+
sage: Q.is_negative_definite()
|
|
816
|
+
False
|
|
817
|
+
sage: Q.is_indefinite()
|
|
818
|
+
False
|
|
819
|
+
sage: Q.is_definite()
|
|
820
|
+
False
|
|
821
|
+
"""
|
|
822
|
+
# Sanity Check
|
|
823
|
+
from sage.rings.real_mpfr import RR
|
|
824
|
+
|
|
825
|
+
if not ((self.base_ring() == ZZ) or (self.base_ring() == QQ) or (self.base_ring() == RR)):
|
|
826
|
+
raise NotImplementedError("we can only check definiteness over ZZ, QQ, and RR for now")
|
|
827
|
+
|
|
828
|
+
# Some useful variables
|
|
829
|
+
n = self.dim()
|
|
830
|
+
|
|
831
|
+
# Deal with the zero-diml form
|
|
832
|
+
if n == 0:
|
|
833
|
+
self.__definiteness_string = "zero"
|
|
834
|
+
return
|
|
835
|
+
|
|
836
|
+
sig_pos, sig_neg, sig_zer = self.signature_vector()
|
|
837
|
+
|
|
838
|
+
# Determine and cache the definiteness string
|
|
839
|
+
if sig_zer > 0:
|
|
840
|
+
self.__definiteness_string = "degenerate"
|
|
841
|
+
return
|
|
842
|
+
elif sig_neg == n:
|
|
843
|
+
self.__definiteness_string = "neg_def"
|
|
844
|
+
return
|
|
845
|
+
elif sig_pos == n:
|
|
846
|
+
self.__definiteness_string = "pos_def"
|
|
847
|
+
return
|
|
848
|
+
else:
|
|
849
|
+
self.__definiteness_string = "indefinite"
|
|
850
|
+
return
|
|
851
|
+
|
|
852
|
+
|
|
853
|
+
def compute_definiteness_string_by_determinants(self):
|
|
854
|
+
"""
|
|
855
|
+
Compute the (positive) definiteness of a quadratic form by looking
|
|
856
|
+
at the signs of all of its upper-left subdeterminants. See also
|
|
857
|
+
:meth:`compute_definiteness` for more documentation.
|
|
858
|
+
|
|
859
|
+
OUTPUT: string describing the definiteness
|
|
860
|
+
|
|
861
|
+
EXAMPLES::
|
|
862
|
+
|
|
863
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1,1,1])
|
|
864
|
+
sage: Q.compute_definiteness_string_by_determinants()
|
|
865
|
+
'pos_def'
|
|
866
|
+
|
|
867
|
+
::
|
|
868
|
+
|
|
869
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [])
|
|
870
|
+
sage: Q.compute_definiteness_string_by_determinants()
|
|
871
|
+
'zero'
|
|
872
|
+
|
|
873
|
+
::
|
|
874
|
+
|
|
875
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,0,-1])
|
|
876
|
+
sage: Q.compute_definiteness_string_by_determinants()
|
|
877
|
+
'degenerate'
|
|
878
|
+
|
|
879
|
+
::
|
|
880
|
+
|
|
881
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,-1])
|
|
882
|
+
sage: Q.compute_definiteness_string_by_determinants()
|
|
883
|
+
'indefinite'
|
|
884
|
+
|
|
885
|
+
::
|
|
886
|
+
|
|
887
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [-1,-1])
|
|
888
|
+
sage: Q.compute_definiteness_string_by_determinants()
|
|
889
|
+
'neg_def'
|
|
890
|
+
"""
|
|
891
|
+
# Sanity Check
|
|
892
|
+
from sage.rings.real_mpfr import RR
|
|
893
|
+
|
|
894
|
+
if not ((self.base_ring() == ZZ) or (self.base_ring() == QQ) or (self.base_ring() == RR)):
|
|
895
|
+
raise NotImplementedError("we can only check definiteness over ZZ, QQ, and RR for now")
|
|
896
|
+
|
|
897
|
+
from sage.functions.all import sgn
|
|
898
|
+
|
|
899
|
+
# Some useful variables
|
|
900
|
+
n = self.dim()
|
|
901
|
+
M = self.matrix()
|
|
902
|
+
|
|
903
|
+
# Deal with the zero-diml form
|
|
904
|
+
if n == 0:
|
|
905
|
+
return "zero"
|
|
906
|
+
|
|
907
|
+
# Deal with degenerate forms
|
|
908
|
+
if self.det() == 0:
|
|
909
|
+
return "degenerate"
|
|
910
|
+
|
|
911
|
+
# Check the sign of the ratios of consecutive determinants of the upper triangular r x r submatrices
|
|
912
|
+
first_coeff = self[0, 0]
|
|
913
|
+
for r in range(1, n + 1):
|
|
914
|
+
I = list(range(r))
|
|
915
|
+
new_det = M.matrix_from_rows_and_columns(I, I).det()
|
|
916
|
+
|
|
917
|
+
# Check for a (non-degenerate) zero -- so it's indefinite
|
|
918
|
+
if new_det == 0:
|
|
919
|
+
return "indefinite"
|
|
920
|
+
|
|
921
|
+
# Check for a change of signs in the upper r x r submatrix -- so it's indefinite
|
|
922
|
+
if sgn(first_coeff)**r != sgn(new_det):
|
|
923
|
+
return "indefinite"
|
|
924
|
+
|
|
925
|
+
# Here all ratios of determinants have the correct sign, so the matrix is (pos or neg) definite.
|
|
926
|
+
return "pos_def" if first_coeff > 0 else "neg_def"
|
|
927
|
+
|
|
928
|
+
|
|
929
|
+
def is_positive_definite(self) -> bool:
|
|
930
|
+
"""
|
|
931
|
+
Determine if the given quadratic form is positive-definite.
|
|
932
|
+
|
|
933
|
+
.. NOTE::
|
|
934
|
+
|
|
935
|
+
A degenerate form is considered neither definite nor indefinite.
|
|
936
|
+
|
|
937
|
+
.. NOTE::
|
|
938
|
+
|
|
939
|
+
The zero-dimensional form is considered both positive definite and negative definite.
|
|
940
|
+
|
|
941
|
+
OUTPUT: boolean
|
|
942
|
+
|
|
943
|
+
EXAMPLES::
|
|
944
|
+
|
|
945
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,3,5])
|
|
946
|
+
sage: Q.is_positive_definite()
|
|
947
|
+
True
|
|
948
|
+
|
|
949
|
+
::
|
|
950
|
+
|
|
951
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,-3,5])
|
|
952
|
+
sage: Q.is_positive_definite()
|
|
953
|
+
False
|
|
954
|
+
"""
|
|
955
|
+
# Try to use the cached value
|
|
956
|
+
try:
|
|
957
|
+
def_str = self.__definiteness_string
|
|
958
|
+
except AttributeError:
|
|
959
|
+
self.compute_definiteness()
|
|
960
|
+
def_str = self.__definiteness_string
|
|
961
|
+
|
|
962
|
+
# Return the answer
|
|
963
|
+
return (def_str == "pos_def") or (def_str == "zero")
|
|
964
|
+
|
|
965
|
+
|
|
966
|
+
def is_negative_definite(self) -> bool:
|
|
967
|
+
"""
|
|
968
|
+
Determine if the given quadratic form is negative-definite.
|
|
969
|
+
|
|
970
|
+
.. NOTE::
|
|
971
|
+
|
|
972
|
+
A degenerate form is considered neither definite nor indefinite.
|
|
973
|
+
|
|
974
|
+
.. NOTE::
|
|
975
|
+
|
|
976
|
+
The zero-dimensional form is considered both positive definite and negative definite.
|
|
977
|
+
|
|
978
|
+
OUTPUT: boolean
|
|
979
|
+
|
|
980
|
+
EXAMPLES::
|
|
981
|
+
|
|
982
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [-1,-3,-5])
|
|
983
|
+
sage: Q.is_negative_definite()
|
|
984
|
+
True
|
|
985
|
+
|
|
986
|
+
::
|
|
987
|
+
|
|
988
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,-3,5])
|
|
989
|
+
sage: Q.is_negative_definite()
|
|
990
|
+
False
|
|
991
|
+
"""
|
|
992
|
+
# Try to use the cached value
|
|
993
|
+
try:
|
|
994
|
+
def_str = self.__definiteness_string
|
|
995
|
+
except AttributeError:
|
|
996
|
+
self.compute_definiteness()
|
|
997
|
+
def_str = self.__definiteness_string
|
|
998
|
+
|
|
999
|
+
# Return the answer
|
|
1000
|
+
return (def_str == "neg_def") or (def_str == "zero")
|
|
1001
|
+
|
|
1002
|
+
|
|
1003
|
+
def is_indefinite(self) -> bool:
|
|
1004
|
+
"""
|
|
1005
|
+
Determine if the given quadratic form is indefinite.
|
|
1006
|
+
|
|
1007
|
+
.. NOTE::
|
|
1008
|
+
|
|
1009
|
+
A degenerate form is considered neither definite nor indefinite.
|
|
1010
|
+
|
|
1011
|
+
.. NOTE::
|
|
1012
|
+
|
|
1013
|
+
The zero-dimensional form is not considered indefinite.
|
|
1014
|
+
|
|
1015
|
+
OUTPUT: boolean
|
|
1016
|
+
|
|
1017
|
+
EXAMPLES::
|
|
1018
|
+
|
|
1019
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [-1,-3,-5])
|
|
1020
|
+
sage: Q.is_indefinite()
|
|
1021
|
+
False
|
|
1022
|
+
|
|
1023
|
+
::
|
|
1024
|
+
|
|
1025
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,-3,5])
|
|
1026
|
+
sage: Q.is_indefinite()
|
|
1027
|
+
True
|
|
1028
|
+
"""
|
|
1029
|
+
# Try to use the cached value
|
|
1030
|
+
try:
|
|
1031
|
+
def_str = self.__definiteness_string
|
|
1032
|
+
except AttributeError:
|
|
1033
|
+
self.compute_definiteness()
|
|
1034
|
+
def_str = self.__definiteness_string
|
|
1035
|
+
|
|
1036
|
+
# Return the answer
|
|
1037
|
+
return def_str == "indefinite"
|
|
1038
|
+
|
|
1039
|
+
|
|
1040
|
+
def is_definite(self) -> bool:
|
|
1041
|
+
"""
|
|
1042
|
+
Determine if the given quadratic form is (positive or negative) definite.
|
|
1043
|
+
|
|
1044
|
+
.. NOTE::
|
|
1045
|
+
|
|
1046
|
+
A degenerate form is considered neither definite nor indefinite.
|
|
1047
|
+
|
|
1048
|
+
.. NOTE::
|
|
1049
|
+
|
|
1050
|
+
The zero-dimensional form is considered indefinite.
|
|
1051
|
+
|
|
1052
|
+
OUTPUT: boolean
|
|
1053
|
+
|
|
1054
|
+
EXAMPLES::
|
|
1055
|
+
|
|
1056
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [-1,-3,-5])
|
|
1057
|
+
sage: Q.is_definite()
|
|
1058
|
+
True
|
|
1059
|
+
|
|
1060
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,-3,5])
|
|
1061
|
+
sage: Q.is_definite()
|
|
1062
|
+
False
|
|
1063
|
+
"""
|
|
1064
|
+
# Try to use the cached value
|
|
1065
|
+
try:
|
|
1066
|
+
def_str = self.__definiteness_string
|
|
1067
|
+
except AttributeError:
|
|
1068
|
+
self.compute_definiteness()
|
|
1069
|
+
def_str = self.__definiteness_string
|
|
1070
|
+
|
|
1071
|
+
# Return the answer
|
|
1072
|
+
return (def_str == "pos_def") or (def_str == "neg_def") or (def_str == "zero")
|