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,708 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
"""
|
|
3
|
+
Equivalence Testing
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Anna Haensch (2014-12-01): added test for rational isometry
|
|
8
|
+
"""
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from sage.arith.misc import (hilbert_symbol,
|
|
12
|
+
GCD,
|
|
13
|
+
is_prime,
|
|
14
|
+
legendre_symbol,
|
|
15
|
+
prime_divisors,
|
|
16
|
+
valuation)
|
|
17
|
+
from sage.rings.integer_ring import ZZ
|
|
18
|
+
from sage.rings.rational_field import QQ
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
##############################################################################
|
|
22
|
+
# Routines to test if two quadratic forms over ZZ are globally equivalent. #
|
|
23
|
+
# (For now, we require both forms to be positive definite.) #
|
|
24
|
+
##############################################################################
|
|
25
|
+
|
|
26
|
+
def is_globally_equivalent_to(self, other, return_matrix=False) -> bool | Any:
|
|
27
|
+
r"""
|
|
28
|
+
Determine if the current quadratic form is equivalent to the
|
|
29
|
+
given form over `\ZZ`.
|
|
30
|
+
|
|
31
|
+
If ``return_matrix`` is True, then we return the transformation
|
|
32
|
+
matrix `M` so that ``self(M) == other``.
|
|
33
|
+
|
|
34
|
+
INPUT:
|
|
35
|
+
|
|
36
|
+
- ``self``, ``other`` -- positive definite integral quadratic forms
|
|
37
|
+
|
|
38
|
+
- ``return_matrix`` -- boolean (default: ``False``); return
|
|
39
|
+
the transformation matrix instead of a boolean
|
|
40
|
+
|
|
41
|
+
OUTPUT:
|
|
42
|
+
|
|
43
|
+
- if ``return_matrix`` is ``False``: a boolean
|
|
44
|
+
|
|
45
|
+
- if ``return_matrix`` is ``True``: either ``False`` or the
|
|
46
|
+
transformation matrix
|
|
47
|
+
|
|
48
|
+
EXAMPLES::
|
|
49
|
+
|
|
50
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1,1])
|
|
51
|
+
sage: M = Matrix(ZZ, 4, 4, [1,2,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1])
|
|
52
|
+
sage: Q1 = Q(M)
|
|
53
|
+
sage: Q.is_globally_equivalent_to(Q1) # needs sage.libs.pari
|
|
54
|
+
True
|
|
55
|
+
sage: MM = Q.is_globally_equivalent_to(Q1, return_matrix=True) # needs sage.libs.pari
|
|
56
|
+
sage: Q(MM) == Q1 # needs sage.libs.pari
|
|
57
|
+
True
|
|
58
|
+
|
|
59
|
+
::
|
|
60
|
+
|
|
61
|
+
sage: # needs sage.libs.pari
|
|
62
|
+
sage: Q1 = QuadraticForm(ZZ, 3, [1, 0, -1, 2, -1, 5])
|
|
63
|
+
sage: Q2 = QuadraticForm(ZZ, 3, [2, 1, 2, 2, 1, 3])
|
|
64
|
+
sage: Q3 = QuadraticForm(ZZ, 3, [8, 6, 5, 3, 4, 2])
|
|
65
|
+
sage: Q1.is_globally_equivalent_to(Q2)
|
|
66
|
+
False
|
|
67
|
+
sage: Q1.is_globally_equivalent_to(Q2, return_matrix=True)
|
|
68
|
+
False
|
|
69
|
+
sage: Q1.is_globally_equivalent_to(Q3)
|
|
70
|
+
True
|
|
71
|
+
sage: M = Q1.is_globally_equivalent_to(Q3, True); M
|
|
72
|
+
[-1 -1 0]
|
|
73
|
+
[ 1 1 1]
|
|
74
|
+
[-1 0 0]
|
|
75
|
+
sage: Q1(M) == Q3
|
|
76
|
+
True
|
|
77
|
+
|
|
78
|
+
::
|
|
79
|
+
|
|
80
|
+
sage: Q = DiagonalQuadraticForm(ZZ, [1, -1])
|
|
81
|
+
sage: Q.is_globally_equivalent_to(Q) # needs sage.libs.pari
|
|
82
|
+
Traceback (most recent call last):
|
|
83
|
+
...
|
|
84
|
+
ValueError: not a definite form in QuadraticForm.is_globally_equivalent_to()
|
|
85
|
+
|
|
86
|
+
ALGORITHM: this uses the PARI function :pari:`qfisom`, implementing
|
|
87
|
+
an algorithm by Plesken and Souvignier.
|
|
88
|
+
|
|
89
|
+
TESTS:
|
|
90
|
+
|
|
91
|
+
:issue:`27749` is fixed::
|
|
92
|
+
|
|
93
|
+
sage: Q = QuadraticForm(ZZ, 2, [2, 3, 5])
|
|
94
|
+
sage: P = QuadraticForm(ZZ, 2, [8, 6, 5])
|
|
95
|
+
sage: Q.is_globally_equivalent_to(P) # needs sage.libs.pari
|
|
96
|
+
False
|
|
97
|
+
sage: P.is_globally_equivalent_to(Q) # needs sage.libs.pari
|
|
98
|
+
False
|
|
99
|
+
"""
|
|
100
|
+
from sage.quadratic_forms.quadratic_form import QuadraticForm
|
|
101
|
+
|
|
102
|
+
# Check that other is a QuadraticForm
|
|
103
|
+
if not isinstance(other, QuadraticForm):
|
|
104
|
+
raise TypeError("you must compare two quadratic forms, but the argument is not a quadratic form")
|
|
105
|
+
|
|
106
|
+
# only for definite forms
|
|
107
|
+
if not self.is_definite() or not other.is_definite():
|
|
108
|
+
raise ValueError("not a definite form in QuadraticForm.is_globally_equivalent_to()")
|
|
109
|
+
|
|
110
|
+
mat = other.__pari__().qfisom(self)
|
|
111
|
+
if not mat:
|
|
112
|
+
return False
|
|
113
|
+
|
|
114
|
+
if return_matrix:
|
|
115
|
+
return mat.sage()
|
|
116
|
+
else:
|
|
117
|
+
return True
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def is_locally_equivalent_to(self, other, check_primes_only=False,
|
|
121
|
+
force_jordan_equivalence_test=False) -> bool:
|
|
122
|
+
r"""
|
|
123
|
+
Determine if the current quadratic form (defined over `\ZZ`) is
|
|
124
|
+
locally equivalent to the given form over the real numbers and the
|
|
125
|
+
`p`-adic integers for every prime `p`.
|
|
126
|
+
|
|
127
|
+
This works by comparing the local Jordan decompositions at every
|
|
128
|
+
prime, and the dimension and signature at the real place.
|
|
129
|
+
|
|
130
|
+
INPUT:
|
|
131
|
+
|
|
132
|
+
- ``other`` -- a :class:`QuadraticForm`
|
|
133
|
+
|
|
134
|
+
OUTPUT: boolean
|
|
135
|
+
|
|
136
|
+
EXAMPLES::
|
|
137
|
+
|
|
138
|
+
sage: Q1 = QuadraticForm(ZZ, 3, [1, 0, -1, 2, -1, 5])
|
|
139
|
+
sage: Q2 = QuadraticForm(ZZ, 3, [2, 1, 2, 2, 1, 3])
|
|
140
|
+
sage: Q1.is_globally_equivalent_to(Q2) # needs sage.libs.pari
|
|
141
|
+
False
|
|
142
|
+
sage: Q1.is_locally_equivalent_to(Q2) # needs sage.libs.pari
|
|
143
|
+
True
|
|
144
|
+
"""
|
|
145
|
+
# TO IMPLEMENT:
|
|
146
|
+
if self.det() == 0:
|
|
147
|
+
raise NotImplementedError("OOps! We need to think about whether this still works for degenerate forms... especially check the signature.")
|
|
148
|
+
|
|
149
|
+
# Check that both forms have the same dimension and base ring
|
|
150
|
+
if (self.dim() != other.dim()) or (self.base_ring() != other.base_ring()):
|
|
151
|
+
return False
|
|
152
|
+
|
|
153
|
+
# Check that the determinant and level agree
|
|
154
|
+
if (self.det() != other.det()) or (self.level() != other.level()):
|
|
155
|
+
return False
|
|
156
|
+
|
|
157
|
+
# -----------------------------------------------------
|
|
158
|
+
|
|
159
|
+
# Test equivalence over the real numbers
|
|
160
|
+
if self.signature() != other.signature():
|
|
161
|
+
return False
|
|
162
|
+
|
|
163
|
+
# Test equivalence over Z_p for all primes
|
|
164
|
+
if (self.base_ring() == ZZ) and (not force_jordan_equivalence_test):
|
|
165
|
+
|
|
166
|
+
# Test equivalence with Conway-Sloane genus symbols (default over ZZ)
|
|
167
|
+
if self.CS_genus_symbol_list() != other.CS_genus_symbol_list():
|
|
168
|
+
return False
|
|
169
|
+
else:
|
|
170
|
+
# Test equivalence via the O'Meara criterion.
|
|
171
|
+
for p in prime_divisors(ZZ(2) * self.det()):
|
|
172
|
+
if not self.has_equivalent_Jordan_decomposition_at_prime(other, p):
|
|
173
|
+
return False
|
|
174
|
+
|
|
175
|
+
# All tests have passed!
|
|
176
|
+
return True
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def has_equivalent_Jordan_decomposition_at_prime(self, other, p) -> bool:
|
|
180
|
+
"""
|
|
181
|
+
Determine if the given quadratic form has a Jordan decomposition
|
|
182
|
+
equivalent to that of ``self``.
|
|
183
|
+
|
|
184
|
+
INPUT:
|
|
185
|
+
|
|
186
|
+
- ``other`` -- a :class:`QuadraticForm`
|
|
187
|
+
|
|
188
|
+
OUTPUT: boolean
|
|
189
|
+
|
|
190
|
+
EXAMPLES::
|
|
191
|
+
|
|
192
|
+
sage: Q1 = QuadraticForm(ZZ, 3, [1, 0, -1, 1, 0, 3])
|
|
193
|
+
sage: Q2 = QuadraticForm(ZZ, 3, [1, 0, 0, 2, -2, 6])
|
|
194
|
+
sage: Q3 = QuadraticForm(ZZ, 3, [1, 0, 0, 1, 0, 11])
|
|
195
|
+
sage: [Q1.level(), Q2.level(), Q3.level()]
|
|
196
|
+
[44, 44, 44]
|
|
197
|
+
|
|
198
|
+
sage: # needs sage.libs.pari
|
|
199
|
+
sage: Q1.has_equivalent_Jordan_decomposition_at_prime(Q2, 2)
|
|
200
|
+
False
|
|
201
|
+
sage: Q1.has_equivalent_Jordan_decomposition_at_prime(Q2, 11)
|
|
202
|
+
False
|
|
203
|
+
sage: Q1.has_equivalent_Jordan_decomposition_at_prime(Q3, 2)
|
|
204
|
+
False
|
|
205
|
+
sage: Q1.has_equivalent_Jordan_decomposition_at_prime(Q3, 11)
|
|
206
|
+
True
|
|
207
|
+
sage: Q2.has_equivalent_Jordan_decomposition_at_prime(Q3, 2)
|
|
208
|
+
True
|
|
209
|
+
sage: Q2.has_equivalent_Jordan_decomposition_at_prime(Q3, 11)
|
|
210
|
+
False
|
|
211
|
+
"""
|
|
212
|
+
# Sanity Checks
|
|
213
|
+
# if not isinstance(other, QuadraticForm):
|
|
214
|
+
if not isinstance(other, type(self)):
|
|
215
|
+
raise TypeError("the first argument must be of type QuadraticForm")
|
|
216
|
+
if not is_prime(p):
|
|
217
|
+
raise TypeError("the second argument must be a prime number")
|
|
218
|
+
|
|
219
|
+
# Get the relevant local normal forms quickly
|
|
220
|
+
self_jordan = self.jordan_blocks_by_scale_and_unimodular(p, safe_flag=False)
|
|
221
|
+
other_jordan = other.jordan_blocks_by_scale_and_unimodular(p, safe_flag=False)
|
|
222
|
+
|
|
223
|
+
# Check for the same number of Jordan components
|
|
224
|
+
if len(self_jordan) != len(other_jordan):
|
|
225
|
+
return False
|
|
226
|
+
|
|
227
|
+
# Deal with odd primes: Check that the Jordan component scales, dimensions, and discriminants are the same
|
|
228
|
+
if p != 2:
|
|
229
|
+
for i in range(len(self_jordan)):
|
|
230
|
+
if (self_jordan[i][0] != other_jordan[i][0]) \
|
|
231
|
+
or (self_jordan[i][1].dim() != other_jordan[i][1].dim()) \
|
|
232
|
+
or (legendre_symbol(self_jordan[i][1].det() * other_jordan[i][1].det(), p) != 1):
|
|
233
|
+
return False
|
|
234
|
+
|
|
235
|
+
# All tests passed for an odd prime.
|
|
236
|
+
return True
|
|
237
|
+
|
|
238
|
+
# For p = 2: Check that all Jordan Invariants are the same.
|
|
239
|
+
elif p == 2:
|
|
240
|
+
|
|
241
|
+
# Useful definition
|
|
242
|
+
t = len(self_jordan) # Define t = Number of Jordan components
|
|
243
|
+
|
|
244
|
+
# Check that all Jordan Invariants are the same (scale, dim, and norm)
|
|
245
|
+
for i in range(t):
|
|
246
|
+
if (self_jordan[i][0] != other_jordan[i][0]) \
|
|
247
|
+
or (self_jordan[i][1].dim() != other_jordan[i][1].dim()) \
|
|
248
|
+
or (valuation(GCD(self_jordan[i][1].coefficients()), p) != valuation(GCD(other_jordan[i][1].coefficients()), p)):
|
|
249
|
+
return False
|
|
250
|
+
|
|
251
|
+
# Use O'Meara's isometry test 93:29 on p277.
|
|
252
|
+
# ------------------------------------------
|
|
253
|
+
|
|
254
|
+
# List of norms, scales, and dimensions for each i
|
|
255
|
+
scale_list = [ZZ(2)**self_jordan[i][0] for i in range(t)]
|
|
256
|
+
norm_list = [ZZ(2)**(self_jordan[i][0] + valuation(GCD(self_jordan[i][1].coefficients()), 2)) for i in range(t)]
|
|
257
|
+
dim_list = [(self_jordan[i][1].dim()) for i in range(t)]
|
|
258
|
+
|
|
259
|
+
# List of Hessian determinants and Hasse invariants for each Jordan (sub)chain
|
|
260
|
+
# (Note: This is not the same as O'Meara's Gram determinants, but ratios are the same!) -- NOT SO GOOD...
|
|
261
|
+
# But it matters in condition (ii), so we multiply all by 2 (instead of dividing by 2 since only square-factors matter, and it's easier.)
|
|
262
|
+
j = 0
|
|
263
|
+
self_chain_det_list = [self_jordan[j][1].Gram_det() * (scale_list[j]**dim_list[j])]
|
|
264
|
+
other_chain_det_list = [other_jordan[j][1].Gram_det() * (scale_list[j]**dim_list[j])]
|
|
265
|
+
self_hasse_chain_list = [self_jordan[j][1].scale_by_factor(ZZ(2)**self_jordan[j][0]).hasse_invariant__OMeara(2)]
|
|
266
|
+
other_hasse_chain_list = [other_jordan[j][1].scale_by_factor(ZZ(2)**other_jordan[j][0]).hasse_invariant__OMeara(2)]
|
|
267
|
+
|
|
268
|
+
for j in range(1, t):
|
|
269
|
+
self_chain_det_list.append(self_chain_det_list[j-1] * self_jordan[j][1].Gram_det() * (scale_list[j]**dim_list[j]))
|
|
270
|
+
other_chain_det_list.append(other_chain_det_list[j-1] * other_jordan[j][1].Gram_det() * (scale_list[j]**dim_list[j]))
|
|
271
|
+
self_hasse_chain_list.append(self_hasse_chain_list[j-1]
|
|
272
|
+
* hilbert_symbol(self_chain_det_list[j-1], self_jordan[j][1].Gram_det(), 2)
|
|
273
|
+
* self_jordan[j][1].hasse_invariant__OMeara(2))
|
|
274
|
+
other_hasse_chain_list.append(other_hasse_chain_list[j-1]
|
|
275
|
+
* hilbert_symbol(other_chain_det_list[j-1], other_jordan[j][1].Gram_det(), 2)
|
|
276
|
+
* other_jordan[j][1].hasse_invariant__OMeara(2))
|
|
277
|
+
|
|
278
|
+
# SANITY CHECK -- check that the scale powers are strictly increasing
|
|
279
|
+
for i in range(1, len(scale_list)):
|
|
280
|
+
if scale_list[i - 1] >= scale_list[i]:
|
|
281
|
+
raise RuntimeError("there is something wrong with the Jordan Decomposition ; the given scales are not strictly increasing")
|
|
282
|
+
|
|
283
|
+
# Test O'Meara's two conditions
|
|
284
|
+
for i in range(t - 1):
|
|
285
|
+
|
|
286
|
+
# Condition (i): Check that their (unit) ratio is a square (but it suffices to check at most mod 8).
|
|
287
|
+
modulus = norm_list[i] * norm_list[i+1] / (scale_list[i] ** 2)
|
|
288
|
+
modulus = min(modulus, 8)
|
|
289
|
+
if (modulus > 1) and (((self_chain_det_list[i] / other_chain_det_list[i]) % modulus) != 1):
|
|
290
|
+
return False
|
|
291
|
+
|
|
292
|
+
# Check O'Meara's condition (ii) when appropriate
|
|
293
|
+
if norm_list[i + 1] % (4 * norm_list[i]) == 0:
|
|
294
|
+
if self_hasse_chain_list[i] * hilbert_symbol(norm_list[i] * other_chain_det_list[i], -self_chain_det_list[i], 2) \
|
|
295
|
+
!= other_hasse_chain_list[i] * hilbert_symbol(norm_list[i], -other_chain_det_list[i], 2): # Nipp conditions
|
|
296
|
+
return False
|
|
297
|
+
|
|
298
|
+
# All tests passed for the prime 2.
|
|
299
|
+
return True
|
|
300
|
+
|
|
301
|
+
else:
|
|
302
|
+
raise TypeError("this should not have happened")
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
def is_rationally_isometric(self, other, return_matrix=False) -> bool | Any:
|
|
306
|
+
"""
|
|
307
|
+
Determine if two regular quadratic forms over a number field are isometric.
|
|
308
|
+
|
|
309
|
+
INPUT:
|
|
310
|
+
|
|
311
|
+
- ``other`` -- a quadratic form over a number field
|
|
312
|
+
|
|
313
|
+
- ``return_matrix`` -- boolean (default: ``False``); return
|
|
314
|
+
the transformation matrix instead of a boolean; this is currently
|
|
315
|
+
only implemented for forms over ``QQ``
|
|
316
|
+
|
|
317
|
+
OUTPUT:
|
|
318
|
+
|
|
319
|
+
- if ``return_matrix`` is ``False``: a boolean
|
|
320
|
+
|
|
321
|
+
- if ``return_matrix`` is ``True``: either ``False`` or the
|
|
322
|
+
transformation matrix
|
|
323
|
+
|
|
324
|
+
EXAMPLES::
|
|
325
|
+
|
|
326
|
+
sage: V = DiagonalQuadraticForm(QQ, [1, 1, 2])
|
|
327
|
+
sage: W = DiagonalQuadraticForm(QQ, [2, 2, 2])
|
|
328
|
+
sage: V.is_rationally_isometric(W) # needs sage.libs.pari
|
|
329
|
+
True
|
|
330
|
+
|
|
331
|
+
::
|
|
332
|
+
|
|
333
|
+
sage: # needs sage.rings.number_field
|
|
334
|
+
sage: x = polygen(ZZ, 'x')
|
|
335
|
+
sage: K.<a> = NumberField(x^2 - 3)
|
|
336
|
+
sage: V = QuadraticForm(K, 4, [1, 0, 0, 0, 2*a, 0, 0, a, 0, 2]); V
|
|
337
|
+
Quadratic form in 4 variables over Number Field in a
|
|
338
|
+
with defining polynomial x^2 - 3 with coefficients:
|
|
339
|
+
[ 1 0 0 0 ]
|
|
340
|
+
[ * 2*a 0 0 ]
|
|
341
|
+
[ * * a 0 ]
|
|
342
|
+
[ * * * 2 ]
|
|
343
|
+
sage: W = QuadraticForm(K, 4, [1, 2*a, 4, 6, 3, 10, 2, 1, 2, 5]); W
|
|
344
|
+
Quadratic form in 4 variables over Number Field in a
|
|
345
|
+
with defining polynomial x^2 - 3 with coefficients:
|
|
346
|
+
[ 1 2*a 4 6 ]
|
|
347
|
+
[ * 3 10 2 ]
|
|
348
|
+
[ * * 1 2 ]
|
|
349
|
+
[ * * * 5 ]
|
|
350
|
+
sage: V.is_rationally_isometric(W)
|
|
351
|
+
False
|
|
352
|
+
|
|
353
|
+
::
|
|
354
|
+
|
|
355
|
+
sage: # needs sage.rings.number_field
|
|
356
|
+
sage: K.<a> = NumberField(x^4 + 2*x + 6)
|
|
357
|
+
sage: V = DiagonalQuadraticForm(K, [a, 2, 3, 2, 1]); V
|
|
358
|
+
Quadratic form in 5 variables over Number Field in a
|
|
359
|
+
with defining polynomial x^4 + 2*x + 6 with coefficients:
|
|
360
|
+
[ a 0 0 0 0 ]
|
|
361
|
+
[ * 2 0 0 0 ]
|
|
362
|
+
[ * * 3 0 0 ]
|
|
363
|
+
[ * * * 2 0 ]
|
|
364
|
+
[ * * * * 1 ]
|
|
365
|
+
sage: W = DiagonalQuadraticForm(K, [a, a, a, 2, 1]); W
|
|
366
|
+
Quadratic form in 5 variables over Number Field in a
|
|
367
|
+
with defining polynomial x^4 + 2*x + 6 with coefficients:
|
|
368
|
+
[ a 0 0 0 0 ]
|
|
369
|
+
[ * a 0 0 0 ]
|
|
370
|
+
[ * * a 0 0 ]
|
|
371
|
+
[ * * * 2 0 ]
|
|
372
|
+
[ * * * * 1 ]
|
|
373
|
+
sage: V.is_rationally_isometric(W)
|
|
374
|
+
False
|
|
375
|
+
|
|
376
|
+
::
|
|
377
|
+
|
|
378
|
+
sage: # needs sage.rings.number_field
|
|
379
|
+
sage: K.<a> = NumberField(x^2 - 3)
|
|
380
|
+
sage: V = DiagonalQuadraticForm(K, [-1, a, -2*a])
|
|
381
|
+
sage: W = DiagonalQuadraticForm(K, [-1, -a, 2*a])
|
|
382
|
+
sage: V.is_rationally_isometric(W)
|
|
383
|
+
True
|
|
384
|
+
|
|
385
|
+
sage: # needs sage.rings.number_field
|
|
386
|
+
sage: V = DiagonalQuadraticForm(QQ, [1, 1, 2])
|
|
387
|
+
sage: W = DiagonalQuadraticForm(QQ, [2, 2, 2])
|
|
388
|
+
sage: T = V.is_rationally_isometric(W, True); T
|
|
389
|
+
[ 0 0 1]
|
|
390
|
+
[-1/2 -1/2 0]
|
|
391
|
+
[ 1/2 -1/2 0]
|
|
392
|
+
sage: V.Gram_matrix() == T.transpose() * W.Gram_matrix() * T
|
|
393
|
+
True
|
|
394
|
+
|
|
395
|
+
sage: T = W.is_rationally_isometric(V, True); T # needs sage.rings.number_field
|
|
396
|
+
[ 0 -1 1]
|
|
397
|
+
[ 0 -1 -1]
|
|
398
|
+
[ 1 0 0]
|
|
399
|
+
sage: W.Gram_matrix() == T.T * V.Gram_matrix() * T # needs sage.rings.number_field
|
|
400
|
+
True
|
|
401
|
+
|
|
402
|
+
::
|
|
403
|
+
|
|
404
|
+
sage: L = QuadraticForm(QQ, 3, [2, 2, 0, 2, 2, 5])
|
|
405
|
+
sage: M = QuadraticForm(QQ, 3, [2, 2, 0, 3, 2, 3])
|
|
406
|
+
sage: L.is_rationally_isometric(M, True) # needs sage.libs.pari
|
|
407
|
+
False
|
|
408
|
+
|
|
409
|
+
::
|
|
410
|
+
|
|
411
|
+
sage: A = DiagonalQuadraticForm(QQ, [1, 5])
|
|
412
|
+
sage: B = QuadraticForm(QQ, 2, [1, 12, 81])
|
|
413
|
+
sage: T = A.is_rationally_isometric(B, True); T # needs sage.libs.pari
|
|
414
|
+
[ 1 -2]
|
|
415
|
+
[ 0 1/3]
|
|
416
|
+
sage: A.Gram_matrix() == T.T * B.Gram_matrix() * T # needs sage.libs.pari
|
|
417
|
+
True
|
|
418
|
+
|
|
419
|
+
::
|
|
420
|
+
|
|
421
|
+
sage: C = DiagonalQuadraticForm(QQ, [1, 5, 9])
|
|
422
|
+
sage: D = DiagonalQuadraticForm(QQ, [6, 30, 1])
|
|
423
|
+
sage: T = C.is_rationally_isometric(D, True); T # needs sage.libs.pari
|
|
424
|
+
[ 0 -5/6 1/2]
|
|
425
|
+
[ 0 1/6 1/2]
|
|
426
|
+
[ -1 0 0]
|
|
427
|
+
sage: C.Gram_matrix() == T.T * D.Gram_matrix() * T # needs sage.libs.pari
|
|
428
|
+
True
|
|
429
|
+
|
|
430
|
+
::
|
|
431
|
+
|
|
432
|
+
sage: E = DiagonalQuadraticForm(QQ, [1, 1])
|
|
433
|
+
sage: F = QuadraticForm(QQ, 2, [17, 94, 130])
|
|
434
|
+
sage: T = F.is_rationally_isometric(E, True); T # needs sage.libs.pari
|
|
435
|
+
[ -4 -189/17]
|
|
436
|
+
[ -1 -43/17]
|
|
437
|
+
sage: F.Gram_matrix() == T.T * E.Gram_matrix() * T # needs sage.libs.pari
|
|
438
|
+
True
|
|
439
|
+
|
|
440
|
+
TESTS::
|
|
441
|
+
|
|
442
|
+
sage: # needs sage.rings.number_field
|
|
443
|
+
sage: K.<a> = QuadraticField(3)
|
|
444
|
+
sage: V = DiagonalQuadraticForm(K, [1, 2])
|
|
445
|
+
sage: W = DiagonalQuadraticForm(K, [1, 0])
|
|
446
|
+
sage: V.is_rationally_isometric(W)
|
|
447
|
+
Traceback (most recent call last):
|
|
448
|
+
...
|
|
449
|
+
NotImplementedError: this only tests regular forms
|
|
450
|
+
|
|
451
|
+
Forms must have the same base ring otherwise a :exc:`TypeError` is raised::
|
|
452
|
+
|
|
453
|
+
sage: # needs sage.rings.number_field
|
|
454
|
+
sage: K1.<a> = QuadraticField(5)
|
|
455
|
+
sage: K2.<b> = QuadraticField(7)
|
|
456
|
+
sage: V = DiagonalQuadraticForm(K1, [1, a])
|
|
457
|
+
sage: W = DiagonalQuadraticForm(K2, [1, b])
|
|
458
|
+
sage: V.is_rationally_isometric(W)
|
|
459
|
+
Traceback (most recent call last):
|
|
460
|
+
...
|
|
461
|
+
TypeError: forms must have the same base ring.
|
|
462
|
+
|
|
463
|
+
Forms which have different dimension are not isometric::
|
|
464
|
+
|
|
465
|
+
sage: W = DiagonalQuadraticForm(QQ, [1, 2])
|
|
466
|
+
sage: V = DiagonalQuadraticForm(QQ, [1, 1, 1])
|
|
467
|
+
sage: V.is_rationally_isometric(W)
|
|
468
|
+
False
|
|
469
|
+
|
|
470
|
+
Forms whose determinants do not differ by a square in the base field are not isometric::
|
|
471
|
+
|
|
472
|
+
sage: # needs sage.rings.number_field
|
|
473
|
+
sage: K.<a> = NumberField(x^2 - 3)
|
|
474
|
+
sage: V = DiagonalQuadraticForm(K, [-1, a, -2*a])
|
|
475
|
+
sage: W = DiagonalQuadraticForm(K, [-1, a, 2*a])
|
|
476
|
+
sage: V.is_rationally_isometric(W)
|
|
477
|
+
False
|
|
478
|
+
|
|
479
|
+
::
|
|
480
|
+
|
|
481
|
+
sage: # needs sage.rings.number_field
|
|
482
|
+
sage: K.<a> = NumberField(x^5 - x + 2, 'a')
|
|
483
|
+
sage: Q = QuadraticForm(K, 3, [a, 1, 0, -a**2, -a**3, -1])
|
|
484
|
+
sage: m = Q.matrix()
|
|
485
|
+
sage: for _ in range(5):
|
|
486
|
+
....: t = random_matrix(ZZ, 3, algorithm='unimodular')
|
|
487
|
+
....: m2 = t*m*t.transpose()
|
|
488
|
+
....: Q2 = QuadraticForm(K, 3, [m2[i,j] / (2 if i==j else 1)
|
|
489
|
+
....: for i in range(3) for j in range(i,3)])
|
|
490
|
+
....: print(Q.is_rationally_isometric(Q2))
|
|
491
|
+
True
|
|
492
|
+
True
|
|
493
|
+
True
|
|
494
|
+
True
|
|
495
|
+
True
|
|
496
|
+
"""
|
|
497
|
+
if self.Gram_det() == 0 or other.Gram_det() == 0:
|
|
498
|
+
raise NotImplementedError("this only tests regular forms")
|
|
499
|
+
|
|
500
|
+
if self.base_ring() != other.base_ring():
|
|
501
|
+
raise TypeError("forms must have the same base ring.")
|
|
502
|
+
|
|
503
|
+
if self.dim() != other.dim():
|
|
504
|
+
return False
|
|
505
|
+
|
|
506
|
+
if not (self.Gram_det() * other.Gram_det()).is_square():
|
|
507
|
+
return False
|
|
508
|
+
|
|
509
|
+
L1 = self.Gram_det().support()
|
|
510
|
+
L2 = other.Gram_det().support()
|
|
511
|
+
|
|
512
|
+
for p in set().union(L1, L2):
|
|
513
|
+
if self.hasse_invariant(p) != other.hasse_invariant(p):
|
|
514
|
+
return False
|
|
515
|
+
|
|
516
|
+
if self.base_ring() == QQ:
|
|
517
|
+
if self.signature() != other.signature():
|
|
518
|
+
return False
|
|
519
|
+
else:
|
|
520
|
+
|
|
521
|
+
M = self.rational_diagonal_form().Gram_matrix_rational()
|
|
522
|
+
N = other.rational_diagonal_form().Gram_matrix_rational()
|
|
523
|
+
K = self.base_ring()
|
|
524
|
+
|
|
525
|
+
Mentries = M.diagonal()
|
|
526
|
+
Nentries = N.diagonal()
|
|
527
|
+
|
|
528
|
+
for emb in K.real_embeddings():
|
|
529
|
+
|
|
530
|
+
Mpos = 0
|
|
531
|
+
for x in Mentries:
|
|
532
|
+
Mpos += emb(x) >= 0
|
|
533
|
+
|
|
534
|
+
Npos = 0
|
|
535
|
+
for x in Nentries:
|
|
536
|
+
Npos += emb(x) >= 0
|
|
537
|
+
|
|
538
|
+
if Npos != Mpos:
|
|
539
|
+
return False
|
|
540
|
+
|
|
541
|
+
if not return_matrix:
|
|
542
|
+
return True
|
|
543
|
+
|
|
544
|
+
# Ensure that both quadratic forms are diagonal.
|
|
545
|
+
Q, q_diagonal_transform = self.rational_diagonal_form(True)
|
|
546
|
+
F, f_diagonal_transform = other.rational_diagonal_form(True)
|
|
547
|
+
|
|
548
|
+
# Call the method that does all the work to compute the transformation.
|
|
549
|
+
transform = _diagonal_isometry(Q, F)
|
|
550
|
+
|
|
551
|
+
return f_diagonal_transform * transform * q_diagonal_transform.inverse()
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
def _diagonal_isometry(V, W):
|
|
555
|
+
r"""
|
|
556
|
+
Given two diagonal, rationally equivalent quadratic forms, computes a
|
|
557
|
+
transition matrix mapping from one to the other.
|
|
558
|
+
|
|
559
|
+
.. NOTE::
|
|
560
|
+
|
|
561
|
+
This function is an auxiliary method of ``isometry``, which is
|
|
562
|
+
the method that should be called as it performs error-checking
|
|
563
|
+
that is not present in this function.
|
|
564
|
+
|
|
565
|
+
INPUT:
|
|
566
|
+
|
|
567
|
+
- ``V`` -- a diagonal quadratic form
|
|
568
|
+
- ``W`` -- a diagonal quadratic form
|
|
569
|
+
|
|
570
|
+
OUTPUT:
|
|
571
|
+
|
|
572
|
+
- A matrix ``T`` representing the isometry transformation, such that if
|
|
573
|
+
``VM`` is the gram matrix of ``V`` and ``WM`` is the gram matrix of
|
|
574
|
+
``W``, then ``VM == T.transpose() * WM * T`` yields ``True``.
|
|
575
|
+
|
|
576
|
+
EXAMPLES::
|
|
577
|
+
|
|
578
|
+
sage: from sage.quadratic_forms.quadratic_form__equivalence_testing import _diagonal_isometry
|
|
579
|
+
|
|
580
|
+
sage: Q = DiagonalQuadraticForm(QQ, [1, 2, 4])
|
|
581
|
+
sage: F = DiagonalQuadraticForm(QQ, [2, 2, 2])
|
|
582
|
+
|
|
583
|
+
sage: T = _diagonal_isometry(Q, F); T # needs sage.libs.pari
|
|
584
|
+
[ 0 1 0]
|
|
585
|
+
[-1/2 0 1]
|
|
586
|
+
[ 1/2 0 1]
|
|
587
|
+
sage: Q.Gram_matrix() == T.T * F.Gram_matrix() * T # needs sage.libs.pari
|
|
588
|
+
True
|
|
589
|
+
|
|
590
|
+
sage: T = _diagonal_isometry(F, Q); T # needs sage.libs.pari
|
|
591
|
+
[ 0 -1 -1]
|
|
592
|
+
[ 1 0 0]
|
|
593
|
+
[ 0 -1/2 1/2]
|
|
594
|
+
sage: F.Gram_matrix() == T.T * Q.Gram_matrix() * T # needs sage.libs.pari
|
|
595
|
+
True
|
|
596
|
+
"""
|
|
597
|
+
import copy
|
|
598
|
+
from sage.quadratic_forms.quadratic_form import DiagonalQuadraticForm
|
|
599
|
+
from sage.matrix.constructor import Matrix
|
|
600
|
+
from sage.modules.free_module_element import vector
|
|
601
|
+
|
|
602
|
+
# We need to modify V and W, so copy them into Q and F respectively.
|
|
603
|
+
Q, F = copy.deepcopy(V), copy.deepcopy(W)
|
|
604
|
+
# Let FM denote the Gram matrix of F.
|
|
605
|
+
FM = F.Gram_matrix()
|
|
606
|
+
n = Q.dim()
|
|
607
|
+
|
|
608
|
+
# This matrix represents a new basis for W, where the columns of the
|
|
609
|
+
# matrix are the vectors of the basis. We initialize it to the standard basis.
|
|
610
|
+
change_of_basis_matrix = Matrix.identity(QQ, n)
|
|
611
|
+
|
|
612
|
+
# The goal of this loop is to obtain a new basis for W such that the
|
|
613
|
+
# Gram matrix of V with respect to the standard basis equals the Gram matrix
|
|
614
|
+
# of W with respect to the new basis.
|
|
615
|
+
for i in range(n):
|
|
616
|
+
# If the first terms are not equal...
|
|
617
|
+
if Q.Gram_matrix()[0][0] != F.Gram_matrix()[0][0]:
|
|
618
|
+
# Find a vector w in F such that F(w) equals the first term of Q.
|
|
619
|
+
w = F.solve(Q.Gram_matrix()[0][0])
|
|
620
|
+
w = vector(QQ, i * [0] + w.list())
|
|
621
|
+
|
|
622
|
+
# We want to extend the basis of W to include the vector w.
|
|
623
|
+
# Find a non-fixed vector in the current basis to replace by w.
|
|
624
|
+
j = i
|
|
625
|
+
# The new set of vectors must still be linearly independent (i.e. the matrix is non-singular).
|
|
626
|
+
while True:
|
|
627
|
+
temp_matrix = Matrix(change_of_basis_matrix)
|
|
628
|
+
temp_matrix.set_column(j, change_of_basis_matrix * w)
|
|
629
|
+
if not temp_matrix.is_singular():
|
|
630
|
+
break
|
|
631
|
+
j += 1
|
|
632
|
+
|
|
633
|
+
change_of_basis_matrix = temp_matrix
|
|
634
|
+
|
|
635
|
+
# We want to fix w to be the basis vector at position i, so swap it with whatever is already there.
|
|
636
|
+
col = change_of_basis_matrix.column(i)
|
|
637
|
+
change_of_basis_matrix.set_column(i, change_of_basis_matrix.column(j))
|
|
638
|
+
change_of_basis_matrix.set_column(j, col)
|
|
639
|
+
|
|
640
|
+
# Orthogonalize the basis.
|
|
641
|
+
change_of_basis_matrix = _gram_schmidt(change_of_basis_matrix, i, W.bilinear_map)
|
|
642
|
+
|
|
643
|
+
# Obtain the diagonal gram matrix of F.
|
|
644
|
+
FM = W(change_of_basis_matrix).Gram_matrix_rational()
|
|
645
|
+
|
|
646
|
+
# Now we have that QM[0][0] == FM[0][0] where QM and FM are the Gram matrices
|
|
647
|
+
# of Q and F respectively. We remove the first variable from each form and continue.
|
|
648
|
+
F = DiagonalQuadraticForm(F.base_ring(), FM.diagonal())
|
|
649
|
+
F = F.extract_variables(range(i + 1, F.dim()))
|
|
650
|
+
Q = Q.extract_variables(range(1, Q.dim()))
|
|
651
|
+
|
|
652
|
+
return change_of_basis_matrix
|
|
653
|
+
|
|
654
|
+
|
|
655
|
+
def _gram_schmidt(m, fixed_vector_index, inner_product):
|
|
656
|
+
r"""
|
|
657
|
+
Orthogonalize a set of vectors, starting at a fixed vector, with respect to a given
|
|
658
|
+
inner product.
|
|
659
|
+
|
|
660
|
+
INPUT:
|
|
661
|
+
|
|
662
|
+
- ``m`` -- a square matrix whose columns represent vectors
|
|
663
|
+
- ``fixed_vector_index`` -- any vectors preceding the vector (i.e. to its left)
|
|
664
|
+
at this index are not changed.
|
|
665
|
+
- ``inner_product`` -- a function that takes two vector arguments and returns a scalar,
|
|
666
|
+
representing an inner product
|
|
667
|
+
|
|
668
|
+
OUTPUT: a matrix consisting of orthogonal columns with respect to the given inner product
|
|
669
|
+
|
|
670
|
+
EXAMPLES::
|
|
671
|
+
|
|
672
|
+
sage: from sage.quadratic_forms.quadratic_form__equivalence_testing import _gram_schmidt
|
|
673
|
+
sage: Q = QuadraticForm(QQ, 3, [1, 2, 2, 2, 1, 3]); Q
|
|
674
|
+
Quadratic form in 3 variables over Rational Field with coefficients:
|
|
675
|
+
[ 1 2 2 ]
|
|
676
|
+
[ * 2 1 ]
|
|
677
|
+
[ * * 3 ]
|
|
678
|
+
sage: QM = Q.Gram_matrix(); QM
|
|
679
|
+
[ 1 1 1]
|
|
680
|
+
[ 1 2 1/2]
|
|
681
|
+
[ 1 1/2 3]
|
|
682
|
+
sage: std_basis = matrix.identity(3)
|
|
683
|
+
sage: ortho_basis = _gram_schmidt(std_basis, 0, Q.bilinear_map); ortho_basis
|
|
684
|
+
[ 1 -1 -3/2]
|
|
685
|
+
[ 0 1 1/2]
|
|
686
|
+
[ 0 0 1]
|
|
687
|
+
sage: Q(ortho_basis).Gram_matrix_rational()
|
|
688
|
+
[ 1 0 0]
|
|
689
|
+
[ 0 1 0]
|
|
690
|
+
[ 0 0 7/4]
|
|
691
|
+
sage: v1 = ortho_basis.column(0); v2 = ortho_basis.column(1); v3 = ortho_basis.column(2);
|
|
692
|
+
sage: Q.bilinear_map(v1, v2) == 0
|
|
693
|
+
True
|
|
694
|
+
sage: Q.bilinear_map(v1, v3) == 0
|
|
695
|
+
True
|
|
696
|
+
sage: Q.bilinear_map(v2, v3) == 0
|
|
697
|
+
True
|
|
698
|
+
"""
|
|
699
|
+
from sage.matrix.constructor import column_matrix
|
|
700
|
+
|
|
701
|
+
n = m.dimensions()[0]
|
|
702
|
+
vectors = [m.column(i) for i in range(n)]
|
|
703
|
+
|
|
704
|
+
for i in range(fixed_vector_index, n):
|
|
705
|
+
for j in range(i + 1, n):
|
|
706
|
+
vectors[j] = vectors[j] - (inner_product(vectors[j], vectors[i]) / inner_product(vectors[i], vectors[i])) * vectors[i]
|
|
707
|
+
|
|
708
|
+
return column_matrix(vectors)
|