passagemath-categories 10.6.32__cp314-cp314t-musllinux_1_2_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.
- passagemath_categories-10.6.32.dist-info/METADATA +156 -0
- passagemath_categories-10.6.32.dist-info/RECORD +719 -0
- passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
- passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
- passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
- sage/all__sagemath_categories.py +28 -0
- sage/arith/all.py +38 -0
- sage/arith/constants.pxd +27 -0
- sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/functions.pxd +4 -0
- sage/arith/functions.pyx +221 -0
- sage/arith/misc.py +6552 -0
- sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/multi_modular.pxd +39 -0
- sage/arith/multi_modular.pyx +994 -0
- sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/rational_reconstruction.pxd +4 -0
- sage/arith/rational_reconstruction.pyx +115 -0
- sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/srange.pyx +571 -0
- sage/calculus/all__sagemath_categories.py +2 -0
- sage/calculus/functional.py +481 -0
- sage/calculus/functions.py +151 -0
- sage/categories/additive_groups.py +73 -0
- sage/categories/additive_magmas.py +1044 -0
- sage/categories/additive_monoids.py +114 -0
- sage/categories/additive_semigroups.py +184 -0
- sage/categories/affine_weyl_groups.py +238 -0
- sage/categories/algebra_ideals.py +95 -0
- sage/categories/algebra_modules.py +96 -0
- sage/categories/algebras.py +349 -0
- sage/categories/algebras_with_basis.py +377 -0
- sage/categories/all.py +160 -0
- sage/categories/aperiodic_semigroups.py +29 -0
- sage/categories/associative_algebras.py +47 -0
- sage/categories/bialgebras.py +101 -0
- sage/categories/bialgebras_with_basis.py +414 -0
- sage/categories/bimodules.py +206 -0
- sage/categories/chain_complexes.py +268 -0
- sage/categories/classical_crystals.py +480 -0
- sage/categories/coalgebras.py +405 -0
- sage/categories/coalgebras_with_basis.py +232 -0
- sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/coercion_methods.pyx +52 -0
- sage/categories/commutative_additive_groups.py +104 -0
- sage/categories/commutative_additive_monoids.py +45 -0
- sage/categories/commutative_additive_semigroups.py +48 -0
- sage/categories/commutative_algebra_ideals.py +87 -0
- sage/categories/commutative_algebras.py +94 -0
- sage/categories/commutative_ring_ideals.py +58 -0
- sage/categories/commutative_rings.py +736 -0
- sage/categories/complete_discrete_valuation.py +293 -0
- sage/categories/complex_reflection_groups.py +145 -0
- sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
- sage/categories/coxeter_group_algebras.py +186 -0
- sage/categories/coxeter_groups.py +3402 -0
- sage/categories/crystals.py +2628 -0
- sage/categories/cw_complexes.py +216 -0
- sage/categories/dedekind_domains.py +137 -0
- sage/categories/discrete_valuation.py +325 -0
- sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
- sage/categories/division_rings.py +114 -0
- sage/categories/domains.py +95 -0
- sage/categories/drinfeld_modules.py +789 -0
- sage/categories/dual.py +42 -0
- sage/categories/enumerated_sets.py +1146 -0
- sage/categories/euclidean_domains.py +271 -0
- sage/categories/examples/algebras_with_basis.py +102 -0
- sage/categories/examples/all.py +1 -0
- sage/categories/examples/commutative_additive_monoids.py +130 -0
- sage/categories/examples/commutative_additive_semigroups.py +199 -0
- sage/categories/examples/coxeter_groups.py +8 -0
- sage/categories/examples/crystals.py +236 -0
- sage/categories/examples/cw_complexes.py +163 -0
- sage/categories/examples/facade_sets.py +187 -0
- sage/categories/examples/filtered_algebras_with_basis.py +204 -0
- sage/categories/examples/filtered_modules_with_basis.py +154 -0
- sage/categories/examples/finite_coxeter_groups.py +252 -0
- sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
- sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
- sage/categories/examples/finite_enumerated_sets.py +208 -0
- sage/categories/examples/finite_monoids.py +150 -0
- sage/categories/examples/finite_semigroups.py +190 -0
- sage/categories/examples/finite_weyl_groups.py +191 -0
- sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
- sage/categories/examples/graded_modules_with_basis.py +168 -0
- sage/categories/examples/graphs.py +122 -0
- sage/categories/examples/hopf_algebras_with_basis.py +145 -0
- sage/categories/examples/infinite_enumerated_sets.py +190 -0
- sage/categories/examples/lie_algebras.py +352 -0
- sage/categories/examples/lie_algebras_with_basis.py +196 -0
- sage/categories/examples/magmas.py +162 -0
- sage/categories/examples/manifolds.py +94 -0
- sage/categories/examples/monoids.py +144 -0
- sage/categories/examples/posets.py +178 -0
- sage/categories/examples/semigroups.py +580 -0
- sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/examples/semigroups_cython.pyx +221 -0
- sage/categories/examples/semirings.py +249 -0
- sage/categories/examples/sets_cat.py +706 -0
- sage/categories/examples/sets_with_grading.py +101 -0
- sage/categories/examples/with_realizations.py +542 -0
- sage/categories/fields.py +991 -0
- sage/categories/filtered_algebras.py +63 -0
- sage/categories/filtered_algebras_with_basis.py +548 -0
- sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
- sage/categories/filtered_modules.py +210 -0
- sage/categories/filtered_modules_with_basis.py +1209 -0
- sage/categories/finite_complex_reflection_groups.py +1506 -0
- sage/categories/finite_coxeter_groups.py +1138 -0
- sage/categories/finite_crystals.py +103 -0
- sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
- sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
- sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
- sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
- sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
- sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
- sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
- sage/categories/finite_enumerated_sets.py +769 -0
- sage/categories/finite_fields.py +252 -0
- sage/categories/finite_groups.py +256 -0
- sage/categories/finite_lattice_posets.py +242 -0
- sage/categories/finite_monoids.py +316 -0
- sage/categories/finite_permutation_groups.py +339 -0
- sage/categories/finite_posets.py +1994 -0
- sage/categories/finite_semigroups.py +136 -0
- sage/categories/finite_sets.py +93 -0
- sage/categories/finite_weyl_groups.py +39 -0
- sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
- sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
- sage/categories/finitely_generated_magmas.py +57 -0
- sage/categories/finitely_generated_semigroups.py +214 -0
- sage/categories/function_fields.py +76 -0
- sage/categories/g_sets.py +77 -0
- sage/categories/gcd_domains.py +65 -0
- sage/categories/generalized_coxeter_groups.py +94 -0
- sage/categories/graded_algebras.py +85 -0
- sage/categories/graded_algebras_with_basis.py +258 -0
- sage/categories/graded_bialgebras.py +32 -0
- sage/categories/graded_bialgebras_with_basis.py +32 -0
- sage/categories/graded_coalgebras.py +65 -0
- sage/categories/graded_coalgebras_with_basis.py +51 -0
- sage/categories/graded_hopf_algebras.py +41 -0
- sage/categories/graded_hopf_algebras_with_basis.py +169 -0
- sage/categories/graded_lie_algebras.py +91 -0
- sage/categories/graded_lie_algebras_with_basis.py +44 -0
- sage/categories/graded_lie_conformal_algebras.py +74 -0
- sage/categories/graded_modules.py +133 -0
- sage/categories/graded_modules_with_basis.py +329 -0
- sage/categories/graphs.py +138 -0
- sage/categories/group_algebras.py +430 -0
- sage/categories/groupoid.py +94 -0
- sage/categories/groups.py +667 -0
- sage/categories/h_trivial_semigroups.py +64 -0
- sage/categories/hecke_modules.py +185 -0
- sage/categories/highest_weight_crystals.py +980 -0
- sage/categories/hopf_algebras.py +219 -0
- sage/categories/hopf_algebras_with_basis.py +309 -0
- sage/categories/infinite_enumerated_sets.py +115 -0
- sage/categories/integral_domains.py +203 -0
- sage/categories/j_trivial_semigroups.py +29 -0
- sage/categories/kac_moody_algebras.py +82 -0
- sage/categories/kahler_algebras.py +203 -0
- sage/categories/l_trivial_semigroups.py +63 -0
- sage/categories/lambda_bracket_algebras.py +280 -0
- sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
- sage/categories/lattice_posets.py +89 -0
- sage/categories/left_modules.py +49 -0
- sage/categories/lie_algebras.py +1070 -0
- sage/categories/lie_algebras_with_basis.py +261 -0
- sage/categories/lie_conformal_algebras.py +350 -0
- sage/categories/lie_conformal_algebras_with_basis.py +147 -0
- sage/categories/lie_groups.py +73 -0
- sage/categories/loop_crystals.py +1290 -0
- sage/categories/magmas.py +1189 -0
- sage/categories/magmas_and_additive_magmas.py +149 -0
- sage/categories/magmatic_algebras.py +365 -0
- sage/categories/manifolds.py +352 -0
- sage/categories/matrix_algebras.py +40 -0
- sage/categories/metric_spaces.py +387 -0
- sage/categories/modular_abelian_varieties.py +78 -0
- sage/categories/modules.py +989 -0
- sage/categories/modules_with_basis.py +2794 -0
- sage/categories/monoid_algebras.py +38 -0
- sage/categories/monoids.py +739 -0
- sage/categories/noetherian_rings.py +87 -0
- sage/categories/number_fields.py +242 -0
- sage/categories/ore_modules.py +189 -0
- sage/categories/partially_ordered_monoids.py +49 -0
- sage/categories/permutation_groups.py +63 -0
- sage/categories/pointed_sets.py +42 -0
- sage/categories/polyhedra.py +74 -0
- sage/categories/poor_man_map.py +270 -0
- sage/categories/posets.py +722 -0
- sage/categories/principal_ideal_domains.py +270 -0
- sage/categories/quantum_group_representations.py +543 -0
- sage/categories/quotient_fields.py +728 -0
- sage/categories/r_trivial_semigroups.py +45 -0
- sage/categories/regular_crystals.py +898 -0
- sage/categories/regular_supercrystals.py +170 -0
- sage/categories/right_modules.py +49 -0
- sage/categories/ring_ideals.py +74 -0
- sage/categories/rings.py +1904 -0
- sage/categories/rngs.py +175 -0
- sage/categories/schemes.py +393 -0
- sage/categories/semigroups.py +1060 -0
- sage/categories/semirings.py +71 -0
- sage/categories/semisimple_algebras.py +114 -0
- sage/categories/sets_with_grading.py +235 -0
- sage/categories/shephard_groups.py +43 -0
- sage/categories/signed_tensor.py +120 -0
- sage/categories/simplicial_complexes.py +134 -0
- sage/categories/simplicial_sets.py +1206 -0
- sage/categories/super_algebras.py +149 -0
- sage/categories/super_algebras_with_basis.py +144 -0
- sage/categories/super_hopf_algebras_with_basis.py +126 -0
- sage/categories/super_lie_conformal_algebras.py +193 -0
- sage/categories/super_modules.py +229 -0
- sage/categories/super_modules_with_basis.py +193 -0
- sage/categories/supercommutative_algebras.py +99 -0
- sage/categories/supercrystals.py +406 -0
- sage/categories/tensor.py +110 -0
- sage/categories/topological_spaces.py +170 -0
- sage/categories/triangular_kac_moody_algebras.py +439 -0
- sage/categories/tutorial.py +58 -0
- sage/categories/unique_factorization_domains.py +318 -0
- sage/categories/unital_algebras.py +426 -0
- sage/categories/vector_bundles.py +159 -0
- sage/categories/vector_spaces.py +357 -0
- sage/categories/weyl_groups.py +853 -0
- sage/combinat/all__sagemath_categories.py +34 -0
- sage/combinat/backtrack.py +180 -0
- sage/combinat/combinat.py +2269 -0
- sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/combinat_cython.pxd +6 -0
- sage/combinat/combinat_cython.pyx +390 -0
- sage/combinat/combination.py +796 -0
- sage/combinat/combinatorial_map.py +416 -0
- sage/combinat/composition.py +2192 -0
- sage/combinat/dlx.py +510 -0
- sage/combinat/integer_lists/__init__.py +7 -0
- sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/base.pxd +16 -0
- sage/combinat/integer_lists/base.pyx +713 -0
- sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/invlex.pxd +4 -0
- sage/combinat/integer_lists/invlex.pyx +1650 -0
- sage/combinat/integer_lists/lists.py +328 -0
- sage/combinat/integer_lists/nn.py +48 -0
- sage/combinat/integer_vector.py +1818 -0
- sage/combinat/integer_vector_weighted.py +413 -0
- sage/combinat/matrices/all__sagemath_categories.py +5 -0
- sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/matrices/dancing_links.pyx +1159 -0
- sage/combinat/matrices/dancing_links_c.h +380 -0
- sage/combinat/matrices/dlxcpp.py +136 -0
- sage/combinat/partition.py +10070 -0
- sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/partitions.pyx +743 -0
- sage/combinat/permutation.py +10168 -0
- sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/permutation_cython.pxd +11 -0
- sage/combinat/permutation_cython.pyx +407 -0
- sage/combinat/q_analogues.py +1090 -0
- sage/combinat/ranker.py +268 -0
- sage/combinat/subset.py +1561 -0
- sage/combinat/subsets_hereditary.py +202 -0
- sage/combinat/subsets_pairwise.py +184 -0
- sage/combinat/tools.py +63 -0
- sage/combinat/tuple.py +348 -0
- sage/data_structures/all.py +2 -0
- sage/data_structures/all__sagemath_categories.py +2 -0
- sage/data_structures/binary_matrix.pxd +138 -0
- sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/binary_search.pxd +3 -0
- sage/data_structures/binary_search.pyx +66 -0
- sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset.pxd +40 -0
- sage/data_structures/bitset.pyx +2385 -0
- sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset_base.pxd +926 -0
- sage/data_structures/bitset_base.pyx +117 -0
- sage/data_structures/bitset_intrinsics.h +487 -0
- sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/blas_dict.pxd +12 -0
- sage/data_structures/blas_dict.pyx +469 -0
- sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/list_of_pairs.pxd +16 -0
- sage/data_structures/list_of_pairs.pyx +122 -0
- sage/data_structures/mutable_poset.py +3312 -0
- sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/pairing_heap.h +346 -0
- sage/data_structures/pairing_heap.pxd +88 -0
- sage/data_structures/pairing_heap.pyx +1464 -0
- sage/data_structures/sparse_bitset.pxd +62 -0
- sage/data_structures/stream.py +5070 -0
- sage/databases/all__sagemath_categories.py +7 -0
- sage/databases/sql_db.py +2236 -0
- sage/ext/all__sagemath_categories.py +3 -0
- sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_callable.pxd +4 -0
- sage/ext/fast_callable.pyx +2746 -0
- sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_eval.pxd +1 -0
- sage/ext/fast_eval.pyx +102 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_categories.py +2 -0
- sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_el.pxd +18 -0
- sage/ext/interpreters/wrapper_el.pyx +148 -0
- sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_py.pxd +17 -0
- sage/ext/interpreters/wrapper_py.pyx +133 -0
- sage/functions/airy.py +937 -0
- sage/functions/all.py +97 -0
- sage/functions/bessel.py +2102 -0
- sage/functions/error.py +784 -0
- sage/functions/exp_integral.py +1529 -0
- sage/functions/gamma.py +1087 -0
- sage/functions/generalized.py +672 -0
- sage/functions/hyperbolic.py +747 -0
- sage/functions/hypergeometric.py +1156 -0
- sage/functions/jacobi.py +1705 -0
- sage/functions/log.py +1402 -0
- sage/functions/min_max.py +338 -0
- sage/functions/orthogonal_polys.py +3106 -0
- sage/functions/other.py +2303 -0
- sage/functions/piecewise.py +1505 -0
- sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/functions/prime_pi.pyx +262 -0
- sage/functions/special.py +1212 -0
- sage/functions/spike_function.py +278 -0
- sage/functions/transcendental.py +690 -0
- sage/functions/trig.py +1062 -0
- sage/functions/wigner.py +726 -0
- sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/geometry/abc.pyx +82 -0
- sage/geometry/all__sagemath_categories.py +1 -0
- sage/groups/all__sagemath_categories.py +11 -0
- sage/groups/generic.py +1733 -0
- sage/groups/groups_catalog.py +113 -0
- sage/groups/perm_gps/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/all.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
- sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
- sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
- sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
- sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
- sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
- sage/interfaces/abc.py +140 -0
- sage/interfaces/all.py +58 -0
- sage/interfaces/all__sagemath_categories.py +1 -0
- sage/interfaces/expect.py +1643 -0
- sage/interfaces/interface.py +1682 -0
- sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/process.pxd +5 -0
- sage/interfaces/process.pyx +288 -0
- sage/interfaces/quit.py +167 -0
- sage/interfaces/sage0.py +604 -0
- sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/sagespawn.pyx +308 -0
- sage/interfaces/tab_completion.py +101 -0
- sage/misc/all__sagemath_categories.py +78 -0
- sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/allocator.pxd +6 -0
- sage/misc/allocator.pyx +47 -0
- sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/binary_tree.pxd +29 -0
- sage/misc/binary_tree.pyx +537 -0
- sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/callable_dict.pyx +89 -0
- sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/citation.pyx +159 -0
- sage/misc/converting_dict.py +293 -0
- sage/misc/defaults.py +129 -0
- sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/derivative.pyx +223 -0
- sage/misc/functional.py +2005 -0
- sage/misc/html.py +589 -0
- sage/misc/latex.py +2673 -0
- sage/misc/latex_macros.py +236 -0
- sage/misc/latex_standalone.py +1833 -0
- sage/misc/map_threaded.py +38 -0
- sage/misc/mathml.py +76 -0
- sage/misc/method_decorator.py +88 -0
- sage/misc/mrange.py +755 -0
- sage/misc/multireplace.py +41 -0
- sage/misc/object_multiplexer.py +92 -0
- sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/parser.pyx +1107 -0
- sage/misc/random_testing.py +264 -0
- sage/misc/rest_index_of_methods.py +377 -0
- sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/search.pxd +2 -0
- sage/misc/search.pyx +68 -0
- sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/stopgap.pyx +95 -0
- sage/misc/table.py +853 -0
- sage/monoids/all__sagemath_categories.py +1 -0
- sage/monoids/indexed_free_monoid.py +1071 -0
- sage/monoids/monoid.py +82 -0
- sage/numerical/all__sagemath_categories.py +1 -0
- sage/numerical/backends/all__sagemath_categories.py +1 -0
- sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_backend.pxd +61 -0
- sage/numerical/backends/generic_backend.pyx +1893 -0
- sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_sdp_backend.pxd +38 -0
- sage/numerical/backends/generic_sdp_backend.pyx +755 -0
- sage/parallel/all.py +6 -0
- sage/parallel/decorate.py +575 -0
- sage/parallel/map_reduce.py +1997 -0
- sage/parallel/multiprocessing_sage.py +76 -0
- sage/parallel/ncpus.py +35 -0
- sage/parallel/parallelism.py +364 -0
- sage/parallel/reference.py +47 -0
- sage/parallel/use_fork.py +333 -0
- sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/abc.pxd +31 -0
- sage/rings/abc.pyx +526 -0
- sage/rings/algebraic_closure_finite_field.py +1154 -0
- sage/rings/all__sagemath_categories.py +91 -0
- sage/rings/big_oh.py +227 -0
- sage/rings/continued_fraction.py +2754 -0
- sage/rings/continued_fraction_gosper.py +220 -0
- sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/factorint.pyx +295 -0
- sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fast_arith.pxd +21 -0
- sage/rings/fast_arith.pyx +535 -0
- sage/rings/finite_rings/all__sagemath_categories.py +9 -0
- sage/rings/finite_rings/conway_polynomials.py +542 -0
- sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_base.pxd +12 -0
- sage/rings/finite_rings/element_base.pyx +1176 -0
- sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/finite_field_base.pxd +7 -0
- sage/rings/finite_rings/finite_field_base.pyx +2171 -0
- sage/rings/finite_rings/finite_field_constructor.py +827 -0
- sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
- sage/rings/finite_rings/galois_group.py +154 -0
- sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_finite_field.pxd +23 -0
- sage/rings/finite_rings/hom_finite_field.pyx +856 -0
- sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
- sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
- sage/rings/finite_rings/homset.py +357 -0
- sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/integer_mod.pxd +56 -0
- sage/rings/finite_rings/integer_mod.pyx +4586 -0
- sage/rings/finite_rings/integer_mod_limits.h +11 -0
- sage/rings/finite_rings/integer_mod_ring.py +2044 -0
- sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/residue_field.pxd +30 -0
- sage/rings/finite_rings/residue_field.pyx +1811 -0
- sage/rings/finite_rings/stdint.pxd +19 -0
- sage/rings/fraction_field.py +1452 -0
- sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fraction_field_element.pyx +1357 -0
- sage/rings/function_field/all.py +7 -0
- sage/rings/function_field/all__sagemath_categories.py +2 -0
- sage/rings/function_field/constructor.py +218 -0
- sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element.pxd +11 -0
- sage/rings/function_field/element.pyx +1008 -0
- sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element_rational.pyx +513 -0
- sage/rings/function_field/extensions.py +230 -0
- sage/rings/function_field/function_field.py +1468 -0
- sage/rings/function_field/function_field_rational.py +1005 -0
- sage/rings/function_field/ideal.py +1155 -0
- sage/rings/function_field/ideal_rational.py +629 -0
- sage/rings/function_field/jacobian_base.py +826 -0
- sage/rings/function_field/jacobian_hess.py +1053 -0
- sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
- sage/rings/function_field/maps.py +1039 -0
- sage/rings/function_field/order.py +281 -0
- sage/rings/function_field/order_basis.py +586 -0
- sage/rings/function_field/order_rational.py +576 -0
- sage/rings/function_field/place.py +426 -0
- sage/rings/function_field/place_rational.py +181 -0
- sage/rings/generic.py +320 -0
- sage/rings/homset.py +332 -0
- sage/rings/ideal.py +1885 -0
- sage/rings/ideal_monoid.py +215 -0
- sage/rings/infinity.py +1890 -0
- sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer.pxd +45 -0
- sage/rings/integer.pyx +7874 -0
- sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer_ring.pxd +8 -0
- sage/rings/integer_ring.pyx +1693 -0
- sage/rings/laurent_series_ring.py +931 -0
- sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/laurent_series_ring_element.pxd +11 -0
- sage/rings/laurent_series_ring_element.pyx +1927 -0
- sage/rings/lazy_series.py +7815 -0
- sage/rings/lazy_series_ring.py +4356 -0
- sage/rings/localization.py +1043 -0
- sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/morphism.pxd +39 -0
- sage/rings/morphism.pyx +3299 -0
- sage/rings/multi_power_series_ring.py +1145 -0
- sage/rings/multi_power_series_ring_element.py +2184 -0
- sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/noncommutative_ideals.pyx +423 -0
- sage/rings/number_field/all__sagemath_categories.py +1 -0
- sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_base.pxd +8 -0
- sage/rings/number_field/number_field_base.pyx +507 -0
- sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_element_base.pxd +6 -0
- sage/rings/number_field/number_field_element_base.pyx +36 -0
- sage/rings/number_field/number_field_ideal.py +3550 -0
- sage/rings/padics/all__sagemath_categories.py +4 -0
- sage/rings/padics/local_generic.py +1670 -0
- sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/local_generic_element.pxd +5 -0
- sage/rings/padics/local_generic_element.pyx +1017 -0
- sage/rings/padics/misc.py +256 -0
- sage/rings/padics/padic_generic.py +1911 -0
- sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/pow_computer.pxd +38 -0
- sage/rings/padics/pow_computer.pyx +671 -0
- sage/rings/padics/precision_error.py +24 -0
- sage/rings/polynomial/all__sagemath_categories.py +25 -0
- sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/commutative_polynomial.pxd +6 -0
- sage/rings/polynomial/commutative_polynomial.pyx +24 -0
- sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/cyclotomic.pyx +404 -0
- sage/rings/polynomial/flatten.py +711 -0
- sage/rings/polynomial/ideal.py +102 -0
- sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
- sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
- sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial.pxd +18 -0
- sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
- sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
- sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
- sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
- sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial.pxd +12 -0
- sage/rings/polynomial/multi_polynomial.pyx +3082 -0
- sage/rings/polynomial/multi_polynomial_element.py +2570 -0
- sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
- sage/rings/polynomial/multi_polynomial_ring.py +947 -0
- sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
- sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
- sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polydict.pxd +45 -0
- sage/rings/polynomial/polydict.pyx +2701 -0
- sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_compiled.pxd +59 -0
- sage/rings/polynomial/polynomial_compiled.pyx +509 -0
- sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_element.pxd +64 -0
- sage/rings/polynomial/polynomial_element.pyx +13255 -0
- sage/rings/polynomial/polynomial_element_generic.py +1637 -0
- sage/rings/polynomial/polynomial_fateman.py +97 -0
- sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
- sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
- sage/rings/polynomial/polynomial_ring.py +3784 -0
- sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
- sage/rings/polynomial/polynomial_singular_interface.py +549 -0
- sage/rings/polynomial/symmetric_ideal.py +989 -0
- sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/symmetric_reduction.pxd +8 -0
- sage/rings/polynomial/symmetric_reduction.pyx +669 -0
- sage/rings/polynomial/term_order.py +2279 -0
- sage/rings/polynomial/toy_buchberger.py +449 -0
- sage/rings/polynomial/toy_d_basis.py +387 -0
- sage/rings/polynomial/toy_variety.py +362 -0
- sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_mpoly.pxd +9 -0
- sage/rings/power_series_mpoly.pyx +161 -0
- sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_poly.pxd +10 -0
- sage/rings/power_series_poly.pyx +1317 -0
- sage/rings/power_series_ring.py +1441 -0
- sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_ring_element.pxd +12 -0
- sage/rings/power_series_ring_element.pyx +3028 -0
- sage/rings/puiseux_series_ring.py +487 -0
- sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/puiseux_series_ring_element.pxd +7 -0
- sage/rings/puiseux_series_ring_element.pyx +1055 -0
- sage/rings/qqbar_decorators.py +167 -0
- sage/rings/quotient_ring.py +1598 -0
- sage/rings/quotient_ring_element.py +979 -0
- sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/rational.pxd +20 -0
- sage/rings/rational.pyx +4284 -0
- sage/rings/rational_field.py +1730 -0
- sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_double.pxd +16 -0
- sage/rings/real_double.pyx +2218 -0
- sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_lazy.pxd +30 -0
- sage/rings/real_lazy.pyx +1773 -0
- sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/ring.pxd +30 -0
- sage/rings/ring.pyx +850 -0
- sage/rings/semirings/all.py +3 -0
- sage/rings/semirings/non_negative_integer_semiring.py +107 -0
- sage/rings/semirings/tropical_mpolynomial.py +972 -0
- sage/rings/semirings/tropical_polynomial.py +997 -0
- sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/semirings/tropical_semiring.pyx +676 -0
- sage/rings/semirings/tropical_variety.py +1701 -0
- sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/sum_of_squares.pxd +3 -0
- sage/rings/sum_of_squares.pyx +336 -0
- sage/rings/tests.py +504 -0
- sage/schemes/affine/affine_homset.py +508 -0
- sage/schemes/affine/affine_morphism.py +1574 -0
- sage/schemes/affine/affine_point.py +460 -0
- sage/schemes/affine/affine_rational_point.py +308 -0
- sage/schemes/affine/affine_space.py +1264 -0
- sage/schemes/affine/affine_subscheme.py +592 -0
- sage/schemes/affine/all.py +25 -0
- sage/schemes/all__sagemath_categories.py +5 -0
- sage/schemes/generic/algebraic_scheme.py +2092 -0
- sage/schemes/generic/all.py +5 -0
- sage/schemes/generic/ambient_space.py +400 -0
- sage/schemes/generic/divisor.py +465 -0
- sage/schemes/generic/divisor_group.py +313 -0
- sage/schemes/generic/glue.py +84 -0
- sage/schemes/generic/homset.py +820 -0
- sage/schemes/generic/hypersurface.py +234 -0
- sage/schemes/generic/morphism.py +2107 -0
- sage/schemes/generic/point.py +237 -0
- sage/schemes/generic/scheme.py +1190 -0
- sage/schemes/generic/spec.py +199 -0
- sage/schemes/product_projective/all.py +6 -0
- sage/schemes/product_projective/homset.py +236 -0
- sage/schemes/product_projective/morphism.py +517 -0
- sage/schemes/product_projective/point.py +568 -0
- sage/schemes/product_projective/rational_point.py +550 -0
- sage/schemes/product_projective/space.py +1301 -0
- sage/schemes/product_projective/subscheme.py +466 -0
- sage/schemes/projective/all.py +24 -0
- sage/schemes/projective/proj_bdd_height.py +453 -0
- sage/schemes/projective/projective_homset.py +718 -0
- sage/schemes/projective/projective_morphism.py +2792 -0
- sage/schemes/projective/projective_point.py +1484 -0
- sage/schemes/projective/projective_rational_point.py +569 -0
- sage/schemes/projective/projective_space.py +2571 -0
- sage/schemes/projective/projective_subscheme.py +1574 -0
- sage/sets/all.py +17 -0
- sage/sets/cartesian_product.py +376 -0
- sage/sets/condition_set.py +525 -0
- sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/disjoint_set.pxd +36 -0
- sage/sets/disjoint_set.pyx +998 -0
- sage/sets/disjoint_union_enumerated_sets.py +625 -0
- sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/family.pxd +12 -0
- sage/sets/family.pyx +1556 -0
- sage/sets/finite_enumerated_set.py +406 -0
- sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/finite_set_map_cy.pxd +34 -0
- sage/sets/finite_set_map_cy.pyx +708 -0
- sage/sets/finite_set_maps.py +591 -0
- sage/sets/image_set.py +448 -0
- sage/sets/integer_range.py +829 -0
- sage/sets/non_negative_integers.py +241 -0
- sage/sets/positive_integers.py +93 -0
- sage/sets/primes.py +188 -0
- sage/sets/real_set.py +2760 -0
- sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/recursively_enumerated_set.pxd +31 -0
- sage/sets/recursively_enumerated_set.pyx +2082 -0
- sage/sets/set.py +2083 -0
- sage/sets/set_from_iterator.py +1021 -0
- sage/sets/totally_ordered_finite_set.py +329 -0
- sage/symbolic/all__sagemath_categories.py +1 -0
- sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/symbolic/function.pxd +29 -0
- sage/symbolic/function.pyx +1488 -0
- sage/symbolic/symbols.py +56 -0
- sage/tests/all__sagemath_categories.py +1 -0
- sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/cython.pyx +37 -0
- sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/stl_vector.pyx +171 -0
- sage/typeset/all.py +6 -0
- sage/typeset/ascii_art.py +295 -0
- sage/typeset/character_art.py +789 -0
- sage/typeset/character_art_factory.py +572 -0
- sage/typeset/symbols.py +334 -0
- sage/typeset/unicode_art.py +183 -0
- sage/typeset/unicode_characters.py +101 -0
|
@@ -0,0 +1,1017 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
# sage.doctest: needs sage.rings.padics
|
|
3
|
+
"""
|
|
4
|
+
Local Generic Element
|
|
5
|
+
|
|
6
|
+
This file contains a common superclass for `p`-adic elements and power
|
|
7
|
+
series elements.
|
|
8
|
+
|
|
9
|
+
AUTHORS:
|
|
10
|
+
|
|
11
|
+
- David Roe: initial version
|
|
12
|
+
|
|
13
|
+
- Julian Rueth (2012-10-15, 2014-06-25, 2017-08-04): added inverse_of_unit(); improved
|
|
14
|
+
add_bigoh(); added _test_expansion()
|
|
15
|
+
"""
|
|
16
|
+
# ****************************************************************************
|
|
17
|
+
# Copyright (C) 2007-2017 David Roe <roed@math.harvard.edu>
|
|
18
|
+
# 2012-2017 Julian Rueth <julian.rueth@fsfe.org>
|
|
19
|
+
#
|
|
20
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
21
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
22
|
+
# the License, or (at your option) any later version.
|
|
23
|
+
# https://www.gnu.org/licenses/
|
|
24
|
+
# ****************************************************************************
|
|
25
|
+
|
|
26
|
+
from sage.rings.infinity import infinity
|
|
27
|
+
from sage.structure.element cimport CommutativeRingElement
|
|
28
|
+
from sage.structure.element import coerce_binop
|
|
29
|
+
from itertools import islice
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
cdef class LocalGenericElement(CommutativeRingElement):
|
|
33
|
+
#cpdef _add_(self, right):
|
|
34
|
+
# raise NotImplementedError
|
|
35
|
+
|
|
36
|
+
cpdef _div_(self, right):
|
|
37
|
+
r"""
|
|
38
|
+
Return the quotient of ``self`` by ``right``.
|
|
39
|
+
|
|
40
|
+
INPUT:
|
|
41
|
+
|
|
42
|
+
- ``self`` -- a `p`-adic element
|
|
43
|
+
|
|
44
|
+
- ``right`` -- a `p`-adic element distinguishable from zero;
|
|
45
|
+
in a fixed-modulus ring, this element must be a unit
|
|
46
|
+
|
|
47
|
+
EXAMPLES::
|
|
48
|
+
|
|
49
|
+
sage: R = Zp(7, 4, 'capped-rel', 'series'); R(3)/R(5)
|
|
50
|
+
2 + 4*7 + 5*7^2 + 2*7^3 + O(7^4)
|
|
51
|
+
sage: R(2/3) / R(1/3) # indirect doctest
|
|
52
|
+
2 + O(7^4)
|
|
53
|
+
sage: R(49) / R(7)
|
|
54
|
+
7 + O(7^5)
|
|
55
|
+
sage: R = Zp(7, 4, 'capped-abs', 'series'); 1/R(7)
|
|
56
|
+
7^-1 + O(7^2)
|
|
57
|
+
sage: R = Zp(7, 4, 'fixed-mod'); 1/R(7)
|
|
58
|
+
Traceback (most recent call last):
|
|
59
|
+
...
|
|
60
|
+
ValueError: cannot invert non-unit
|
|
61
|
+
"""
|
|
62
|
+
# this doctest doesn't actually test the function, since it's overridden.
|
|
63
|
+
return self * ~right
|
|
64
|
+
|
|
65
|
+
def inverse_of_unit(self):
|
|
66
|
+
r"""
|
|
67
|
+
Return the inverse of ``self`` if ``self`` is a unit.
|
|
68
|
+
|
|
69
|
+
OUTPUT: an element in the same ring as ``self``
|
|
70
|
+
|
|
71
|
+
EXAMPLES::
|
|
72
|
+
|
|
73
|
+
sage: R = ZpCA(3,5)
|
|
74
|
+
sage: a = R(2); a
|
|
75
|
+
2 + O(3^5)
|
|
76
|
+
sage: b = a.inverse_of_unit(); b
|
|
77
|
+
2 + 3 + 3^2 + 3^3 + 3^4 + O(3^5)
|
|
78
|
+
|
|
79
|
+
A :exc:`ZeroDivisionError` is raised if an element has no inverse in the
|
|
80
|
+
ring::
|
|
81
|
+
|
|
82
|
+
sage: R(3).inverse_of_unit()
|
|
83
|
+
Traceback (most recent call last):
|
|
84
|
+
...
|
|
85
|
+
ZeroDivisionError: inverse of 3 + O(3^5) does not exist
|
|
86
|
+
|
|
87
|
+
Unlike the usual inverse of an element, the result is in the same ring
|
|
88
|
+
as ``self`` and not just in its fraction field::
|
|
89
|
+
|
|
90
|
+
sage: c = ~a; c
|
|
91
|
+
2 + 3 + 3^2 + 3^3 + 3^4 + O(3^5)
|
|
92
|
+
sage: a.parent()
|
|
93
|
+
3-adic Ring with capped absolute precision 5
|
|
94
|
+
sage: b.parent()
|
|
95
|
+
3-adic Ring with capped absolute precision 5
|
|
96
|
+
sage: c.parent()
|
|
97
|
+
3-adic Field with capped relative precision 5
|
|
98
|
+
|
|
99
|
+
For fields this does of course not make any difference::
|
|
100
|
+
|
|
101
|
+
sage: R = QpCR(3,5)
|
|
102
|
+
sage: a = R(2)
|
|
103
|
+
sage: b = a.inverse_of_unit()
|
|
104
|
+
sage: c = ~a
|
|
105
|
+
sage: a.parent()
|
|
106
|
+
3-adic Field with capped relative precision 5
|
|
107
|
+
sage: b.parent()
|
|
108
|
+
3-adic Field with capped relative precision 5
|
|
109
|
+
sage: c.parent()
|
|
110
|
+
3-adic Field with capped relative precision 5
|
|
111
|
+
|
|
112
|
+
TESTS:
|
|
113
|
+
|
|
114
|
+
Test that this works for all kinds of `p`-adic base elements::
|
|
115
|
+
|
|
116
|
+
sage: ZpCA(3,5)(2).inverse_of_unit()
|
|
117
|
+
2 + 3 + 3^2 + 3^3 + 3^4 + O(3^5)
|
|
118
|
+
sage: ZpCR(3,5)(2).inverse_of_unit()
|
|
119
|
+
2 + 3 + 3^2 + 3^3 + 3^4 + O(3^5)
|
|
120
|
+
sage: ZpFM(3,5)(2).inverse_of_unit()
|
|
121
|
+
2 + 3 + 3^2 + 3^3 + 3^4
|
|
122
|
+
sage: ZpFP(3,5)(2).inverse_of_unit()
|
|
123
|
+
2 + 3 + 3^2 + 3^3 + 3^4
|
|
124
|
+
sage: QpCR(3,5)(2).inverse_of_unit()
|
|
125
|
+
2 + 3 + 3^2 + 3^3 + 3^4 + O(3^5)
|
|
126
|
+
|
|
127
|
+
Over unramified extensions::
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
sage: # needs sage.libs.ntl
|
|
131
|
+
sage: R = ZpCR(3,5); S.<t> = R[]; W.<t> = R.extension( t^2 + 1 )
|
|
132
|
+
sage: t.inverse_of_unit()
|
|
133
|
+
2*t + 2*t*3 + 2*t*3^2 + 2*t*3^3 + 2*t*3^4 + O(3^5)
|
|
134
|
+
sage: R = QpCR(3,5); S.<t> = R[]; W.<t> = R.extension( t^2 + 1 )
|
|
135
|
+
sage: t.inverse_of_unit()
|
|
136
|
+
2*t + 2*t*3 + 2*t*3^2 + 2*t*3^3 + 2*t*3^4 + O(3^5)
|
|
137
|
+
|
|
138
|
+
sage: # needs sage.libs.flint
|
|
139
|
+
sage: R = ZpCA(3,5); S.<t> = R[]; W.<t> = R.extension( t^2 + 1 )
|
|
140
|
+
sage: t.inverse_of_unit()
|
|
141
|
+
2*t + 2*t*3 + 2*t*3^2 + 2*t*3^3 + 2*t*3^4 + O(3^5)
|
|
142
|
+
sage: R = ZpFM(3,5); S.<t> = R[]; W.<t> = R.extension( t^2 + 1 )
|
|
143
|
+
sage: t.inverse_of_unit()
|
|
144
|
+
2*t + 2*t*3 + 2*t*3^2 + 2*t*3^3 + 2*t*3^4
|
|
145
|
+
sage: R = ZpFP(3,5); S.<t> = R[]; W.<t> = R.extension( t^2 + 1 )
|
|
146
|
+
sage: t.inverse_of_unit()
|
|
147
|
+
2*t + 2*t*3 + 2*t*3^2 + 2*t*3^3 + 2*t*3^4
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
Over Eisenstein extensions::
|
|
151
|
+
|
|
152
|
+
sage: # needs sage.libs.ntl
|
|
153
|
+
sage: R = ZpCA(3,5); S.<t> = R[]; W.<t> = R.extension( t^2 - 3 )
|
|
154
|
+
sage: (t - 1).inverse_of_unit()
|
|
155
|
+
2 + 2*t + t^2 + t^3 + t^4 + t^5 + t^6 + t^7 + t^8 + t^9 + O(t^10)
|
|
156
|
+
sage: R = ZpCR(3,5); S.<t> = R[]; W.<t> = R.extension( t^2 - 3 )
|
|
157
|
+
sage: (t - 1).inverse_of_unit()
|
|
158
|
+
2 + 2*t + t^2 + t^3 + t^4 + t^5 + t^6 + t^7 + t^8 + t^9 + O(t^10)
|
|
159
|
+
sage: R = ZpFM(3,5); S.<t> = R[]; W.<t> = R.extension( t^2 - 3 )
|
|
160
|
+
sage: (t - 1).inverse_of_unit()
|
|
161
|
+
2 + 2*t + t^2 + t^3 + t^4 + t^5 + t^6 + t^7 + t^8 + t^9
|
|
162
|
+
sage: R = QpCR(3,5); S.<t> = R[]; W.<t> = R.extension( t^2 - 3 )
|
|
163
|
+
sage: (t - 1).inverse_of_unit()
|
|
164
|
+
2 + 2*t + t^2 + t^3 + t^4 + t^5 + t^6 + t^7 + t^8 + t^9 + O(t^10)
|
|
165
|
+
"""
|
|
166
|
+
if not self.is_unit():
|
|
167
|
+
raise ZeroDivisionError(f"inverse of {self} does not exist")
|
|
168
|
+
return self.parent()(~self)
|
|
169
|
+
|
|
170
|
+
def __iter__(self):
|
|
171
|
+
"""
|
|
172
|
+
Local elements should not be iterable, so this method correspondingly
|
|
173
|
+
raises a :exc:`TypeError`.
|
|
174
|
+
|
|
175
|
+
.. NOTE::
|
|
176
|
+
|
|
177
|
+
Typically, local elements provide a implementation for
|
|
178
|
+
``__getitem__``. If they do not provide a method ``__iter__``, then
|
|
179
|
+
iterating over them is realized by calling ``__getitem__``,
|
|
180
|
+
starting from index 0. However, there are several issues with this.
|
|
181
|
+
For example, terms with negative valuation would be excluded from
|
|
182
|
+
the iteration, and an exact value of zero would lead to an infinite
|
|
183
|
+
iterable.
|
|
184
|
+
|
|
185
|
+
There doesn't seem to be an obvious behaviour that iteration over
|
|
186
|
+
such elements should produce, so it is disabled; see :issue:`13592`.
|
|
187
|
+
|
|
188
|
+
TESTS::
|
|
189
|
+
|
|
190
|
+
sage: x = Qp(3).zero()
|
|
191
|
+
sage: for v in x: pass
|
|
192
|
+
Traceback (most recent call last):
|
|
193
|
+
...
|
|
194
|
+
TypeError: this local element is not iterable
|
|
195
|
+
"""
|
|
196
|
+
raise TypeError("this local element is not iterable")
|
|
197
|
+
|
|
198
|
+
def slice(self, i, j, k=1, lift_mode='simple'):
|
|
199
|
+
r"""
|
|
200
|
+
Return the sum of the `pi^{i + l \cdot k}` terms of the series
|
|
201
|
+
expansion of this element, where pi is the uniformizer,
|
|
202
|
+
for `i + l \cdot k` between ``i`` and ``j-1`` inclusive, and
|
|
203
|
+
nonnegative integers `l`. Behaves analogously to the slice
|
|
204
|
+
function for lists.
|
|
205
|
+
|
|
206
|
+
INPUT:
|
|
207
|
+
|
|
208
|
+
- ``i`` -- integer; if set to ``None``, the sum will start with the
|
|
209
|
+
first nonzero term of the series
|
|
210
|
+
|
|
211
|
+
- ``j`` -- integer; if set to ``None`` or `\infty`, this method
|
|
212
|
+
behaves as if it was set to the absolute precision of this element
|
|
213
|
+
|
|
214
|
+
- ``k`` -- (default: 1) a positive integer
|
|
215
|
+
|
|
216
|
+
EXAMPLES::
|
|
217
|
+
|
|
218
|
+
sage: R = Zp(5, 6, 'capped-rel')
|
|
219
|
+
sage: a = R(1/2); a
|
|
220
|
+
3 + 2*5 + 2*5^2 + 2*5^3 + 2*5^4 + 2*5^5 + O(5^6)
|
|
221
|
+
sage: a.slice(2, 4)
|
|
222
|
+
2*5^2 + 2*5^3 + O(5^4)
|
|
223
|
+
sage: a.slice(1, 6, 2)
|
|
224
|
+
2*5 + 2*5^3 + 2*5^5 + O(5^6)
|
|
225
|
+
|
|
226
|
+
The step size ``k`` has to be positive::
|
|
227
|
+
|
|
228
|
+
sage: a.slice(0, 3, 0)
|
|
229
|
+
Traceback (most recent call last):
|
|
230
|
+
...
|
|
231
|
+
ValueError: slice step must be positive
|
|
232
|
+
sage: a.slice(0, 3, -1)
|
|
233
|
+
Traceback (most recent call last):
|
|
234
|
+
...
|
|
235
|
+
ValueError: slice step must be positive
|
|
236
|
+
|
|
237
|
+
If ``i`` exceeds ``j``, then the result will be zero, with the
|
|
238
|
+
precision given by ``j``::
|
|
239
|
+
|
|
240
|
+
sage: a.slice(5, 4)
|
|
241
|
+
O(5^4)
|
|
242
|
+
sage: a.slice(6, 5)
|
|
243
|
+
O(5^5)
|
|
244
|
+
|
|
245
|
+
However, the precision cannot exceed the precision of the element::
|
|
246
|
+
|
|
247
|
+
sage: a.slice(101,100)
|
|
248
|
+
O(5^6)
|
|
249
|
+
sage: a.slice(0,5,2)
|
|
250
|
+
3 + 2*5^2 + 2*5^4 + O(5^5)
|
|
251
|
+
sage: a.slice(0,6,2)
|
|
252
|
+
3 + 2*5^2 + 2*5^4 + O(5^6)
|
|
253
|
+
sage: a.slice(0,7,2)
|
|
254
|
+
3 + 2*5^2 + 2*5^4 + O(5^6)
|
|
255
|
+
|
|
256
|
+
If start is left blank, it is set to the valuation::
|
|
257
|
+
|
|
258
|
+
sage: K = Qp(5, 6)
|
|
259
|
+
sage: x = K(1/25 + 5); x
|
|
260
|
+
5^-2 + 5 + O(5^4)
|
|
261
|
+
sage: x.slice(None, 3)
|
|
262
|
+
5^-2 + 5 + O(5^3)
|
|
263
|
+
sage: x[:3]
|
|
264
|
+
doctest:warning
|
|
265
|
+
...
|
|
266
|
+
DeprecationWarning: __getitem__ is changing to match the behavior of number fields. Please use expansion instead.
|
|
267
|
+
See https://github.com/sagemath/sage/issues/14825 for details.
|
|
268
|
+
5^-2 + 5 + O(5^3)
|
|
269
|
+
|
|
270
|
+
TESTS:
|
|
271
|
+
|
|
272
|
+
Test that slices also work over fields::
|
|
273
|
+
|
|
274
|
+
sage: a = K(1/25); a
|
|
275
|
+
5^-2 + O(5^4)
|
|
276
|
+
sage: b = K(25); b
|
|
277
|
+
5^2 + O(5^8)
|
|
278
|
+
|
|
279
|
+
sage: a.slice(2, 4)
|
|
280
|
+
O(5^4)
|
|
281
|
+
sage: b.slice(2, 4)
|
|
282
|
+
5^2 + O(5^4)
|
|
283
|
+
sage: a.slice(-3, -1)
|
|
284
|
+
5^-2 + O(5^-1)
|
|
285
|
+
sage: b.slice(-1, 1)
|
|
286
|
+
O(5)
|
|
287
|
+
sage: b.slice(-3, -1)
|
|
288
|
+
O(5^-1)
|
|
289
|
+
sage: b.slice(101, 100)
|
|
290
|
+
O(5^8)
|
|
291
|
+
sage: b.slice(0,7,2)
|
|
292
|
+
5^2 + O(5^7)
|
|
293
|
+
sage: b.slice(0,8,2)
|
|
294
|
+
5^2 + O(5^8)
|
|
295
|
+
sage: b.slice(0,9,2)
|
|
296
|
+
5^2 + O(5^8)
|
|
297
|
+
|
|
298
|
+
Test that slices also work over eisenstein extensions::
|
|
299
|
+
|
|
300
|
+
sage: # needs sage.libs.ntl
|
|
301
|
+
sage: F = Qp(5)
|
|
302
|
+
sage: H.<x> = F[]
|
|
303
|
+
sage: T.<t> = F.extension(x^2 - 5)
|
|
304
|
+
sage: a = T(3*t^-2 + 1 + 4*t + 2*t^2)
|
|
305
|
+
sage: a.slice(0, 1)
|
|
306
|
+
1 + O(t)
|
|
307
|
+
sage: a.slice(-3, 4)
|
|
308
|
+
3*t^-2 + 1 + 4*t + 2*t^2 + O(t^4)
|
|
309
|
+
sage: a.slice(-2, 6, 3)
|
|
310
|
+
3*t^-2 + 4*t + O(t^6)
|
|
311
|
+
|
|
312
|
+
Test that slices also work over unramified extensions::
|
|
313
|
+
|
|
314
|
+
sage: # needs sage.libs.ntl
|
|
315
|
+
sage: F = Qp(5)
|
|
316
|
+
sage: H.<x> = F[]
|
|
317
|
+
sage: T.<t> = F.extension(x^2 - 2)
|
|
318
|
+
sage: a = T(3*5^-1 + 1 + (3*t + 4)*5^2)
|
|
319
|
+
sage: a.slice(0, 1)
|
|
320
|
+
1 + O(5)
|
|
321
|
+
sage: a.slice(-3, 4)
|
|
322
|
+
3*5^-1 + 1 + (3*t + 4)*5^2 + O(5^4)
|
|
323
|
+
sage: a.slice(-1, 6, 3)
|
|
324
|
+
3*5^-1 + (3*t + 4)*5^2 + O(5^6)
|
|
325
|
+
|
|
326
|
+
Test that slices also work over 2-step extensions (unramified followed by eisenstein)::
|
|
327
|
+
|
|
328
|
+
sage: # needs sage.libs.ntl
|
|
329
|
+
sage: F = Qp(5)
|
|
330
|
+
sage: H.<x> = F[]
|
|
331
|
+
sage: T.<t> = F.extension(x^2 - 3)
|
|
332
|
+
sage: D.<y> = T[]
|
|
333
|
+
sage: W.<w> = T.extension((4*5^-2 + 2*5^-1 + 4 + (2*t + 2)*5 + 3*t*5^3 + 4*5^4 + 3*5^5 + (2*t + 2)*5^8 + (4*t + 3)*5^9 + 2*t*5^10 + (3*t + 3)*5^11 + (3*t + 1)*5^12 + (3*t + 2)*5^13 + 4*5^14 + (2*t + 4)*5^15 + (4*t + 1)*5^16 + (t + 1)*5^17 + O(5^18))*y^2 + (t + 2*t*5 + t*5^2 + 4*t*5^3 + (2*t + 4)*5^4 + (3*t + 4)*5^5 + (t + 1)*5^6 + t*5^7 + (2*t + 4)*5^8 + 3*5^9 + 2*5^10 + 5^12 + (4*t + 2)*5^13 + 5^14 + 5^15 + 3*t*5^16 + (t + 2)*5^17 + 4*5^18 + (3*t + 1)*5^19 + O(5^20))*y + (2*t + 2)*5^-1 + 3 + 5 + t*5^2 + (4*t + 2)*5^3 + (4*t + 1)*5^4 + (3*t + 4)*5^5 + (4*t + 4)*5^6 + (3*t + 2)*5^7 + (4*t + 4)*5^8 + 3*5^9 + (t + 3)*5^10 + (4*t + 3)*5^11 + 5^12 + (2*t + 2)*5^14 + 4*t*5^15 + (2*t + 2)*5^16 + (4*t + 4)*5^17 + O(5^18))
|
|
334
|
+
sage: a = W(3*w^-36 + (2*t + 2)*w^-23)
|
|
335
|
+
sage: a.slice(-25,2)
|
|
336
|
+
(2*t + 2)*w^-23 + O(w^2)
|
|
337
|
+
sage: a.slice(0, 1)
|
|
338
|
+
O(w)
|
|
339
|
+
|
|
340
|
+
Verify that :issue:`14106` has been fixed::
|
|
341
|
+
|
|
342
|
+
sage: R = Zp(5,7)
|
|
343
|
+
sage: a = R(300)
|
|
344
|
+
sage: a
|
|
345
|
+
2*5^2 + 2*5^3 + O(5^9)
|
|
346
|
+
sage: a[:5]
|
|
347
|
+
2*5^2 + 2*5^3 + O(5^5)
|
|
348
|
+
sage: a.slice(None, 5, None)
|
|
349
|
+
2*5^2 + 2*5^3 + O(5^5)
|
|
350
|
+
|
|
351
|
+
Verify that :issue:`30695` has been fixed::
|
|
352
|
+
|
|
353
|
+
sage: F = Qp(3)
|
|
354
|
+
sage: a = F(0)
|
|
355
|
+
sage: a.slice(0,None)
|
|
356
|
+
0
|
|
357
|
+
"""
|
|
358
|
+
if k is None:
|
|
359
|
+
k = 1
|
|
360
|
+
if k <= 0:
|
|
361
|
+
raise ValueError("slice step must be positive")
|
|
362
|
+
if i is None:
|
|
363
|
+
i = self.valuation()
|
|
364
|
+
if j is None or j is infinity:
|
|
365
|
+
j = self.precision_absolute()
|
|
366
|
+
if j is infinity:
|
|
367
|
+
return self.parent()(0)
|
|
368
|
+
|
|
369
|
+
start = i
|
|
370
|
+
stop = j
|
|
371
|
+
|
|
372
|
+
# for fields, self.list() contains only the coefficients starting from
|
|
373
|
+
# self.valuation(), so we have to shift the indices around to make up
|
|
374
|
+
# for this
|
|
375
|
+
if self.parent().is_field():
|
|
376
|
+
start -= self.valuation()
|
|
377
|
+
stop -= self.valuation()
|
|
378
|
+
|
|
379
|
+
# make sure that start and stop are nonnegative
|
|
380
|
+
if start<0:
|
|
381
|
+
i += -start # fix the value of ppow below
|
|
382
|
+
start = 0
|
|
383
|
+
stop = max(stop, 0)
|
|
384
|
+
|
|
385
|
+
# the increase of the pi-power in every step
|
|
386
|
+
pk = self.parent().uniformizer_pow(k)
|
|
387
|
+
# the pi-power of the first term
|
|
388
|
+
ppow = self.parent().uniformizer_pow(i)
|
|
389
|
+
|
|
390
|
+
# construct the return value
|
|
391
|
+
ans = self.parent().zero()
|
|
392
|
+
unramified_generator = self.parent()(self.parent().residue_field().gen()).lift_to_precision()
|
|
393
|
+
for c in islice(self.expansion(lift_mode=lift_mode), int(start), int(stop), int(k)):
|
|
394
|
+
genpow = 1
|
|
395
|
+
if not isinstance(c, list):
|
|
396
|
+
c = [c] # relevant for the case of base-rings, or one-step
|
|
397
|
+
# Eisenstein extensions
|
|
398
|
+
for d in c:
|
|
399
|
+
ans += d * genpow * ppow
|
|
400
|
+
genpow *= unramified_generator
|
|
401
|
+
ppow *= pk
|
|
402
|
+
|
|
403
|
+
# fix the precision of the return value
|
|
404
|
+
if j < ans.precision_absolute() or self.precision_absolute() < ans.precision_absolute():
|
|
405
|
+
ans = ans.add_bigoh(min(j, self.precision_absolute()))
|
|
406
|
+
|
|
407
|
+
return ans
|
|
408
|
+
|
|
409
|
+
def _latex_(self):
|
|
410
|
+
r"""
|
|
411
|
+
Return a latex representation of ``self``.
|
|
412
|
+
|
|
413
|
+
EXAMPLES::
|
|
414
|
+
|
|
415
|
+
sage: R = Zp(5); a = R(17)
|
|
416
|
+
sage: latex(a) # indirect doctest
|
|
417
|
+
2 + 3 \cdot 5 + O(5^{20})
|
|
418
|
+
"""
|
|
419
|
+
# TODO: add a bunch more documentation of latexing elements
|
|
420
|
+
return self._repr_(do_latex = True)
|
|
421
|
+
|
|
422
|
+
#def __mod__(self, right):
|
|
423
|
+
# raise NotImplementedError
|
|
424
|
+
|
|
425
|
+
#cpdef _mul_(self, right):
|
|
426
|
+
# raise NotImplementedError
|
|
427
|
+
|
|
428
|
+
#cdef _neg_(self):
|
|
429
|
+
# raise NotImplementedError
|
|
430
|
+
|
|
431
|
+
#def __pow__(self, right):
|
|
432
|
+
# raise NotImplementedError
|
|
433
|
+
|
|
434
|
+
cpdef _sub_(self, right):
|
|
435
|
+
r"""
|
|
436
|
+
Return the difference between ``self`` and ``right``.
|
|
437
|
+
|
|
438
|
+
EXAMPLES::
|
|
439
|
+
|
|
440
|
+
sage: R = Zp(7, 4, 'capped-rel', 'series'); a = R(12); b = R(5); a - b
|
|
441
|
+
7 + O(7^4)
|
|
442
|
+
sage: R(4/3) - R(1/3) # indirect doctest
|
|
443
|
+
1 + O(7^4)
|
|
444
|
+
"""
|
|
445
|
+
# this doctest doesn't actually test this function, since _sub_ is overridden.
|
|
446
|
+
return self + (-right)
|
|
447
|
+
|
|
448
|
+
def add_bigoh(self, absprec):
|
|
449
|
+
"""
|
|
450
|
+
Return a copy of this element with absolute precision decreased to
|
|
451
|
+
``absprec``.
|
|
452
|
+
|
|
453
|
+
INPUT:
|
|
454
|
+
|
|
455
|
+
- ``absprec`` -- integer or positive infinity
|
|
456
|
+
|
|
457
|
+
EXAMPLES::
|
|
458
|
+
|
|
459
|
+
sage: K = QpCR(3,4)
|
|
460
|
+
sage: o = K(1); o
|
|
461
|
+
1 + O(3^4)
|
|
462
|
+
sage: o.add_bigoh(2)
|
|
463
|
+
1 + O(3^2)
|
|
464
|
+
sage: o.add_bigoh(-5)
|
|
465
|
+
O(3^-5)
|
|
466
|
+
|
|
467
|
+
One cannot use ``add_bigoh`` to lift to a higher precision; this
|
|
468
|
+
can be accomplished with :meth:`lift_to_precision`::
|
|
469
|
+
|
|
470
|
+
sage: o.add_bigoh(5)
|
|
471
|
+
1 + O(3^4)
|
|
472
|
+
|
|
473
|
+
Negative values of ``absprec`` return an element in the fraction field
|
|
474
|
+
of the element's parent::
|
|
475
|
+
|
|
476
|
+
sage: R = ZpCA(3,4)
|
|
477
|
+
sage: R(3).add_bigoh(-5)
|
|
478
|
+
O(3^-5)
|
|
479
|
+
|
|
480
|
+
For fixed-mod elements this method truncates the element::
|
|
481
|
+
|
|
482
|
+
sage: R = ZpFM(3,4)
|
|
483
|
+
sage: R(3).add_bigoh(1)
|
|
484
|
+
0
|
|
485
|
+
|
|
486
|
+
If ``absprec`` exceeds the precision of the element, then this method
|
|
487
|
+
has no effect::
|
|
488
|
+
|
|
489
|
+
sage: R(3).add_bigoh(5)
|
|
490
|
+
3
|
|
491
|
+
|
|
492
|
+
A negative value for ``absprec`` returns an element in the fraction field::
|
|
493
|
+
|
|
494
|
+
sage: R(3).add_bigoh(-1).parent()
|
|
495
|
+
3-adic Field with floating precision 4
|
|
496
|
+
|
|
497
|
+
TESTS:
|
|
498
|
+
|
|
499
|
+
Test that this also works for infinity::
|
|
500
|
+
|
|
501
|
+
sage: R = ZpCR(3,4)
|
|
502
|
+
sage: R(3).add_bigoh(infinity)
|
|
503
|
+
3 + O(3^5)
|
|
504
|
+
sage: R(0).add_bigoh(infinity)
|
|
505
|
+
0
|
|
506
|
+
|
|
507
|
+
Check that :issue:`23464` has been resolved::
|
|
508
|
+
|
|
509
|
+
sage: x = polygen(QQ)
|
|
510
|
+
sage: R.<pi> = Qp(7).extension(x^3 - 7) # needs sage.libs.ntl
|
|
511
|
+
sage: (pi^93).add_bigoh(-10) # needs sage.libs.ntl sage.symbolic
|
|
512
|
+
O(pi^-10)
|
|
513
|
+
"""
|
|
514
|
+
parent = self.parent()
|
|
515
|
+
if absprec >= self.precision_absolute():
|
|
516
|
+
return self
|
|
517
|
+
if absprec < 0:
|
|
518
|
+
parent = parent.fraction_field()
|
|
519
|
+
return parent(self, absprec=absprec)
|
|
520
|
+
|
|
521
|
+
#def copy(self):
|
|
522
|
+
# raise NotImplementedError
|
|
523
|
+
|
|
524
|
+
#def exp(self):
|
|
525
|
+
# raise NotImplementedError
|
|
526
|
+
|
|
527
|
+
def is_integral(self):
|
|
528
|
+
"""
|
|
529
|
+
Return whether ``self`` is an integral element.
|
|
530
|
+
|
|
531
|
+
INPUT:
|
|
532
|
+
|
|
533
|
+
- ``self`` -- a local ring element
|
|
534
|
+
|
|
535
|
+
OUTPUT: boolean; whether ``self`` is an integral element
|
|
536
|
+
|
|
537
|
+
EXAMPLES::
|
|
538
|
+
|
|
539
|
+
sage: R = Qp(3,20)
|
|
540
|
+
sage: a = R(7/3); a.is_integral()
|
|
541
|
+
False
|
|
542
|
+
sage: b = R(7/5); b.is_integral()
|
|
543
|
+
True
|
|
544
|
+
"""
|
|
545
|
+
return self.valuation() >= 0
|
|
546
|
+
|
|
547
|
+
#def is_square(self):
|
|
548
|
+
# raise NotImplementedError
|
|
549
|
+
|
|
550
|
+
def is_padic_unit(self):
|
|
551
|
+
"""
|
|
552
|
+
Return whether ``self`` is a `p`-adic unit. That is, whether it has
|
|
553
|
+
zero valuation.
|
|
554
|
+
|
|
555
|
+
INPUT:
|
|
556
|
+
|
|
557
|
+
- ``self`` -- a local ring element
|
|
558
|
+
|
|
559
|
+
OUTPUT: boolean; whether ``self`` is a unit
|
|
560
|
+
|
|
561
|
+
EXAMPLES::
|
|
562
|
+
|
|
563
|
+
sage: R = Zp(3,20,'capped-rel'); K = Qp(3,20,'capped-rel')
|
|
564
|
+
sage: R(0).is_padic_unit()
|
|
565
|
+
False
|
|
566
|
+
sage: R(1).is_padic_unit()
|
|
567
|
+
True
|
|
568
|
+
sage: R(2).is_padic_unit()
|
|
569
|
+
True
|
|
570
|
+
sage: R(3).is_padic_unit()
|
|
571
|
+
False
|
|
572
|
+
sage: Qp(5,5)(5).is_padic_unit()
|
|
573
|
+
False
|
|
574
|
+
|
|
575
|
+
TESTS::
|
|
576
|
+
|
|
577
|
+
sage: R(4).is_padic_unit()
|
|
578
|
+
True
|
|
579
|
+
sage: R(6).is_padic_unit()
|
|
580
|
+
False
|
|
581
|
+
sage: R(9).is_padic_unit()
|
|
582
|
+
False
|
|
583
|
+
sage: K(0).is_padic_unit()
|
|
584
|
+
False
|
|
585
|
+
sage: K(1).is_padic_unit()
|
|
586
|
+
True
|
|
587
|
+
sage: K(2).is_padic_unit()
|
|
588
|
+
True
|
|
589
|
+
sage: K(3).is_padic_unit()
|
|
590
|
+
False
|
|
591
|
+
sage: K(4).is_padic_unit()
|
|
592
|
+
True
|
|
593
|
+
sage: K(6).is_padic_unit()
|
|
594
|
+
False
|
|
595
|
+
sage: K(9).is_padic_unit()
|
|
596
|
+
False
|
|
597
|
+
sage: K(1/3).is_padic_unit()
|
|
598
|
+
False
|
|
599
|
+
sage: K(1/9).is_padic_unit()
|
|
600
|
+
False
|
|
601
|
+
sage: Qq(3^2,5,names='a')(3).is_padic_unit() # needs sage.libs.ntl
|
|
602
|
+
False
|
|
603
|
+
"""
|
|
604
|
+
return self.valuation() == 0
|
|
605
|
+
|
|
606
|
+
def is_unit(self):
|
|
607
|
+
"""
|
|
608
|
+
Return whether ``self`` is a unit.
|
|
609
|
+
|
|
610
|
+
INPUT:
|
|
611
|
+
|
|
612
|
+
- ``self`` -- a local ring element
|
|
613
|
+
|
|
614
|
+
OUTPUT: boolean; whether ``self`` is a unit
|
|
615
|
+
|
|
616
|
+
.. NOTE::
|
|
617
|
+
|
|
618
|
+
For fields all nonzero elements are units. For DVR's, only
|
|
619
|
+
those elements of valuation 0 are. An older implementation
|
|
620
|
+
ignored the case of fields, and returned always the
|
|
621
|
+
negation of self.valuation()==0. This behavior is now
|
|
622
|
+
supported with self.is_padic_unit().
|
|
623
|
+
|
|
624
|
+
EXAMPLES::
|
|
625
|
+
|
|
626
|
+
sage: R = Zp(3,20,'capped-rel'); K = Qp(3,20,'capped-rel')
|
|
627
|
+
sage: R(0).is_unit()
|
|
628
|
+
False
|
|
629
|
+
sage: R(1).is_unit()
|
|
630
|
+
True
|
|
631
|
+
sage: R(2).is_unit()
|
|
632
|
+
True
|
|
633
|
+
sage: R(3).is_unit()
|
|
634
|
+
False
|
|
635
|
+
sage: Qp(5,5)(5).is_unit() # Note that 5 is invertible in `QQ_5`, even if it has positive valuation!
|
|
636
|
+
True
|
|
637
|
+
sage: Qp(5,5)(5).is_padic_unit()
|
|
638
|
+
False
|
|
639
|
+
|
|
640
|
+
TESTS::
|
|
641
|
+
|
|
642
|
+
sage: R(4).is_unit()
|
|
643
|
+
True
|
|
644
|
+
sage: R(6).is_unit()
|
|
645
|
+
False
|
|
646
|
+
sage: R(9).is_unit()
|
|
647
|
+
False
|
|
648
|
+
sage: K(0).is_unit()
|
|
649
|
+
False
|
|
650
|
+
sage: K(1).is_unit()
|
|
651
|
+
True
|
|
652
|
+
sage: K(2).is_unit()
|
|
653
|
+
True
|
|
654
|
+
sage: K(3).is_unit()
|
|
655
|
+
True
|
|
656
|
+
sage: K(4).is_unit()
|
|
657
|
+
True
|
|
658
|
+
sage: K(6).is_unit()
|
|
659
|
+
True
|
|
660
|
+
sage: K(9).is_unit()
|
|
661
|
+
True
|
|
662
|
+
sage: K(1/3).is_unit()
|
|
663
|
+
True
|
|
664
|
+
sage: K(1/9).is_unit()
|
|
665
|
+
True
|
|
666
|
+
sage: Qq(3^2,5,names='a')(3).is_unit() # needs sage.libs.ntl
|
|
667
|
+
True
|
|
668
|
+
sage: R(0,0).is_unit()
|
|
669
|
+
False
|
|
670
|
+
sage: K(0,0).is_unit()
|
|
671
|
+
False
|
|
672
|
+
"""
|
|
673
|
+
if self.is_zero():
|
|
674
|
+
return False
|
|
675
|
+
if self.parent().is_field():
|
|
676
|
+
return True
|
|
677
|
+
return self.valuation() == 0
|
|
678
|
+
|
|
679
|
+
#def is_zero(self, prec):
|
|
680
|
+
# raise NotImplementedError
|
|
681
|
+
|
|
682
|
+
#def is_equal_to(self, right, prec):
|
|
683
|
+
# raise NotImplementedError
|
|
684
|
+
|
|
685
|
+
#def lift(self):
|
|
686
|
+
# raise NotImplementedError
|
|
687
|
+
|
|
688
|
+
#def list(self):
|
|
689
|
+
# raise NotImplementedError
|
|
690
|
+
|
|
691
|
+
#def log(self):
|
|
692
|
+
# raise NotImplementedError
|
|
693
|
+
|
|
694
|
+
#def multiplicative_order(self, prec):
|
|
695
|
+
# raise NotImplementedError
|
|
696
|
+
|
|
697
|
+
#def padded_list(self):
|
|
698
|
+
# raise NotImplementedError
|
|
699
|
+
|
|
700
|
+
#def precision_absolute(self):
|
|
701
|
+
# raise NotImplementedError
|
|
702
|
+
|
|
703
|
+
#def precision_relative(self):
|
|
704
|
+
# raise NotImplementedError
|
|
705
|
+
|
|
706
|
+
#def residue(self, prec):
|
|
707
|
+
# raise NotImplementedError
|
|
708
|
+
|
|
709
|
+
def sqrt(self, extend=True, all=False, algorithm=None):
|
|
710
|
+
r"""
|
|
711
|
+
Return the square root of this element.
|
|
712
|
+
|
|
713
|
+
INPUT:
|
|
714
|
+
|
|
715
|
+
- ``self`` -- a `p`-adic element
|
|
716
|
+
|
|
717
|
+
- ``extend`` -- boolean (default: ``True``); if ``True``, return a
|
|
718
|
+
square root in an extension if necessary; if ``False`` and no root
|
|
719
|
+
exists in the given ring or field, raise a :exc:`ValueError`.
|
|
720
|
+
|
|
721
|
+
- ``all`` -- boolean (default: ``False``); if ``True``, return a
|
|
722
|
+
list of all square roots
|
|
723
|
+
|
|
724
|
+
- ``algorithm`` -- ``'pari'``, ``'sage'`` or ``None`` (default:
|
|
725
|
+
``None``); Sage provides an implementation for any extension of
|
|
726
|
+
`Q_p` whereas only square roots over `Q_p` is implemented in Pari;
|
|
727
|
+
the default is ``'pari'`` if the ground field is `Q_p`, ``'sage'``
|
|
728
|
+
otherwise.
|
|
729
|
+
|
|
730
|
+
OUTPUT: the square root or the list of all square roots of this element
|
|
731
|
+
|
|
732
|
+
.. NOTE::
|
|
733
|
+
|
|
734
|
+
The square root is chosen (resp. the square roots are ordered) in
|
|
735
|
+
a deterministic way, which is compatible with change of precision.
|
|
736
|
+
|
|
737
|
+
EXAMPLES::
|
|
738
|
+
|
|
739
|
+
sage: R = Zp(3, 20)
|
|
740
|
+
sage: sqrt(R(0))
|
|
741
|
+
0
|
|
742
|
+
|
|
743
|
+
sage: sqrt(R(1))
|
|
744
|
+
1 + O(3^20)
|
|
745
|
+
|
|
746
|
+
sage: R(2).sqrt(extend=False)
|
|
747
|
+
Traceback (most recent call last):
|
|
748
|
+
...
|
|
749
|
+
ValueError: element is not a square
|
|
750
|
+
|
|
751
|
+
sage: s = sqrt(R(4)); -s
|
|
752
|
+
2 + O(3^20)
|
|
753
|
+
|
|
754
|
+
sage: s = sqrt(R(9)); s
|
|
755
|
+
3 + O(3^21)
|
|
756
|
+
|
|
757
|
+
Over the `2`-adics, the precision of the square root is less
|
|
758
|
+
than the input::
|
|
759
|
+
|
|
760
|
+
sage: R2 = Zp(2, 20)
|
|
761
|
+
sage: sqrt(R2(1))
|
|
762
|
+
1 + O(2^19)
|
|
763
|
+
sage: sqrt(R2(4))
|
|
764
|
+
2 + O(2^20)
|
|
765
|
+
|
|
766
|
+
sage: R.<t> = Zq(2^10, 10) # needs sage.libs.ntl
|
|
767
|
+
sage: u = 1 + 8*t # needs sage.libs.ntl
|
|
768
|
+
sage: sqrt(u) # needs sage.libs.ntl
|
|
769
|
+
1 + t*2^2 + t^2*2^3 + t^2*2^4 + (t^4 + t^3 + t^2)*2^5 + (t^4 + t^2)*2^6
|
|
770
|
+
+ (t^5 + t^2)*2^7 + (t^6 + t^5 + t^4 + t^2)*2^8 + O(2^9)
|
|
771
|
+
|
|
772
|
+
sage: x = polygen(QQ, 'x')
|
|
773
|
+
sage: R.<a> = Zp(2).extension(x^3 - 2)
|
|
774
|
+
sage: u = R(1 + a^4 + a^5 + a^7 + a^8, 10); u
|
|
775
|
+
1 + a^4 + a^5 + a^7 + a^8 + O(a^10)
|
|
776
|
+
sage: v = sqrt(u); v # needs sage.libs.ntl
|
|
777
|
+
1 + a^2 + a^4 + a^6 + O(a^7)
|
|
778
|
+
|
|
779
|
+
However, observe that the precision increases to its original value
|
|
780
|
+
when we recompute the square of the square root::
|
|
781
|
+
|
|
782
|
+
sage: v^2 # needs sage.libs.ntl
|
|
783
|
+
1 + a^4 + a^5 + a^7 + a^8 + O(a^10)
|
|
784
|
+
|
|
785
|
+
If the input does not have enough precision in order to determine if
|
|
786
|
+
the given element has a square root in the ground field, an error is
|
|
787
|
+
raised::
|
|
788
|
+
|
|
789
|
+
sage: R(1, 6).sqrt()
|
|
790
|
+
Traceback (most recent call last):
|
|
791
|
+
...
|
|
792
|
+
PrecisionError: not enough precision to be sure that this element has a square root
|
|
793
|
+
|
|
794
|
+
sage: R(1, 7).sqrt()
|
|
795
|
+
1 + O(a^4)
|
|
796
|
+
|
|
797
|
+
sage: R(1+a^6, 7).sqrt(extend=False)
|
|
798
|
+
Traceback (most recent call last):
|
|
799
|
+
...
|
|
800
|
+
ValueError: element is not a square
|
|
801
|
+
|
|
802
|
+
In particular, an error is raised when we try to compute the square
|
|
803
|
+
root of an inexact
|
|
804
|
+
|
|
805
|
+
TESTS::
|
|
806
|
+
|
|
807
|
+
sage: R = Qp(5, 100)
|
|
808
|
+
sage: c = R.random_element()
|
|
809
|
+
sage: s = sqrt(c^2)
|
|
810
|
+
sage: s == c or s == -c
|
|
811
|
+
True
|
|
812
|
+
|
|
813
|
+
sage: c2 = c^2
|
|
814
|
+
sage: c2 = c2.add_bigoh(c2.valuation() + 50)
|
|
815
|
+
sage: s == sqrt(c2)
|
|
816
|
+
True
|
|
817
|
+
"""
|
|
818
|
+
return self.square_root(extend, all)
|
|
819
|
+
|
|
820
|
+
#def square_root(self, extend=True, all=False):
|
|
821
|
+
# raise NotImplementedError
|
|
822
|
+
|
|
823
|
+
#def unit_part(self):
|
|
824
|
+
# raise NotImplementedError
|
|
825
|
+
|
|
826
|
+
#def valuation(self):
|
|
827
|
+
# raise NotImplementedError
|
|
828
|
+
|
|
829
|
+
def normalized_valuation(self):
|
|
830
|
+
r"""
|
|
831
|
+
Return the normalized valuation of this local ring element,
|
|
832
|
+
i.e., the valuation divided by the absolute ramification index.
|
|
833
|
+
|
|
834
|
+
INPUT:
|
|
835
|
+
|
|
836
|
+
- ``self`` -- a local ring element
|
|
837
|
+
|
|
838
|
+
OUTPUT: rational; the normalized valuation of ``self``
|
|
839
|
+
|
|
840
|
+
EXAMPLES::
|
|
841
|
+
|
|
842
|
+
sage: Q7 = Qp(7)
|
|
843
|
+
sage: R.<x> = Q7[] # needs sage.libs.ntl
|
|
844
|
+
sage: F.<z> = Q7.ext(x^3+7*x+7) # needs sage.libs.ntl
|
|
845
|
+
sage: z.normalized_valuation() # needs sage.libs.ntl
|
|
846
|
+
1/3
|
|
847
|
+
"""
|
|
848
|
+
F = self.parent()
|
|
849
|
+
return self.valuation()/F.absolute_e()
|
|
850
|
+
|
|
851
|
+
def _min_valuation(self):
|
|
852
|
+
r"""
|
|
853
|
+
Return the valuation of this local ring element.
|
|
854
|
+
|
|
855
|
+
This function only differs from valuation for relaxed elements.
|
|
856
|
+
|
|
857
|
+
INPUT:
|
|
858
|
+
|
|
859
|
+
- ``self`` -- a local ring element
|
|
860
|
+
|
|
861
|
+
OUTPUT: integer; the valuation of ``self``
|
|
862
|
+
|
|
863
|
+
EXAMPLES::
|
|
864
|
+
|
|
865
|
+
sage: R = Qp(7, 4, 'capped-rel', 'series')
|
|
866
|
+
sage: R(7)._min_valuation()
|
|
867
|
+
1
|
|
868
|
+
sage: R(1/7)._min_valuation()
|
|
869
|
+
-1
|
|
870
|
+
"""
|
|
871
|
+
return self.valuation()
|
|
872
|
+
|
|
873
|
+
def euclidean_degree(self):
|
|
874
|
+
r"""
|
|
875
|
+
Return the degree of this element as an element of a Euclidean domain.
|
|
876
|
+
|
|
877
|
+
EXAMPLES:
|
|
878
|
+
|
|
879
|
+
For a field, this is always zero except for the zero element::
|
|
880
|
+
|
|
881
|
+
sage: K = Qp(2)
|
|
882
|
+
sage: K.one().euclidean_degree()
|
|
883
|
+
0
|
|
884
|
+
sage: K.gen().euclidean_degree()
|
|
885
|
+
0
|
|
886
|
+
sage: K.zero().euclidean_degree()
|
|
887
|
+
Traceback (most recent call last):
|
|
888
|
+
...
|
|
889
|
+
ValueError: euclidean degree not defined for the zero element
|
|
890
|
+
|
|
891
|
+
For a ring which is not a field, this is the valuation of the element::
|
|
892
|
+
|
|
893
|
+
sage: R = Zp(2)
|
|
894
|
+
sage: R.one().euclidean_degree()
|
|
895
|
+
0
|
|
896
|
+
sage: R.gen().euclidean_degree()
|
|
897
|
+
1
|
|
898
|
+
sage: R.zero().euclidean_degree()
|
|
899
|
+
Traceback (most recent call last):
|
|
900
|
+
...
|
|
901
|
+
ValueError: euclidean degree not defined for the zero element
|
|
902
|
+
"""
|
|
903
|
+
if self.is_zero():
|
|
904
|
+
raise ValueError("euclidean degree not defined for the zero element")
|
|
905
|
+
|
|
906
|
+
from sage.categories.fields import Fields
|
|
907
|
+
if self.parent() in Fields():
|
|
908
|
+
from sage.rings.integer import Integer
|
|
909
|
+
return Integer(0)
|
|
910
|
+
return self.valuation()
|
|
911
|
+
|
|
912
|
+
@coerce_binop
|
|
913
|
+
def quo_rem(self, other, integral=False):
|
|
914
|
+
r"""
|
|
915
|
+
Return the quotient with remainder of the division of this element by
|
|
916
|
+
``other``.
|
|
917
|
+
|
|
918
|
+
INPUT:
|
|
919
|
+
|
|
920
|
+
- ``other`` -- an element in the same ring
|
|
921
|
+
- ``integral`` -- if ``True``, use integral-style remainders even when
|
|
922
|
+
the parent is a field. Namely, the remainder will have no terms in
|
|
923
|
+
its `p`-adic expansion above the valuation of ``other``.
|
|
924
|
+
|
|
925
|
+
EXAMPLES::
|
|
926
|
+
|
|
927
|
+
sage: R = Zp(3, 5)
|
|
928
|
+
sage: R(12).quo_rem(R(2))
|
|
929
|
+
(2*3 + O(3^6), 0)
|
|
930
|
+
sage: R(2).quo_rem(R(12))
|
|
931
|
+
(O(3^4), 2 + O(3^5))
|
|
932
|
+
|
|
933
|
+
sage: K = Qp(3, 5)
|
|
934
|
+
sage: K(12).quo_rem(K(2))
|
|
935
|
+
(2*3 + O(3^6), 0)
|
|
936
|
+
sage: K(2).quo_rem(K(12))
|
|
937
|
+
(2*3^-1 + 1 + 3 + 3^2 + 3^3 + O(3^4), 0)
|
|
938
|
+
|
|
939
|
+
You can get the same behavior for fields as for rings
|
|
940
|
+
by using integral=True::
|
|
941
|
+
|
|
942
|
+
sage: K(12).quo_rem(K(2), integral=True)
|
|
943
|
+
(2*3 + O(3^6), 0)
|
|
944
|
+
sage: K(2).quo_rem(K(12), integral=True)
|
|
945
|
+
(O(3^4), 2 + O(3^5))
|
|
946
|
+
"""
|
|
947
|
+
if other.is_zero():
|
|
948
|
+
raise ZeroDivisionError
|
|
949
|
+
|
|
950
|
+
from sage.categories.fields import Fields
|
|
951
|
+
if not integral and self.parent() in Fields():
|
|
952
|
+
return (self / other, self.parent().zero())
|
|
953
|
+
else:
|
|
954
|
+
return self._quo_rem(other)
|
|
955
|
+
|
|
956
|
+
def _test_trivial_powers(self, **options):
|
|
957
|
+
r"""
|
|
958
|
+
Check that taking trivial powers of elements works as expected.
|
|
959
|
+
|
|
960
|
+
EXAMPLES::
|
|
961
|
+
|
|
962
|
+
sage: x = Zp(3, 5).zero()
|
|
963
|
+
sage: x._test_trivial_powers()
|
|
964
|
+
"""
|
|
965
|
+
tester = self._tester(**options)
|
|
966
|
+
|
|
967
|
+
x = self**1
|
|
968
|
+
tester.assertEqual(x, self)
|
|
969
|
+
tester.assertEqual(x.precision_absolute(), self.precision_absolute())
|
|
970
|
+
|
|
971
|
+
z = self**0
|
|
972
|
+
one = self.parent().one()
|
|
973
|
+
tester.assertEqual(z, one)
|
|
974
|
+
tester.assertEqual(z.precision_absolute(), one.precision_absolute())
|
|
975
|
+
|
|
976
|
+
def _test_expansion(self, **options):
|
|
977
|
+
r"""
|
|
978
|
+
Check that ``expansion`` works as expected.
|
|
979
|
+
|
|
980
|
+
EXAMPLES::
|
|
981
|
+
|
|
982
|
+
sage: x = Zp(3, 5).zero()
|
|
983
|
+
sage: x._test_expansion()
|
|
984
|
+
"""
|
|
985
|
+
tester = self._tester(**options)
|
|
986
|
+
|
|
987
|
+
shift = self.parent().one()
|
|
988
|
+
v = 0
|
|
989
|
+
# so that this test doesn't take too long for large precision cap
|
|
990
|
+
prec_cutoff = int(min((10000 / (1 + self.precision_relative())).ceil(), 100))
|
|
991
|
+
|
|
992
|
+
from sage.categories.fields import Fields
|
|
993
|
+
if self.parent() in Fields():
|
|
994
|
+
v = self.valuation()
|
|
995
|
+
from sage.rings.infinity import infinity
|
|
996
|
+
if self.valuation() is not infinity:
|
|
997
|
+
shift = shift << v
|
|
998
|
+
|
|
999
|
+
if self.parent().is_lattice_prec() or self.parent().is_relaxed():
|
|
1000
|
+
modes = ['simple']
|
|
1001
|
+
else:
|
|
1002
|
+
modes = ['simple', 'smallest', 'teichmuller']
|
|
1003
|
+
for mode in modes:
|
|
1004
|
+
expansion = self.expansion(lift_mode=mode)
|
|
1005
|
+
expansion_sum = sum(self.parent().maximal_unramified_subextension()(c) *
|
|
1006
|
+
(self.parent().one()<<i)
|
|
1007
|
+
for i, c in enumerate(islice(expansion, prec_cutoff))) * shift
|
|
1008
|
+
|
|
1009
|
+
tester.assertEqual(self.add_bigoh(prec_cutoff), expansion_sum.add_bigoh(prec_cutoff))
|
|
1010
|
+
|
|
1011
|
+
for i, c in enumerate(islice(expansion, prec_cutoff)):
|
|
1012
|
+
tester.assertEqual(c, self.expansion(lift_mode=mode, n=i+v))
|
|
1013
|
+
|
|
1014
|
+
if mode == 'teichmuller':
|
|
1015
|
+
q = self.parent().residue_field().cardinality()
|
|
1016
|
+
for c in islice(expansion, prec_cutoff):
|
|
1017
|
+
tester.assertEqual(c, c**q)
|