passagemath-modules 10.6.31rc3__cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +807 -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-83c28eba.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-6e109695.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-cda90e79.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7f678fcf.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-82690d50.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-2284e583.so.0.0.0 +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,1029 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
"""
|
|
3
|
+
Finite-Dimensional Algebras
|
|
4
|
+
"""
|
|
5
|
+
# ***************************************************************************
|
|
6
|
+
# Copyright (C) 2011 Johan Bosman <johan.g.bosman@gmail.com>
|
|
7
|
+
# Copyright (C) 2011, 2013 Peter Bruin <peter.bruin@math.uzh.ch>
|
|
8
|
+
# Copyright (C) 2011 Michiel Kosters <kosters@gmail.com>
|
|
9
|
+
#
|
|
10
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
11
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
12
|
+
# the License, or (at your option) any later version.
|
|
13
|
+
# https://www.gnu.org/licenses/
|
|
14
|
+
# ***************************************************************************
|
|
15
|
+
|
|
16
|
+
from .finite_dimensional_algebra_element import FiniteDimensionalAlgebraElement
|
|
17
|
+
from .finite_dimensional_algebra_ideal import FiniteDimensionalAlgebraIdeal
|
|
18
|
+
|
|
19
|
+
from sage.rings.integer_ring import ZZ
|
|
20
|
+
|
|
21
|
+
from sage.categories.magmatic_algebras import MagmaticAlgebras
|
|
22
|
+
from sage.categories.algebras import Algebras
|
|
23
|
+
from sage.matrix.constructor import matrix
|
|
24
|
+
from sage.structure.element import Matrix
|
|
25
|
+
from sage.structure.category_object import normalize_names
|
|
26
|
+
from sage.structure.parent import Parent
|
|
27
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
28
|
+
|
|
29
|
+
from sage.misc.cachefunc import cached_method
|
|
30
|
+
from functools import reduce
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class FiniteDimensionalAlgebra(UniqueRepresentation, Parent):
|
|
34
|
+
r"""
|
|
35
|
+
Create a finite-dimensional `k`-algebra from a multiplication table.
|
|
36
|
+
|
|
37
|
+
This is a magmatic `k`-algebra, i.e., not necessarily
|
|
38
|
+
associative or unital.
|
|
39
|
+
|
|
40
|
+
INPUT:
|
|
41
|
+
|
|
42
|
+
- ``k`` -- a field
|
|
43
|
+
|
|
44
|
+
- ``table`` -- list of matrices
|
|
45
|
+
|
|
46
|
+
- ``names`` -- string (default: ``'e'``); names for the basis
|
|
47
|
+
elements
|
|
48
|
+
|
|
49
|
+
- ``assume_associative`` -- boolean (default: ``False``); if
|
|
50
|
+
``True``, then the category is set to ``category.Associative()``
|
|
51
|
+
and methods requiring associativity assume this
|
|
52
|
+
|
|
53
|
+
- ``assume_unital`` -- boolean (default: ``False``); if
|
|
54
|
+
``True``, then the category is set to ``category.Unital()``
|
|
55
|
+
and methods requiring unitality assume this
|
|
56
|
+
|
|
57
|
+
- ``category`` -- (default:
|
|
58
|
+
``MagmaticAlgebras(k).FiniteDimensional().WithBasis()``)
|
|
59
|
+
the category to which this algebra belongs
|
|
60
|
+
|
|
61
|
+
The list ``table`` must have the following form: there exists a
|
|
62
|
+
finite-dimensional `k`-algebra of degree `n` with basis
|
|
63
|
+
`(e_1, \ldots, e_n)` such that the `i`-th element of ``table`` is the
|
|
64
|
+
matrix of right multiplication by `e_i` with respect to the basis
|
|
65
|
+
`(e_1, \ldots, e_n)`.
|
|
66
|
+
|
|
67
|
+
EXAMPLES::
|
|
68
|
+
|
|
69
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]]),
|
|
70
|
+
....: Matrix([[0, 1], [0, 0]])]); A
|
|
71
|
+
Finite-dimensional algebra of degree 2 over Finite Field of size 3
|
|
72
|
+
sage: TestSuite(A).run()
|
|
73
|
+
|
|
74
|
+
sage: B = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0,0], [0,1,0], [0,0,0]]),
|
|
75
|
+
....: Matrix([[0,1,0], [0,0,0], [0,0,0]]),
|
|
76
|
+
....: Matrix([[0,0,0], [0,0,0], [0,0,1]])])
|
|
77
|
+
sage: B
|
|
78
|
+
Finite-dimensional algebra of degree 3 over Rational Field
|
|
79
|
+
sage: B.one()
|
|
80
|
+
e0 + e2
|
|
81
|
+
sage: B.is_associative()
|
|
82
|
+
True
|
|
83
|
+
|
|
84
|
+
A more complicated example (the descent algebra of `S_3` in
|
|
85
|
+
a slightly rescaled I-basis, see :class:`DescentAlgebra`)::
|
|
86
|
+
|
|
87
|
+
sage: Ma = Matrix([[6,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0]])
|
|
88
|
+
sage: Mb = Matrix([[0,0,0,0], [0,1,0,0], [0,1,0,0], [0,0,0,0]])
|
|
89
|
+
sage: Mc = Matrix([[0,0,0,0], [0,0,1,0], [0,0,1,0], [0,0,0,0]])
|
|
90
|
+
sage: Md = Matrix([[0,0,0,0], [0,1,-1,0], [0,-1,1,0], [0,0,0,2]])
|
|
91
|
+
sage: C = FiniteDimensionalAlgebra(QQ, [Ma, Mb, Mc, Md])
|
|
92
|
+
sage: C.one()
|
|
93
|
+
1/6*e0 + 1/2*e1 + 1/2*e2 + 1/2*e3
|
|
94
|
+
sage: C.is_associative()
|
|
95
|
+
True
|
|
96
|
+
sage: C.is_commutative()
|
|
97
|
+
False
|
|
98
|
+
|
|
99
|
+
If we set both ``is_associative`` and ``is_unital`` to
|
|
100
|
+
``True``, then this is an associative unital algebra and
|
|
101
|
+
belongs to the category of
|
|
102
|
+
:class:`sage.categories.finite_dimensional_algebras_with_basis.FiniteDimensionalAlgebrasWithBasis`::
|
|
103
|
+
|
|
104
|
+
sage: C = FiniteDimensionalAlgebra(QQ, [Ma, Mb, Mc, Md],
|
|
105
|
+
....: assume_associative=True,
|
|
106
|
+
....: assume_unital=True)
|
|
107
|
+
sage: C.radical_basis()
|
|
108
|
+
(e1 - e2,)
|
|
109
|
+
sage: C.radical()
|
|
110
|
+
Radical of Finite-dimensional algebra of degree 4 over Rational Field
|
|
111
|
+
sage: C.center_basis()
|
|
112
|
+
(e0, e1 + e2 + e3)
|
|
113
|
+
sage: C.center()
|
|
114
|
+
Center of Finite-dimensional algebra of degree 4 over Rational Field
|
|
115
|
+
sage: C.center().is_commutative()
|
|
116
|
+
True
|
|
117
|
+
sage: e = C.basis()
|
|
118
|
+
sage: C.annihilator_basis([e[1]])
|
|
119
|
+
(e0, e1 - e2, e3)
|
|
120
|
+
sage: C.annihilator_basis([e[1]], side='left')
|
|
121
|
+
(e0, e1 - e2 - e3)
|
|
122
|
+
|
|
123
|
+
TESTS::
|
|
124
|
+
|
|
125
|
+
sage: A.category()
|
|
126
|
+
Category of finite dimensional magmatic algebras with basis
|
|
127
|
+
over Finite Field of size 3
|
|
128
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]]),
|
|
129
|
+
....: Matrix([[0, 1], [0, 0]])],
|
|
130
|
+
....: assume_associative=True)
|
|
131
|
+
sage: A.category()
|
|
132
|
+
Category of finite dimensional associative algebras with basis
|
|
133
|
+
over Finite Field of size 3
|
|
134
|
+
"""
|
|
135
|
+
@staticmethod
|
|
136
|
+
def __classcall_private__(cls, k, table, names='e', assume_associative=False,
|
|
137
|
+
assume_unital=False, category=None):
|
|
138
|
+
"""
|
|
139
|
+
Normalize input.
|
|
140
|
+
|
|
141
|
+
TESTS::
|
|
142
|
+
|
|
143
|
+
sage: table = [Matrix([[1, 0], [0, 1]]), Matrix([[0, 1], [0, 0]])]
|
|
144
|
+
sage: A1 = FiniteDimensionalAlgebra(GF(3), table)
|
|
145
|
+
sage: A2 = FiniteDimensionalAlgebra(GF(3), table, names='e')
|
|
146
|
+
sage: A3 = FiniteDimensionalAlgebra(GF(3), table, names=['e0', 'e1'])
|
|
147
|
+
sage: A1 is A2 and A2 is A3
|
|
148
|
+
True
|
|
149
|
+
|
|
150
|
+
The ``assume_associative`` keyword is built into the category::
|
|
151
|
+
|
|
152
|
+
sage: from sage.categories.magmatic_algebras import MagmaticAlgebras
|
|
153
|
+
sage: cat = MagmaticAlgebras(GF(3)).FiniteDimensional().WithBasis()
|
|
154
|
+
sage: A1 = FiniteDimensionalAlgebra(GF(3), table,
|
|
155
|
+
....: category=cat.Associative())
|
|
156
|
+
sage: A2 = FiniteDimensionalAlgebra(GF(3), table, assume_associative=True)
|
|
157
|
+
sage: A1 is A2
|
|
158
|
+
True
|
|
159
|
+
|
|
160
|
+
Likewise for the ``assume_associative`` keyword::
|
|
161
|
+
|
|
162
|
+
sage: A3 = FiniteDimensionalAlgebra(GF(3), table,
|
|
163
|
+
....: category=cat.Unital())
|
|
164
|
+
sage: A4 = FiniteDimensionalAlgebra(GF(3), table, assume_unital=True)
|
|
165
|
+
sage: A3 is A4
|
|
166
|
+
True
|
|
167
|
+
|
|
168
|
+
With both keywords on, the
|
|
169
|
+
:class:`sage.categories.algebras.Algebras` category
|
|
170
|
+
is used::
|
|
171
|
+
|
|
172
|
+
sage: cat_a = Algebras(GF(3)).FiniteDimensional().WithBasis()
|
|
173
|
+
sage: A5 = FiniteDimensionalAlgebra(GF(3), table,
|
|
174
|
+
....: category=cat_a)
|
|
175
|
+
sage: A6 = FiniteDimensionalAlgebra(GF(3), table, assume_associative=True,
|
|
176
|
+
....: assume_unital=True)
|
|
177
|
+
sage: A5 is A6
|
|
178
|
+
True
|
|
179
|
+
|
|
180
|
+
Uniqueness depends on the category::
|
|
181
|
+
|
|
182
|
+
sage: cat = Algebras(GF(3)).FiniteDimensional().WithBasis()
|
|
183
|
+
sage: A1 = FiniteDimensionalAlgebra(GF(3), table)
|
|
184
|
+
sage: A2 = FiniteDimensionalAlgebra(GF(3), table, category=cat)
|
|
185
|
+
sage: A1 == A2
|
|
186
|
+
False
|
|
187
|
+
sage: A1 is A2
|
|
188
|
+
False
|
|
189
|
+
|
|
190
|
+
Checking that equality is still as expected::
|
|
191
|
+
|
|
192
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), table)
|
|
193
|
+
sage: B = FiniteDimensionalAlgebra(GF(5), [Matrix([0])])
|
|
194
|
+
sage: A == A
|
|
195
|
+
True
|
|
196
|
+
sage: B == B
|
|
197
|
+
True
|
|
198
|
+
sage: A == B
|
|
199
|
+
False
|
|
200
|
+
sage: A != A
|
|
201
|
+
False
|
|
202
|
+
sage: B != B
|
|
203
|
+
False
|
|
204
|
+
sage: A != B
|
|
205
|
+
True
|
|
206
|
+
"""
|
|
207
|
+
n = len(table)
|
|
208
|
+
table = [b.base_extend(k) for b in table]
|
|
209
|
+
for b in table:
|
|
210
|
+
b.set_immutable()
|
|
211
|
+
if not (isinstance(b, Matrix) and b.dimensions() == (n, n)):
|
|
212
|
+
raise ValueError("input is not a multiplication table")
|
|
213
|
+
table = tuple(table)
|
|
214
|
+
|
|
215
|
+
cat = MagmaticAlgebras(k).FiniteDimensional().WithBasis()
|
|
216
|
+
cat = cat.or_subcategory(category)
|
|
217
|
+
if assume_associative:
|
|
218
|
+
cat = cat.Associative()
|
|
219
|
+
if assume_unital:
|
|
220
|
+
# both unital and associative, so algebra in modern sense
|
|
221
|
+
cat = Algebras(k).FiniteDimensional().WithBasis()
|
|
222
|
+
cat = cat.or_subcategory(category)
|
|
223
|
+
elif assume_unital:
|
|
224
|
+
cat = cat.Unital()
|
|
225
|
+
|
|
226
|
+
names = normalize_names(n, names)
|
|
227
|
+
|
|
228
|
+
return super().__classcall__(cls, k, table,
|
|
229
|
+
names, category=cat)
|
|
230
|
+
|
|
231
|
+
def __init__(self, k, table, names='e', category=None):
|
|
232
|
+
"""
|
|
233
|
+
TESTS::
|
|
234
|
+
|
|
235
|
+
sage: A = FiniteDimensionalAlgebra(QQ, [])
|
|
236
|
+
sage: A
|
|
237
|
+
Finite-dimensional algebra of degree 0 over Rational Field
|
|
238
|
+
sage: type(A)
|
|
239
|
+
<class 'sage.algebras.finite_dimensional_algebras.finite_dimensional_algebra.FiniteDimensionalAlgebra_with_category'>
|
|
240
|
+
sage: TestSuite(A).run()
|
|
241
|
+
|
|
242
|
+
sage: B = FiniteDimensionalAlgebra(GF(7), [Matrix([1])])
|
|
243
|
+
sage: B
|
|
244
|
+
Finite-dimensional algebra of degree 1 over Finite Field of size 7
|
|
245
|
+
sage: TestSuite(B).run()
|
|
246
|
+
|
|
247
|
+
sage: C = FiniteDimensionalAlgebra(CC, [Matrix([[1, 0], [0, 1]]), Matrix([[0, 1], [0, 0]])])
|
|
248
|
+
sage: C
|
|
249
|
+
Finite-dimensional algebra of degree 2 over Complex Field with 53 bits of precision
|
|
250
|
+
sage: TestSuite(C).run()
|
|
251
|
+
|
|
252
|
+
sage: FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]])])
|
|
253
|
+
Traceback (most recent call last):
|
|
254
|
+
...
|
|
255
|
+
ValueError: input is not a multiplication table
|
|
256
|
+
|
|
257
|
+
sage: D.<a,b> = FiniteDimensionalAlgebra(RR, [Matrix([[1, 0], [0, 1]]), Matrix([[0, 1], [-1, 0]])])
|
|
258
|
+
sage: D.gens()
|
|
259
|
+
(a, b)
|
|
260
|
+
|
|
261
|
+
sage: E = FiniteDimensionalAlgebra(QQ, [Matrix([0])])
|
|
262
|
+
sage: E.gens()
|
|
263
|
+
(e,)
|
|
264
|
+
"""
|
|
265
|
+
self._table = table
|
|
266
|
+
self._assume_associative = "Associative" in category.axioms()
|
|
267
|
+
# No further validity checks necessary!
|
|
268
|
+
Parent.__init__(self, base=k, names=names, category=category)
|
|
269
|
+
|
|
270
|
+
def _repr_(self):
|
|
271
|
+
"""
|
|
272
|
+
Return a string representation of ``self``.
|
|
273
|
+
|
|
274
|
+
TESTS::
|
|
275
|
+
|
|
276
|
+
sage: FiniteDimensionalAlgebra(RR, [Matrix([1])])._repr_()
|
|
277
|
+
'Finite-dimensional algebra of degree 1 over Real Field with 53 bits of precision'
|
|
278
|
+
"""
|
|
279
|
+
return "Finite-dimensional algebra of degree {} over {}".format(self.degree(), self.base_ring())
|
|
280
|
+
|
|
281
|
+
def _coerce_map_from_(self, S):
|
|
282
|
+
"""
|
|
283
|
+
TESTS::
|
|
284
|
+
|
|
285
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]]),
|
|
286
|
+
....: Matrix([[0, 1], [0, 0]])])
|
|
287
|
+
sage: A.has_coerce_map_from(ZZ)
|
|
288
|
+
True
|
|
289
|
+
sage: A.has_coerce_map_from(GF(3))
|
|
290
|
+
True
|
|
291
|
+
sage: A.has_coerce_map_from(GF(5))
|
|
292
|
+
False
|
|
293
|
+
sage: A.has_coerce_map_from(QQ)
|
|
294
|
+
False
|
|
295
|
+
"""
|
|
296
|
+
return S == self or (self.base_ring().has_coerce_map_from(S) and self.is_unitary())
|
|
297
|
+
|
|
298
|
+
Element = FiniteDimensionalAlgebraElement
|
|
299
|
+
|
|
300
|
+
def _element_constructor_(self, x):
|
|
301
|
+
"""
|
|
302
|
+
TESTS::
|
|
303
|
+
|
|
304
|
+
sage: A = FiniteDimensionalAlgebra(QQ, [Matrix([0])])
|
|
305
|
+
sage: a = A(0)
|
|
306
|
+
sage: a.parent()
|
|
307
|
+
Finite-dimensional algebra of degree 1 over Rational Field
|
|
308
|
+
sage: A(1)
|
|
309
|
+
Traceback (most recent call last):
|
|
310
|
+
...
|
|
311
|
+
TypeError: algebra is not unitary
|
|
312
|
+
|
|
313
|
+
sage: B = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0,0], [0,1,0], [0,0,0]]),
|
|
314
|
+
....: Matrix([[0,1,0], [0,0,0], [0,0,0]]),
|
|
315
|
+
....: Matrix([[0,0,0], [0,0,0], [0,0,1]])])
|
|
316
|
+
sage: B(17)
|
|
317
|
+
17*e0 + 17*e2
|
|
318
|
+
"""
|
|
319
|
+
return self.element_class(self, x)
|
|
320
|
+
|
|
321
|
+
# This is needed because the default implementation
|
|
322
|
+
# assumes that the algebra is unitary.
|
|
323
|
+
from_base_ring = _element_constructor_
|
|
324
|
+
|
|
325
|
+
def _Hom_(self, B, category):
|
|
326
|
+
"""
|
|
327
|
+
Construct a homset of ``self`` and ``B``.
|
|
328
|
+
|
|
329
|
+
EXAMPLES::
|
|
330
|
+
|
|
331
|
+
sage: A = FiniteDimensionalAlgebra(QQ, [Matrix([1])])
|
|
332
|
+
sage: B = FiniteDimensionalAlgebra(QQ, [Matrix([[1, 0], [0, 1]]), Matrix([[0, 1], [0, 0]])])
|
|
333
|
+
sage: A._Hom_(B, A.category())
|
|
334
|
+
Set of Homomorphisms
|
|
335
|
+
from Finite-dimensional algebra of degree 1 over Rational Field
|
|
336
|
+
to Finite-dimensional algebra of degree 2 over Rational Field
|
|
337
|
+
"""
|
|
338
|
+
cat = MagmaticAlgebras(self.base_ring()).FiniteDimensional().WithBasis()
|
|
339
|
+
if category.is_subcategory(cat):
|
|
340
|
+
from sage.algebras.finite_dimensional_algebras.finite_dimensional_algebra_morphism import FiniteDimensionalAlgebraHomset
|
|
341
|
+
return FiniteDimensionalAlgebraHomset(self, B, category=category)
|
|
342
|
+
return super()._Hom_(B, category)
|
|
343
|
+
|
|
344
|
+
def ngens(self):
|
|
345
|
+
"""
|
|
346
|
+
Return the number of generators of ``self``, i.e., the degree
|
|
347
|
+
of ``self`` over its base field.
|
|
348
|
+
|
|
349
|
+
EXAMPLES::
|
|
350
|
+
|
|
351
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]]),
|
|
352
|
+
....: Matrix([[0, 1], [0, 0]])])
|
|
353
|
+
sage: A.ngens()
|
|
354
|
+
2
|
|
355
|
+
"""
|
|
356
|
+
return len(self._table)
|
|
357
|
+
|
|
358
|
+
degree = ngens
|
|
359
|
+
|
|
360
|
+
@cached_method
|
|
361
|
+
def gen(self, i):
|
|
362
|
+
"""
|
|
363
|
+
Return the `i`-th basis element of ``self``.
|
|
364
|
+
|
|
365
|
+
EXAMPLES::
|
|
366
|
+
|
|
367
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]]),
|
|
368
|
+
....: Matrix([[0, 1], [0, 0]])])
|
|
369
|
+
sage: A.gen(0)
|
|
370
|
+
e0
|
|
371
|
+
"""
|
|
372
|
+
return self.element_class(self, [j == i for j in range(self.ngens())])
|
|
373
|
+
|
|
374
|
+
@cached_method
|
|
375
|
+
def basis(self):
|
|
376
|
+
"""
|
|
377
|
+
Return a list of the basis elements of ``self``.
|
|
378
|
+
|
|
379
|
+
EXAMPLES::
|
|
380
|
+
|
|
381
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]]),
|
|
382
|
+
....: Matrix([[0, 1], [0, 0]])])
|
|
383
|
+
sage: A.basis()
|
|
384
|
+
Finite family {0: e0, 1: e1}
|
|
385
|
+
"""
|
|
386
|
+
from sage.sets.family import Family
|
|
387
|
+
return Family({i: self.gen(i) for i in range(self.ngens())})
|
|
388
|
+
|
|
389
|
+
def __iter__(self):
|
|
390
|
+
"""
|
|
391
|
+
Iterate over the elements of ``self``.
|
|
392
|
+
|
|
393
|
+
EXAMPLES::
|
|
394
|
+
|
|
395
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]]),
|
|
396
|
+
....: Matrix([[0, 1], [0, 0]])])
|
|
397
|
+
sage: list(A)
|
|
398
|
+
[0, e0, 2*e0, e1, e0 + e1, 2*e0 + e1, 2*e1, e0 + 2*e1, 2*e0 + 2*e1]
|
|
399
|
+
|
|
400
|
+
This is used in the :class:`Testsuite`'s when ``self`` is
|
|
401
|
+
finite.
|
|
402
|
+
"""
|
|
403
|
+
if not self.is_finite():
|
|
404
|
+
raise NotImplementedError("object does not support iteration")
|
|
405
|
+
V = self.zero().vector().parent()
|
|
406
|
+
for v in V:
|
|
407
|
+
yield self(v)
|
|
408
|
+
|
|
409
|
+
def _ideal_class_(self, n=0):
|
|
410
|
+
"""
|
|
411
|
+
Return the ideal class of ``self`` (that is, the class that
|
|
412
|
+
all ideals of ``self`` inherit from).
|
|
413
|
+
|
|
414
|
+
EXAMPLES::
|
|
415
|
+
|
|
416
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]]),
|
|
417
|
+
....: Matrix([[0, 1], [0, 0]])])
|
|
418
|
+
sage: A._ideal_class_()
|
|
419
|
+
<class 'sage.algebras.finite_dimensional_algebras.finite_dimensional_algebra_ideal.FiniteDimensionalAlgebraIdeal'>
|
|
420
|
+
"""
|
|
421
|
+
return FiniteDimensionalAlgebraIdeal
|
|
422
|
+
|
|
423
|
+
def table(self):
|
|
424
|
+
"""
|
|
425
|
+
Return the multiplication table of ``self``, as a list of
|
|
426
|
+
matrices for right multiplication by the basis elements.
|
|
427
|
+
|
|
428
|
+
EXAMPLES::
|
|
429
|
+
|
|
430
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]]),
|
|
431
|
+
....: Matrix([[0, 1], [0, 0]])])
|
|
432
|
+
sage: A.table()
|
|
433
|
+
(
|
|
434
|
+
[1 0] [0 1]
|
|
435
|
+
[0 1], [0 0]
|
|
436
|
+
)
|
|
437
|
+
"""
|
|
438
|
+
return self._table
|
|
439
|
+
|
|
440
|
+
@cached_method
|
|
441
|
+
def left_table(self):
|
|
442
|
+
"""
|
|
443
|
+
Return the list of matrices for left multiplication by the
|
|
444
|
+
basis elements.
|
|
445
|
+
|
|
446
|
+
EXAMPLES::
|
|
447
|
+
|
|
448
|
+
sage: B = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0], [0,1]]),
|
|
449
|
+
....: Matrix([[0,1], [-1,0]])])
|
|
450
|
+
sage: T = B.left_table(); T
|
|
451
|
+
(
|
|
452
|
+
[1 0] [ 0 1]
|
|
453
|
+
[0 1], [-1 0]
|
|
454
|
+
)
|
|
455
|
+
|
|
456
|
+
We check immutability::
|
|
457
|
+
|
|
458
|
+
sage: T[0] = "vandalized by h4xx0r"
|
|
459
|
+
Traceback (most recent call last):
|
|
460
|
+
...
|
|
461
|
+
TypeError: 'tuple' object does not support item assignment
|
|
462
|
+
sage: T[1][0] = [13, 37]
|
|
463
|
+
Traceback (most recent call last):
|
|
464
|
+
...
|
|
465
|
+
ValueError: matrix is immutable; please change a copy instead
|
|
466
|
+
(i.e., use copy(M) to change a copy of M).
|
|
467
|
+
"""
|
|
468
|
+
B = self.table()
|
|
469
|
+
n = self.degree()
|
|
470
|
+
table = [matrix([B[j][i] for j in range(n)]) for i in range(n)]
|
|
471
|
+
for b in table:
|
|
472
|
+
b.set_immutable()
|
|
473
|
+
return tuple(table)
|
|
474
|
+
|
|
475
|
+
def base_extend(self, F):
|
|
476
|
+
"""
|
|
477
|
+
Return ``self`` base changed to the field ``F``.
|
|
478
|
+
|
|
479
|
+
EXAMPLES::
|
|
480
|
+
|
|
481
|
+
sage: C = FiniteDimensionalAlgebra(GF(2), [Matrix([1])])
|
|
482
|
+
sage: k.<y> = GF(4) # needs sage.rings.finite_rings
|
|
483
|
+
sage: C.base_extend(k) # needs sage.rings.finite_rings
|
|
484
|
+
Finite-dimensional algebra of degree 1 over Finite Field in y of size 2^2
|
|
485
|
+
"""
|
|
486
|
+
# Base extension of the multiplication table is done by __classcall_private__.
|
|
487
|
+
return FiniteDimensionalAlgebra(F, self.table())
|
|
488
|
+
|
|
489
|
+
def cardinality(self):
|
|
490
|
+
"""
|
|
491
|
+
Return the cardinality of ``self``.
|
|
492
|
+
|
|
493
|
+
EXAMPLES::
|
|
494
|
+
|
|
495
|
+
sage: A = FiniteDimensionalAlgebra(GF(7), [Matrix([[1, 0], [0, 1]]),
|
|
496
|
+
....: Matrix([[0, 1], [2, 3]])])
|
|
497
|
+
sage: A.cardinality()
|
|
498
|
+
49
|
|
499
|
+
|
|
500
|
+
sage: B = FiniteDimensionalAlgebra(RR, [Matrix([[1, 0], [0, 1]]),
|
|
501
|
+
....: Matrix([[0, 1], [2, 3]])])
|
|
502
|
+
sage: B.cardinality()
|
|
503
|
+
+Infinity
|
|
504
|
+
|
|
505
|
+
sage: C = FiniteDimensionalAlgebra(RR, [])
|
|
506
|
+
sage: C.cardinality()
|
|
507
|
+
1
|
|
508
|
+
"""
|
|
509
|
+
n = self.degree()
|
|
510
|
+
return ZZ.one() if not n else self.base_ring().cardinality() ** n
|
|
511
|
+
|
|
512
|
+
def ideal(self, gens=None, given_by_matrix=False, side=None):
|
|
513
|
+
"""
|
|
514
|
+
Return the right ideal of ``self`` generated by ``gens``.
|
|
515
|
+
|
|
516
|
+
INPUT:
|
|
517
|
+
|
|
518
|
+
- ``A`` -- a :class:`FiniteDimensionalAlgebra`
|
|
519
|
+
|
|
520
|
+
- ``gens`` -- (default: ``None``) either an element of `A` or a
|
|
521
|
+
list of elements of `A`, given as vectors, matrices, or
|
|
522
|
+
FiniteDimensionalAlgebraElements. If ``given_by_matrix`` is
|
|
523
|
+
``True``, then ``gens`` should instead be a matrix whose rows
|
|
524
|
+
form a basis of an ideal of `A`.
|
|
525
|
+
|
|
526
|
+
- ``given_by_matrix`` -- boolean (default: ``False``); if
|
|
527
|
+
``True``, no checking is done
|
|
528
|
+
|
|
529
|
+
- ``side`` -- ignored but necessary for coercions
|
|
530
|
+
|
|
531
|
+
The algebra ``A`` has to be in the category of associative algebras.
|
|
532
|
+
|
|
533
|
+
EXAMPLES::
|
|
534
|
+
|
|
535
|
+
sage: cat = Algebras(GF(3)).FiniteDimensional().WithBasis()
|
|
536
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]]),
|
|
537
|
+
....: Matrix([[0, 1], [0, 0]])],
|
|
538
|
+
....: category=cat)
|
|
539
|
+
sage: A.ideal(A([1,1]))
|
|
540
|
+
Ideal (e0 + e1) of
|
|
541
|
+
Finite-dimensional algebra of degree 2 over Finite Field of size 3
|
|
542
|
+
"""
|
|
543
|
+
return self._ideal_class_()(self, gens=gens,
|
|
544
|
+
given_by_matrix=given_by_matrix)
|
|
545
|
+
|
|
546
|
+
@cached_method
|
|
547
|
+
def is_associative(self):
|
|
548
|
+
"""
|
|
549
|
+
Return ``True`` if ``self`` is associative.
|
|
550
|
+
|
|
551
|
+
EXAMPLES::
|
|
552
|
+
|
|
553
|
+
sage: A = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0], [0,1]]),
|
|
554
|
+
....: Matrix([[0,1], [-1,0]])])
|
|
555
|
+
sage: A.is_associative()
|
|
556
|
+
True
|
|
557
|
+
|
|
558
|
+
sage: B = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0,0], [0,1,0], [0,0,1]]),
|
|
559
|
+
....: Matrix([[0,1,0], [0,0,0], [0,0,0]]),
|
|
560
|
+
....: Matrix([[0,0,1], [0,0,0], [1,0,0]])])
|
|
561
|
+
sage: B.is_associative()
|
|
562
|
+
False
|
|
563
|
+
|
|
564
|
+
sage: e = B.basis()
|
|
565
|
+
sage: (e[1]*e[2])*e[2]==e[1]*(e[2]*e[2])
|
|
566
|
+
False
|
|
567
|
+
"""
|
|
568
|
+
B = self.table()
|
|
569
|
+
n = self.degree()
|
|
570
|
+
for i in range(n):
|
|
571
|
+
for j in range(n):
|
|
572
|
+
eiej = B[j][i]
|
|
573
|
+
if B[i]*B[j] != sum(eiej[k] * B[k] for k in range(n)):
|
|
574
|
+
return False
|
|
575
|
+
return True
|
|
576
|
+
|
|
577
|
+
@cached_method
|
|
578
|
+
def is_commutative(self) -> bool:
|
|
579
|
+
"""
|
|
580
|
+
Return ``True`` if ``self`` is commutative.
|
|
581
|
+
|
|
582
|
+
EXAMPLES::
|
|
583
|
+
|
|
584
|
+
sage: B = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0,0], [0,1,0], [0,0,0]]),
|
|
585
|
+
....: Matrix([[0,1,0], [0,0,0], [0,0,0]]),
|
|
586
|
+
....: Matrix([[0,0,0], [0,0,0], [0,0,1]])])
|
|
587
|
+
sage: B.is_commutative()
|
|
588
|
+
True
|
|
589
|
+
|
|
590
|
+
sage: C = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0,0], [0,0,0], [0,0,0]]),
|
|
591
|
+
....: Matrix([[0,1,0], [0,0,0], [0,0,0]]),
|
|
592
|
+
....: Matrix([[0,0,0], [0,1,0], [0,0,1]])])
|
|
593
|
+
sage: C.is_commutative()
|
|
594
|
+
False
|
|
595
|
+
"""
|
|
596
|
+
# Equivalent to self.table() == self.left_table()
|
|
597
|
+
B = self.table()
|
|
598
|
+
for i in range(self.degree()):
|
|
599
|
+
for j in range(i):
|
|
600
|
+
if B[j][i] != B[i][j]:
|
|
601
|
+
return False
|
|
602
|
+
return True
|
|
603
|
+
|
|
604
|
+
def is_finite(self):
|
|
605
|
+
"""
|
|
606
|
+
Return ``True`` if the cardinality of ``self`` is finite.
|
|
607
|
+
|
|
608
|
+
EXAMPLES::
|
|
609
|
+
|
|
610
|
+
sage: A = FiniteDimensionalAlgebra(GF(7), [Matrix([[1, 0], [0, 1]]),
|
|
611
|
+
....: Matrix([[0, 1], [2, 3]])])
|
|
612
|
+
sage: A.is_finite()
|
|
613
|
+
True
|
|
614
|
+
|
|
615
|
+
sage: B = FiniteDimensionalAlgebra(RR, [Matrix([[1, 0], [0, 1]]),
|
|
616
|
+
....: Matrix([[0, 1], [2, 3]])])
|
|
617
|
+
sage: B.is_finite()
|
|
618
|
+
False
|
|
619
|
+
|
|
620
|
+
sage: C = FiniteDimensionalAlgebra(RR, [])
|
|
621
|
+
sage: C.is_finite()
|
|
622
|
+
True
|
|
623
|
+
"""
|
|
624
|
+
return self.degree() == 0 or self.base_ring().is_finite()
|
|
625
|
+
|
|
626
|
+
@cached_method
|
|
627
|
+
def is_unitary(self):
|
|
628
|
+
"""
|
|
629
|
+
Return ``True`` if ``self`` has a two-sided multiplicative
|
|
630
|
+
identity element.
|
|
631
|
+
|
|
632
|
+
.. WARNING::
|
|
633
|
+
|
|
634
|
+
This uses linear algebra; thus expect wrong results when
|
|
635
|
+
the base ring is not a field.
|
|
636
|
+
|
|
637
|
+
EXAMPLES::
|
|
638
|
+
|
|
639
|
+
sage: A = FiniteDimensionalAlgebra(QQ, [])
|
|
640
|
+
sage: A.is_unitary()
|
|
641
|
+
True
|
|
642
|
+
|
|
643
|
+
sage: B = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0], [0,1]]),
|
|
644
|
+
....: Matrix([[0,1], [-1,0]])])
|
|
645
|
+
sage: B.is_unitary()
|
|
646
|
+
True
|
|
647
|
+
|
|
648
|
+
sage: C = FiniteDimensionalAlgebra(QQ, [Matrix([[0,0], [0,0]]),
|
|
649
|
+
....: Matrix([[0,0], [0,0]])])
|
|
650
|
+
sage: C.is_unitary()
|
|
651
|
+
False
|
|
652
|
+
|
|
653
|
+
sage: D = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0], [0,1]]),
|
|
654
|
+
....: Matrix([[1,0], [0,1]])])
|
|
655
|
+
sage: D.is_unitary()
|
|
656
|
+
False
|
|
657
|
+
|
|
658
|
+
sage: E = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0],[1,0]]),
|
|
659
|
+
....: Matrix([[0,1],[0,1]])])
|
|
660
|
+
sage: E.is_unitary()
|
|
661
|
+
False
|
|
662
|
+
|
|
663
|
+
sage: F = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0,0], [0,1,0], [0,0,1]]),
|
|
664
|
+
....: Matrix([[0,1,0], [0,0,0], [0,0,0]]),
|
|
665
|
+
....: Matrix([[0,0,1], [0,0,0], [1,0,0]])])
|
|
666
|
+
sage: F.is_unitary()
|
|
667
|
+
True
|
|
668
|
+
|
|
669
|
+
sage: G = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0,0], [0,1,0], [0,0,1]]),
|
|
670
|
+
....: Matrix([[0,1,0], [0,0,0], [0,0,0]]),
|
|
671
|
+
....: Matrix([[0,1,0], [0,0,0], [1,0,0]])])
|
|
672
|
+
sage: G.is_unitary() # Unique right identity, but no left identity.
|
|
673
|
+
False
|
|
674
|
+
"""
|
|
675
|
+
n = self.degree()
|
|
676
|
+
k = self.base_ring()
|
|
677
|
+
if n == 0:
|
|
678
|
+
self._one = matrix(k, 1, n)
|
|
679
|
+
return True
|
|
680
|
+
B1 = reduce(lambda x, y: x.augment(y),
|
|
681
|
+
self._table, matrix(k, n, 0))
|
|
682
|
+
B2 = reduce(lambda x, y: x.augment(y),
|
|
683
|
+
self.left_table(), matrix(k, n, 0))
|
|
684
|
+
# This is the vector obtained by concatenating the rows of the
|
|
685
|
+
# n times n identity matrix:
|
|
686
|
+
kone = k.one()
|
|
687
|
+
kzero = k.zero()
|
|
688
|
+
v = matrix(k, 1, n**2, (n - 1) * ([kone] + n * [kzero]) + [kone])
|
|
689
|
+
try:
|
|
690
|
+
sol1 = B1.solve_left(v)
|
|
691
|
+
except ValueError:
|
|
692
|
+
return False
|
|
693
|
+
if sol1 * B2 != v:
|
|
694
|
+
return False
|
|
695
|
+
self._one = sol1
|
|
696
|
+
return True
|
|
697
|
+
|
|
698
|
+
def is_zero(self):
|
|
699
|
+
"""
|
|
700
|
+
Return ``True`` if ``self`` is the zero ring.
|
|
701
|
+
|
|
702
|
+
EXAMPLES::
|
|
703
|
+
|
|
704
|
+
sage: A = FiniteDimensionalAlgebra(QQ, [])
|
|
705
|
+
sage: A.is_zero()
|
|
706
|
+
True
|
|
707
|
+
|
|
708
|
+
sage: B = FiniteDimensionalAlgebra(GF(7), [Matrix([0])])
|
|
709
|
+
sage: B.is_zero()
|
|
710
|
+
False
|
|
711
|
+
"""
|
|
712
|
+
return self.degree() == 0
|
|
713
|
+
|
|
714
|
+
def one(self):
|
|
715
|
+
"""
|
|
716
|
+
Return the multiplicative identity element of ``self``, if it
|
|
717
|
+
exists.
|
|
718
|
+
|
|
719
|
+
EXAMPLES::
|
|
720
|
+
|
|
721
|
+
sage: A = FiniteDimensionalAlgebra(QQ, [])
|
|
722
|
+
sage: A.one()
|
|
723
|
+
0
|
|
724
|
+
|
|
725
|
+
sage: B = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0], [0,1]]),
|
|
726
|
+
....: Matrix([[0,1], [-1,0]])])
|
|
727
|
+
sage: B.one()
|
|
728
|
+
e0
|
|
729
|
+
|
|
730
|
+
sage: C = FiniteDimensionalAlgebra(QQ, [Matrix([[0,0], [0,0]]),
|
|
731
|
+
....: Matrix([[0,0], [0,0]])])
|
|
732
|
+
sage: C.one()
|
|
733
|
+
Traceback (most recent call last):
|
|
734
|
+
...
|
|
735
|
+
TypeError: algebra is not unitary
|
|
736
|
+
|
|
737
|
+
sage: D = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0,0], [0,1,0], [0,0,1]]),
|
|
738
|
+
....: Matrix([[0,1,0], [0,0,0], [0,0,0]]),
|
|
739
|
+
....: Matrix([[0,0,1], [0,0,0], [1,0,0]])])
|
|
740
|
+
sage: D.one()
|
|
741
|
+
e0
|
|
742
|
+
|
|
743
|
+
sage: E = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0,0], [0,1,0], [0,0,1]]),
|
|
744
|
+
....: Matrix([[0,1,0], [0,0,0], [0,0,0]]),
|
|
745
|
+
....: Matrix([[0,1,0], [0,0,0], [1,0,0]])])
|
|
746
|
+
sage: E.one()
|
|
747
|
+
Traceback (most recent call last):
|
|
748
|
+
...
|
|
749
|
+
TypeError: algebra is not unitary
|
|
750
|
+
"""
|
|
751
|
+
if not self.is_unitary():
|
|
752
|
+
raise TypeError("algebra is not unitary")
|
|
753
|
+
else:
|
|
754
|
+
return self(self._one)
|
|
755
|
+
|
|
756
|
+
def random_element(self, *args, **kwargs):
|
|
757
|
+
"""
|
|
758
|
+
Return a random element of ``self``.
|
|
759
|
+
|
|
760
|
+
Optional input parameters are propagated to the ``random_element``
|
|
761
|
+
method of the underlying :class:`VectorSpace`.
|
|
762
|
+
|
|
763
|
+
EXAMPLES::
|
|
764
|
+
|
|
765
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]]),
|
|
766
|
+
....: Matrix([[0, 1], [0, 0]])])
|
|
767
|
+
sage: A.random_element() # random
|
|
768
|
+
e0 + 2*e1
|
|
769
|
+
|
|
770
|
+
sage: B = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0,0], [0,1,0], [0,0,0]]),
|
|
771
|
+
....: Matrix([[0,1,0], [0,0,0], [0,0,0]]),
|
|
772
|
+
....: Matrix([[0,0,0], [0,0,0], [0,0,1]])])
|
|
773
|
+
sage: B.random_element(num_bound=1000) # random
|
|
774
|
+
215/981*e0 + 709/953*e1 + 931/264*e2
|
|
775
|
+
"""
|
|
776
|
+
return self(self.zero().vector().parent().random_element(*args, **kwargs))
|
|
777
|
+
|
|
778
|
+
def _is_valid_homomorphism_(self, other, im_gens, base_map=None):
|
|
779
|
+
"""
|
|
780
|
+
TESTS::
|
|
781
|
+
|
|
782
|
+
sage: A = FiniteDimensionalAlgebra(QQ, [Matrix([[1, 0], [0, 1]]),
|
|
783
|
+
....: Matrix([[0, 1], [0, 0]])])
|
|
784
|
+
sage: B = FiniteDimensionalAlgebra(QQ, [Matrix([1])])
|
|
785
|
+
sage: Hom(A, B)(Matrix([[1], [0]]))
|
|
786
|
+
Morphism from Finite-dimensional algebra of degree 2 over Rational Field
|
|
787
|
+
to Finite-dimensional algebra of degree 1 over Rational Field given by matrix
|
|
788
|
+
[1]
|
|
789
|
+
[0]
|
|
790
|
+
sage: Hom(B, A)(Matrix([[1, 0]]))
|
|
791
|
+
Morphism from Finite-dimensional algebra of degree 1 over Rational Field
|
|
792
|
+
to Finite-dimensional algebra of degree 2 over Rational Field given by matrix
|
|
793
|
+
[1 0]
|
|
794
|
+
sage: H = Hom(A, A)
|
|
795
|
+
sage: H(Matrix.identity(QQ, 2))
|
|
796
|
+
Morphism from Finite-dimensional algebra of degree 2 over Rational Field
|
|
797
|
+
to Finite-dimensional algebra of degree 2 over Rational Field given by matrix
|
|
798
|
+
[1 0]
|
|
799
|
+
[0 1]
|
|
800
|
+
sage: H(Matrix([[1, 0], [0, 0]]))
|
|
801
|
+
Morphism from Finite-dimensional algebra of degree 2 over Rational Field
|
|
802
|
+
to Finite-dimensional algebra of degree 2 over Rational Field given by matrix
|
|
803
|
+
[1 0]
|
|
804
|
+
[0 0]
|
|
805
|
+
sage: H(Matrix([[1, 0], [1, 1]]))
|
|
806
|
+
Traceback (most recent call last):
|
|
807
|
+
...
|
|
808
|
+
ValueError: relations do not all (canonically) map to 0
|
|
809
|
+
under map determined by images of generators
|
|
810
|
+
sage: Hom(B, B)(Matrix([[2]]))
|
|
811
|
+
Traceback (most recent call last):
|
|
812
|
+
...
|
|
813
|
+
ValueError: relations do not all (canonically) map to 0
|
|
814
|
+
under map determined by images of generators
|
|
815
|
+
"""
|
|
816
|
+
assert len(im_gens) == self.degree()
|
|
817
|
+
|
|
818
|
+
if base_map is None:
|
|
819
|
+
base_map = lambda x: x
|
|
820
|
+
B = self.table()
|
|
821
|
+
for i,gi in enumerate(im_gens):
|
|
822
|
+
for j,gj in enumerate(im_gens):
|
|
823
|
+
eiej = B[j][i]
|
|
824
|
+
if (sum([other(im_gens[k]) * base_map(v) for k,v in enumerate(eiej)])
|
|
825
|
+
!= other(gi) * other(gj)):
|
|
826
|
+
return False
|
|
827
|
+
return True
|
|
828
|
+
|
|
829
|
+
def quotient_map(self, ideal):
|
|
830
|
+
"""
|
|
831
|
+
Return the quotient of ``self`` by ``ideal``.
|
|
832
|
+
|
|
833
|
+
``self`` has to be in the category of associative and unital algebras.
|
|
834
|
+
|
|
835
|
+
INPUT:
|
|
836
|
+
|
|
837
|
+
- ``ideal`` -- a :class:`FiniteDimensionalAlgebraIdeal`
|
|
838
|
+
|
|
839
|
+
OUTPUT:
|
|
840
|
+
|
|
841
|
+
- :class:`~sage.algebras.finite_dimensional_algebras.finite_dimensional_algebra_morphism.FiniteDimensionalAlgebraMorphism`;
|
|
842
|
+
the quotient homomorphism
|
|
843
|
+
|
|
844
|
+
EXAMPLES::
|
|
845
|
+
|
|
846
|
+
sage: cat = Algebras(GF(3)).FiniteDimensional().WithBasis()
|
|
847
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]]),
|
|
848
|
+
....: Matrix([[0, 1], [0, 0]])],
|
|
849
|
+
....: category=cat)
|
|
850
|
+
sage: q0 = A.quotient_map(A.zero_ideal()); q0
|
|
851
|
+
Morphism
|
|
852
|
+
from Finite-dimensional algebra of degree 2 over Finite Field of size 3
|
|
853
|
+
to Finite-dimensional algebra of degree 2 over Finite Field of size 3
|
|
854
|
+
given by matrix
|
|
855
|
+
[1 0]
|
|
856
|
+
[0 1]
|
|
857
|
+
sage: q1 = A.quotient_map(A.ideal(A.gen(1))); q1
|
|
858
|
+
Morphism
|
|
859
|
+
from Finite-dimensional algebra of degree 2 over Finite Field of size 3
|
|
860
|
+
to Finite-dimensional algebra of degree 1 over Finite Field of size 3
|
|
861
|
+
given by matrix
|
|
862
|
+
[1]
|
|
863
|
+
[0]
|
|
864
|
+
"""
|
|
865
|
+
k = self.base_ring()
|
|
866
|
+
f = ideal.basis_matrix().transpose().kernel().basis_matrix().echelon_form().transpose()
|
|
867
|
+
pivots = f.pivot_rows()
|
|
868
|
+
table = []
|
|
869
|
+
for p in pivots:
|
|
870
|
+
v = matrix(k, 1, self.degree())
|
|
871
|
+
v[0,p] = 1
|
|
872
|
+
v = self.element_class(self, v)
|
|
873
|
+
table.append(f.solve_right(v.matrix() * f))
|
|
874
|
+
cat = self.category()
|
|
875
|
+
B = FiniteDimensionalAlgebra(k, table, category=cat)
|
|
876
|
+
return self.hom(f, codomain=B, check=False)
|
|
877
|
+
|
|
878
|
+
def maximal_ideal(self):
|
|
879
|
+
"""
|
|
880
|
+
Compute the maximal ideal of the local algebra ``self``.
|
|
881
|
+
|
|
882
|
+
.. NOTE::
|
|
883
|
+
|
|
884
|
+
``self`` has to be in the category of unitary, commutative
|
|
885
|
+
and associative algebras as in the examples below. It must
|
|
886
|
+
moreover be local (have a unique maximal ideal).
|
|
887
|
+
|
|
888
|
+
OUTPUT:
|
|
889
|
+
|
|
890
|
+
- :class:`~sage.algebras.finite_dimensional_algebras.finite_dimensional_algebra_ideal.FiniteDimensionalAlgebraIdeal`;
|
|
891
|
+
the unique maximal ideal of ``self``. If ``self`` is not a local
|
|
892
|
+
algebra, a :exc:`ValueError` is raised.
|
|
893
|
+
|
|
894
|
+
EXAMPLES::
|
|
895
|
+
|
|
896
|
+
sage: cat = CommutativeAlgebras(GF(3)).FiniteDimensional().WithBasis()
|
|
897
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]]),
|
|
898
|
+
....: Matrix([[0, 1], [0, 0]])],
|
|
899
|
+
....: category=cat)
|
|
900
|
+
sage: A.maximal_ideal() # needs sage.rings.finite_rings
|
|
901
|
+
Ideal (0, e1) of
|
|
902
|
+
Finite-dimensional algebra of degree 2 over Finite Field of size 3
|
|
903
|
+
|
|
904
|
+
sage: cat = CommutativeAlgebras(QQ).FiniteDimensional().WithBasis()
|
|
905
|
+
sage: B = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0,0], [0,1,0], [0,0,0]]),
|
|
906
|
+
....: Matrix([[0,1,0], [0,0,0], [0,0,0]]),
|
|
907
|
+
....: Matrix([[0,0,0], [0,0,0], [0,0,1]])],
|
|
908
|
+
....: category=cat)
|
|
909
|
+
sage: B.maximal_ideal() # needs sage.libs.pari
|
|
910
|
+
Traceback (most recent call last):
|
|
911
|
+
...
|
|
912
|
+
ValueError: algebra is not local
|
|
913
|
+
"""
|
|
914
|
+
if self.degree() == 0:
|
|
915
|
+
raise ValueError("the zero algebra is not local")
|
|
916
|
+
if not (self.is_unitary() and self.is_commutative()
|
|
917
|
+
and (self._assume_associative or self.is_associative())):
|
|
918
|
+
raise TypeError("algebra must be unitary, commutative and associative")
|
|
919
|
+
gens = []
|
|
920
|
+
for x in self.gens():
|
|
921
|
+
f = x.characteristic_polynomial().factor()
|
|
922
|
+
if len(f) != 1:
|
|
923
|
+
raise ValueError("algebra is not local")
|
|
924
|
+
if f[0][1] > 1:
|
|
925
|
+
gens.append(f[0][0](x))
|
|
926
|
+
return FiniteDimensionalAlgebraIdeal(self, gens)
|
|
927
|
+
|
|
928
|
+
def primary_decomposition(self):
|
|
929
|
+
"""
|
|
930
|
+
Return the primary decomposition of ``self``.
|
|
931
|
+
|
|
932
|
+
.. NOTE::
|
|
933
|
+
|
|
934
|
+
``self`` has to be in the category of unitary, commutative
|
|
935
|
+
and associative algebras as in the examples below.
|
|
936
|
+
|
|
937
|
+
OUTPUT:
|
|
938
|
+
|
|
939
|
+
- a list consisting of the quotient maps ``self`` -> `A`,
|
|
940
|
+
with `A` running through the primary factors of ``self``
|
|
941
|
+
|
|
942
|
+
EXAMPLES::
|
|
943
|
+
|
|
944
|
+
sage: cat = CommutativeAlgebras(GF(3)).FiniteDimensional().WithBasis()
|
|
945
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]]),
|
|
946
|
+
....: Matrix([[0, 1], [0, 0]])], category=cat)
|
|
947
|
+
sage: A.primary_decomposition() # needs sage.rings.finite_rings
|
|
948
|
+
[Morphism
|
|
949
|
+
from Finite-dimensional algebra of degree 2 over Finite Field of size 3
|
|
950
|
+
to Finite-dimensional algebra of degree 2 over Finite Field of size 3
|
|
951
|
+
given by matrix [1 0]
|
|
952
|
+
[0 1]]
|
|
953
|
+
|
|
954
|
+
sage: cat = CommutativeAlgebras(QQ).FiniteDimensional().WithBasis()
|
|
955
|
+
sage: B = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0,0], [0,1,0], [0,0,0]]),
|
|
956
|
+
....: Matrix([[0,1,0], [0,0,0], [0,0,0]]),
|
|
957
|
+
....: Matrix([[0,0,0], [0,0,0], [0,0,1]])], category=cat)
|
|
958
|
+
sage: B.primary_decomposition() # needs sage.libs.pari
|
|
959
|
+
[Morphism
|
|
960
|
+
from Finite-dimensional algebra of degree 3 over Rational Field
|
|
961
|
+
to Finite-dimensional algebra of degree 1 over Rational Field
|
|
962
|
+
given by matrix [0]
|
|
963
|
+
[0]
|
|
964
|
+
[1],
|
|
965
|
+
Morphism
|
|
966
|
+
from Finite-dimensional algebra of degree 3 over Rational Field
|
|
967
|
+
to Finite-dimensional algebra of degree 2 over Rational Field
|
|
968
|
+
given by matrix [1 0]
|
|
969
|
+
[0 1]
|
|
970
|
+
[0 0]]
|
|
971
|
+
"""
|
|
972
|
+
k = self.base_ring()
|
|
973
|
+
n = self.degree()
|
|
974
|
+
if n == 0:
|
|
975
|
+
return []
|
|
976
|
+
if not (self.is_unitary() and self.is_commutative()
|
|
977
|
+
and (self._assume_associative or self.is_associative())):
|
|
978
|
+
raise TypeError("algebra must be unitary, commutative and associative")
|
|
979
|
+
# Start with the trivial decomposition of self.
|
|
980
|
+
components = [matrix.identity(k, n)]
|
|
981
|
+
for b in self.table():
|
|
982
|
+
# Use the action of the basis element b to refine our
|
|
983
|
+
# decomposition of self.
|
|
984
|
+
components_new = []
|
|
985
|
+
for c in components:
|
|
986
|
+
# Compute the matrix of b on the component c, find its
|
|
987
|
+
# characteristic polynomial, and factor it.
|
|
988
|
+
b_c = c.solve_left(c * b)
|
|
989
|
+
fact = b_c.characteristic_polynomial().factor()
|
|
990
|
+
if len(fact) == 1:
|
|
991
|
+
components_new.append(c)
|
|
992
|
+
else:
|
|
993
|
+
for f in fact:
|
|
994
|
+
h, a = f
|
|
995
|
+
e = h(b_c) ** a
|
|
996
|
+
ker_e = e.kernel().basis_matrix()
|
|
997
|
+
components_new.append(ker_e * c)
|
|
998
|
+
components = components_new
|
|
999
|
+
quotients = []
|
|
1000
|
+
for i in range(len(components)):
|
|
1001
|
+
I = matrix(k, 0, n)
|
|
1002
|
+
for j,c in enumerate(components):
|
|
1003
|
+
if j != i:
|
|
1004
|
+
I = I.stack(c)
|
|
1005
|
+
quotients.append(self.quotient_map(self.ideal(I, given_by_matrix=True)))
|
|
1006
|
+
return quotients
|
|
1007
|
+
|
|
1008
|
+
def maximal_ideals(self):
|
|
1009
|
+
"""
|
|
1010
|
+
Return a list consisting of all maximal ideals of ``self``.
|
|
1011
|
+
|
|
1012
|
+
The algebra ``self`` has to be in the category of
|
|
1013
|
+
commutative, associative algebras.
|
|
1014
|
+
|
|
1015
|
+
EXAMPLES::
|
|
1016
|
+
|
|
1017
|
+
sage: cat = Algebras(GF(3)).FiniteDimensional().WithBasis()
|
|
1018
|
+
sage: A = FiniteDimensionalAlgebra(GF(3), [Matrix([[1, 0], [0, 1]]),
|
|
1019
|
+
....: Matrix([[0, 1], [0, 0]])], category=cat)
|
|
1020
|
+
sage: A.maximal_ideals() # needs sage.rings.finite_rings
|
|
1021
|
+
[Ideal (e1) of Finite-dimensional algebra of degree 2 over Finite Field of size 3]
|
|
1022
|
+
|
|
1023
|
+
sage: cat = Algebras(QQ).FiniteDimensional().WithBasis()
|
|
1024
|
+
sage: B = FiniteDimensionalAlgebra(QQ, [], category=cat)
|
|
1025
|
+
sage: B.maximal_ideals()
|
|
1026
|
+
[]
|
|
1027
|
+
"""
|
|
1028
|
+
P = self.primary_decomposition()
|
|
1029
|
+
return [f.inverse_image(f.codomain().maximal_ideal()) for f in P]
|