passagemath-modules 10.6.31rc3__cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +806 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +6 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgfortran-e1b7dfc8.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-93ebf16a.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-e3525837.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-c5c421e1.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-e0f11cf3.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-4c5b64b1.3.29.so +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,1745 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
Toric lattices
|
|
4
|
+
|
|
5
|
+
This module was designed as a part of the framework for toric varieties
|
|
6
|
+
(:mod:`~sage.schemes.toric.variety`,
|
|
7
|
+
:mod:`~sage.schemes.toric.fano_variety`).
|
|
8
|
+
|
|
9
|
+
All toric lattices are isomorphic to `\ZZ^n` for some `n`, but will prevent
|
|
10
|
+
you from doing "wrong" operations with objects from different lattices.
|
|
11
|
+
|
|
12
|
+
AUTHORS:
|
|
13
|
+
|
|
14
|
+
- Andrey Novoseltsev (2010-05-27): initial version.
|
|
15
|
+
- Andrey Novoseltsev (2010-07-30): sublattices and quotients.
|
|
16
|
+
|
|
17
|
+
EXAMPLES:
|
|
18
|
+
|
|
19
|
+
The simplest way to create a toric lattice is to specify its dimension only::
|
|
20
|
+
|
|
21
|
+
sage: N = ToricLattice(3)
|
|
22
|
+
sage: N
|
|
23
|
+
3-d lattice N
|
|
24
|
+
|
|
25
|
+
While our lattice ``N`` is called exactly "N" it is a coincidence: all
|
|
26
|
+
lattices are called "N" by default::
|
|
27
|
+
|
|
28
|
+
sage: another_name = ToricLattice(3)
|
|
29
|
+
sage: another_name
|
|
30
|
+
3-d lattice N
|
|
31
|
+
|
|
32
|
+
If fact, the above lattice is exactly the same as before as an object in
|
|
33
|
+
memory::
|
|
34
|
+
|
|
35
|
+
sage: N is another_name
|
|
36
|
+
True
|
|
37
|
+
|
|
38
|
+
There are actually four names associated to a toric lattice and they all must
|
|
39
|
+
be the same for two lattices to coincide::
|
|
40
|
+
|
|
41
|
+
sage: N, N.dual(), latex(N), latex(N.dual())
|
|
42
|
+
(3-d lattice N, 3-d lattice M, N, M)
|
|
43
|
+
|
|
44
|
+
Notice that the lattice dual to ``N`` is called "M" which is standard in toric
|
|
45
|
+
geometry. This happens only if you allow completely automatic handling of
|
|
46
|
+
names::
|
|
47
|
+
|
|
48
|
+
sage: another_N = ToricLattice(3, "N")
|
|
49
|
+
sage: another_N.dual()
|
|
50
|
+
3-d lattice N*
|
|
51
|
+
sage: N is another_N
|
|
52
|
+
False
|
|
53
|
+
|
|
54
|
+
What can you do with toric lattices? Well, their main purpose is to allow
|
|
55
|
+
creation of elements of toric lattices::
|
|
56
|
+
|
|
57
|
+
sage: n = N([1,2,3])
|
|
58
|
+
sage: n
|
|
59
|
+
N(1, 2, 3)
|
|
60
|
+
sage: M = N.dual()
|
|
61
|
+
sage: m = M(1,2,3)
|
|
62
|
+
sage: m
|
|
63
|
+
M(1, 2, 3)
|
|
64
|
+
|
|
65
|
+
Dual lattices can act on each other::
|
|
66
|
+
|
|
67
|
+
sage: n * m
|
|
68
|
+
14
|
|
69
|
+
sage: m * n
|
|
70
|
+
14
|
|
71
|
+
|
|
72
|
+
You can also add elements of the same lattice or scale them::
|
|
73
|
+
|
|
74
|
+
sage: 2 * n
|
|
75
|
+
N(2, 4, 6)
|
|
76
|
+
sage: n * 2
|
|
77
|
+
N(2, 4, 6)
|
|
78
|
+
sage: n + n
|
|
79
|
+
N(2, 4, 6)
|
|
80
|
+
|
|
81
|
+
However, you cannot "mix wrong lattices" in your expressions::
|
|
82
|
+
|
|
83
|
+
sage: n + m
|
|
84
|
+
Traceback (most recent call last):
|
|
85
|
+
...
|
|
86
|
+
TypeError: unsupported operand parent(s) for +:
|
|
87
|
+
'3-d lattice N' and '3-d lattice M'
|
|
88
|
+
sage: n * n
|
|
89
|
+
Traceback (most recent call last):
|
|
90
|
+
...
|
|
91
|
+
TypeError: elements of the same toric lattice cannot be multiplied!
|
|
92
|
+
sage: n == m
|
|
93
|
+
False
|
|
94
|
+
|
|
95
|
+
Note that ``n`` and ``m`` are not equal to each other even though they are
|
|
96
|
+
both "just (1,2,3)." Moreover, you cannot easily convert elements between
|
|
97
|
+
toric lattices::
|
|
98
|
+
|
|
99
|
+
sage: M(n)
|
|
100
|
+
Traceback (most recent call last):
|
|
101
|
+
...
|
|
102
|
+
TypeError: N(1, 2, 3) cannot be converted to 3-d lattice M!
|
|
103
|
+
|
|
104
|
+
If you really need to consider elements of one lattice as elements of another,
|
|
105
|
+
you can either use intermediate conversion to "just a vector"::
|
|
106
|
+
|
|
107
|
+
sage: ZZ3 = ZZ^3
|
|
108
|
+
sage: n_in_M = M(ZZ3(n))
|
|
109
|
+
sage: n_in_M
|
|
110
|
+
M(1, 2, 3)
|
|
111
|
+
sage: n == n_in_M
|
|
112
|
+
False
|
|
113
|
+
sage: n_in_M == m
|
|
114
|
+
True
|
|
115
|
+
|
|
116
|
+
Or you can create a homomorphism from one lattice to any other::
|
|
117
|
+
|
|
118
|
+
sage: h = N.hom(identity_matrix(3), M)
|
|
119
|
+
sage: h(n)
|
|
120
|
+
M(1, 2, 3)
|
|
121
|
+
|
|
122
|
+
.. WARNING::
|
|
123
|
+
|
|
124
|
+
While integer vectors (elements of `\ZZ^n`) are printed as ``(1,2,3)``,
|
|
125
|
+
in the code ``(1,2,3)`` is a :class:`tuple`, which has nothing to do
|
|
126
|
+
neither with vectors, nor with toric lattices, so the following is
|
|
127
|
+
probably not what you want while working with toric geometry objects::
|
|
128
|
+
|
|
129
|
+
sage: (1,2,3) + (1,2,3)
|
|
130
|
+
(1, 2, 3, 1, 2, 3)
|
|
131
|
+
|
|
132
|
+
Instead, use syntax like ::
|
|
133
|
+
|
|
134
|
+
sage: N(1,2,3) + N(1,2,3)
|
|
135
|
+
N(2, 4, 6)
|
|
136
|
+
"""
|
|
137
|
+
# Parts of the "tutorial" above are also in toric_lattice_element.pyx.
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
# ****************************************************************************
|
|
141
|
+
# Copyright (C) 2010 Andrey Novoseltsev <novoselt@gmail.com>
|
|
142
|
+
# Copyright (C) 2010 William Stein <wstein@gmail.com>
|
|
143
|
+
#
|
|
144
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
145
|
+
#
|
|
146
|
+
# https://www.gnu.org/licenses/
|
|
147
|
+
# ****************************************************************************
|
|
148
|
+
|
|
149
|
+
from sage.geometry.toric_lattice_element import ToricLatticeElement
|
|
150
|
+
from sage.misc.lazy_import import lazy_import
|
|
151
|
+
lazy_import('sage.geometry.toric_plotter', 'ToricPlotter')
|
|
152
|
+
from sage.misc.latex import latex
|
|
153
|
+
from sage.structure.all import parent
|
|
154
|
+
from sage.structure.richcmp import (richcmp_method, richcmp, rich_to_bool,
|
|
155
|
+
richcmp_not_equal)
|
|
156
|
+
from sage.modules.fg_pid.fgp_element import FGP_Element
|
|
157
|
+
from sage.modules.fg_pid.fgp_module import FGP_Module_class
|
|
158
|
+
from sage.modules.free_module import (FreeModule_ambient_pid,
|
|
159
|
+
FreeModule_generic_pid,
|
|
160
|
+
FreeModule_submodule_pid,
|
|
161
|
+
FreeModule_submodule_with_basis_pid)
|
|
162
|
+
from sage.rings.integer_ring import ZZ
|
|
163
|
+
from sage.rings.rational_field import QQ
|
|
164
|
+
from sage.structure.factory import UniqueFactory
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def is_ToricLattice(x):
|
|
168
|
+
r"""
|
|
169
|
+
Check if ``x`` is a toric lattice.
|
|
170
|
+
|
|
171
|
+
INPUT:
|
|
172
|
+
|
|
173
|
+
- ``x`` -- anything
|
|
174
|
+
|
|
175
|
+
OUTPUT: ``True`` if ``x`` is a toric lattice and ``False`` otherwise
|
|
176
|
+
|
|
177
|
+
EXAMPLES::
|
|
178
|
+
|
|
179
|
+
sage: from sage.geometry.toric_lattice import (
|
|
180
|
+
....: is_ToricLattice)
|
|
181
|
+
sage: is_ToricLattice(1)
|
|
182
|
+
doctest:warning...
|
|
183
|
+
DeprecationWarning: The function is_ToricLattice is deprecated;
|
|
184
|
+
use 'isinstance(..., ToricLattice_generic)' instead.
|
|
185
|
+
See https://github.com/sagemath/sage/issues/38126 for details.
|
|
186
|
+
False
|
|
187
|
+
sage: N = ToricLattice(3)
|
|
188
|
+
sage: N
|
|
189
|
+
3-d lattice N
|
|
190
|
+
sage: is_ToricLattice(N)
|
|
191
|
+
True
|
|
192
|
+
"""
|
|
193
|
+
from sage.misc.superseded import deprecation
|
|
194
|
+
deprecation(38126,
|
|
195
|
+
"The function is_ToricLattice is deprecated; "
|
|
196
|
+
"use 'isinstance(..., ToricLattice_generic)' instead.")
|
|
197
|
+
return isinstance(x, ToricLattice_generic)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def is_ToricLatticeQuotient(x):
|
|
201
|
+
r"""
|
|
202
|
+
Check if ``x`` is a toric lattice quotient.
|
|
203
|
+
|
|
204
|
+
INPUT:
|
|
205
|
+
|
|
206
|
+
- ``x`` -- anything
|
|
207
|
+
|
|
208
|
+
OUTPUT: ``True`` if ``x`` is a toric lattice quotient and ``False`` otherwise
|
|
209
|
+
|
|
210
|
+
EXAMPLES::
|
|
211
|
+
|
|
212
|
+
sage: from sage.geometry.toric_lattice import (
|
|
213
|
+
....: is_ToricLatticeQuotient)
|
|
214
|
+
sage: is_ToricLatticeQuotient(1)
|
|
215
|
+
doctest:warning...
|
|
216
|
+
DeprecationWarning: The function is_ToricLatticeQuotient is deprecated;
|
|
217
|
+
use 'isinstance(..., ToricLattice_quotient)' instead.
|
|
218
|
+
See https://github.com/sagemath/sage/issues/38126 for details.
|
|
219
|
+
False
|
|
220
|
+
sage: N = ToricLattice(3)
|
|
221
|
+
sage: N
|
|
222
|
+
3-d lattice N
|
|
223
|
+
sage: is_ToricLatticeQuotient(N)
|
|
224
|
+
False
|
|
225
|
+
sage: Q = N / N.submodule([(1,2,3), (3,2,1)])
|
|
226
|
+
sage: Q # needs sage.libs.pari
|
|
227
|
+
Quotient with torsion of 3-d lattice N
|
|
228
|
+
by Sublattice <N(1, 2, 3), N(0, 4, 8)>
|
|
229
|
+
sage: is_ToricLatticeQuotient(Q)
|
|
230
|
+
True
|
|
231
|
+
"""
|
|
232
|
+
from sage.misc.superseded import deprecation
|
|
233
|
+
deprecation(38126,
|
|
234
|
+
"The function is_ToricLatticeQuotient is deprecated; "
|
|
235
|
+
"use 'isinstance(..., ToricLattice_quotient)' instead.")
|
|
236
|
+
return isinstance(x, ToricLattice_quotient)
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
class ToricLatticeFactory(UniqueFactory):
|
|
240
|
+
r"""
|
|
241
|
+
Create a lattice for toric geometry objects.
|
|
242
|
+
|
|
243
|
+
INPUT:
|
|
244
|
+
|
|
245
|
+
- ``rank`` -- nonnegative integer; the only mandatory parameter
|
|
246
|
+
|
|
247
|
+
- ``name`` -- string
|
|
248
|
+
|
|
249
|
+
- ``dual_name`` -- string
|
|
250
|
+
|
|
251
|
+
- ``latex_name`` -- string
|
|
252
|
+
|
|
253
|
+
- ``latex_dual_name`` -- string
|
|
254
|
+
|
|
255
|
+
OUTPUT: lattice
|
|
256
|
+
|
|
257
|
+
A toric lattice is uniquely determined by its rank and associated names.
|
|
258
|
+
There are four such "associated names" whose meaning should be clear from
|
|
259
|
+
the names of the corresponding parameters, but the choice of default
|
|
260
|
+
values is a little bit involved. So here is the full description of the
|
|
261
|
+
"naming algorithm":
|
|
262
|
+
|
|
263
|
+
#. If no names were given at all, then this lattice will be called "N" and
|
|
264
|
+
the dual one "M". These are the standard choices in toric geometry.
|
|
265
|
+
|
|
266
|
+
#. If ``name`` was given and ``dual_name`` was not, then ``dual_name``
|
|
267
|
+
will be ``name`` followed by "*".
|
|
268
|
+
|
|
269
|
+
#. If LaTeX names were not given, they will coincide with the "usual"
|
|
270
|
+
names, but if ``dual_name`` was constructed automatically, the trailing
|
|
271
|
+
star will be typeset as a superscript.
|
|
272
|
+
|
|
273
|
+
EXAMPLES:
|
|
274
|
+
|
|
275
|
+
Let's start with no names at all and see how automatic names are given::
|
|
276
|
+
|
|
277
|
+
sage: L1 = ToricLattice(3)
|
|
278
|
+
sage: L1
|
|
279
|
+
3-d lattice N
|
|
280
|
+
sage: L1.dual()
|
|
281
|
+
3-d lattice M
|
|
282
|
+
|
|
283
|
+
If we give the name "N" explicitly, the dual lattice will be called "N*"::
|
|
284
|
+
|
|
285
|
+
sage: L2 = ToricLattice(3, "N")
|
|
286
|
+
sage: L2
|
|
287
|
+
3-d lattice N
|
|
288
|
+
sage: L2.dual()
|
|
289
|
+
3-d lattice N*
|
|
290
|
+
|
|
291
|
+
However, we can give an explicit name for it too::
|
|
292
|
+
|
|
293
|
+
sage: L3 = ToricLattice(3, "N", "M")
|
|
294
|
+
sage: L3
|
|
295
|
+
3-d lattice N
|
|
296
|
+
sage: L3.dual()
|
|
297
|
+
3-d lattice M
|
|
298
|
+
|
|
299
|
+
If you want, you may also give explicit LaTeX names::
|
|
300
|
+
|
|
301
|
+
sage: L4 = ToricLattice(3, "N", "M", r"\mathbb{N}", r"\mathbb{M}")
|
|
302
|
+
sage: latex(L4)
|
|
303
|
+
\mathbb{N}
|
|
304
|
+
sage: latex(L4.dual())
|
|
305
|
+
\mathbb{M}
|
|
306
|
+
|
|
307
|
+
While all four lattices above are called "N", only two of them are equal
|
|
308
|
+
(and are actually the same)::
|
|
309
|
+
|
|
310
|
+
sage: L1 == L2
|
|
311
|
+
False
|
|
312
|
+
sage: L1 == L3
|
|
313
|
+
True
|
|
314
|
+
sage: L1 is L3
|
|
315
|
+
True
|
|
316
|
+
sage: L1 == L4
|
|
317
|
+
False
|
|
318
|
+
|
|
319
|
+
The reason for this is that ``L2`` and ``L4`` have different names either
|
|
320
|
+
for dual lattices or for LaTeX typesetting.
|
|
321
|
+
"""
|
|
322
|
+
|
|
323
|
+
def create_key(self, rank, name=None, dual_name=None,
|
|
324
|
+
latex_name=None, latex_dual_name=None):
|
|
325
|
+
"""
|
|
326
|
+
Create a key that uniquely identifies this toric lattice.
|
|
327
|
+
|
|
328
|
+
See :class:`ToricLattice <ToricLatticeFactory>` for documentation.
|
|
329
|
+
|
|
330
|
+
.. WARNING::
|
|
331
|
+
|
|
332
|
+
You probably should not use this function directly.
|
|
333
|
+
|
|
334
|
+
TESTS::
|
|
335
|
+
|
|
336
|
+
sage: ToricLattice.create_key(3)
|
|
337
|
+
(3, 'N', 'M', 'N', 'M')
|
|
338
|
+
sage: N = ToricLattice(3)
|
|
339
|
+
sage: loads(dumps(N)) is N
|
|
340
|
+
True
|
|
341
|
+
sage: TestSuite(N).run()
|
|
342
|
+
"""
|
|
343
|
+
rank = int(rank)
|
|
344
|
+
# Should we use standard M and N lattices?
|
|
345
|
+
if name is None:
|
|
346
|
+
if dual_name is not None:
|
|
347
|
+
raise ValueError("you can name the dual lattice only if you "
|
|
348
|
+
"also name the original one!")
|
|
349
|
+
name = "N"
|
|
350
|
+
dual_name = "M"
|
|
351
|
+
if latex_name is None:
|
|
352
|
+
latex_name = name
|
|
353
|
+
# Now name and latex_name are set
|
|
354
|
+
# The default for latex_dual_name depends on whether dual_name was
|
|
355
|
+
# given or constructed, so we determine it before dual_name
|
|
356
|
+
if latex_dual_name is None:
|
|
357
|
+
latex_dual_name = (dual_name if dual_name is not None
|
|
358
|
+
else latex_name + "^*")
|
|
359
|
+
if dual_name is None:
|
|
360
|
+
dual_name = name + "*"
|
|
361
|
+
return (rank, name, dual_name, latex_name, latex_dual_name)
|
|
362
|
+
|
|
363
|
+
def create_object(self, version, key):
|
|
364
|
+
r"""
|
|
365
|
+
Create the toric lattice described by ``key``.
|
|
366
|
+
|
|
367
|
+
See :class:`ToricLattice <ToricLatticeFactory>` for documentation.
|
|
368
|
+
|
|
369
|
+
.. WARNING::
|
|
370
|
+
|
|
371
|
+
You probably should not use this function directly.
|
|
372
|
+
|
|
373
|
+
TESTS::
|
|
374
|
+
|
|
375
|
+
sage: key = ToricLattice.create_key(3)
|
|
376
|
+
sage: ToricLattice.create_object(1, key)
|
|
377
|
+
3-d lattice N
|
|
378
|
+
"""
|
|
379
|
+
return ToricLattice_ambient(*key)
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
ToricLattice = ToricLatticeFactory("ToricLattice")
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
# Possible TODO's:
|
|
386
|
+
# - implement a better construction() method, which still will prohibit
|
|
387
|
+
# operations mixing lattices by conversion to ZZ^n
|
|
388
|
+
# - maybe __call__ is not the right place to prohibit conversion between
|
|
389
|
+
# lattices (we need it now so that morphisms behave nicely)
|
|
390
|
+
class ToricLattice_generic(FreeModule_generic_pid):
|
|
391
|
+
r"""
|
|
392
|
+
Abstract base class for toric lattices.
|
|
393
|
+
"""
|
|
394
|
+
|
|
395
|
+
Element = ToricLatticeElement
|
|
396
|
+
|
|
397
|
+
# It is not recommended to override __call__ in Parent-derived objects
|
|
398
|
+
# since it may interfere with the coercion model. We do it here to allow
|
|
399
|
+
# N(1,2,3) to be interpreted as N([1,2,3]). We also prohibit N(m) where
|
|
400
|
+
# m is an element of another lattice. Otherwise morphisms will care only
|
|
401
|
+
# about dimension of lattices.
|
|
402
|
+
def __call__(self, *args, **kwds):
|
|
403
|
+
r"""
|
|
404
|
+
Construct a new element of ``self``.
|
|
405
|
+
|
|
406
|
+
INPUT:
|
|
407
|
+
|
|
408
|
+
- anything that can be interpreted as coordinates, except for elements
|
|
409
|
+
of other lattices.
|
|
410
|
+
|
|
411
|
+
OUTPUT: :class:`~sage.geometry.toric_lattice_element.ToricLatticeElement`
|
|
412
|
+
|
|
413
|
+
TESTS::
|
|
414
|
+
|
|
415
|
+
sage: N = ToricLattice(3)
|
|
416
|
+
sage: N.__call__([1,2,3])
|
|
417
|
+
N(1, 2, 3)
|
|
418
|
+
sage: N([1,2,3]) # indirect test
|
|
419
|
+
N(1, 2, 3)
|
|
420
|
+
|
|
421
|
+
The point of overriding this function was to allow writing the above
|
|
422
|
+
command as::
|
|
423
|
+
|
|
424
|
+
sage: N(1,2,3)
|
|
425
|
+
N(1, 2, 3)
|
|
426
|
+
|
|
427
|
+
We also test that the special treatment of zero still works::
|
|
428
|
+
|
|
429
|
+
sage: N(0)
|
|
430
|
+
N(0, 0, 0)
|
|
431
|
+
|
|
432
|
+
Quotients of toric lattices can be converted to a new toric
|
|
433
|
+
lattice of the appropriate dimension::
|
|
434
|
+
|
|
435
|
+
sage: N3 = ToricLattice(3, 'N3')
|
|
436
|
+
sage: Q = N3 / N3.span([ N3(1,2,3) ])
|
|
437
|
+
sage: Q.an_element() # needs sage.libs.pari
|
|
438
|
+
N3[1, 0, 0]
|
|
439
|
+
sage: N2 = ToricLattice(2, 'N2')
|
|
440
|
+
sage: N2( Q.an_element() ) # needs sage.libs.pari
|
|
441
|
+
N2(1, 0)
|
|
442
|
+
"""
|
|
443
|
+
supercall = super().__call__
|
|
444
|
+
if args == (0, ):
|
|
445
|
+
# Special treatment for N(0) to return (0,...,0)
|
|
446
|
+
return supercall(*args, **kwds)
|
|
447
|
+
|
|
448
|
+
if (isinstance(args[0], ToricLattice_quotient_element)
|
|
449
|
+
and args[0].parent().is_torsion_free()):
|
|
450
|
+
# convert a torsion free quotient lattice
|
|
451
|
+
return supercall(list(args[0]), **kwds)
|
|
452
|
+
|
|
453
|
+
try:
|
|
454
|
+
coordinates = [ZZ(_) for _ in args]
|
|
455
|
+
except TypeError:
|
|
456
|
+
# Prohibit conversion of elements of other lattices
|
|
457
|
+
if (isinstance(args[0], ToricLatticeElement)
|
|
458
|
+
and args[0].parent().ambient_module()
|
|
459
|
+
is not self.ambient_module()):
|
|
460
|
+
raise TypeError("%s cannot be converted to %s!"
|
|
461
|
+
% (args[0], self))
|
|
462
|
+
# "Standard call"
|
|
463
|
+
return supercall(*args, **kwds)
|
|
464
|
+
# Coordinates were given without packing them into a list or a tuple
|
|
465
|
+
return supercall(coordinates, **kwds)
|
|
466
|
+
|
|
467
|
+
def _coerce_map_from_(self, other):
|
|
468
|
+
"""
|
|
469
|
+
Return a coercion map from ``other`` to ``self``, or None.
|
|
470
|
+
|
|
471
|
+
This prevents the construction of coercion maps between
|
|
472
|
+
lattices with different ambient modules, so :meth:`__call__`
|
|
473
|
+
is invoked instead, which prohibits conversion::
|
|
474
|
+
|
|
475
|
+
sage: N = ToricLattice(3)
|
|
476
|
+
sage: M = N.dual()
|
|
477
|
+
sage: M(N(1,2,3))
|
|
478
|
+
Traceback (most recent call last):
|
|
479
|
+
...
|
|
480
|
+
TypeError: N(1, 2, 3) cannot be converted to 3-d lattice M!
|
|
481
|
+
"""
|
|
482
|
+
if (isinstance(other, ToricLattice_generic) and
|
|
483
|
+
other.ambient_module() is not self.ambient_module()):
|
|
484
|
+
return None
|
|
485
|
+
return super()._convert_map_from_(other)
|
|
486
|
+
|
|
487
|
+
def __contains__(self, point):
|
|
488
|
+
r"""
|
|
489
|
+
Check if ``point`` is an element of ``self``.
|
|
490
|
+
|
|
491
|
+
INPUT:
|
|
492
|
+
|
|
493
|
+
- ``point`` -- anything
|
|
494
|
+
|
|
495
|
+
OUTPUT: ``True`` if ``point`` is an element of ``self``, ``False``
|
|
496
|
+
otherwise
|
|
497
|
+
|
|
498
|
+
TESTS::
|
|
499
|
+
|
|
500
|
+
sage: N = ToricLattice(3)
|
|
501
|
+
sage: M = N.dual()
|
|
502
|
+
sage: L = ToricLattice(3, "L")
|
|
503
|
+
sage: 1 in N
|
|
504
|
+
False
|
|
505
|
+
sage: (1,0) in N
|
|
506
|
+
False
|
|
507
|
+
sage: (1,0,0) in N
|
|
508
|
+
True
|
|
509
|
+
sage: N(1,0,0) in N
|
|
510
|
+
True
|
|
511
|
+
sage: M(1,0,0) in N
|
|
512
|
+
False
|
|
513
|
+
sage: L(1,0,0) in N
|
|
514
|
+
False
|
|
515
|
+
sage: (1/2,0,0) in N
|
|
516
|
+
False
|
|
517
|
+
sage: (2/2,0,0) in N
|
|
518
|
+
True
|
|
519
|
+
"""
|
|
520
|
+
try:
|
|
521
|
+
self(point)
|
|
522
|
+
except TypeError:
|
|
523
|
+
return False
|
|
524
|
+
return True
|
|
525
|
+
|
|
526
|
+
# We need to override this function, otherwise e.g. the sum of elements of
|
|
527
|
+
# different lattices of the same dimension will live in ZZ^n.
|
|
528
|
+
def construction(self):
|
|
529
|
+
r"""
|
|
530
|
+
Return the functorial construction of ``self``.
|
|
531
|
+
|
|
532
|
+
OUTPUT:
|
|
533
|
+
|
|
534
|
+
``None``, we do not think of toric lattices as constructed from
|
|
535
|
+
simpler objects since we do not want to perform arithmetic involving
|
|
536
|
+
different lattices.
|
|
537
|
+
|
|
538
|
+
TESTS::
|
|
539
|
+
|
|
540
|
+
sage: print(ToricLattice(3).construction())
|
|
541
|
+
None
|
|
542
|
+
"""
|
|
543
|
+
return None
|
|
544
|
+
|
|
545
|
+
def direct_sum(self, other):
|
|
546
|
+
r"""
|
|
547
|
+
Return the direct sum with ``other``.
|
|
548
|
+
|
|
549
|
+
INPUT:
|
|
550
|
+
|
|
551
|
+
- ``other`` -- a toric lattice or more general module
|
|
552
|
+
|
|
553
|
+
OUTPUT:
|
|
554
|
+
|
|
555
|
+
The direct sum of ``self`` and ``other`` as `\ZZ`-modules. If
|
|
556
|
+
``other`` is a :class:`ToricLattice <ToricLatticeFactory>`,
|
|
557
|
+
another toric lattice will be returned.
|
|
558
|
+
|
|
559
|
+
EXAMPLES::
|
|
560
|
+
|
|
561
|
+
sage: K = ToricLattice(3, 'K')
|
|
562
|
+
sage: L = ToricLattice(3, 'L')
|
|
563
|
+
sage: N = K.direct_sum(L); N
|
|
564
|
+
6-d lattice K+L
|
|
565
|
+
sage: N, N.dual(), latex(N), latex(N.dual())
|
|
566
|
+
(6-d lattice K+L, 6-d lattice K*+L*, K \oplus L, K^* \oplus L^*)
|
|
567
|
+
|
|
568
|
+
With default names::
|
|
569
|
+
|
|
570
|
+
sage: N = ToricLattice(3).direct_sum(ToricLattice(2))
|
|
571
|
+
sage: N, N.dual(), latex(N), latex(N.dual())
|
|
572
|
+
(5-d lattice N+N, 5-d lattice M+M, N \oplus N, M \oplus M)
|
|
573
|
+
|
|
574
|
+
If ``other`` is not a :class:`ToricLattice
|
|
575
|
+
<ToricLatticeFactory>`, fall back to sum of modules::
|
|
576
|
+
|
|
577
|
+
sage: ToricLattice(3).direct_sum(ZZ^2)
|
|
578
|
+
Free module of degree 5 and rank 5 over Integer Ring
|
|
579
|
+
Echelon basis matrix:
|
|
580
|
+
[1 0 0 0 0]
|
|
581
|
+
[0 1 0 0 0]
|
|
582
|
+
[0 0 1 0 0]
|
|
583
|
+
[0 0 0 1 0]
|
|
584
|
+
[0 0 0 0 1]
|
|
585
|
+
"""
|
|
586
|
+
if not isinstance(other, ToricLattice_generic):
|
|
587
|
+
return super().direct_sum(other)
|
|
588
|
+
|
|
589
|
+
def make_name(N1, N2, use_latex=False):
|
|
590
|
+
if use_latex:
|
|
591
|
+
return latex(N1) + r' \oplus ' + latex(N2)
|
|
592
|
+
else:
|
|
593
|
+
return N1._name + '+' + N2._name
|
|
594
|
+
|
|
595
|
+
rank = self.rank() + other.rank()
|
|
596
|
+
name = make_name(self, other, False)
|
|
597
|
+
dual_name = make_name(self.dual(), other.dual(), False)
|
|
598
|
+
latex_name = make_name(self, other, True)
|
|
599
|
+
latex_dual_name = make_name(self.dual(), other.dual(), True)
|
|
600
|
+
return ToricLattice(rank, name, dual_name, latex_name, latex_dual_name)
|
|
601
|
+
|
|
602
|
+
def intersection(self, other):
|
|
603
|
+
r"""
|
|
604
|
+
Return the intersection of ``self`` and ``other``.
|
|
605
|
+
|
|
606
|
+
INPUT:
|
|
607
|
+
|
|
608
|
+
- ``other`` -- a toric (sub)lattice.dual
|
|
609
|
+
|
|
610
|
+
OUTPUT:
|
|
611
|
+
|
|
612
|
+
- a toric (sub)lattice.
|
|
613
|
+
|
|
614
|
+
EXAMPLES::
|
|
615
|
+
|
|
616
|
+
sage: N = ToricLattice(3)
|
|
617
|
+
sage: Ns1 = N.submodule([N(2,4,0), N(9,12,0)])
|
|
618
|
+
sage: Ns2 = N.submodule([N(1,4,9), N(9,2,0)])
|
|
619
|
+
sage: Ns1.intersection(Ns2)
|
|
620
|
+
Sublattice <N(54, 12, 0)>
|
|
621
|
+
|
|
622
|
+
Note that if one of the intersecting sublattices is a sublattice of
|
|
623
|
+
another, no new lattices will be constructed::
|
|
624
|
+
|
|
625
|
+
sage: N.intersection(N) is N
|
|
626
|
+
True
|
|
627
|
+
sage: Ns1.intersection(N) is Ns1
|
|
628
|
+
True
|
|
629
|
+
sage: N.intersection(Ns1) is Ns1
|
|
630
|
+
True
|
|
631
|
+
"""
|
|
632
|
+
# Lattice-specific input check
|
|
633
|
+
if not isinstance(other, ToricLattice_generic):
|
|
634
|
+
raise TypeError("%s is not a toric lattice!" % other)
|
|
635
|
+
if self.ambient_module() != other.ambient_module():
|
|
636
|
+
raise ValueError("%s and %s have different ambient lattices!" %
|
|
637
|
+
(self, other))
|
|
638
|
+
# Construct a generic intersection, but make sure to return a lattice.
|
|
639
|
+
I = super().intersection(other)
|
|
640
|
+
if not isinstance(I, ToricLattice_generic):
|
|
641
|
+
I = self.ambient_module().submodule(I.basis())
|
|
642
|
+
return I
|
|
643
|
+
|
|
644
|
+
def quotient(self, sub, check=True,
|
|
645
|
+
positive_point=None, positive_dual_point=None, **kwds):
|
|
646
|
+
"""
|
|
647
|
+
Return the quotient of ``self`` by the given sublattice ``sub``.
|
|
648
|
+
|
|
649
|
+
INPUT:
|
|
650
|
+
|
|
651
|
+
- ``sub`` -- sublattice of self
|
|
652
|
+
|
|
653
|
+
- ``check`` -- boolean (default: ``True``); whether or not to check that ``sub`` is
|
|
654
|
+
a valid sublattice
|
|
655
|
+
|
|
656
|
+
If the quotient is one-dimensional and torsion free, the
|
|
657
|
+
following two mutually exclusive keyword arguments are also
|
|
658
|
+
allowed. They decide the sign choice for the (single)
|
|
659
|
+
generator of the quotient lattice:
|
|
660
|
+
|
|
661
|
+
- ``positive_point`` -- a lattice point of ``self`` not in the
|
|
662
|
+
sublattice ``sub`` (that is, not zero in the quotient
|
|
663
|
+
lattice). The quotient generator will be in the same
|
|
664
|
+
direction as ``positive_point``.
|
|
665
|
+
|
|
666
|
+
- ``positive_dual_point`` -- a dual lattice point. The
|
|
667
|
+
quotient generator will be chosen such that its lift has a
|
|
668
|
+
positive product with ``positive_dual_point``. Note: if
|
|
669
|
+
``positive_dual_point`` is not zero on the sublattice
|
|
670
|
+
``sub``, then the notion of positivity will depend on the
|
|
671
|
+
choice of lift!
|
|
672
|
+
|
|
673
|
+
Further named arguments are passed to the constructor of a toric lattice
|
|
674
|
+
quotient.
|
|
675
|
+
|
|
676
|
+
EXAMPLES::
|
|
677
|
+
|
|
678
|
+
sage: N = ToricLattice(3)
|
|
679
|
+
sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
|
|
680
|
+
sage: Q = N/Ns
|
|
681
|
+
sage: Q # needs sage.libs.pari
|
|
682
|
+
Quotient with torsion of 3-d lattice N
|
|
683
|
+
by Sublattice <N(1, 8, 0), N(0, 12, 0)>
|
|
684
|
+
|
|
685
|
+
Attempting to quotient one lattice by a sublattice of another
|
|
686
|
+
will result in a :exc:`ValueError`::
|
|
687
|
+
|
|
688
|
+
sage: N = ToricLattice(3)
|
|
689
|
+
sage: M = ToricLattice(3, name='M')
|
|
690
|
+
sage: Ms = M.submodule([M(2,4,0), M(9,12,0)])
|
|
691
|
+
sage: N.quotient(Ms)
|
|
692
|
+
Traceback (most recent call last):
|
|
693
|
+
...
|
|
694
|
+
ValueError: M(1, 8, 0) cannot generate a sublattice of
|
|
695
|
+
3-d lattice N
|
|
696
|
+
|
|
697
|
+
However, if we forget the sublattice structure, then it is
|
|
698
|
+
possible to quotient by vector spaces or modules constructed
|
|
699
|
+
from any sublattice::
|
|
700
|
+
|
|
701
|
+
sage: N = ToricLattice(3)
|
|
702
|
+
sage: M = ToricLattice(3, name='M')
|
|
703
|
+
sage: Ms = M.submodule([M(2,4,0), M(9,12,0)])
|
|
704
|
+
sage: N.quotient(Ms.vector_space()) # needs sage.libs.pari
|
|
705
|
+
Quotient with torsion of 3-d lattice N by Sublattice
|
|
706
|
+
<N(1, 8, 0), N(0, 12, 0)>
|
|
707
|
+
sage: N.quotient(Ms.sparse_module()) # needs sage.libs.pari
|
|
708
|
+
Quotient with torsion of 3-d lattice N by Sublattice
|
|
709
|
+
<N(1, 8, 0), N(0, 12, 0)>
|
|
710
|
+
|
|
711
|
+
See :class:`ToricLattice_quotient` for more examples.
|
|
712
|
+
|
|
713
|
+
TESTS:
|
|
714
|
+
|
|
715
|
+
We check that :issue:`19603` is fixed::
|
|
716
|
+
|
|
717
|
+
sage: # needs sage.geometry.polyhedron
|
|
718
|
+
sage: K = Cone([(1,0,0),(0,1,0)])
|
|
719
|
+
sage: K.lattice()
|
|
720
|
+
3-d lattice N
|
|
721
|
+
sage: K.orthogonal_sublattice()
|
|
722
|
+
Sublattice <M(0, 0, 1)>
|
|
723
|
+
sage: K.lattice().quotient(K.orthogonal_sublattice())
|
|
724
|
+
Traceback (most recent call last):
|
|
725
|
+
...
|
|
726
|
+
ValueError: M(0, 0, 1) cannot generate a sublattice of
|
|
727
|
+
3-d lattice N
|
|
728
|
+
|
|
729
|
+
We can quotient by the trivial sublattice::
|
|
730
|
+
|
|
731
|
+
sage: N = ToricLattice(3)
|
|
732
|
+
sage: N.quotient(N.zero_submodule()) # needs sage.libs.pari
|
|
733
|
+
3-d lattice, quotient of 3-d lattice N by Sublattice <>
|
|
734
|
+
|
|
735
|
+
We can quotient a lattice by itself::
|
|
736
|
+
|
|
737
|
+
sage: N = ToricLattice(3)
|
|
738
|
+
sage: N.quotient(N) # needs sage.libs.pari
|
|
739
|
+
0-d lattice, quotient of 3-d lattice N by Sublattice
|
|
740
|
+
<N(1, 0, 0), N(0, 1, 0), N(0, 0, 1)>
|
|
741
|
+
"""
|
|
742
|
+
return ToricLattice_quotient(self, sub, check,
|
|
743
|
+
positive_point, positive_dual_point, **kwds)
|
|
744
|
+
|
|
745
|
+
def saturation(self):
|
|
746
|
+
r"""
|
|
747
|
+
Return the saturation of ``self``.
|
|
748
|
+
|
|
749
|
+
OUTPUT: a :class:`toric lattice <ToricLatticeFactory>`
|
|
750
|
+
|
|
751
|
+
EXAMPLES::
|
|
752
|
+
|
|
753
|
+
sage: N = ToricLattice(3)
|
|
754
|
+
sage: Ns = N.submodule([(1,2,3), (4,5,6)])
|
|
755
|
+
sage: Ns
|
|
756
|
+
Sublattice <N(1, 2, 3), N(0, 3, 6)>
|
|
757
|
+
sage: Ns_sat = Ns.saturation()
|
|
758
|
+
sage: Ns_sat
|
|
759
|
+
Sublattice <N(1, 0, -1), N(0, 1, 2)>
|
|
760
|
+
sage: Ns_sat is Ns_sat.saturation()
|
|
761
|
+
True
|
|
762
|
+
"""
|
|
763
|
+
S = super().saturation()
|
|
764
|
+
return S if isinstance(S, ToricLattice_generic) else self.ambient_module().submodule(S)
|
|
765
|
+
|
|
766
|
+
def span(self, gens, base_ring=ZZ, *args, **kwds):
|
|
767
|
+
r"""
|
|
768
|
+
Return the span of the given generators.
|
|
769
|
+
|
|
770
|
+
INPUT:
|
|
771
|
+
|
|
772
|
+
- ``gens`` -- list of elements of the ambient vector space of
|
|
773
|
+
``self``
|
|
774
|
+
|
|
775
|
+
- ``base_ring`` -- (default: `\ZZ`) base ring for the generated module
|
|
776
|
+
|
|
777
|
+
OUTPUT: submodule spanned by ``gens``
|
|
778
|
+
|
|
779
|
+
.. NOTE::
|
|
780
|
+
|
|
781
|
+
The output need not be a submodule of ``self``, nor even of the
|
|
782
|
+
ambient space. It must, however, be contained in the ambient
|
|
783
|
+
vector space.
|
|
784
|
+
|
|
785
|
+
See also :meth:`span_of_basis`,
|
|
786
|
+
:meth:`~sage.modules.free_module.FreeModule_generic_pid.submodule`,
|
|
787
|
+
and
|
|
788
|
+
:meth:`~sage.modules.free_module.FreeModule_generic_pid.submodule_with_basis`,
|
|
789
|
+
|
|
790
|
+
EXAMPLES::
|
|
791
|
+
|
|
792
|
+
sage: N = ToricLattice(3)
|
|
793
|
+
sage: Ns = N.submodule([N.gen(0)])
|
|
794
|
+
sage: Ns.span([N.gen(1)])
|
|
795
|
+
Sublattice <N(0, 1, 0)>
|
|
796
|
+
sage: Ns.submodule([N.gen(1)])
|
|
797
|
+
Traceback (most recent call last):
|
|
798
|
+
...
|
|
799
|
+
ArithmeticError: argument gens (= [N(0, 1, 0)]) does not generate a submodule of self
|
|
800
|
+
"""
|
|
801
|
+
A = self.ambient_module()
|
|
802
|
+
if base_ring is ZZ and all(g in A for g in gens):
|
|
803
|
+
return ToricLattice_sublattice(A, gens)
|
|
804
|
+
for g in gens:
|
|
805
|
+
if isinstance(g, ToricLatticeElement) and g not in A:
|
|
806
|
+
raise ValueError("%s cannot generate a sublattice of %s"
|
|
807
|
+
% (g, A))
|
|
808
|
+
return super().span(gens, base_ring, *args, **kwds)
|
|
809
|
+
|
|
810
|
+
def span_of_basis(self, basis, base_ring=ZZ, *args, **kwds):
|
|
811
|
+
r"""
|
|
812
|
+
Return the submodule with the given ``basis``.
|
|
813
|
+
|
|
814
|
+
INPUT:
|
|
815
|
+
|
|
816
|
+
- ``basis`` -- list of elements of the ambient vector space of
|
|
817
|
+
``self``
|
|
818
|
+
|
|
819
|
+
- ``base_ring`` -- (default: `\ZZ`) base ring for the generated module
|
|
820
|
+
|
|
821
|
+
OUTPUT: submodule spanned by ``basis``
|
|
822
|
+
|
|
823
|
+
.. NOTE::
|
|
824
|
+
|
|
825
|
+
The output need not be a submodule of ``self``, nor even of the
|
|
826
|
+
ambient space. It must, however, be contained in the ambient
|
|
827
|
+
vector space.
|
|
828
|
+
|
|
829
|
+
See also :meth:`span`,
|
|
830
|
+
:meth:`~sage.modules.free_module.FreeModule_generic_pid.submodule`,
|
|
831
|
+
and
|
|
832
|
+
:meth:`~sage.modules.free_module.FreeModule_generic_pid.submodule_with_basis`,
|
|
833
|
+
|
|
834
|
+
EXAMPLES::
|
|
835
|
+
|
|
836
|
+
sage: N = ToricLattice(3)
|
|
837
|
+
sage: Ns = N.span_of_basis([(1,2,3)])
|
|
838
|
+
sage: Ns.span_of_basis([(2,4,0)])
|
|
839
|
+
Sublattice <N(2, 4, 0)>
|
|
840
|
+
sage: Ns.span_of_basis([(1/5,2/5,0), (1/7,1/7,0)])
|
|
841
|
+
Free module of degree 3 and rank 2 over Integer Ring
|
|
842
|
+
User basis matrix:
|
|
843
|
+
[1/5 2/5 0]
|
|
844
|
+
[1/7 1/7 0]
|
|
845
|
+
|
|
846
|
+
Of course the input basis vectors must be linearly independent::
|
|
847
|
+
|
|
848
|
+
sage: Ns.span_of_basis([(1,2,0), (2,4,0)])
|
|
849
|
+
Traceback (most recent call last):
|
|
850
|
+
...
|
|
851
|
+
ValueError: The given basis vectors must be linearly independent.
|
|
852
|
+
"""
|
|
853
|
+
A = self.ambient_module()
|
|
854
|
+
if base_ring is ZZ and all(g in A for g in basis):
|
|
855
|
+
return ToricLattice_sublattice_with_basis(A, basis)
|
|
856
|
+
for g in basis:
|
|
857
|
+
if isinstance(g, ToricLatticeElement) and g not in A:
|
|
858
|
+
raise ValueError("%s cannot generate a sublattice of %s"
|
|
859
|
+
% (g, A))
|
|
860
|
+
return super().span_of_basis(basis, base_ring, *args, **kwds)
|
|
861
|
+
|
|
862
|
+
|
|
863
|
+
@richcmp_method
|
|
864
|
+
class ToricLattice_ambient(ToricLattice_generic, FreeModule_ambient_pid):
|
|
865
|
+
r"""
|
|
866
|
+
Create a toric lattice.
|
|
867
|
+
|
|
868
|
+
See :class:`ToricLattice <ToricLatticeFactory>` for documentation.
|
|
869
|
+
|
|
870
|
+
.. WARNING::
|
|
871
|
+
|
|
872
|
+
There should be only one toric lattice with the given rank and
|
|
873
|
+
associated names. Using this class directly to create toric lattices
|
|
874
|
+
may lead to unexpected results. Please, use :class:`ToricLattice
|
|
875
|
+
<ToricLatticeFactory>` to create toric lattices.
|
|
876
|
+
|
|
877
|
+
TESTS::
|
|
878
|
+
|
|
879
|
+
sage: N = ToricLattice(3, "N", "M", "N", "M")
|
|
880
|
+
sage: N
|
|
881
|
+
3-d lattice N
|
|
882
|
+
sage: TestSuite(N).run()
|
|
883
|
+
"""
|
|
884
|
+
|
|
885
|
+
Element = ToricLatticeElement
|
|
886
|
+
|
|
887
|
+
def __init__(self, rank, name, dual_name, latex_name, latex_dual_name):
|
|
888
|
+
r"""
|
|
889
|
+
See :class:`ToricLattice <ToricLatticeFactory>` for documentation.
|
|
890
|
+
|
|
891
|
+
TESTS::
|
|
892
|
+
|
|
893
|
+
sage: ToricLattice(3, "N", "M", "N", "M")
|
|
894
|
+
3-d lattice N
|
|
895
|
+
"""
|
|
896
|
+
super().__init__(ZZ, rank)
|
|
897
|
+
self._name = name
|
|
898
|
+
self._dual_name = dual_name
|
|
899
|
+
self._latex_name = latex_name
|
|
900
|
+
self._latex_dual_name = latex_dual_name
|
|
901
|
+
|
|
902
|
+
def _sage_input_(self, sib, coerced):
|
|
903
|
+
r"""
|
|
904
|
+
Return Sage command to reconstruct ``self``.
|
|
905
|
+
|
|
906
|
+
See :mod:`sage.misc.sage_input` for details.
|
|
907
|
+
|
|
908
|
+
EXAMPLES::
|
|
909
|
+
|
|
910
|
+
sage: N = ToricLattice(3, "N", "M", "N", "M")
|
|
911
|
+
sage: sage_input(N, verify=True)
|
|
912
|
+
# Verified
|
|
913
|
+
ToricLattice(3, 'N', 'M')
|
|
914
|
+
|
|
915
|
+
sage: N = ToricLattice(3, "N")
|
|
916
|
+
sage: sage_input(N, verify=True)
|
|
917
|
+
# Verified
|
|
918
|
+
ToricLattice(3, 'N', 'N*', 'N', 'N^*')
|
|
919
|
+
"""
|
|
920
|
+
args = [self.rank(), self._name, self._dual_name]
|
|
921
|
+
if self._latex_name != self._name or self._latex_dual_name != self._dual_name:
|
|
922
|
+
args.extend([self._latex_name, self._latex_dual_name])
|
|
923
|
+
return sib.name('ToricLattice')(*args)
|
|
924
|
+
|
|
925
|
+
def __richcmp__(self, right, op):
|
|
926
|
+
r"""
|
|
927
|
+
Compare ``self`` and ``right``.
|
|
928
|
+
|
|
929
|
+
INPUT:
|
|
930
|
+
|
|
931
|
+
- ``right`` -- anything
|
|
932
|
+
|
|
933
|
+
OUTPUT: boolean
|
|
934
|
+
|
|
935
|
+
There is equality if ``right`` is a toric lattice of the same
|
|
936
|
+
dimension as ``self`` and their associated names are the
|
|
937
|
+
same.
|
|
938
|
+
|
|
939
|
+
TESTS::
|
|
940
|
+
|
|
941
|
+
sage: N3 = ToricLattice(3)
|
|
942
|
+
sage: N4 = ToricLattice(4)
|
|
943
|
+
sage: M3 = N3.dual()
|
|
944
|
+
sage: N3 < N4
|
|
945
|
+
True
|
|
946
|
+
sage: N3 > M3
|
|
947
|
+
True
|
|
948
|
+
sage: N3 == ToricLattice(3)
|
|
949
|
+
True
|
|
950
|
+
"""
|
|
951
|
+
if self is right:
|
|
952
|
+
return rich_to_bool(op, 0)
|
|
953
|
+
if type(self) is not type(right):
|
|
954
|
+
return NotImplemented
|
|
955
|
+
|
|
956
|
+
lx = self.rank()
|
|
957
|
+
rx = right.rank()
|
|
958
|
+
if lx != rx:
|
|
959
|
+
return richcmp_not_equal(lx, rx, op)
|
|
960
|
+
# If lattices are the same as ZZ-modules, compare associated names
|
|
961
|
+
return richcmp([self._name, self._dual_name,
|
|
962
|
+
self._latex_name, self._latex_dual_name],
|
|
963
|
+
[right._name, right._dual_name,
|
|
964
|
+
right._latex_name, right._latex_dual_name], op)
|
|
965
|
+
|
|
966
|
+
def _latex_(self):
|
|
967
|
+
r"""
|
|
968
|
+
Return a LaTeX representation of ``self``.
|
|
969
|
+
|
|
970
|
+
OUTPUT: string
|
|
971
|
+
|
|
972
|
+
TESTS::
|
|
973
|
+
|
|
974
|
+
sage: L = ToricLattice(3, "L")
|
|
975
|
+
sage: L.dual()._latex_()
|
|
976
|
+
'L^*'
|
|
977
|
+
"""
|
|
978
|
+
return self._latex_name
|
|
979
|
+
|
|
980
|
+
def _repr_(self):
|
|
981
|
+
r"""
|
|
982
|
+
Return a string representation of ``self``.
|
|
983
|
+
|
|
984
|
+
OUTPUT: string
|
|
985
|
+
|
|
986
|
+
TESTS::
|
|
987
|
+
|
|
988
|
+
sage: L = ToricLattice(3, "L")
|
|
989
|
+
sage: L.dual()._repr_()
|
|
990
|
+
'3-d lattice L*'
|
|
991
|
+
"""
|
|
992
|
+
return "%d-d lattice %s" % (self.dimension(), self._name)
|
|
993
|
+
|
|
994
|
+
def ambient_module(self):
|
|
995
|
+
r"""
|
|
996
|
+
Return the ambient module of ``self``.
|
|
997
|
+
|
|
998
|
+
OUTPUT: :class:`toric lattice <ToricLatticeFactory>`
|
|
999
|
+
|
|
1000
|
+
.. NOTE::
|
|
1001
|
+
|
|
1002
|
+
For any ambient toric lattice its ambient module is the lattice
|
|
1003
|
+
itself.
|
|
1004
|
+
|
|
1005
|
+
EXAMPLES::
|
|
1006
|
+
|
|
1007
|
+
sage: N = ToricLattice(3)
|
|
1008
|
+
sage: N.ambient_module()
|
|
1009
|
+
3-d lattice N
|
|
1010
|
+
sage: N.ambient_module() is N
|
|
1011
|
+
True
|
|
1012
|
+
"""
|
|
1013
|
+
return self
|
|
1014
|
+
|
|
1015
|
+
def dual(self):
|
|
1016
|
+
r"""
|
|
1017
|
+
Return the lattice dual to ``self``.
|
|
1018
|
+
|
|
1019
|
+
OUTPUT: :class:`toric lattice <ToricLatticeFactory>`
|
|
1020
|
+
|
|
1021
|
+
EXAMPLES::
|
|
1022
|
+
|
|
1023
|
+
sage: N = ToricLattice(3)
|
|
1024
|
+
sage: N
|
|
1025
|
+
3-d lattice N
|
|
1026
|
+
sage: M = N.dual()
|
|
1027
|
+
sage: M
|
|
1028
|
+
3-d lattice M
|
|
1029
|
+
sage: M.dual() is N
|
|
1030
|
+
True
|
|
1031
|
+
|
|
1032
|
+
Elements of dual lattices can act on each other::
|
|
1033
|
+
|
|
1034
|
+
sage: n = N(1,2,3)
|
|
1035
|
+
sage: m = M(4,5,6)
|
|
1036
|
+
sage: n * m
|
|
1037
|
+
32
|
|
1038
|
+
sage: m * n
|
|
1039
|
+
32
|
|
1040
|
+
"""
|
|
1041
|
+
if "_dual" not in self.__dict__:
|
|
1042
|
+
self._dual = ToricLattice(self.rank(), self._dual_name,
|
|
1043
|
+
self._name, self._latex_dual_name, self._latex_name)
|
|
1044
|
+
return self._dual
|
|
1045
|
+
|
|
1046
|
+
def plot(self, **options):
|
|
1047
|
+
r"""
|
|
1048
|
+
Plot ``self``.
|
|
1049
|
+
|
|
1050
|
+
INPUT:
|
|
1051
|
+
|
|
1052
|
+
- any options for toric plots (see :func:`toric_plotter.options
|
|
1053
|
+
<sage.geometry.toric_plotter.options>`), none are mandatory.
|
|
1054
|
+
|
|
1055
|
+
OUTPUT: a plot
|
|
1056
|
+
|
|
1057
|
+
EXAMPLES::
|
|
1058
|
+
|
|
1059
|
+
sage: N = ToricLattice(3)
|
|
1060
|
+
sage: N.plot() # needs sage.geometry.polyhedron sage.plot
|
|
1061
|
+
Graphics3d Object
|
|
1062
|
+
"""
|
|
1063
|
+
if "show_lattice" not in options:
|
|
1064
|
+
# Unless user made an explicit decision, we assume that lattice
|
|
1065
|
+
# should be visible no matter what is the size of the bounding box.
|
|
1066
|
+
options["show_lattice"] = True
|
|
1067
|
+
tp = ToricPlotter(options, self.degree())
|
|
1068
|
+
tp.adjust_options()
|
|
1069
|
+
return tp.plot_lattice()
|
|
1070
|
+
|
|
1071
|
+
|
|
1072
|
+
class ToricLattice_sublattice_with_basis(ToricLattice_generic,
|
|
1073
|
+
FreeModule_submodule_with_basis_pid):
|
|
1074
|
+
r"""
|
|
1075
|
+
Construct the sublattice of ``ambient`` toric lattice with given ``basis``.
|
|
1076
|
+
|
|
1077
|
+
INPUT (same as for
|
|
1078
|
+
:class:`~sage.modules.free_module.FreeModule_submodule_with_basis_pid`):
|
|
1079
|
+
|
|
1080
|
+
- ``ambient`` -- ambient :class:`toric lattice <ToricLatticeFactory>` for
|
|
1081
|
+
this sublattice
|
|
1082
|
+
|
|
1083
|
+
- ``basis`` -- list of linearly independent elements of ``ambient``, these
|
|
1084
|
+
elements will be used as the default basis of the constructed
|
|
1085
|
+
sublattice
|
|
1086
|
+
|
|
1087
|
+
- see the base class for other available options
|
|
1088
|
+
|
|
1089
|
+
OUTPUT: sublattice of a toric lattice with a user-specified basis
|
|
1090
|
+
|
|
1091
|
+
See also :class:`ToricLattice_sublattice` if you do not want to specify an
|
|
1092
|
+
explicit basis.
|
|
1093
|
+
|
|
1094
|
+
EXAMPLES:
|
|
1095
|
+
|
|
1096
|
+
The intended way to get objects of this class is to use
|
|
1097
|
+
:meth:`submodule_with_basis` method of toric lattices::
|
|
1098
|
+
|
|
1099
|
+
sage: N = ToricLattice(3)
|
|
1100
|
+
sage: sublattice = N.submodule_with_basis([(1,1,0), (3,2,1)])
|
|
1101
|
+
sage: sublattice.has_user_basis()
|
|
1102
|
+
True
|
|
1103
|
+
sage: sublattice.basis()
|
|
1104
|
+
[N(1, 1, 0), N(3, 2, 1)]
|
|
1105
|
+
|
|
1106
|
+
Even if you have provided your own basis, you still can access the
|
|
1107
|
+
"standard" one::
|
|
1108
|
+
|
|
1109
|
+
sage: sublattice.echelonized_basis()
|
|
1110
|
+
[N(1, 0, 1), N(0, 1, -1)]
|
|
1111
|
+
"""
|
|
1112
|
+
|
|
1113
|
+
def _repr_(self):
|
|
1114
|
+
r"""
|
|
1115
|
+
Return a string representation of ``self``.
|
|
1116
|
+
|
|
1117
|
+
OUTPUT: string
|
|
1118
|
+
|
|
1119
|
+
TESTS::
|
|
1120
|
+
|
|
1121
|
+
sage: L = ToricLattice(3, "L")
|
|
1122
|
+
sage: L.submodule_with_basis([(3,2,1),(1,2,3)])
|
|
1123
|
+
Sublattice <L(3, 2, 1), L(1, 2, 3)>
|
|
1124
|
+
sage: print(L.submodule([(3,2,1),(1,2,3)])._repr_())
|
|
1125
|
+
Sublattice <L(1, 2, 3), L(0, 4, 8)>
|
|
1126
|
+
"""
|
|
1127
|
+
s = 'Sublattice '
|
|
1128
|
+
s += '<'
|
|
1129
|
+
s += ', '.join(map(str, self.basis()))
|
|
1130
|
+
s += '>'
|
|
1131
|
+
return s
|
|
1132
|
+
|
|
1133
|
+
def _latex_(self):
|
|
1134
|
+
r"""
|
|
1135
|
+
Return a LaTeX representation of ``self``.
|
|
1136
|
+
|
|
1137
|
+
OUTPUT: string
|
|
1138
|
+
|
|
1139
|
+
TESTS::
|
|
1140
|
+
|
|
1141
|
+
sage: L = ToricLattice(3, "L")
|
|
1142
|
+
sage: L.submodule_with_basis([(3,2,1),(1,2,3)])._latex_()
|
|
1143
|
+
'\\left\\langle\\left(3,\\,2,\\,1\\right)_{L},
|
|
1144
|
+
\\left(1,\\,2,\\,3\\right)_{L}\\right\\rangle'
|
|
1145
|
+
sage: L.submodule([(3,2,1),(1,2,3)])._latex_()
|
|
1146
|
+
'\\left\\langle\\left(1,\\,2,\\,3\\right)_{L},
|
|
1147
|
+
\\left(0,\\,4,\\,8\\right)_{L}\\right\\rangle'
|
|
1148
|
+
"""
|
|
1149
|
+
s = '\\left\\langle'
|
|
1150
|
+
s += ', '.join(b._latex_() for b in self.basis())
|
|
1151
|
+
s += '\\right\\rangle'
|
|
1152
|
+
return s
|
|
1153
|
+
|
|
1154
|
+
def dual(self):
|
|
1155
|
+
r"""
|
|
1156
|
+
Return the lattice dual to ``self``.
|
|
1157
|
+
|
|
1158
|
+
OUTPUT: a :class:`toric lattice quotient <ToricLattice_quotient>`
|
|
1159
|
+
|
|
1160
|
+
EXAMPLES::
|
|
1161
|
+
|
|
1162
|
+
sage: N = ToricLattice(3)
|
|
1163
|
+
sage: Ns = N.submodule([(1,1,0), (3,2,1)])
|
|
1164
|
+
sage: Ns.dual() # needs sage.libs.pari
|
|
1165
|
+
2-d lattice, quotient of 3-d lattice M by Sublattice <M(1, -1, -1)>
|
|
1166
|
+
"""
|
|
1167
|
+
if "_dual" not in self.__dict__:
|
|
1168
|
+
if self is not self.saturation():
|
|
1169
|
+
raise ValueError("only dual lattices of saturated sublattices "
|
|
1170
|
+
"can be constructed! Got %s." % self)
|
|
1171
|
+
self._dual = (self.ambient_module().dual() /
|
|
1172
|
+
self.basis_matrix().transpose().integer_kernel())
|
|
1173
|
+
self._dual._dual = self
|
|
1174
|
+
return self._dual
|
|
1175
|
+
|
|
1176
|
+
def plot(self, **options):
|
|
1177
|
+
r"""
|
|
1178
|
+
Plot ``self``.
|
|
1179
|
+
|
|
1180
|
+
INPUT:
|
|
1181
|
+
|
|
1182
|
+
- any options for toric plots (see :func:`toric_plotter.options
|
|
1183
|
+
<sage.geometry.toric_plotter.options>`), none are mandatory.
|
|
1184
|
+
|
|
1185
|
+
OUTPUT: a plot
|
|
1186
|
+
|
|
1187
|
+
EXAMPLES::
|
|
1188
|
+
|
|
1189
|
+
sage: N = ToricLattice(3)
|
|
1190
|
+
sage: sublattice = N.submodule_with_basis([(1,1,0), (3,2,1)])
|
|
1191
|
+
sage: sublattice.plot() # needs sage.geometry.polyhedron sage.plot
|
|
1192
|
+
Graphics3d Object
|
|
1193
|
+
|
|
1194
|
+
Now we plot both the ambient lattice and its sublattice::
|
|
1195
|
+
|
|
1196
|
+
sage: N.plot() + sublattice.plot(point_color='red') # needs sage.geometry.polyhedron sage.plot
|
|
1197
|
+
Graphics3d Object
|
|
1198
|
+
"""
|
|
1199
|
+
if "show_lattice" not in options:
|
|
1200
|
+
# Unless user made an explicit decision, we assume that lattice
|
|
1201
|
+
# should be visible no matter what is the size of the bounding box.
|
|
1202
|
+
options["show_lattice"] = True
|
|
1203
|
+
if "lattice_filter" in options:
|
|
1204
|
+
old = options["lattice_filter"]
|
|
1205
|
+
options["lattice_filter"] = lambda pt: pt in self and old(pt)
|
|
1206
|
+
else:
|
|
1207
|
+
options["lattice_filter"] = lambda pt: pt in self
|
|
1208
|
+
tp = ToricPlotter(options, self.degree())
|
|
1209
|
+
tp.adjust_options()
|
|
1210
|
+
return tp.plot_lattice()
|
|
1211
|
+
|
|
1212
|
+
|
|
1213
|
+
class ToricLattice_sublattice(ToricLattice_sublattice_with_basis,
|
|
1214
|
+
FreeModule_submodule_pid):
|
|
1215
|
+
r"""
|
|
1216
|
+
Construct the sublattice of ``ambient`` toric lattice generated by ``gens``.
|
|
1217
|
+
|
|
1218
|
+
INPUT (same as for
|
|
1219
|
+
:class:`~sage.modules.free_module.FreeModule_submodule_pid`):
|
|
1220
|
+
|
|
1221
|
+
- ``ambient`` -- ambient :class:`toric lattice <ToricLatticeFactory>` for
|
|
1222
|
+
this sublattice
|
|
1223
|
+
|
|
1224
|
+
- ``gens`` -- list of elements of ``ambient`` generating the constructed
|
|
1225
|
+
sublattice
|
|
1226
|
+
|
|
1227
|
+
- see the base class for other available options
|
|
1228
|
+
|
|
1229
|
+
OUTPUT: sublattice of a toric lattice with an automatically chosen basis
|
|
1230
|
+
|
|
1231
|
+
See also :class:`ToricLattice_sublattice_with_basis` if you want to
|
|
1232
|
+
specify an explicit basis.
|
|
1233
|
+
|
|
1234
|
+
EXAMPLES:
|
|
1235
|
+
|
|
1236
|
+
The intended way to get objects of this class is to use
|
|
1237
|
+
:meth:`submodule` method of toric lattices::
|
|
1238
|
+
|
|
1239
|
+
sage: N = ToricLattice(3)
|
|
1240
|
+
sage: sublattice = N.submodule([(1,1,0), (3,2,1)])
|
|
1241
|
+
sage: sublattice.has_user_basis()
|
|
1242
|
+
False
|
|
1243
|
+
sage: sublattice.basis()
|
|
1244
|
+
[N(1, 0, 1), N(0, 1, -1)]
|
|
1245
|
+
|
|
1246
|
+
For sublattices without user-specified basis, the basis obtained above is
|
|
1247
|
+
the same as the "standard" one::
|
|
1248
|
+
|
|
1249
|
+
sage: sublattice.echelonized_basis()
|
|
1250
|
+
[N(1, 0, 1), N(0, 1, -1)]
|
|
1251
|
+
"""
|
|
1252
|
+
pass
|
|
1253
|
+
|
|
1254
|
+
|
|
1255
|
+
class ToricLattice_quotient_element(FGP_Element):
|
|
1256
|
+
r"""
|
|
1257
|
+
Create an element of a toric lattice quotient.
|
|
1258
|
+
|
|
1259
|
+
.. WARNING::
|
|
1260
|
+
|
|
1261
|
+
You probably should not construct such elements explicitly.
|
|
1262
|
+
|
|
1263
|
+
INPUT:
|
|
1264
|
+
|
|
1265
|
+
- same as for :class:`~sage.modules.fg_pid.fgp_element.FGP_Element`.
|
|
1266
|
+
|
|
1267
|
+
OUTPUT: element of a toric lattice quotient
|
|
1268
|
+
|
|
1269
|
+
TESTS::
|
|
1270
|
+
|
|
1271
|
+
sage: N = ToricLattice(3)
|
|
1272
|
+
sage: sublattice = N.submodule([(1,1,0), (3,2,1)])
|
|
1273
|
+
sage: Q = N/sublattice
|
|
1274
|
+
sage: e = Q(1,2,3)
|
|
1275
|
+
sage: e
|
|
1276
|
+
N[1, 2, 3]
|
|
1277
|
+
sage: e2 = Q(N(2,3,3))
|
|
1278
|
+
sage: e2
|
|
1279
|
+
N[2, 3, 3]
|
|
1280
|
+
sage: e == e2 # needs sage.libs.pari
|
|
1281
|
+
True
|
|
1282
|
+
sage: e.vector() # needs sage.libs.pari
|
|
1283
|
+
(-4)
|
|
1284
|
+
sage: e2.vector() # needs sage.libs.pari
|
|
1285
|
+
(-4)
|
|
1286
|
+
"""
|
|
1287
|
+
|
|
1288
|
+
def _latex_(self):
|
|
1289
|
+
r"""
|
|
1290
|
+
Return a LaTeX representation of ``self``.
|
|
1291
|
+
|
|
1292
|
+
OUTPUT: string
|
|
1293
|
+
|
|
1294
|
+
TESTS::
|
|
1295
|
+
|
|
1296
|
+
sage: N = ToricLattice(3)
|
|
1297
|
+
sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
|
|
1298
|
+
sage: Q = N/Ns
|
|
1299
|
+
sage: print(Q.gen(0)._latex_()) # needs sage.libs.pari
|
|
1300
|
+
\left[0,\,1,\,0\right]_{N}
|
|
1301
|
+
"""
|
|
1302
|
+
return latex(self.lift()).replace("(", "[", 1).replace(")", "]", 1)
|
|
1303
|
+
|
|
1304
|
+
def _repr_(self):
|
|
1305
|
+
r"""
|
|
1306
|
+
Return a string representation of ``self``.
|
|
1307
|
+
|
|
1308
|
+
OUTPUT: string
|
|
1309
|
+
|
|
1310
|
+
TESTS::
|
|
1311
|
+
|
|
1312
|
+
sage: N = ToricLattice(3)
|
|
1313
|
+
sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
|
|
1314
|
+
sage: Q = N/Ns
|
|
1315
|
+
sage: print(Q.gen(0)._repr_()) # needs sage.libs.pari
|
|
1316
|
+
N[0, 1, 0]
|
|
1317
|
+
"""
|
|
1318
|
+
return str(self.lift()).replace("(", "[", 1).replace(")", "]", 1)
|
|
1319
|
+
|
|
1320
|
+
def set_immutable(self):
|
|
1321
|
+
r"""
|
|
1322
|
+
Make ``self`` immutable.
|
|
1323
|
+
|
|
1324
|
+
OUTPUT: none
|
|
1325
|
+
|
|
1326
|
+
.. NOTE:: Elements of toric lattice quotients are always immutable, so
|
|
1327
|
+
this method does nothing, it is introduced for compatibility
|
|
1328
|
+
purposes only.
|
|
1329
|
+
|
|
1330
|
+
EXAMPLES::
|
|
1331
|
+
|
|
1332
|
+
sage: N = ToricLattice(3)
|
|
1333
|
+
sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
|
|
1334
|
+
sage: Q = N/Ns
|
|
1335
|
+
sage: Q.0.set_immutable() # needs sage.libs.pari
|
|
1336
|
+
"""
|
|
1337
|
+
pass
|
|
1338
|
+
|
|
1339
|
+
|
|
1340
|
+
class ToricLattice_quotient(FGP_Module_class):
|
|
1341
|
+
r"""
|
|
1342
|
+
Construct the quotient of a toric lattice ``V`` by its sublattice ``W``.
|
|
1343
|
+
|
|
1344
|
+
INPUT:
|
|
1345
|
+
|
|
1346
|
+
- ``V`` -- ambient toric lattice
|
|
1347
|
+
|
|
1348
|
+
- ``W`` -- sublattice of ``V``
|
|
1349
|
+
|
|
1350
|
+
- ``check`` -- boolean (default: ``True``); whether to check correctness of input
|
|
1351
|
+
or not
|
|
1352
|
+
|
|
1353
|
+
If the quotient is one-dimensional and torsion free, the following
|
|
1354
|
+
two mutually exclusive keyword arguments are also allowed. They
|
|
1355
|
+
decide the sign choice for the (single) generator of the quotient
|
|
1356
|
+
lattice:
|
|
1357
|
+
|
|
1358
|
+
- ``positive_point`` -- a lattice point of ``self`` not in the
|
|
1359
|
+
sublattice ``sub`` (that is, not zero in the quotient
|
|
1360
|
+
lattice). The quotient generator will be in the same direction
|
|
1361
|
+
as ``positive_point``.
|
|
1362
|
+
|
|
1363
|
+
- ``positive_dual_point`` -- a dual lattice point. The quotient
|
|
1364
|
+
generator will be chosen such that its lift has a positive
|
|
1365
|
+
product with ``positive_dual_point``. Note: if
|
|
1366
|
+
``positive_dual_point`` is not zero on the sublattice ``sub``,
|
|
1367
|
+
then the notion of positivity will depend on the choice of lift!
|
|
1368
|
+
|
|
1369
|
+
Further given named arguments are passed to the constructor of an FGP
|
|
1370
|
+
module.
|
|
1371
|
+
|
|
1372
|
+
OUTPUT: quotient of ``V`` by ``W``
|
|
1373
|
+
|
|
1374
|
+
EXAMPLES:
|
|
1375
|
+
|
|
1376
|
+
The intended way to get objects of this class is to use
|
|
1377
|
+
:meth:`quotient` method of toric lattices::
|
|
1378
|
+
|
|
1379
|
+
sage: N = ToricLattice(3)
|
|
1380
|
+
sage: sublattice = N.submodule([(1,1,0), (3,2,1)])
|
|
1381
|
+
sage: Q = N/sublattice
|
|
1382
|
+
sage: Q # needs sage.libs.pari
|
|
1383
|
+
1-d lattice, quotient of 3-d lattice N by Sublattice <N(1, 0, 1), N(0, 1, -1)>
|
|
1384
|
+
sage: Q.gens() # needs sage.libs.pari
|
|
1385
|
+
(N[1, 0, 0],)
|
|
1386
|
+
|
|
1387
|
+
Here, ``sublattice`` happens to be of codimension one in ``N``. If
|
|
1388
|
+
you want to prescribe the sign of the quotient generator, you can
|
|
1389
|
+
do either::
|
|
1390
|
+
|
|
1391
|
+
sage: Q = N.quotient(sublattice, positive_point=N(0,0,-1)); Q # needs sage.libs.pari
|
|
1392
|
+
1-d lattice, quotient of 3-d lattice N by Sublattice <N(1, 0, 1), N(0, 1, -1)>
|
|
1393
|
+
sage: Q.gens() # needs sage.libs.pari
|
|
1394
|
+
(N[1, 0, 0],)
|
|
1395
|
+
|
|
1396
|
+
or::
|
|
1397
|
+
|
|
1398
|
+
sage: M = N.dual()
|
|
1399
|
+
sage: Q = N.quotient(sublattice, positive_dual_point=M(1,0,0)); Q # needs sage.libs.pari
|
|
1400
|
+
1-d lattice, quotient of 3-d lattice N by Sublattice <N(1, 0, 1), N(0, 1, -1)>
|
|
1401
|
+
sage: Q.gens() # needs sage.libs.pari
|
|
1402
|
+
(N[1, 0, 0],)
|
|
1403
|
+
|
|
1404
|
+
TESTS::
|
|
1405
|
+
|
|
1406
|
+
sage: loads(dumps(Q)) == Q
|
|
1407
|
+
True
|
|
1408
|
+
sage: loads(dumps(Q)).gens() == Q.gens() # needs sage.libs.pari
|
|
1409
|
+
True
|
|
1410
|
+
"""
|
|
1411
|
+
|
|
1412
|
+
def __init__(self, V, W, check=True, positive_point=None, positive_dual_point=None, **kwds):
|
|
1413
|
+
r"""
|
|
1414
|
+
The constructor.
|
|
1415
|
+
|
|
1416
|
+
See :class:`ToricLattice_quotient` for an explanation of the arguments.
|
|
1417
|
+
|
|
1418
|
+
EXAMPLES::
|
|
1419
|
+
|
|
1420
|
+
sage: N = ToricLattice(3)
|
|
1421
|
+
sage: from sage.geometry.toric_lattice import ToricLattice_quotient
|
|
1422
|
+
sage: ToricLattice_quotient(N, N.span([N(1,2,3)])) # needs sage.libs.pari
|
|
1423
|
+
2-d lattice, quotient of 3-d lattice N by Sublattice <N(1, 2, 3)>
|
|
1424
|
+
|
|
1425
|
+
An :exc:`ArithmeticError` will be raised if ``W`` is not a
|
|
1426
|
+
sublattice of ``V``::
|
|
1427
|
+
|
|
1428
|
+
sage: N = ToricLattice(3)
|
|
1429
|
+
sage: Ns = N.submodule([N.gen(0)])
|
|
1430
|
+
sage: Ns
|
|
1431
|
+
Sublattice <N(1, 0, 0)>
|
|
1432
|
+
sage: Ns.span([N.gen(1)])
|
|
1433
|
+
Sublattice <N(0, 1, 0)>
|
|
1434
|
+
sage: Ns.quotient(Ns.span([N.gen(1)])) # needs sage.libs.pari
|
|
1435
|
+
Traceback (most recent call last):
|
|
1436
|
+
...
|
|
1437
|
+
ArithmeticError: W must be a sublattice of V
|
|
1438
|
+
"""
|
|
1439
|
+
if check:
|
|
1440
|
+
try:
|
|
1441
|
+
W = V.submodule(W)
|
|
1442
|
+
except (TypeError, ArithmeticError):
|
|
1443
|
+
raise ArithmeticError("W must be a sublattice of V")
|
|
1444
|
+
super().__init__(V, W, check, **kwds)
|
|
1445
|
+
if (positive_point, positive_dual_point) == (None, None):
|
|
1446
|
+
self._flip_sign_of_generator = False
|
|
1447
|
+
return
|
|
1448
|
+
|
|
1449
|
+
self._flip_sign_of_generator = False
|
|
1450
|
+
assert self.is_torsion_free() and self.ngens() == 1, \
|
|
1451
|
+
'You may only specify a positive direction in the codimension one case.'
|
|
1452
|
+
quotient_generator = self.gen(0)
|
|
1453
|
+
lattice = self.V().ambient_module()
|
|
1454
|
+
if (positive_point is not None) and (positive_dual_point is None):
|
|
1455
|
+
assert positive_point in lattice, 'positive_point must be a lattice point.'
|
|
1456
|
+
point_quotient = self(positive_point)
|
|
1457
|
+
scalar_product = quotient_generator.vector()[0] * point_quotient.vector()[0]
|
|
1458
|
+
if scalar_product == 0:
|
|
1459
|
+
raise ValueError(str(positive_point)+' is zero in the quotient.')
|
|
1460
|
+
elif (positive_point is None) and (positive_dual_point is not None):
|
|
1461
|
+
assert positive_dual_point in lattice.dual(), 'positive_dual_point must be a dual lattice point.'
|
|
1462
|
+
scalar_product = quotient_generator.lift() * positive_dual_point
|
|
1463
|
+
if scalar_product == 0:
|
|
1464
|
+
raise ValueError(str(positive_dual_point)+' is zero on the lift of the quotient generator.')
|
|
1465
|
+
else:
|
|
1466
|
+
raise ValueError('You may not specify both positive_point and positive_dual_point.')
|
|
1467
|
+
self._flip_sign_of_generator = (scalar_product < 0)
|
|
1468
|
+
|
|
1469
|
+
def gens(self) -> tuple:
|
|
1470
|
+
"""
|
|
1471
|
+
Return the generators of the quotient.
|
|
1472
|
+
|
|
1473
|
+
OUTPUT:
|
|
1474
|
+
|
|
1475
|
+
A tuple of :class:`ToricLattice_quotient_element` generating
|
|
1476
|
+
the quotient.
|
|
1477
|
+
|
|
1478
|
+
EXAMPLES::
|
|
1479
|
+
|
|
1480
|
+
sage: N = ToricLattice(3)
|
|
1481
|
+
sage: Q = N.quotient(N.span([N(1,2,3), N(0,2,1)]), positive_point=N(0,-1,0)) # needs sage.libs.pari
|
|
1482
|
+
sage: Q.gens() # needs sage.libs.pari
|
|
1483
|
+
(N[0, -1, 0],)
|
|
1484
|
+
"""
|
|
1485
|
+
gens = self.smith_form_gens()
|
|
1486
|
+
if self._flip_sign_of_generator:
|
|
1487
|
+
assert len(gens) == 1
|
|
1488
|
+
return (-gens[0],)
|
|
1489
|
+
else:
|
|
1490
|
+
return gens
|
|
1491
|
+
|
|
1492
|
+
# Should be overridden in derived classes.
|
|
1493
|
+
Element = ToricLattice_quotient_element
|
|
1494
|
+
|
|
1495
|
+
def _element_constructor_(self, *x, **kwds):
|
|
1496
|
+
r"""
|
|
1497
|
+
Construct an element of ``self``.
|
|
1498
|
+
|
|
1499
|
+
INPUT:
|
|
1500
|
+
|
|
1501
|
+
- element of a compatible toric object (lattice, sublattice, quotient)
|
|
1502
|
+
or something that defines such an element (list, generic vector,
|
|
1503
|
+
etc.).
|
|
1504
|
+
|
|
1505
|
+
OUTPUT:
|
|
1506
|
+
|
|
1507
|
+
- :class:`toric lattice quotient element
|
|
1508
|
+
<ToricLattice_quotient_element>`.
|
|
1509
|
+
|
|
1510
|
+
EXAMPLES::
|
|
1511
|
+
|
|
1512
|
+
sage: N = ToricLattice(3)
|
|
1513
|
+
sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
|
|
1514
|
+
sage: Q = N/Ns
|
|
1515
|
+
sage: x = Q(1,2,3) # indirect doctest
|
|
1516
|
+
sage: x
|
|
1517
|
+
N[1, 2, 3]
|
|
1518
|
+
sage: type(x)
|
|
1519
|
+
<class 'sage.geometry.toric_lattice.ToricLattice_quotient_with_category.element_class'>
|
|
1520
|
+
sage: x is Q(x)
|
|
1521
|
+
True
|
|
1522
|
+
sage: x.parent() is Q
|
|
1523
|
+
True
|
|
1524
|
+
sage: x == Q(N(1,2,3)) # needs sage.libs.pari
|
|
1525
|
+
True
|
|
1526
|
+
sage: y = Q(3,6,3)
|
|
1527
|
+
sage: y
|
|
1528
|
+
N[3, 6, 3]
|
|
1529
|
+
sage: x == y # needs sage.libs.pari
|
|
1530
|
+
True
|
|
1531
|
+
"""
|
|
1532
|
+
if len(x) == 1 and (x[0] not in ZZ or x[0] == 0):
|
|
1533
|
+
x = x[0]
|
|
1534
|
+
if parent(x) is self:
|
|
1535
|
+
return x
|
|
1536
|
+
try:
|
|
1537
|
+
x = x.lift()
|
|
1538
|
+
except AttributeError:
|
|
1539
|
+
pass
|
|
1540
|
+
try:
|
|
1541
|
+
return self.element_class(self, self._V(x), **kwds)
|
|
1542
|
+
except TypeError:
|
|
1543
|
+
return self.linear_combination_of_smith_form_gens(x)
|
|
1544
|
+
|
|
1545
|
+
def _latex_(self):
|
|
1546
|
+
r"""
|
|
1547
|
+
Return a LaTeX representation of ``self``.
|
|
1548
|
+
|
|
1549
|
+
OUTPUT: string
|
|
1550
|
+
|
|
1551
|
+
TESTS::
|
|
1552
|
+
|
|
1553
|
+
sage: N = ToricLattice(3)
|
|
1554
|
+
sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
|
|
1555
|
+
sage: Q = N/Ns
|
|
1556
|
+
sage: print(Q._latex_())
|
|
1557
|
+
N / \left\langle\left(1,\,8,\,0\right)_{N}, \left(0,\,12,\,0\right)_{N}\right\rangle
|
|
1558
|
+
sage: Ns = N.submodule([N(1,4,0)])
|
|
1559
|
+
sage: Q = N/Ns
|
|
1560
|
+
sage: print(Q._latex_())
|
|
1561
|
+
N / \left\langle\left(1,\,4,\,0\right)_{N}\right\rangle
|
|
1562
|
+
"""
|
|
1563
|
+
return "%s / %s" % (latex(self.V()), latex(self.W()))
|
|
1564
|
+
|
|
1565
|
+
def _repr_(self):
|
|
1566
|
+
r"""
|
|
1567
|
+
Return a string representation of ``self``.
|
|
1568
|
+
|
|
1569
|
+
OUTPUT: string
|
|
1570
|
+
|
|
1571
|
+
TESTS::
|
|
1572
|
+
|
|
1573
|
+
sage: N = ToricLattice(3)
|
|
1574
|
+
sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
|
|
1575
|
+
sage: Q = N/Ns
|
|
1576
|
+
sage: print(Q._repr_()) # needs sage.libs.pari
|
|
1577
|
+
Quotient with torsion of 3-d lattice N
|
|
1578
|
+
by Sublattice <N(1, 8, 0), N(0, 12, 0)>
|
|
1579
|
+
sage: Ns = N.submodule([N(1,4,0)])
|
|
1580
|
+
sage: Q = N/Ns
|
|
1581
|
+
sage: print(Q._repr_()) # needs sage.libs.pari
|
|
1582
|
+
2-d lattice, quotient of 3-d lattice N
|
|
1583
|
+
by Sublattice <N(1, 4, 0)>
|
|
1584
|
+
"""
|
|
1585
|
+
if self.is_torsion_free():
|
|
1586
|
+
return "%d-d lattice, quotient of %s by %s" % (self.rank(),
|
|
1587
|
+
self.V(), self.W())
|
|
1588
|
+
else:
|
|
1589
|
+
return "Quotient with torsion of %s by %s" % (self.V(), self.W())
|
|
1590
|
+
|
|
1591
|
+
def _module_constructor(self, V, W, check=True):
|
|
1592
|
+
r"""
|
|
1593
|
+
Construct new quotient modules.
|
|
1594
|
+
|
|
1595
|
+
INPUT:
|
|
1596
|
+
|
|
1597
|
+
- ``V`` -- ambient toric lattice
|
|
1598
|
+
|
|
1599
|
+
- ``W`` -- sublattice of ``V``
|
|
1600
|
+
|
|
1601
|
+
- ``check`` -- boolean (default: ``True``); whether to check
|
|
1602
|
+
correctness of input or not
|
|
1603
|
+
|
|
1604
|
+
TESTS::
|
|
1605
|
+
|
|
1606
|
+
sage: N = ToricLattice(3)
|
|
1607
|
+
sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
|
|
1608
|
+
sage: Q = N/Ns; Q # needs sage.libs.pari
|
|
1609
|
+
Quotient with torsion of 3-d lattice N by Sublattice <N(1, 8, 0), N(0, 12, 0)>
|
|
1610
|
+
sage: Q._module_constructor(N,Ns) # needs sage.libs.pari
|
|
1611
|
+
Quotient with torsion of 3-d lattice N by Sublattice <N(1, 8, 0), N(0, 12, 0)>
|
|
1612
|
+
"""
|
|
1613
|
+
return ToricLattice_quotient(V,W,check)
|
|
1614
|
+
|
|
1615
|
+
def base_extend(self, R):
|
|
1616
|
+
r"""
|
|
1617
|
+
Return the base change of ``self`` to the ring ``R``.
|
|
1618
|
+
|
|
1619
|
+
INPUT:
|
|
1620
|
+
|
|
1621
|
+
- ``R`` -- either `\ZZ` or `\QQ`
|
|
1622
|
+
|
|
1623
|
+
OUTPUT: ``self`` if `R=\ZZ`, quotient of the base extension of the ambient
|
|
1624
|
+
lattice by the base extension of the sublattice if `R=\QQ`
|
|
1625
|
+
|
|
1626
|
+
EXAMPLES::
|
|
1627
|
+
|
|
1628
|
+
sage: N = ToricLattice(3)
|
|
1629
|
+
sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
|
|
1630
|
+
sage: Q = N/Ns
|
|
1631
|
+
sage: Q.base_extend(ZZ) is Q
|
|
1632
|
+
True
|
|
1633
|
+
sage: Q.base_extend(QQ)
|
|
1634
|
+
Vector space quotient V/W of dimension 1 over Rational Field where
|
|
1635
|
+
V: Vector space of dimension 3 over Rational Field
|
|
1636
|
+
W: Vector space of degree 3 and dimension 2 over Rational Field
|
|
1637
|
+
Basis matrix:
|
|
1638
|
+
[1 0 0]
|
|
1639
|
+
[0 1 0]
|
|
1640
|
+
"""
|
|
1641
|
+
if R is ZZ:
|
|
1642
|
+
return self
|
|
1643
|
+
if R is QQ:
|
|
1644
|
+
return self.V().base_extend(R) / self.W().base_extend(R)
|
|
1645
|
+
raise NotImplementedError("quotients of toric lattices can only be "
|
|
1646
|
+
"extended to ZZ or QQ, not %s!" % R)
|
|
1647
|
+
|
|
1648
|
+
def is_torsion_free(self):
|
|
1649
|
+
r"""
|
|
1650
|
+
Check if ``self`` is torsion-free.
|
|
1651
|
+
|
|
1652
|
+
OUTPUT: ``True`` if ``self`` has no torsion and ``False`` otherwise
|
|
1653
|
+
|
|
1654
|
+
EXAMPLES::
|
|
1655
|
+
|
|
1656
|
+
sage: N = ToricLattice(3)
|
|
1657
|
+
sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
|
|
1658
|
+
sage: Q = N/Ns
|
|
1659
|
+
sage: Q.is_torsion_free() # needs sage.libs.pari
|
|
1660
|
+
False
|
|
1661
|
+
sage: Ns = N.submodule([N(1,4,0)])
|
|
1662
|
+
sage: Q = N/Ns
|
|
1663
|
+
sage: Q.is_torsion_free() # needs sage.libs.pari
|
|
1664
|
+
True
|
|
1665
|
+
"""
|
|
1666
|
+
return sum(self.invariants()) == 0
|
|
1667
|
+
|
|
1668
|
+
def dual(self):
|
|
1669
|
+
r"""
|
|
1670
|
+
Return the lattice dual to ``self``.
|
|
1671
|
+
|
|
1672
|
+
OUTPUT: a :class:`toric lattice quotient <ToricLattice_quotient>`
|
|
1673
|
+
|
|
1674
|
+
EXAMPLES::
|
|
1675
|
+
|
|
1676
|
+
sage: N = ToricLattice(3)
|
|
1677
|
+
sage: Ns = N.submodule([(1, -1, -1)])
|
|
1678
|
+
sage: Q = N / Ns
|
|
1679
|
+
sage: Q.dual()
|
|
1680
|
+
Sublattice <M(1, 0, 1), M(0, 1, -1)>
|
|
1681
|
+
"""
|
|
1682
|
+
if "_dual" not in self.__dict__:
|
|
1683
|
+
self._dual = self.V().dual().submodule(
|
|
1684
|
+
self.W().basis_matrix().transpose().integer_kernel().gens())
|
|
1685
|
+
self._dual._dual = self
|
|
1686
|
+
return self._dual
|
|
1687
|
+
|
|
1688
|
+
def rank(self):
|
|
1689
|
+
r"""
|
|
1690
|
+
Return the rank of ``self``.
|
|
1691
|
+
|
|
1692
|
+
OUTPUT: integer; the dimension of the free part of the quotient
|
|
1693
|
+
|
|
1694
|
+
EXAMPLES::
|
|
1695
|
+
|
|
1696
|
+
sage: N = ToricLattice(3)
|
|
1697
|
+
sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
|
|
1698
|
+
sage: Q = N/Ns
|
|
1699
|
+
sage: Q.ngens() # needs sage.libs.pari
|
|
1700
|
+
2
|
|
1701
|
+
sage: Q.rank()
|
|
1702
|
+
1
|
|
1703
|
+
sage: Ns = N.submodule([N(1,4,0)])
|
|
1704
|
+
sage: Q = N/Ns
|
|
1705
|
+
sage: Q.ngens() # needs sage.libs.pari
|
|
1706
|
+
2
|
|
1707
|
+
sage: Q.rank()
|
|
1708
|
+
2
|
|
1709
|
+
"""
|
|
1710
|
+
return self.V().rank() - self.W().rank()
|
|
1711
|
+
|
|
1712
|
+
dimension = rank
|
|
1713
|
+
|
|
1714
|
+
def coordinate_vector(self, x, reduce=False):
|
|
1715
|
+
"""
|
|
1716
|
+
Return coordinates of ``x`` with respect to the optimized
|
|
1717
|
+
representation of ``self``.
|
|
1718
|
+
|
|
1719
|
+
INPUT:
|
|
1720
|
+
|
|
1721
|
+
- ``x`` -- element of ``self`` or convertible to ``self``
|
|
1722
|
+
|
|
1723
|
+
- ``reduce`` -- (default: ``False``) if ``True``, reduce coefficients
|
|
1724
|
+
modulo invariants
|
|
1725
|
+
|
|
1726
|
+
OUTPUT: the coordinates as a vector
|
|
1727
|
+
|
|
1728
|
+
EXAMPLES::
|
|
1729
|
+
|
|
1730
|
+
sage: # needs sage.libs.pari
|
|
1731
|
+
sage: N = ToricLattice(3)
|
|
1732
|
+
sage: Q = N.quotient(N.span([N(1,2,3), N(0,2,1)]), positive_point=N(0,-1,0))
|
|
1733
|
+
sage: q = Q.gen(0); q
|
|
1734
|
+
N[0, -1, 0]
|
|
1735
|
+
sage: q.vector() # indirect test
|
|
1736
|
+
(1)
|
|
1737
|
+
sage: Q.coordinate_vector(q)
|
|
1738
|
+
(1)
|
|
1739
|
+
"""
|
|
1740
|
+
coordinates = super().coordinate_vector(x, reduce)
|
|
1741
|
+
if self._flip_sign_of_generator:
|
|
1742
|
+
assert len(coordinates) == 1, "Sign flipped for a multi-dimensional quotient!"
|
|
1743
|
+
return -coordinates
|
|
1744
|
+
else:
|
|
1745
|
+
return coordinates
|