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,844 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
Discrete Fourier Transforms
|
|
4
|
+
|
|
5
|
+
This file contains functions useful for computing discrete Fourier
|
|
6
|
+
transforms and probability distribution functions for discrete random
|
|
7
|
+
variables for sequences of elements of `\QQ` or `\CC`, indexed by a
|
|
8
|
+
``range(N)``, `\ZZ / N \ZZ`, an abelian group, the conjugacy classes
|
|
9
|
+
of a permutation group, or the conjugacy classes of a matrix group.
|
|
10
|
+
|
|
11
|
+
This file implements:
|
|
12
|
+
|
|
13
|
+
- :meth:`__eq__`
|
|
14
|
+
|
|
15
|
+
- :meth:`__mul__` (for right multiplication by a scalar)
|
|
16
|
+
|
|
17
|
+
- plotting, printing -- :meth:`IndexedSequence.plot`,
|
|
18
|
+
:meth:`IndexedSequence.plot_histogram`, :meth:`_repr_`, :meth:`__str__`
|
|
19
|
+
|
|
20
|
+
- :meth:`dft` -- computes the discrete Fourier transform for the following cases:
|
|
21
|
+
|
|
22
|
+
* a sequence (over `\QQ` or :class:`CyclotomicField`) indexed by ``range(N)``
|
|
23
|
+
or `\ZZ / N \ZZ`
|
|
24
|
+
* a sequence (as above) indexed by a finite abelian group
|
|
25
|
+
* a sequence (as above) indexed by a complete set of representatives of
|
|
26
|
+
the conjugacy classes of a finite permutation group
|
|
27
|
+
* a sequence (as above) indexed by a complete set of representatives of
|
|
28
|
+
the conjugacy classes of a finite matrix group
|
|
29
|
+
|
|
30
|
+
- :meth:`idft` -- computes the discrete Fourier transform for the following cases:
|
|
31
|
+
|
|
32
|
+
* a sequence (over `\QQ` or CyclotomicField) indexed by ``range(N)`` or
|
|
33
|
+
`\ZZ / N \ZZ`
|
|
34
|
+
|
|
35
|
+
- :meth:`dct`, :meth:`dst` (for discrete Fourier/Cosine/Sine transform)
|
|
36
|
+
|
|
37
|
+
- convolution (in :meth:`IndexedSequence.convolution` and
|
|
38
|
+
:meth:`IndexedSequence.convolution_periodic`)
|
|
39
|
+
|
|
40
|
+
- :meth:`fft`, :meth:`ifft` -- (fast Fourier transforms) wrapping GSL's
|
|
41
|
+
``gsl_fft_complex_forward()``, ``gsl_fft_complex_inverse()``,
|
|
42
|
+
using William Stein's :func:`FastFourierTransform`
|
|
43
|
+
|
|
44
|
+
- :meth:`dwt`, :meth:`idwt` -- (fast wavelet transforms) wrapping GSL's ``gsl_dwt_forward()``,
|
|
45
|
+
``gsl_dwt_backward()`` using Joshua Kantor's :func:`WaveletTransform` class.
|
|
46
|
+
Allows for wavelets of type:
|
|
47
|
+
|
|
48
|
+
* "haar"
|
|
49
|
+
* "daubechies"
|
|
50
|
+
* "daubechies_centered"
|
|
51
|
+
* "haar_centered"
|
|
52
|
+
* "bspline"
|
|
53
|
+
* "bspline_centered"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
.. TODO::
|
|
57
|
+
|
|
58
|
+
- "filtered" DFTs
|
|
59
|
+
- more idfts
|
|
60
|
+
- more examples for probability, stats, theory of FTs
|
|
61
|
+
|
|
62
|
+
AUTHORS:
|
|
63
|
+
|
|
64
|
+
- David Joyner (2006-10)
|
|
65
|
+
|
|
66
|
+
- William Stein (2006-11) -- fix many bugs
|
|
67
|
+
"""
|
|
68
|
+
##########################################################################
|
|
69
|
+
# Copyright (C) 2006 David Joyner <wdjoyner@gmail.com>
|
|
70
|
+
#
|
|
71
|
+
# Distributed under the terms of the GNU General Public License (GPL):
|
|
72
|
+
#
|
|
73
|
+
# https://www.gnu.org/licenses/
|
|
74
|
+
##########################################################################
|
|
75
|
+
from sage.functions.trig import sin, cos
|
|
76
|
+
from sage.misc.lazy_import import lazy_import
|
|
77
|
+
from sage.rings.integer import Integer
|
|
78
|
+
from sage.rings.integer_ring import ZZ
|
|
79
|
+
from sage.rings.rational_field import QQ
|
|
80
|
+
from sage.structure.sage_object import SageObject
|
|
81
|
+
from sage.structure.sequence import Sequence
|
|
82
|
+
|
|
83
|
+
lazy_import("sage.calculus.transforms.dwt", "WaveletTransform")
|
|
84
|
+
lazy_import("sage.calculus.transforms.fft", "FastFourierTransform")
|
|
85
|
+
lazy_import("sage.groups.abelian_gps.abelian_group", "AbelianGroup")
|
|
86
|
+
lazy_import("sage.groups.perm_gps.permgroup_element", "PermutationGroupElement")
|
|
87
|
+
lazy_import("sage.plot.all", ["polygon", "line", "text"])
|
|
88
|
+
lazy_import("sage.rings.number_field.number_field", "CyclotomicField")
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class IndexedSequence(SageObject):
|
|
92
|
+
"""
|
|
93
|
+
An indexed sequence.
|
|
94
|
+
|
|
95
|
+
INPUT:
|
|
96
|
+
|
|
97
|
+
- ``L`` -- list
|
|
98
|
+
|
|
99
|
+
- ``index_object`` -- must be a Sage object with an ``__iter__`` method
|
|
100
|
+
containing the same number of elements as ``self``, which is a
|
|
101
|
+
list of elements taken from a field
|
|
102
|
+
"""
|
|
103
|
+
def __init__(self, L, index_object):
|
|
104
|
+
r"""
|
|
105
|
+
Initialize ``self``.
|
|
106
|
+
|
|
107
|
+
EXAMPLES::
|
|
108
|
+
|
|
109
|
+
sage: J = list(range(10))
|
|
110
|
+
sage: A = [1/10 for j in J]
|
|
111
|
+
sage: s = IndexedSequence(A,J)
|
|
112
|
+
sage: s
|
|
113
|
+
Indexed sequence: [1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10]
|
|
114
|
+
indexed by [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
115
|
+
sage: s.dict()
|
|
116
|
+
{0: 1/10,
|
|
117
|
+
1: 1/10,
|
|
118
|
+
2: 1/10,
|
|
119
|
+
3: 1/10,
|
|
120
|
+
4: 1/10,
|
|
121
|
+
5: 1/10,
|
|
122
|
+
6: 1/10,
|
|
123
|
+
7: 1/10,
|
|
124
|
+
8: 1/10,
|
|
125
|
+
9: 1/10}
|
|
126
|
+
sage: s.list()
|
|
127
|
+
[1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10]
|
|
128
|
+
sage: s.index_object()
|
|
129
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
130
|
+
sage: s.base_ring()
|
|
131
|
+
Rational Field
|
|
132
|
+
"""
|
|
133
|
+
try:
|
|
134
|
+
ind = index_object.list()
|
|
135
|
+
except AttributeError:
|
|
136
|
+
ind = list(index_object)
|
|
137
|
+
self._index_object = index_object
|
|
138
|
+
self._list = Sequence(L)
|
|
139
|
+
self._base_ring = self._list.universe()
|
|
140
|
+
dict = {}
|
|
141
|
+
for i in range(len(ind)):
|
|
142
|
+
dict[ind[i]] = L[i]
|
|
143
|
+
self._dict = dict
|
|
144
|
+
|
|
145
|
+
def dict(self):
|
|
146
|
+
"""
|
|
147
|
+
Return a python dict of ``self`` where the keys are elements in the
|
|
148
|
+
indexing set.
|
|
149
|
+
|
|
150
|
+
EXAMPLES::
|
|
151
|
+
|
|
152
|
+
sage: J = list(range(10))
|
|
153
|
+
sage: A = [1/10 for j in J]
|
|
154
|
+
sage: s = IndexedSequence(A,J)
|
|
155
|
+
sage: s.dict()
|
|
156
|
+
{0: 1/10, 1: 1/10, 2: 1/10, 3: 1/10, 4: 1/10, 5: 1/10, 6: 1/10, 7: 1/10, 8: 1/10, 9: 1/10}
|
|
157
|
+
"""
|
|
158
|
+
return self._dict
|
|
159
|
+
|
|
160
|
+
def list(self):
|
|
161
|
+
"""
|
|
162
|
+
Return the list of ``self``.
|
|
163
|
+
|
|
164
|
+
EXAMPLES::
|
|
165
|
+
|
|
166
|
+
sage: J = list(range(10))
|
|
167
|
+
sage: A = [1/10 for j in J]
|
|
168
|
+
sage: s = IndexedSequence(A,J)
|
|
169
|
+
sage: s.list()
|
|
170
|
+
[1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10]
|
|
171
|
+
"""
|
|
172
|
+
return self._list
|
|
173
|
+
|
|
174
|
+
def base_ring(self):
|
|
175
|
+
r"""
|
|
176
|
+
This just returns the common parent `R` of the `N` list
|
|
177
|
+
elements. In some applications (say, when computing the
|
|
178
|
+
discrete Fourier transform, dft), it is more accurate to think
|
|
179
|
+
of the base_ring as the group ring `\QQ(\zeta_N)[R]`.
|
|
180
|
+
|
|
181
|
+
EXAMPLES::
|
|
182
|
+
|
|
183
|
+
sage: J = list(range(10))
|
|
184
|
+
sage: A = [1/10 for j in J]
|
|
185
|
+
sage: s = IndexedSequence(A,J)
|
|
186
|
+
sage: s.base_ring()
|
|
187
|
+
Rational Field
|
|
188
|
+
"""
|
|
189
|
+
return self._base_ring
|
|
190
|
+
|
|
191
|
+
def index_object(self):
|
|
192
|
+
"""
|
|
193
|
+
Return the indexing object.
|
|
194
|
+
|
|
195
|
+
EXAMPLES::
|
|
196
|
+
|
|
197
|
+
sage: J = list(range(10))
|
|
198
|
+
sage: A = [1/10 for j in J]
|
|
199
|
+
sage: s = IndexedSequence(A,J)
|
|
200
|
+
sage: s.index_object()
|
|
201
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
202
|
+
"""
|
|
203
|
+
return self._index_object
|
|
204
|
+
|
|
205
|
+
def _repr_(self):
|
|
206
|
+
"""
|
|
207
|
+
Implement print method.
|
|
208
|
+
|
|
209
|
+
EXAMPLES::
|
|
210
|
+
|
|
211
|
+
sage: A = [ZZ(i) for i in range(3)]
|
|
212
|
+
sage: I = list(range(3))
|
|
213
|
+
sage: s = IndexedSequence(A,I)
|
|
214
|
+
sage: s
|
|
215
|
+
Indexed sequence: [0, 1, 2]
|
|
216
|
+
indexed by [0, 1, 2]
|
|
217
|
+
sage: print(s)
|
|
218
|
+
Indexed sequence: [0, 1, 2]
|
|
219
|
+
indexed by [0, 1, 2]
|
|
220
|
+
sage: I = GF(3)
|
|
221
|
+
sage: A = [i^2 for i in I]
|
|
222
|
+
sage: s = IndexedSequence(A,I); s
|
|
223
|
+
Indexed sequence: [0, 1, 1]
|
|
224
|
+
indexed by Finite Field of size 3
|
|
225
|
+
"""
|
|
226
|
+
return "Indexed sequence: " + str(self.list()) + "\n indexed by " + str(self.index_object())
|
|
227
|
+
|
|
228
|
+
def plot_histogram(self, clr=(0, 0, 1), eps=0.4):
|
|
229
|
+
r"""
|
|
230
|
+
Plot the histogram plot of the sequence.
|
|
231
|
+
|
|
232
|
+
The sequence is assumed to be real or from a finite field,
|
|
233
|
+
with a real indexing set ``I`` coercible into `\RR`.
|
|
234
|
+
|
|
235
|
+
Options are ``clr``, which is an RGB value, and ``eps``, which
|
|
236
|
+
is the spacing between the bars.
|
|
237
|
+
|
|
238
|
+
EXAMPLES::
|
|
239
|
+
|
|
240
|
+
sage: J = list(range(3))
|
|
241
|
+
sage: A = [ZZ(i^2)+1 for i in J]
|
|
242
|
+
sage: s = IndexedSequence(A,J)
|
|
243
|
+
sage: P = s.plot_histogram() # needs sage.plot
|
|
244
|
+
sage: show(P) # not tested # needs sage.plot
|
|
245
|
+
"""
|
|
246
|
+
from sage.rings.real_mpfr import RR
|
|
247
|
+
# elements must be coercible into RR
|
|
248
|
+
I = self.index_object()
|
|
249
|
+
N = len(I)
|
|
250
|
+
S = self.list()
|
|
251
|
+
P = [polygon([[RR(I[i]) - eps, 0],
|
|
252
|
+
[RR(I[i]) - eps, RR(S[i])],
|
|
253
|
+
[RR(I[i]) + eps, RR(S[i])],
|
|
254
|
+
[RR(I[i]) + eps, 0],
|
|
255
|
+
[RR(I[i]), 0]], rgbcolor=clr) for i in range(N)]
|
|
256
|
+
T = [text(str(I[i]), (RR(I[i]), -0.8), fontsize=15, rgbcolor=(1, 0, 0))
|
|
257
|
+
for i in range(N)]
|
|
258
|
+
return sum(P) + sum(T)
|
|
259
|
+
|
|
260
|
+
def plot(self):
|
|
261
|
+
"""
|
|
262
|
+
Plot the points of the sequence.
|
|
263
|
+
|
|
264
|
+
Elements of the sequence are assumed to be real or from a
|
|
265
|
+
finite field, with a real indexing set ``I = range(len(self))``.
|
|
266
|
+
|
|
267
|
+
EXAMPLES::
|
|
268
|
+
|
|
269
|
+
sage: I = list(range(3))
|
|
270
|
+
sage: A = [ZZ(i^2)+1 for i in I]
|
|
271
|
+
sage: s = IndexedSequence(A,I)
|
|
272
|
+
sage: P = s.plot() # needs sage.plot
|
|
273
|
+
sage: show(P) # not tested # needs sage.plot
|
|
274
|
+
"""
|
|
275
|
+
from sage.rings.real_mpfr import RR
|
|
276
|
+
# elements must be coercible into RR
|
|
277
|
+
I = self.index_object()
|
|
278
|
+
S = self.list()
|
|
279
|
+
return line([[RR(I[i]), RR(S[i])] for i in range(len(I) - 1)])
|
|
280
|
+
|
|
281
|
+
def dft(self, chi=None):
|
|
282
|
+
r"""
|
|
283
|
+
A discrete Fourier transform "over `\QQ`" using exact
|
|
284
|
+
`N`-th roots of unity.
|
|
285
|
+
|
|
286
|
+
EXAMPLES::
|
|
287
|
+
|
|
288
|
+
sage: J = list(range(6))
|
|
289
|
+
sage: A = [ZZ(1) for i in J]
|
|
290
|
+
sage: s = IndexedSequence(A,J)
|
|
291
|
+
sage: s.dft(lambda x: x^2) # needs sage.rings.number_field
|
|
292
|
+
Indexed sequence: [6, 0, 0, 6, 0, 0]
|
|
293
|
+
indexed by [0, 1, 2, 3, 4, 5]
|
|
294
|
+
sage: s.dft() # needs sage.rings.number_field
|
|
295
|
+
Indexed sequence: [6, 0, 0, 0, 0, 0]
|
|
296
|
+
indexed by [0, 1, 2, 3, 4, 5]
|
|
297
|
+
|
|
298
|
+
sage: # needs sage.combinat sage.groups
|
|
299
|
+
sage: G = SymmetricGroup(3)
|
|
300
|
+
sage: J = G.conjugacy_classes_representatives()
|
|
301
|
+
sage: s = IndexedSequence([1,2,3], J) # 1,2,3 are the values of a class fcn on G
|
|
302
|
+
sage: s.dft() # the "scalar-valued Fourier transform" of this class fcn
|
|
303
|
+
Indexed sequence: [8, 2, 2]
|
|
304
|
+
indexed by [(), (1,2), (1,2,3)]
|
|
305
|
+
|
|
306
|
+
sage: # needs sage.rings.number_field
|
|
307
|
+
sage: J = AbelianGroup(2, [2,3], names='ab')
|
|
308
|
+
sage: s = IndexedSequence([1,2,3,4,5,6], J)
|
|
309
|
+
sage: s.dft() # the precision of output is somewhat random and architecture dependent.
|
|
310
|
+
Indexed sequence: [21.0000000000000,
|
|
311
|
+
-2.99999999999997 - 1.73205080756885*I,
|
|
312
|
+
-2.99999999999999 + 1.73205080756888*I,
|
|
313
|
+
-9.00000000000000 + 0.0000000000000485744257349999*I,
|
|
314
|
+
-0.00000000000000976996261670137 - 0.0000000000000159872115546022*I,
|
|
315
|
+
-0.00000000000000621724893790087 - 0.0000000000000106581410364015*I]
|
|
316
|
+
indexed by Multiplicative Abelian group isomorphic to C2 x C3
|
|
317
|
+
|
|
318
|
+
sage: # needs sage.groups sage.rings.number_field
|
|
319
|
+
sage: J = CyclicPermutationGroup(6)
|
|
320
|
+
sage: s = IndexedSequence([1,2,3,4,5,6], J)
|
|
321
|
+
sage: s.dft() # the precision of output is somewhat random and architecture dependent.
|
|
322
|
+
Indexed sequence: [21.0000000000000,
|
|
323
|
+
-2.99999999999997 - 1.73205080756885*I,
|
|
324
|
+
-2.99999999999999 + 1.73205080756888*I,
|
|
325
|
+
-9.00000000000000 + 0.0000000000000485744257349999*I,
|
|
326
|
+
-0.00000000000000976996261670137 - 0.0000000000000159872115546022*I,
|
|
327
|
+
-0.00000000000000621724893790087 - 0.0000000000000106581410364015*I]
|
|
328
|
+
indexed by Cyclic group of order 6 as a permutation group
|
|
329
|
+
|
|
330
|
+
sage: # needs sage.rings.number_field
|
|
331
|
+
sage: p = 7; J = list(range(p)); A = [kronecker_symbol(j,p) for j in J]
|
|
332
|
+
sage: s = IndexedSequence(A, J)
|
|
333
|
+
sage: Fs = s.dft()
|
|
334
|
+
sage: c = Fs.list()[1]; [x/c for x in Fs.list()]; s.list()
|
|
335
|
+
[0, 1, 1, -1, 1, -1, -1]
|
|
336
|
+
[0, 1, 1, -1, 1, -1, -1]
|
|
337
|
+
|
|
338
|
+
The DFT of the values of the quadratic residue symbol is itself, up to
|
|
339
|
+
a constant factor (denoted c on the last line above).
|
|
340
|
+
|
|
341
|
+
.. TODO::
|
|
342
|
+
|
|
343
|
+
Read the parent of the elements of S; if `\QQ` or `\CC` leave as
|
|
344
|
+
is; if AbelianGroup, use abelian_group_dual; if some other
|
|
345
|
+
implemented Group (permutation, matrix), call .characters()
|
|
346
|
+
and test if the index list is the set of conjugacy classes.
|
|
347
|
+
"""
|
|
348
|
+
if chi is None:
|
|
349
|
+
chi = lambda x: x
|
|
350
|
+
J = self.index_object() # index set of length N
|
|
351
|
+
N = len(J)
|
|
352
|
+
S = self.list()
|
|
353
|
+
F = self.base_ring() # elements must be coercible into QQ(zeta_N)
|
|
354
|
+
if J[0] not in ZZ:
|
|
355
|
+
G = J[0].parent() # if J is not a range it is a group G
|
|
356
|
+
if J[0] in ZZ and F.base_ring().fraction_field() == QQ:
|
|
357
|
+
# assumes J is range(N)
|
|
358
|
+
zeta = CyclotomicField(N).gen()
|
|
359
|
+
FT = [sum([S[i] * chi(zeta**(i * j)) for i in J]) for j in J]
|
|
360
|
+
elif (J[0] not in ZZ) and G.is_abelian() and F == ZZ or (F.is_field() and F.base_ring() == QQ):
|
|
361
|
+
if isinstance(J[0], PermutationGroupElement):
|
|
362
|
+
# J is a CyclicPermGp
|
|
363
|
+
n = G.order()
|
|
364
|
+
a = list(n.factor())
|
|
365
|
+
invs = [x[0]**x[1] for x in a]
|
|
366
|
+
G = AbelianGroup(len(a), invs)
|
|
367
|
+
# assumes J is AbelianGroup(...)
|
|
368
|
+
Gd = G.dual_group()
|
|
369
|
+
FT = [sum([S[i] * chid(G.list()[i]) for i in range(N)])
|
|
370
|
+
for chid in Gd]
|
|
371
|
+
elif (J[0] not in ZZ) and G.is_finite() and F == ZZ or (F.is_field() and F.base_ring() == QQ):
|
|
372
|
+
# assumes J is the list of conj class representatives of a
|
|
373
|
+
# PermutationGroup(...) or Matrixgroup(...)
|
|
374
|
+
chi = G.character_table()
|
|
375
|
+
FT = [sum([S[i] * chi[i, j] for i in range(N)]) for j in range(N)]
|
|
376
|
+
else:
|
|
377
|
+
raise ValueError(f"list elements must be in QQ(zeta_{N})")
|
|
378
|
+
return IndexedSequence(FT, J)
|
|
379
|
+
|
|
380
|
+
def idft(self):
|
|
381
|
+
r"""
|
|
382
|
+
A discrete inverse Fourier transform. Only works over `\QQ`.
|
|
383
|
+
|
|
384
|
+
EXAMPLES::
|
|
385
|
+
|
|
386
|
+
sage: J = list(range(5))
|
|
387
|
+
sage: A = [ZZ(1) for i in J]
|
|
388
|
+
sage: s = IndexedSequence(A,J)
|
|
389
|
+
sage: fs = s.dft(); fs # needs sage.rings.number_field
|
|
390
|
+
Indexed sequence: [5, 0, 0, 0, 0]
|
|
391
|
+
indexed by [0, 1, 2, 3, 4]
|
|
392
|
+
sage: it = fs.idft(); it # needs sage.rings.number_field
|
|
393
|
+
Indexed sequence: [1, 1, 1, 1, 1]
|
|
394
|
+
indexed by [0, 1, 2, 3, 4]
|
|
395
|
+
sage: it == s # needs sage.rings.number_field
|
|
396
|
+
True
|
|
397
|
+
"""
|
|
398
|
+
F = self.base_ring() # elements must be coercible into QQ(zeta_N)
|
|
399
|
+
J = self.index_object() # must be = range(N)
|
|
400
|
+
N = len(J)
|
|
401
|
+
S = self.list()
|
|
402
|
+
zeta = CyclotomicField(N).gen()
|
|
403
|
+
iFT = [sum([S[i] * zeta**(-i * j) for i in J]) for j in J]
|
|
404
|
+
if (J[0] not in ZZ) or F.base_ring().fraction_field() != QQ:
|
|
405
|
+
raise NotImplementedError("Sorry this type of idft is not implemented yet.")
|
|
406
|
+
return IndexedSequence(iFT, J) * (Integer(1) / N)
|
|
407
|
+
|
|
408
|
+
def dct(self):
|
|
409
|
+
"""
|
|
410
|
+
A discrete Cosine transform.
|
|
411
|
+
|
|
412
|
+
EXAMPLES::
|
|
413
|
+
|
|
414
|
+
sage: J = list(range(5))
|
|
415
|
+
sage: A = [exp(-2*pi*i*I/5) for i in J] # needs sage.symbolic
|
|
416
|
+
sage: s = IndexedSequence(A, J) # needs sage.symbolic
|
|
417
|
+
sage: s.dct() # needs sage.symbolic
|
|
418
|
+
Indexed sequence: [0, 1/16*(sqrt(5) + I*sqrt(-2*sqrt(5) + 10) + ...
|
|
419
|
+
indexed by [0, 1, 2, 3, 4]
|
|
420
|
+
"""
|
|
421
|
+
F = self.base_ring() # elements must be coercible into RR
|
|
422
|
+
try:
|
|
423
|
+
pi = F.pi()
|
|
424
|
+
except AttributeError:
|
|
425
|
+
from sage.symbolic.constants import pi
|
|
426
|
+
pi = F(pi)
|
|
427
|
+
|
|
428
|
+
J = self.index_object() # must be = range(N)
|
|
429
|
+
N = len(J)
|
|
430
|
+
S = self.list()
|
|
431
|
+
PI = 2 * pi / N
|
|
432
|
+
FT = [sum([S[i] * cos(PI * i * j) for i in J]) for j in J]
|
|
433
|
+
return IndexedSequence(FT, J)
|
|
434
|
+
|
|
435
|
+
def dst(self):
|
|
436
|
+
"""
|
|
437
|
+
A discrete Sine transform.
|
|
438
|
+
|
|
439
|
+
EXAMPLES::
|
|
440
|
+
|
|
441
|
+
sage: J = list(range(5))
|
|
442
|
+
sage: I = CC.0; pi = CC.pi()
|
|
443
|
+
sage: A = [exp(-2*pi*i*I/5) for i in J]
|
|
444
|
+
sage: s = IndexedSequence(A, J)
|
|
445
|
+
|
|
446
|
+
sage: s.dst() # discrete sine
|
|
447
|
+
Indexed sequence: [0.000000000000000, 1.11022302462516e-16 - 2.50000000000000*I, ...]
|
|
448
|
+
indexed by [0, 1, 2, 3, 4]
|
|
449
|
+
"""
|
|
450
|
+
F = self.base_ring() # elements must be coercible into RR
|
|
451
|
+
try:
|
|
452
|
+
pi = F.pi()
|
|
453
|
+
except AttributeError:
|
|
454
|
+
from sage.symbolic.constants import pi
|
|
455
|
+
pi = F(pi)
|
|
456
|
+
|
|
457
|
+
J = self.index_object() # must be = range(N)
|
|
458
|
+
N = len(J)
|
|
459
|
+
S = self.list()
|
|
460
|
+
PI = 2 * F(pi) / N
|
|
461
|
+
FT = [sum([S[i] * sin(PI * i * j) for i in J]) for j in J]
|
|
462
|
+
return IndexedSequence(FT, J)
|
|
463
|
+
|
|
464
|
+
def convolution(self, other):
|
|
465
|
+
r"""
|
|
466
|
+
Convolves two sequences of the same length (automatically expands
|
|
467
|
+
the shortest one by extending it by 0 if they have different lengths).
|
|
468
|
+
|
|
469
|
+
If `\{a_n\}` and `\{b_n\}` are sequences indexed by `(n=0,1,...,N-1)`,
|
|
470
|
+
extended by zero for all `n` in `\ZZ`, then the convolution is
|
|
471
|
+
|
|
472
|
+
.. MATH::
|
|
473
|
+
|
|
474
|
+
c_j = \sum_{i=0}^{N-1} a_i b_{j-i}.
|
|
475
|
+
|
|
476
|
+
INPUT:
|
|
477
|
+
|
|
478
|
+
- ``other`` -- a collection of elements of a ring with
|
|
479
|
+
index set a finite abelian group (under `+`)
|
|
480
|
+
|
|
481
|
+
OUTPUT: the Dirichlet convolution of ``self`` and ``other``
|
|
482
|
+
|
|
483
|
+
EXAMPLES::
|
|
484
|
+
|
|
485
|
+
sage: J = list(range(5))
|
|
486
|
+
sage: A = [ZZ(1) for i in J]
|
|
487
|
+
sage: B = [ZZ(1) for i in J]
|
|
488
|
+
sage: s = IndexedSequence(A,J)
|
|
489
|
+
sage: t = IndexedSequence(B,J)
|
|
490
|
+
sage: s.convolution(t)
|
|
491
|
+
[1, 2, 3, 4, 5, 4, 3, 2, 1]
|
|
492
|
+
|
|
493
|
+
AUTHOR: David Joyner (2006-09)
|
|
494
|
+
"""
|
|
495
|
+
S = self.list()
|
|
496
|
+
T = other.list()
|
|
497
|
+
I0 = self.index_object()
|
|
498
|
+
J0 = other.index_object()
|
|
499
|
+
F = self.base_ring()
|
|
500
|
+
E = other.base_ring()
|
|
501
|
+
if F != E:
|
|
502
|
+
raise TypeError("IndexedSequences must have same base ring")
|
|
503
|
+
if I0 != J0:
|
|
504
|
+
raise TypeError("IndexedSequences must have same index set")
|
|
505
|
+
M = len(S)
|
|
506
|
+
N = len(T)
|
|
507
|
+
if M < N: # first, extend by 0 if necessary
|
|
508
|
+
a = [S[i] for i in range(M)] + [F(0) for i in range(2 * N)]
|
|
509
|
+
b = T + [E(0) for i in range(2 * M)]
|
|
510
|
+
if M > N: # python trick - a[-j] is really j from the *right*
|
|
511
|
+
b = [T[i] for i in range(N)] + [E(0) for i in range(2 * M)]
|
|
512
|
+
a = S + [F(0) for i in range(2 * M)]
|
|
513
|
+
if M == N: # so need only extend by 0 to the *right*
|
|
514
|
+
a = S + [F(0) for i in range(2 * M)]
|
|
515
|
+
b = T + [E(0) for i in range(2 * M)]
|
|
516
|
+
N = max(M, N)
|
|
517
|
+
return [sum([a[i] * b[j - i] for i in range(N)])
|
|
518
|
+
for j in range(2 * N - 1)]
|
|
519
|
+
|
|
520
|
+
def convolution_periodic(self, other):
|
|
521
|
+
r"""
|
|
522
|
+
Convolves two collections indexed by a ``range(...)`` of the same
|
|
523
|
+
length (automatically expands the shortest one by extending it
|
|
524
|
+
by 0 if they have different lengths).
|
|
525
|
+
|
|
526
|
+
If `\{a_n\}` and `\{b_n\}` are sequences indexed by `(n=0,1,...,N-1)`,
|
|
527
|
+
extended periodically for all `n` in `\ZZ`, then the convolution is
|
|
528
|
+
|
|
529
|
+
.. MATH::
|
|
530
|
+
|
|
531
|
+
c_j = \sum_{i=0}^{N-1} a_i b_{j-i}.
|
|
532
|
+
|
|
533
|
+
INPUT:
|
|
534
|
+
|
|
535
|
+
- ``other`` -- a sequence of elements of `\CC`, `\RR` or `\GF{q}`
|
|
536
|
+
|
|
537
|
+
OUTPUT: the Dirichlet convolution of ``self`` and ``other``
|
|
538
|
+
|
|
539
|
+
EXAMPLES::
|
|
540
|
+
|
|
541
|
+
sage: I = list(range(5))
|
|
542
|
+
sage: A = [ZZ(1) for i in I]
|
|
543
|
+
sage: B = [ZZ(1) for i in I]
|
|
544
|
+
sage: s = IndexedSequence(A,I)
|
|
545
|
+
sage: t = IndexedSequence(B,I)
|
|
546
|
+
sage: s.convolution_periodic(t)
|
|
547
|
+
[5, 5, 5, 5, 5, 5, 5, 5, 5]
|
|
548
|
+
|
|
549
|
+
AUTHOR: David Joyner (2006-09)
|
|
550
|
+
"""
|
|
551
|
+
S = self.list()
|
|
552
|
+
T = other.list()
|
|
553
|
+
I = self.index_object()
|
|
554
|
+
J = other.index_object()
|
|
555
|
+
F = self.base_ring()
|
|
556
|
+
E = other.base_ring()
|
|
557
|
+
if F != E:
|
|
558
|
+
raise TypeError("IndexedSequences must have same parent")
|
|
559
|
+
if I != J:
|
|
560
|
+
raise TypeError("IndexedSequences must have same index set")
|
|
561
|
+
M = len(S)
|
|
562
|
+
N = len(T)
|
|
563
|
+
if M < N: # first, extend by 0 if necessary
|
|
564
|
+
a = [S[i] for i in range(M)] + [F(0) for i in range(N - M)]
|
|
565
|
+
b = other
|
|
566
|
+
if M > N:
|
|
567
|
+
b = [T[i] for i in range(N)] + [E(0) for i in range(M - N)]
|
|
568
|
+
a = self
|
|
569
|
+
if M == N:
|
|
570
|
+
a = S
|
|
571
|
+
b = T
|
|
572
|
+
N = max(M, N)
|
|
573
|
+
return [sum([a[i] * b[(j - i) % N] for i in range(N)])
|
|
574
|
+
for j in range(2 * N - 1)]
|
|
575
|
+
|
|
576
|
+
def __mul__(self, other):
|
|
577
|
+
"""
|
|
578
|
+
Implement scalar multiplication (on the right).
|
|
579
|
+
|
|
580
|
+
EXAMPLES::
|
|
581
|
+
|
|
582
|
+
sage: J = list(range(5))
|
|
583
|
+
sage: A = [ZZ(1) for i in J]
|
|
584
|
+
sage: s = IndexedSequence(A,J)
|
|
585
|
+
sage: s.base_ring()
|
|
586
|
+
Integer Ring
|
|
587
|
+
sage: t = s*(1/3); t; t.base_ring()
|
|
588
|
+
Indexed sequence: [1/3, 1/3, 1/3, 1/3, 1/3]
|
|
589
|
+
indexed by [0, 1, 2, 3, 4]
|
|
590
|
+
Rational Field
|
|
591
|
+
"""
|
|
592
|
+
S = self.list()
|
|
593
|
+
S1 = [S[i] * other for i in range(len(self.index_object()))]
|
|
594
|
+
return IndexedSequence(S1, self.index_object())
|
|
595
|
+
|
|
596
|
+
def __eq__(self, other):
|
|
597
|
+
"""
|
|
598
|
+
Implement boolean equals.
|
|
599
|
+
|
|
600
|
+
EXAMPLES::
|
|
601
|
+
|
|
602
|
+
sage: J = list(range(5))
|
|
603
|
+
sage: A = [ZZ(1) for i in J]
|
|
604
|
+
sage: s = IndexedSequence(A,J)
|
|
605
|
+
sage: t = s*(1/3)
|
|
606
|
+
sage: t*3 == s
|
|
607
|
+
1
|
|
608
|
+
|
|
609
|
+
.. WARNING::
|
|
610
|
+
|
|
611
|
+
** elements are considered different if they differ
|
|
612
|
+
by ``10^(-8)``, which is pretty arbitrary -- use with CAUTION!! **
|
|
613
|
+
"""
|
|
614
|
+
if type(self) is not type(other):
|
|
615
|
+
return False
|
|
616
|
+
S = self.list()
|
|
617
|
+
T = other.list()
|
|
618
|
+
I = self.index_object()
|
|
619
|
+
J = other.index_object()
|
|
620
|
+
if I != J:
|
|
621
|
+
return False
|
|
622
|
+
for i in I:
|
|
623
|
+
try:
|
|
624
|
+
if abs(S[i] - T[i]) > 10**(-8):
|
|
625
|
+
# tests if they differ as reals -- WHY 10^(-8)???
|
|
626
|
+
return False
|
|
627
|
+
except TypeError:
|
|
628
|
+
pass
|
|
629
|
+
# if F != E: # omitted this test since it
|
|
630
|
+
# return 0 # doesn't take into account coercions -- WHY???
|
|
631
|
+
return True
|
|
632
|
+
|
|
633
|
+
def fft(self):
|
|
634
|
+
"""
|
|
635
|
+
Wraps the gsl ``FastFourierTransform.forward()`` in
|
|
636
|
+
:mod:`~sage.calculus.transforms.fft`.
|
|
637
|
+
|
|
638
|
+
If the length is a power of 2 then this automatically uses the
|
|
639
|
+
radix2 method. If the number of sample points in the input is
|
|
640
|
+
a power of 2 then the wrapper for the GSL function
|
|
641
|
+
``gsl_fft_complex_radix2_forward()`` is automatically called.
|
|
642
|
+
Otherwise, ``gsl_fft_complex_forward()`` is used.
|
|
643
|
+
|
|
644
|
+
EXAMPLES::
|
|
645
|
+
|
|
646
|
+
sage: J = list(range(5))
|
|
647
|
+
sage: A = [RR(1) for i in J]
|
|
648
|
+
sage: s = IndexedSequence(A,J)
|
|
649
|
+
sage: t = s.fft(); t
|
|
650
|
+
Indexed sequence: [5.00000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000]
|
|
651
|
+
indexed by [0, 1, 2, 3, 4]
|
|
652
|
+
"""
|
|
653
|
+
from sage.rings.cc import CC
|
|
654
|
+
I = CC.gen()
|
|
655
|
+
|
|
656
|
+
# elements must be coercible into RR
|
|
657
|
+
J = self.index_object() # must be = range(N)
|
|
658
|
+
N = len(J)
|
|
659
|
+
S = self.list()
|
|
660
|
+
a = FastFourierTransform(N)
|
|
661
|
+
for i in range(N):
|
|
662
|
+
a[i] = S[i]
|
|
663
|
+
a.forward_transform()
|
|
664
|
+
return IndexedSequence([a[j][0] + I * a[j][1] for j in J], J)
|
|
665
|
+
|
|
666
|
+
def ifft(self):
|
|
667
|
+
"""
|
|
668
|
+
Implement the gsl ``FastFourierTransform.inverse`` in
|
|
669
|
+
:mod:`~sage.calculus.transforms.fft`.
|
|
670
|
+
|
|
671
|
+
If the number of sample points in the input is a power of 2
|
|
672
|
+
then the wrapper for the GSL function
|
|
673
|
+
``gsl_fft_complex_radix2_inverse()`` is automatically called.
|
|
674
|
+
Otherwise, ``gsl_fft_complex_inverse()`` is used.
|
|
675
|
+
|
|
676
|
+
EXAMPLES::
|
|
677
|
+
|
|
678
|
+
sage: J = list(range(5))
|
|
679
|
+
sage: A = [RR(1) for i in J]
|
|
680
|
+
sage: s = IndexedSequence(A,J)
|
|
681
|
+
sage: t = s.fft(); t
|
|
682
|
+
Indexed sequence: [5.00000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000]
|
|
683
|
+
indexed by [0, 1, 2, 3, 4]
|
|
684
|
+
sage: t.ifft()
|
|
685
|
+
Indexed sequence: [1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000]
|
|
686
|
+
indexed by [0, 1, 2, 3, 4]
|
|
687
|
+
sage: t.ifft() == s
|
|
688
|
+
1
|
|
689
|
+
"""
|
|
690
|
+
from sage.rings.cc import CC
|
|
691
|
+
I = CC.gen()
|
|
692
|
+
|
|
693
|
+
# elements must be coercible into RR
|
|
694
|
+
J = self.index_object() # must be = range(N)
|
|
695
|
+
N = len(J)
|
|
696
|
+
S = self.list()
|
|
697
|
+
a = FastFourierTransform(N)
|
|
698
|
+
for i in range(N):
|
|
699
|
+
a[i] = S[i]
|
|
700
|
+
a.inverse_transform()
|
|
701
|
+
return IndexedSequence([a[j][0] + I * a[j][1] for j in J], J)
|
|
702
|
+
|
|
703
|
+
def dwt(self, other='haar', wavelet_k=2):
|
|
704
|
+
r"""
|
|
705
|
+
Wraps the gsl ``WaveletTransform.forward`` in :mod:`~sage.calculus.transforms.dwt`
|
|
706
|
+
(written by Joshua Kantor). Assumes the length of the sample is a
|
|
707
|
+
power of 2. Uses the GSL function ``gsl_wavelet_transform_forward()``.
|
|
708
|
+
|
|
709
|
+
INPUT:
|
|
710
|
+
|
|
711
|
+
- ``other`` -- the name of the type of wavelet; valid choices are:
|
|
712
|
+
|
|
713
|
+
* ``'daubechies'``
|
|
714
|
+
* ``'daubechies_centered'``
|
|
715
|
+
* ``'haar'`` (default)
|
|
716
|
+
* ``'haar_centered'``
|
|
717
|
+
* ``'bspline'``
|
|
718
|
+
* ``'bspline_centered'``
|
|
719
|
+
|
|
720
|
+
- ``wavelet_k`` -- for daubechies wavelets, ``wavelet_k`` specifies a
|
|
721
|
+
daubechie wavelet with `k/2` vanishing moments;
|
|
722
|
+
`k = 4,6,...,20` for `k` even are the only ones implemented
|
|
723
|
+
|
|
724
|
+
For Haar wavelets, ``wavelet_k`` must be 2.
|
|
725
|
+
|
|
726
|
+
For bspline wavelets, ``wavelet_k`` equal to `103,105,202,204,
|
|
727
|
+
206,208,301,305,307,309` will give biorthogonal B-spline wavelets
|
|
728
|
+
of order `(i,j)` where ``wavelet_k`` equals `100 \cdot i + j`.
|
|
729
|
+
|
|
730
|
+
The wavelet transform uses `J = \log_2(n)` levels.
|
|
731
|
+
|
|
732
|
+
EXAMPLES::
|
|
733
|
+
|
|
734
|
+
sage: J = list(range(8))
|
|
735
|
+
sage: A = [RR(1) for i in J]
|
|
736
|
+
sage: s = IndexedSequence(A,J)
|
|
737
|
+
sage: t = s.dwt()
|
|
738
|
+
sage: t # slightly random output
|
|
739
|
+
Indexed sequence: [2.82842712474999, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000]
|
|
740
|
+
indexed by [0, 1, 2, 3, 4, 5, 6, 7]
|
|
741
|
+
"""
|
|
742
|
+
from sage.rings.real_mpfr import RR
|
|
743
|
+
# elements must be coercible into RR
|
|
744
|
+
J = self.index_object() # must be = range(N)
|
|
745
|
+
N = len(J) # must be 1 minus a power of 2
|
|
746
|
+
S = self.list()
|
|
747
|
+
if other == "haar" or other == "haar_centered":
|
|
748
|
+
if wavelet_k in [2]:
|
|
749
|
+
a = WaveletTransform(N, other, wavelet_k)
|
|
750
|
+
else:
|
|
751
|
+
raise ValueError("wavelet_k must be = 2")
|
|
752
|
+
if other == "daubechies" or other == "daubechies_centered":
|
|
753
|
+
if wavelet_k in [4, 6, 8, 10, 12, 14, 16, 18, 20]:
|
|
754
|
+
a = WaveletTransform(N, other, wavelet_k)
|
|
755
|
+
else:
|
|
756
|
+
raise ValueError("wavelet_k must be in {4,6,8,10,12,14,16,18,20}")
|
|
757
|
+
if other == "bspline" or other == "bspline_centered":
|
|
758
|
+
if wavelet_k in [103, 105, 202, 204, 206, 208, 301, 305, 307, 309]:
|
|
759
|
+
a = WaveletTransform(N, other, 103)
|
|
760
|
+
else:
|
|
761
|
+
raise ValueError("wavelet_k must be in {103,105,202,204,206,208,301,305,307,309}")
|
|
762
|
+
for i in range(N):
|
|
763
|
+
a[i] = S[i]
|
|
764
|
+
a.forward_transform()
|
|
765
|
+
return IndexedSequence([RR(a[j]) for j in J], J)
|
|
766
|
+
|
|
767
|
+
def idwt(self, other='haar', wavelet_k=2):
|
|
768
|
+
r"""
|
|
769
|
+
Implement the gsl ``WaveletTransform.backward()`` in
|
|
770
|
+
:mod:`~sage.calculus.transforms.dwt`.
|
|
771
|
+
|
|
772
|
+
Assumes the length of the sample is a power of 2. Uses the
|
|
773
|
+
GSL function ``gsl_wavelet_transform_backward()``.
|
|
774
|
+
|
|
775
|
+
INPUT:
|
|
776
|
+
|
|
777
|
+
- ``other`` -- must be one of the following:
|
|
778
|
+
|
|
779
|
+
* ``'haar'``
|
|
780
|
+
* ``'daubechies'``
|
|
781
|
+
* ``'daubechies_centered'``
|
|
782
|
+
* ``'haar_centered'``
|
|
783
|
+
* ``'bspline'``
|
|
784
|
+
* ``'bspline_centered'``
|
|
785
|
+
|
|
786
|
+
- ``wavelet_k`` -- for daubechies wavelets, ``wavelet_k`` specifies a
|
|
787
|
+
daubechie wavelet with `k/2` vanishing moments;
|
|
788
|
+
`k = 4,6,...,20` for `k` even are the only ones implemented
|
|
789
|
+
|
|
790
|
+
For Haar wavelets, ``wavelet_k`` must be 2.
|
|
791
|
+
|
|
792
|
+
For bspline wavelets, ``wavelet_k`` equal to `103,105,202,204,
|
|
793
|
+
206,208,301,305,307,309` will give biorthogonal B-spline wavelets
|
|
794
|
+
of order `(i,j)` where ``wavelet_k`` equals `100 \cdot i + j`.
|
|
795
|
+
|
|
796
|
+
EXAMPLES::
|
|
797
|
+
|
|
798
|
+
sage: J = list(range(8))
|
|
799
|
+
sage: A = [RR(1) for i in J]
|
|
800
|
+
sage: s = IndexedSequence(A,J)
|
|
801
|
+
sage: t = s.dwt()
|
|
802
|
+
sage: t # random arch dependent output
|
|
803
|
+
Indexed sequence: [2.82842712474999, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000]
|
|
804
|
+
indexed by [0, 1, 2, 3, 4, 5, 6, 7]
|
|
805
|
+
sage: t.idwt() # random arch dependent output
|
|
806
|
+
Indexed sequence: [1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000]
|
|
807
|
+
indexed by [0, 1, 2, 3, 4, 5, 6, 7]
|
|
808
|
+
sage: t.idwt() == s
|
|
809
|
+
True
|
|
810
|
+
sage: J = list(range(16))
|
|
811
|
+
sage: A = [RR(1) for i in J]
|
|
812
|
+
sage: s = IndexedSequence(A,J)
|
|
813
|
+
sage: t = s.dwt("bspline", 103)
|
|
814
|
+
sage: t # random arch dependent output
|
|
815
|
+
Indexed sequence: [4.00000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000]
|
|
816
|
+
indexed by [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
|
|
817
|
+
sage: t.idwt("bspline", 103) == s
|
|
818
|
+
True
|
|
819
|
+
"""
|
|
820
|
+
from sage.rings.real_mpfr import RR
|
|
821
|
+
# elements must be coercible into RR
|
|
822
|
+
J = self.index_object() # must be = range(N)
|
|
823
|
+
N = len(J) # must be 1 minus a power of 2
|
|
824
|
+
S = self.list()
|
|
825
|
+
k = wavelet_k
|
|
826
|
+
if other == "haar" or other == "haar_centered":
|
|
827
|
+
if k in [2]:
|
|
828
|
+
a = WaveletTransform(N, other, wavelet_k)
|
|
829
|
+
else:
|
|
830
|
+
raise ValueError("wavelet_k must be = 2")
|
|
831
|
+
if other == "daubechies" or other == "daubechies_centered":
|
|
832
|
+
if k in [4, 6, 8, 10, 12, 14, 16, 18, 20]:
|
|
833
|
+
a = WaveletTransform(N, other, wavelet_k)
|
|
834
|
+
else:
|
|
835
|
+
raise ValueError("wavelet_k must be in {4,6,8,10,12,14,16,18,20}")
|
|
836
|
+
if other == "bspline" or other == "bspline_centered":
|
|
837
|
+
if k in [103, 105, 202, 204, 206, 208, 301, 305, 307, 309]:
|
|
838
|
+
a = WaveletTransform(N, other, 103)
|
|
839
|
+
else:
|
|
840
|
+
raise ValueError("wavelet_k must be in {103,105,202,204,206,208,301,305,307,309}")
|
|
841
|
+
for i in range(N):
|
|
842
|
+
a[i] = S[i]
|
|
843
|
+
a.backward_transform()
|
|
844
|
+
return IndexedSequence([RR(a[j]) for j in J], J)
|