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,856 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
# sage.doctest: needs sage.rings.finite_rings
|
|
3
|
+
"""
|
|
4
|
+
Finite field morphisms
|
|
5
|
+
|
|
6
|
+
This file provides several classes implementing:
|
|
7
|
+
|
|
8
|
+
- embeddings between finite fields
|
|
9
|
+
|
|
10
|
+
- Frobenius isomorphism on finite fields
|
|
11
|
+
|
|
12
|
+
EXAMPLES::
|
|
13
|
+
|
|
14
|
+
sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
|
|
15
|
+
|
|
16
|
+
Construction of an embedding::
|
|
17
|
+
|
|
18
|
+
sage: k.<t> = GF(3^7)
|
|
19
|
+
sage: K.<T> = GF(3^21)
|
|
20
|
+
sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)); f # random
|
|
21
|
+
Ring morphism:
|
|
22
|
+
From: Finite Field in t of size 3^7
|
|
23
|
+
To: Finite Field in T of size 3^21
|
|
24
|
+
Defn: t |--> T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T
|
|
25
|
+
|
|
26
|
+
sage: f(t) # random
|
|
27
|
+
T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T
|
|
28
|
+
sage: f(t) == f.im_gens()[0]
|
|
29
|
+
True
|
|
30
|
+
|
|
31
|
+
The map `f` has a method ``section`` which returns a partially defined
|
|
32
|
+
map which is the inverse of `f` on the image of `f`::
|
|
33
|
+
|
|
34
|
+
sage: g = f.section(); g # random
|
|
35
|
+
Section of Ring morphism:
|
|
36
|
+
From: Finite Field in t of size 3^7
|
|
37
|
+
To: Finite Field in T of size 3^21
|
|
38
|
+
Defn: t |--> T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T
|
|
39
|
+
sage: a = k.random_element() # needs sage.modules
|
|
40
|
+
sage: g(f(a)) == a # needs sage.modules
|
|
41
|
+
True
|
|
42
|
+
sage: g(T)
|
|
43
|
+
Traceback (most recent call last):
|
|
44
|
+
...
|
|
45
|
+
ValueError: T is not in the image of Ring morphism:
|
|
46
|
+
From: Finite Field in t of size 3^7
|
|
47
|
+
To: Finite Field in T of size 3^21
|
|
48
|
+
Defn: ...
|
|
49
|
+
|
|
50
|
+
There is no embedding of `GF(5^6)` into `GF(5^11)`::
|
|
51
|
+
|
|
52
|
+
sage: k.<t> = GF(5^6)
|
|
53
|
+
sage: K.<T> = GF(5^11)
|
|
54
|
+
sage: FiniteFieldHomomorphism_generic(Hom(k, K))
|
|
55
|
+
Traceback (most recent call last):
|
|
56
|
+
...
|
|
57
|
+
ValueError: No embedding of Finite Field in t of size 5^6 into Finite Field in T of size 5^11
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
Construction of Frobenius endomorphisms::
|
|
61
|
+
|
|
62
|
+
sage: k.<t> = GF(7^14)
|
|
63
|
+
sage: Frob = k.frobenius_endomorphism(); Frob
|
|
64
|
+
Frobenius endomorphism t |--> t^7 on Finite Field in t of size 7^14
|
|
65
|
+
sage: Frob(t)
|
|
66
|
+
t^7
|
|
67
|
+
|
|
68
|
+
Some basic arithmetics is supported::
|
|
69
|
+
|
|
70
|
+
sage: Frob^2
|
|
71
|
+
Frobenius endomorphism t |--> t^(7^2) on Finite Field in t of size 7^14
|
|
72
|
+
sage: f = k.frobenius_endomorphism(7); f
|
|
73
|
+
Frobenius endomorphism t |--> t^(7^7) on Finite Field in t of size 7^14
|
|
74
|
+
sage: f*Frob
|
|
75
|
+
Frobenius endomorphism t |--> t^(7^8) on Finite Field in t of size 7^14
|
|
76
|
+
|
|
77
|
+
sage: Frob.order()
|
|
78
|
+
14
|
|
79
|
+
sage: f.order()
|
|
80
|
+
2
|
|
81
|
+
|
|
82
|
+
Note that simplifications are made automatically::
|
|
83
|
+
|
|
84
|
+
sage: Frob^16
|
|
85
|
+
Frobenius endomorphism t |--> t^(7^2) on Finite Field in t of size 7^14
|
|
86
|
+
sage: Frob^28
|
|
87
|
+
Identity endomorphism of Finite Field in t of size 7^14
|
|
88
|
+
|
|
89
|
+
And that comparisons work::
|
|
90
|
+
|
|
91
|
+
sage: Frob == Frob^15
|
|
92
|
+
True
|
|
93
|
+
sage: Frob^14 == Hom(k, k).identity()
|
|
94
|
+
True
|
|
95
|
+
|
|
96
|
+
AUTHOR:
|
|
97
|
+
|
|
98
|
+
- Xavier Caruso (2012-06-29)
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
#############################################################################
|
|
102
|
+
# Copyright (C) 2012 Xavier Caruso <xavier.caruso@normalesup.org>
|
|
103
|
+
#
|
|
104
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
105
|
+
#
|
|
106
|
+
# http://www.gnu.org/licenses/
|
|
107
|
+
#****************************************************************************
|
|
108
|
+
|
|
109
|
+
from sage.rings.integer cimport Integer
|
|
110
|
+
|
|
111
|
+
from sage.categories.homset import Hom
|
|
112
|
+
from sage.structure.element cimport Element
|
|
113
|
+
|
|
114
|
+
from sage.rings.finite_rings.finite_field_base import FiniteField as FiniteField_base
|
|
115
|
+
from sage.rings.morphism cimport RingHomomorphism, RingHomomorphism_im_gens, FrobeniusEndomorphism_generic
|
|
116
|
+
from sage.rings.finite_rings.finite_field_constructor import FiniteField
|
|
117
|
+
|
|
118
|
+
from sage.categories.map cimport Section
|
|
119
|
+
from sage.categories.morphism cimport Morphism
|
|
120
|
+
|
|
121
|
+
from sage.misc.cachefunc import cached_method
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
cdef class SectionFiniteFieldHomomorphism_generic(Section):
|
|
125
|
+
"""
|
|
126
|
+
A class implementing sections of embeddings between finite fields.
|
|
127
|
+
"""
|
|
128
|
+
cpdef Element _call_(self, x): # Not optimized
|
|
129
|
+
"""
|
|
130
|
+
TESTS::
|
|
131
|
+
|
|
132
|
+
sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
|
|
133
|
+
sage: k.<t> = GF(3^7)
|
|
134
|
+
sage: K.<T> = GF(3^21)
|
|
135
|
+
sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
|
|
136
|
+
sage: g = f.section()
|
|
137
|
+
sage: a = k.random_element() # needs sage.modules
|
|
138
|
+
sage: g(f(a)) == a # needs sage.modules
|
|
139
|
+
True
|
|
140
|
+
|
|
141
|
+
sage: g(T)
|
|
142
|
+
Traceback (most recent call last):
|
|
143
|
+
...
|
|
144
|
+
ValueError: T is not in the image of Ring morphism:
|
|
145
|
+
From: Finite Field in t of size 3^7
|
|
146
|
+
To: Finite Field in T of size 3^21
|
|
147
|
+
Defn: t |--> ...
|
|
148
|
+
"""
|
|
149
|
+
for root, _ in x.minimal_polynomial().roots(ring=self.codomain()):
|
|
150
|
+
if self._inverse(root) == x:
|
|
151
|
+
return root
|
|
152
|
+
raise ValueError("%s is not in the image of %s" % (x, self._inverse))
|
|
153
|
+
|
|
154
|
+
def _repr_(self):
|
|
155
|
+
"""
|
|
156
|
+
Return a string representation of this section.
|
|
157
|
+
|
|
158
|
+
EXAMPLES::
|
|
159
|
+
|
|
160
|
+
sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
|
|
161
|
+
sage: k.<t> = GF(3^7)
|
|
162
|
+
sage: K.<T> = GF(3^21)
|
|
163
|
+
sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
|
|
164
|
+
sage: g = f.section()
|
|
165
|
+
sage: g._repr_() # random
|
|
166
|
+
'Section of Ring morphism:\n From: Finite Field in t of size 3^7\n To: Finite Field in T of size 3^21\n Defn: t |--> T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T'
|
|
167
|
+
"""
|
|
168
|
+
return "Section of %s" % self._inverse
|
|
169
|
+
|
|
170
|
+
def _latex_(self):
|
|
171
|
+
r"""
|
|
172
|
+
Return a latex representation of this section.
|
|
173
|
+
|
|
174
|
+
EXAMPLES::
|
|
175
|
+
|
|
176
|
+
sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
|
|
177
|
+
sage: k.<t> = GF(3^7)
|
|
178
|
+
sage: K.<T> = GF(3^21)
|
|
179
|
+
sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
|
|
180
|
+
sage: g = f.section()
|
|
181
|
+
sage: g._latex_()
|
|
182
|
+
'\\verb"Section of "\\Bold{F}_{3^{7}} \\hookrightarrow \\Bold{F}_{3^{21}}'
|
|
183
|
+
"""
|
|
184
|
+
return '\\verb"Section of "' + self._inverse._latex_()
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens):
|
|
188
|
+
"""
|
|
189
|
+
A class implementing embeddings between finite fields.
|
|
190
|
+
|
|
191
|
+
TESTS::
|
|
192
|
+
|
|
193
|
+
sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
|
|
194
|
+
sage: k.<t> = GF(3^7)
|
|
195
|
+
sage: K.<T> = GF(3^21)
|
|
196
|
+
sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
|
|
197
|
+
sage: TestSuite(f).run()
|
|
198
|
+
"""
|
|
199
|
+
def __init__(self, parent, im_gens=None, base_map=None, check=True, section_class=None):
|
|
200
|
+
"""
|
|
201
|
+
TESTS::
|
|
202
|
+
|
|
203
|
+
sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
|
|
204
|
+
sage: k.<t> = GF(3^7)
|
|
205
|
+
sage: K.<T> = GF(3^21)
|
|
206
|
+
sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)); f # random
|
|
207
|
+
Ring morphism:
|
|
208
|
+
From: Finite Field in t of size 3^7
|
|
209
|
+
To: Finite Field in T of size 3^21
|
|
210
|
+
Defn: t |--> T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T
|
|
211
|
+
sage: a = k.random_element() # needs sage.modules
|
|
212
|
+
sage: b = k.random_element() # needs sage.modules
|
|
213
|
+
sage: f(a) + f(b) == f(a + b) # needs sage.modules
|
|
214
|
+
True
|
|
215
|
+
|
|
216
|
+
sage: k.<t> = GF(3^6)
|
|
217
|
+
sage: K.<t> = GF(3^9)
|
|
218
|
+
sage: FiniteFieldHomomorphism_generic(Hom(k, K))
|
|
219
|
+
Traceback (most recent call last):
|
|
220
|
+
...
|
|
221
|
+
ValueError: No embedding of Finite Field in t of size 3^6 into Finite Field in t of size 3^9
|
|
222
|
+
|
|
223
|
+
sage: FiniteFieldHomomorphism_generic(Hom(ZZ, QQ))
|
|
224
|
+
Traceback (most recent call last):
|
|
225
|
+
...
|
|
226
|
+
TypeError: The domain is not a finite field or does not provide the required interface for finite fields
|
|
227
|
+
|
|
228
|
+
sage: R.<x> = k[]
|
|
229
|
+
sage: FiniteFieldHomomorphism_generic(Hom(k, R))
|
|
230
|
+
Traceback (most recent call last):
|
|
231
|
+
...
|
|
232
|
+
TypeError: The codomain is not a finite field or does not provide the required interface for finite fields
|
|
233
|
+
"""
|
|
234
|
+
domain = parent.domain()
|
|
235
|
+
codomain = parent.codomain()
|
|
236
|
+
if not isinstance(domain, FiniteField_base):
|
|
237
|
+
raise TypeError("The domain is not a finite field or does not provide the required interface for finite fields")
|
|
238
|
+
if not isinstance(codomain, FiniteField_base):
|
|
239
|
+
raise TypeError("The codomain is not a finite field or does not provide the required interface for finite fields")
|
|
240
|
+
if domain.characteristic() != codomain.characteristic() or codomain.degree() % domain.degree() != 0:
|
|
241
|
+
raise ValueError("No embedding of %s into %s" % (domain, codomain))
|
|
242
|
+
if im_gens is None:
|
|
243
|
+
im_gens = domain.modulus().any_root(codomain)
|
|
244
|
+
check=False
|
|
245
|
+
RingHomomorphism_im_gens.__init__(self, parent, im_gens, base_map=base_map, check=check)
|
|
246
|
+
if section_class is None:
|
|
247
|
+
self._section_class = SectionFiniteFieldHomomorphism_generic
|
|
248
|
+
else:
|
|
249
|
+
self._section_class = section_class
|
|
250
|
+
|
|
251
|
+
def __copy__(self):
|
|
252
|
+
"""
|
|
253
|
+
Return a copy of this map.
|
|
254
|
+
|
|
255
|
+
TESTS::
|
|
256
|
+
|
|
257
|
+
sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
|
|
258
|
+
sage: k.<t> = GF(3^7)
|
|
259
|
+
sage: K.<T> = GF(3^21)
|
|
260
|
+
sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
|
|
261
|
+
sage: g = copy(f)
|
|
262
|
+
sage: g.section()(g(t)) == f.section()(f(t))
|
|
263
|
+
True
|
|
264
|
+
|
|
265
|
+
::
|
|
266
|
+
|
|
267
|
+
sage: F = GF(2)
|
|
268
|
+
sage: E = GF(4)
|
|
269
|
+
sage: phi = E.coerce_map_from(F); phi
|
|
270
|
+
Ring morphism:
|
|
271
|
+
From: Finite Field of size 2
|
|
272
|
+
To: Finite Field in z2 of size 2^2
|
|
273
|
+
Defn: 1 |--> 1
|
|
274
|
+
sage: phi.section()
|
|
275
|
+
Section of Ring morphism:
|
|
276
|
+
From: Finite Field of size 2
|
|
277
|
+
To: Finite Field in z2 of size 2^2
|
|
278
|
+
Defn: 1 |--> 1
|
|
279
|
+
"""
|
|
280
|
+
cdef FiniteFieldHomomorphism_generic out = super().__copy__()
|
|
281
|
+
out._section_class = self._section_class
|
|
282
|
+
return out
|
|
283
|
+
|
|
284
|
+
def _latex_(self):
|
|
285
|
+
r"""
|
|
286
|
+
Return a latex representation of this embedding.
|
|
287
|
+
|
|
288
|
+
EXAMPLES::
|
|
289
|
+
|
|
290
|
+
sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
|
|
291
|
+
sage: k.<t> = GF(3^7)
|
|
292
|
+
sage: K.<T> = GF(3^21)
|
|
293
|
+
sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
|
|
294
|
+
sage: f._latex_()
|
|
295
|
+
'\\Bold{F}_{3^{7}} \\hookrightarrow \\Bold{F}_{3^{21}}'
|
|
296
|
+
"""
|
|
297
|
+
return self.domain()._latex_() + " \\hookrightarrow " + self.codomain()._latex_()
|
|
298
|
+
|
|
299
|
+
cpdef Element _call_(self, x):
|
|
300
|
+
"""
|
|
301
|
+
TESTS::
|
|
302
|
+
|
|
303
|
+
sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
|
|
304
|
+
sage: k.<t> = GF(3^3)
|
|
305
|
+
sage: K.<T> = GF(3^9)
|
|
306
|
+
sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
|
|
307
|
+
sage: f(t) # random
|
|
308
|
+
2*T^6 + 2*T^4 + T^2 + T
|
|
309
|
+
|
|
310
|
+
sage: # needs sage.modules
|
|
311
|
+
sage: a = k.random_element()
|
|
312
|
+
sage: b = k.random_element()
|
|
313
|
+
sage: f(a+b) == f(a) + f(b)
|
|
314
|
+
True
|
|
315
|
+
sage: f(a*b) == f(a) * f(b)
|
|
316
|
+
True
|
|
317
|
+
"""
|
|
318
|
+
f = x.polynomial()
|
|
319
|
+
bm = self.base_map()
|
|
320
|
+
if bm is not None:
|
|
321
|
+
f = f.map_coefficients(bm)
|
|
322
|
+
return f(self.im_gens()[0])
|
|
323
|
+
|
|
324
|
+
def is_injective(self):
|
|
325
|
+
"""
|
|
326
|
+
Return ``True`` since a embedding between finite fields is
|
|
327
|
+
always injective.
|
|
328
|
+
|
|
329
|
+
EXAMPLES::
|
|
330
|
+
|
|
331
|
+
sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
|
|
332
|
+
sage: k.<t> = GF(3^3)
|
|
333
|
+
sage: K.<T> = GF(3^9)
|
|
334
|
+
sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
|
|
335
|
+
sage: f.is_injective()
|
|
336
|
+
True
|
|
337
|
+
"""
|
|
338
|
+
return True
|
|
339
|
+
|
|
340
|
+
def is_surjective(self):
|
|
341
|
+
"""
|
|
342
|
+
Return ``True`` if this embedding is surjective (and hence an
|
|
343
|
+
isomorphism.
|
|
344
|
+
|
|
345
|
+
EXAMPLES::
|
|
346
|
+
|
|
347
|
+
sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
|
|
348
|
+
sage: k.<t> = GF(3^3)
|
|
349
|
+
sage: K.<T> = GF(3^9)
|
|
350
|
+
sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
|
|
351
|
+
sage: f.is_surjective()
|
|
352
|
+
False
|
|
353
|
+
sage: g = FiniteFieldHomomorphism_generic(Hom(k, k))
|
|
354
|
+
sage: g.is_surjective()
|
|
355
|
+
True
|
|
356
|
+
"""
|
|
357
|
+
return self.domain().cardinality() == self.codomain().cardinality()
|
|
358
|
+
|
|
359
|
+
@cached_method
|
|
360
|
+
def section(self):
|
|
361
|
+
"""
|
|
362
|
+
Return the ``inverse`` of this embedding.
|
|
363
|
+
|
|
364
|
+
It is a partially defined map whose domain is the codomain
|
|
365
|
+
of the embedding, but which is only defined on the image of
|
|
366
|
+
the embedding.
|
|
367
|
+
|
|
368
|
+
EXAMPLES::
|
|
369
|
+
|
|
370
|
+
sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
|
|
371
|
+
sage: k.<t> = GF(3^7)
|
|
372
|
+
sage: K.<T> = GF(3^21)
|
|
373
|
+
sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
|
|
374
|
+
sage: g = f.section(); g # random
|
|
375
|
+
Section of Ring morphism:
|
|
376
|
+
From: Finite Field in t of size 3^7
|
|
377
|
+
To: Finite Field in T of size 3^21
|
|
378
|
+
Defn: t |--> T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T
|
|
379
|
+
|
|
380
|
+
sage: # needs sage.modules
|
|
381
|
+
sage: a = k.random_element()
|
|
382
|
+
sage: b = k.random_element()
|
|
383
|
+
sage: g(f(a) + f(b)) == a + b
|
|
384
|
+
True
|
|
385
|
+
sage: g(T)
|
|
386
|
+
Traceback (most recent call last):
|
|
387
|
+
...
|
|
388
|
+
ValueError: T is not in the image of Ring morphism:
|
|
389
|
+
From: Finite Field in t of size 3^7
|
|
390
|
+
To: Finite Field in T of size 3^21
|
|
391
|
+
Defn: ...
|
|
392
|
+
"""
|
|
393
|
+
if self.base_map() is not None:
|
|
394
|
+
raise NotImplementedError
|
|
395
|
+
return self._section_class(self)
|
|
396
|
+
|
|
397
|
+
def _inverse_image_element(self, b):
|
|
398
|
+
"""
|
|
399
|
+
Return the unique ``a`` such that ``self(a) = b`` if one such exists.
|
|
400
|
+
|
|
401
|
+
This method is simply a shorthand for calling the map returned by
|
|
402
|
+
``self.section()`` on ``b``.
|
|
403
|
+
|
|
404
|
+
EXAMPLES::
|
|
405
|
+
|
|
406
|
+
sage: k.<t> = GF(3^7)
|
|
407
|
+
sage: K.<T>, f = k.extension(3, map=True)
|
|
408
|
+
sage: b = f(t^2); b
|
|
409
|
+
2*T^20 + 2*T^19 + T^18 + T^15 + 2*T^14 + 2*T^13 + 2*T^12 + T^8 + 2*T^6 + T^5 + 2*T^4 + T^3 + 2*T^2 + T
|
|
410
|
+
sage: f.inverse_image(b)
|
|
411
|
+
t^2
|
|
412
|
+
sage: f.inverse_image(T)
|
|
413
|
+
Traceback (most recent call last):
|
|
414
|
+
...
|
|
415
|
+
ValueError: T is not in the image of Ring morphism:
|
|
416
|
+
From: Finite Field in t of size 3^7
|
|
417
|
+
To: Finite Field in T of size 3^21
|
|
418
|
+
Defn: t |--> T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T
|
|
419
|
+
"""
|
|
420
|
+
return self.section()(b)
|
|
421
|
+
|
|
422
|
+
def __hash__(self):
|
|
423
|
+
r"""
|
|
424
|
+
Return a hash of this morphism.
|
|
425
|
+
|
|
426
|
+
TESTS::
|
|
427
|
+
|
|
428
|
+
sage: k.<t> = GF(5^3)
|
|
429
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
430
|
+
sage: embed = Frob.fixed_field()[1]
|
|
431
|
+
sage: hash(embed) # random
|
|
432
|
+
-2441354824160407762
|
|
433
|
+
"""
|
|
434
|
+
return Morphism.__hash__(self)
|
|
435
|
+
|
|
436
|
+
cdef dict _extra_slots(self):
|
|
437
|
+
r"""
|
|
438
|
+
Helper function for copying and pickling.
|
|
439
|
+
|
|
440
|
+
TESTS::
|
|
441
|
+
|
|
442
|
+
sage: k.<t> = GF(5^3)
|
|
443
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
444
|
+
sage: embed = Frob.fixed_field()[1]
|
|
445
|
+
sage: embed.__reduce__() # indirect doctest
|
|
446
|
+
(<built-in function unpickle_map>,
|
|
447
|
+
(<class 'sage.rings.finite_rings.hom_prime_finite_field.FiniteFieldHomomorphism_prime'>,
|
|
448
|
+
Set of field embeddings from Finite Field of size 5 to Finite Field in t of size 5^3,
|
|
449
|
+
{},
|
|
450
|
+
{'__im_gens': [1],
|
|
451
|
+
'_base_map': None,
|
|
452
|
+
'_codomain': Finite Field in t of size 5^3,
|
|
453
|
+
'_domain': Finite Field of size 5,
|
|
454
|
+
'_is_coercion': False,
|
|
455
|
+
'_lift': None,
|
|
456
|
+
'_repr_type_str': None,
|
|
457
|
+
'_section_class': <class 'sage.rings.finite_rings.hom_prime_finite_field.SectionFiniteFieldHomomorphism_prime'>}))
|
|
458
|
+
"""
|
|
459
|
+
cdef dict slots
|
|
460
|
+
slots = RingHomomorphism_im_gens._extra_slots(self)
|
|
461
|
+
slots['_section_class'] = self._section_class
|
|
462
|
+
return slots
|
|
463
|
+
|
|
464
|
+
cdef _update_slots(self, dict slots):
|
|
465
|
+
r"""
|
|
466
|
+
Helper function for copying and pickling.
|
|
467
|
+
|
|
468
|
+
TESTS::
|
|
469
|
+
|
|
470
|
+
sage: k.<t> = GF(5^3)
|
|
471
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
472
|
+
sage: embed = Frob.fixed_field()[1]
|
|
473
|
+
sage: f = loads(dumps(embed))
|
|
474
|
+
sage: f == embed
|
|
475
|
+
True
|
|
476
|
+
sage: f.section()
|
|
477
|
+
Section of Ring morphism:
|
|
478
|
+
From: Finite Field of size 5
|
|
479
|
+
To: Finite Field in t of size 5^3
|
|
480
|
+
Defn: 1 |--> 1
|
|
481
|
+
"""
|
|
482
|
+
RingHomomorphism_im_gens._update_slots(self, slots)
|
|
483
|
+
self._section_class = slots['_section_class']
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic):
|
|
487
|
+
"""
|
|
488
|
+
A class implementing Frobenius endomorphisms on finite fields.
|
|
489
|
+
|
|
490
|
+
TESTS::
|
|
491
|
+
|
|
492
|
+
sage: k.<a> = GF(7^11)
|
|
493
|
+
sage: Frob = k.frobenius_endomorphism(5)
|
|
494
|
+
sage: TestSuite(Frob).run()
|
|
495
|
+
"""
|
|
496
|
+
def __init__(self, domain, n=1):
|
|
497
|
+
"""
|
|
498
|
+
INPUT:
|
|
499
|
+
|
|
500
|
+
- ``domain`` -- a finite field
|
|
501
|
+
|
|
502
|
+
- ``n`` -- integer (default: 1)
|
|
503
|
+
|
|
504
|
+
.. NOTE::
|
|
505
|
+
|
|
506
|
+
`n` may be negative.
|
|
507
|
+
|
|
508
|
+
OUTPUT:
|
|
509
|
+
|
|
510
|
+
The `n`-th power of the absolute (arithmetic) Frobenius
|
|
511
|
+
endomorphism on ``domain``
|
|
512
|
+
|
|
513
|
+
TESTS::
|
|
514
|
+
|
|
515
|
+
sage: from sage.rings.finite_rings.hom_finite_field import FrobeniusEndomorphism_finite_field
|
|
516
|
+
sage: k.<t> = GF(5^3)
|
|
517
|
+
sage: FrobeniusEndomorphism_finite_field(k)
|
|
518
|
+
Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^3
|
|
519
|
+
sage: FrobeniusEndomorphism_finite_field(k, 2)
|
|
520
|
+
Frobenius endomorphism t |--> t^(5^2) on Finite Field in t of size 5^3
|
|
521
|
+
|
|
522
|
+
sage: FrobeniusEndomorphism_finite_field(k, t)
|
|
523
|
+
Traceback (most recent call last):
|
|
524
|
+
...
|
|
525
|
+
TypeError: n (=t) is not an integer
|
|
526
|
+
|
|
527
|
+
sage: FrobeniusEndomorphism_finite_field(k['x'])
|
|
528
|
+
Traceback (most recent call last):
|
|
529
|
+
...
|
|
530
|
+
TypeError: The domain is not a finite field or does not provide the required interface for finite fields
|
|
531
|
+
"""
|
|
532
|
+
if not isinstance(domain, FiniteField_base):
|
|
533
|
+
raise TypeError("The domain is not a finite field or does not provide the required interface for finite fields")
|
|
534
|
+
try:
|
|
535
|
+
n = Integer(n)
|
|
536
|
+
except TypeError:
|
|
537
|
+
raise TypeError("n (=%s) is not an integer" % n)
|
|
538
|
+
|
|
539
|
+
self._degree = domain.degree()
|
|
540
|
+
self._power = n % self._degree
|
|
541
|
+
self._degree_fixed = domain.degree().gcd(self._power)
|
|
542
|
+
self._order = self._degree / self._degree_fixed
|
|
543
|
+
self._q = domain.characteristic() ** self._power
|
|
544
|
+
RingHomomorphism.__init__(self, Hom(domain, domain))
|
|
545
|
+
|
|
546
|
+
def _repr_(self):
|
|
547
|
+
"""
|
|
548
|
+
Return a string representation of this endomorphism.
|
|
549
|
+
|
|
550
|
+
EXAMPLES::
|
|
551
|
+
|
|
552
|
+
sage: k.<t> = GF(5^3)
|
|
553
|
+
sage: Frob = k.frobenius_endomorphism(); Frob
|
|
554
|
+
Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^3
|
|
555
|
+
|
|
556
|
+
sage: Frob._repr_()
|
|
557
|
+
'Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^3'
|
|
558
|
+
"""
|
|
559
|
+
name = self.domain().variable_name()
|
|
560
|
+
if self._power == 0:
|
|
561
|
+
s = "Identity endomorphism of"
|
|
562
|
+
elif self._power == 1:
|
|
563
|
+
s = "Frobenius endomorphism %s |--> %s^%s on" % (name, name, self.domain().characteristic())
|
|
564
|
+
else:
|
|
565
|
+
s = "Frobenius endomorphism %s |--> %s^(%s^%s) on" % (name, name, self.domain().characteristic(), self._power)
|
|
566
|
+
s += " %s" % self.domain()
|
|
567
|
+
return s
|
|
568
|
+
|
|
569
|
+
def _repr_short(self):
|
|
570
|
+
"""
|
|
571
|
+
Return a short string representation of this endomorphism.
|
|
572
|
+
|
|
573
|
+
EXAMPLES::
|
|
574
|
+
|
|
575
|
+
sage: k.<t> = GF(5^3)
|
|
576
|
+
sage: Frob = k.frobenius_endomorphism(); Frob
|
|
577
|
+
Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^3
|
|
578
|
+
|
|
579
|
+
sage: Frob._repr_short()
|
|
580
|
+
't |--> t^5'
|
|
581
|
+
"""
|
|
582
|
+
name = self.domain().variable_name()
|
|
583
|
+
if self._power == 0:
|
|
584
|
+
s = "Identity"
|
|
585
|
+
elif self._power == 1:
|
|
586
|
+
s = "%s |--> %s^%s" % (name, name, self.domain().characteristic())
|
|
587
|
+
else:
|
|
588
|
+
s = "%s |--> %s^(%s^%s)" % (name, name, self.domain().characteristic(), self._power)
|
|
589
|
+
return s
|
|
590
|
+
|
|
591
|
+
def _latex_(self):
|
|
592
|
+
r"""
|
|
593
|
+
Return a latex representation of this endomorphism.
|
|
594
|
+
|
|
595
|
+
EXAMPLES::
|
|
596
|
+
|
|
597
|
+
sage: k.<t> = GF(5^3)
|
|
598
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
599
|
+
sage: Frob._latex_()
|
|
600
|
+
't \\mapsto t^{5}'
|
|
601
|
+
"""
|
|
602
|
+
try:
|
|
603
|
+
name = self.domain().latex_variable_names()[0]
|
|
604
|
+
except IndexError:
|
|
605
|
+
name = "x"
|
|
606
|
+
if self._power == 0:
|
|
607
|
+
s = '\\verb"id"'
|
|
608
|
+
elif self._power == 1:
|
|
609
|
+
s = "%s \\mapsto %s^{%s}" % (name, name, self.domain().characteristic())
|
|
610
|
+
else:
|
|
611
|
+
s = "%s \\mapsto %s^{%s^{%s}}" % (name, name, self.domain().characteristic(), self._power)
|
|
612
|
+
return s
|
|
613
|
+
|
|
614
|
+
cpdef Element _call_(self, x):
|
|
615
|
+
"""
|
|
616
|
+
TESTS::
|
|
617
|
+
|
|
618
|
+
sage: k.<t> = GF(5^3)
|
|
619
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
620
|
+
sage: Frob(t)
|
|
621
|
+
2*t^2 + 4*t + 4
|
|
622
|
+
sage: Frob(t) == t^5
|
|
623
|
+
True
|
|
624
|
+
"""
|
|
625
|
+
if self.is_identity():
|
|
626
|
+
return x
|
|
627
|
+
else:
|
|
628
|
+
return x.pth_power(self._power)
|
|
629
|
+
|
|
630
|
+
def order(self):
|
|
631
|
+
"""
|
|
632
|
+
Return the order of this endomorphism.
|
|
633
|
+
|
|
634
|
+
EXAMPLES::
|
|
635
|
+
|
|
636
|
+
sage: k.<t> = GF(5^12)
|
|
637
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
638
|
+
sage: Frob.order()
|
|
639
|
+
12
|
|
640
|
+
sage: (Frob^2).order()
|
|
641
|
+
6
|
|
642
|
+
sage: (Frob^9).order()
|
|
643
|
+
4
|
|
644
|
+
"""
|
|
645
|
+
if self._order == 0:
|
|
646
|
+
from sage.rings.infinity import Infinity
|
|
647
|
+
return Infinity
|
|
648
|
+
else:
|
|
649
|
+
return Integer(self._order)
|
|
650
|
+
|
|
651
|
+
def power(self):
|
|
652
|
+
"""
|
|
653
|
+
Return an integer `n` such that this endomorphism
|
|
654
|
+
is the `n`-th power of the absolute (arithmetic)
|
|
655
|
+
Frobenius.
|
|
656
|
+
|
|
657
|
+
EXAMPLES::
|
|
658
|
+
|
|
659
|
+
sage: k.<t> = GF(5^12)
|
|
660
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
661
|
+
sage: Frob.power()
|
|
662
|
+
1
|
|
663
|
+
sage: (Frob^9).power()
|
|
664
|
+
9
|
|
665
|
+
sage: (Frob^13).power()
|
|
666
|
+
1
|
|
667
|
+
"""
|
|
668
|
+
return self._power
|
|
669
|
+
|
|
670
|
+
def __pow__(self, n, modulus):
|
|
671
|
+
"""
|
|
672
|
+
Return the `n`-th iterate of this endomorphism.
|
|
673
|
+
|
|
674
|
+
EXAMPLES::
|
|
675
|
+
|
|
676
|
+
sage: k.<t> = GF(5^12)
|
|
677
|
+
sage: Frob = k.frobenius_endomorphism(); Frob
|
|
678
|
+
Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^12
|
|
679
|
+
sage: Frob^2
|
|
680
|
+
Frobenius endomorphism t |--> t^(5^2) on Finite Field in t of size 5^12
|
|
681
|
+
|
|
682
|
+
The result is simplified if possible::
|
|
683
|
+
|
|
684
|
+
sage: Frob^15
|
|
685
|
+
Frobenius endomorphism t |--> t^(5^3) on Finite Field in t of size 5^12
|
|
686
|
+
sage: Frob^36
|
|
687
|
+
Identity endomorphism of Finite Field in t of size 5^12
|
|
688
|
+
"""
|
|
689
|
+
return self.__class__(self.domain(), self.power()*n)
|
|
690
|
+
|
|
691
|
+
@cached_method
|
|
692
|
+
def inverse(self):
|
|
693
|
+
"""
|
|
694
|
+
Return the inverse of this Frobenius endomorphism.
|
|
695
|
+
|
|
696
|
+
EXAMPLES::
|
|
697
|
+
|
|
698
|
+
sage: k.<a> = GF(7^11)
|
|
699
|
+
sage: f = k.frobenius_endomorphism(5)
|
|
700
|
+
sage: (f.inverse() * f).is_identity()
|
|
701
|
+
True
|
|
702
|
+
"""
|
|
703
|
+
return self.__class__(self.domain(), -self.power())
|
|
704
|
+
|
|
705
|
+
def _composition(self, right):
|
|
706
|
+
"""
|
|
707
|
+
Return ``self`` o ``right``.
|
|
708
|
+
|
|
709
|
+
EXAMPLES::
|
|
710
|
+
|
|
711
|
+
sage: k.<t> = GF(5^12)
|
|
712
|
+
sage: f = k.frobenius_endomorphism(); f
|
|
713
|
+
Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^12
|
|
714
|
+
sage: g = k.frobenius_endomorphism(2); g
|
|
715
|
+
Frobenius endomorphism t |--> t^(5^2) on Finite Field in t of size 5^12
|
|
716
|
+
sage: f * g
|
|
717
|
+
Frobenius endomorphism t |--> t^(5^3) on Finite Field in t of size 5^12
|
|
718
|
+
|
|
719
|
+
The result is simplified if possible::
|
|
720
|
+
|
|
721
|
+
sage: f = k.frobenius_endomorphism(9)
|
|
722
|
+
sage: g = k.frobenius_endomorphism(10)
|
|
723
|
+
sage: f * g
|
|
724
|
+
Frobenius endomorphism t |--> t^(5^7) on Finite Field in t of size 5^12
|
|
725
|
+
"""
|
|
726
|
+
if isinstance(right, FrobeniusEndomorphism_finite_field):
|
|
727
|
+
return self.__class__(self.domain(), self._power + right.power())
|
|
728
|
+
else:
|
|
729
|
+
return RingHomomorphism._composition(self, right)
|
|
730
|
+
|
|
731
|
+
def fixed_field(self):
|
|
732
|
+
"""
|
|
733
|
+
Return the fixed field of ``self``.
|
|
734
|
+
|
|
735
|
+
OUTPUT:
|
|
736
|
+
|
|
737
|
+
- a tuple `(K, e)`, where `K` is the subfield of the domain
|
|
738
|
+
consisting of elements fixed by ``self`` and `e` is an
|
|
739
|
+
embedding of `K` into the domain.
|
|
740
|
+
|
|
741
|
+
.. NOTE::
|
|
742
|
+
|
|
743
|
+
The name of the variable used for the subfield (if it
|
|
744
|
+
is not a prime subfield) is suffixed by ``_fixed``.
|
|
745
|
+
|
|
746
|
+
EXAMPLES::
|
|
747
|
+
|
|
748
|
+
sage: k.<t> = GF(5^6)
|
|
749
|
+
sage: f = k.frobenius_endomorphism(2)
|
|
750
|
+
sage: kfixed, embed = f.fixed_field()
|
|
751
|
+
sage: kfixed
|
|
752
|
+
Finite Field in t_fixed of size 5^2
|
|
753
|
+
sage: embed # random
|
|
754
|
+
Ring morphism:
|
|
755
|
+
From: Finite Field in t_fixed of size 5^2
|
|
756
|
+
To: Finite Field in t of size 5^6
|
|
757
|
+
Defn: t_fixed |--> 4*t^5 + 2*t^4 + 4*t^2 + t
|
|
758
|
+
|
|
759
|
+
sage: tfixed = kfixed.gen()
|
|
760
|
+
sage: embed(tfixed) # random
|
|
761
|
+
4*t^5 + 2*t^4 + 4*t^2 + t
|
|
762
|
+
sage: embed(tfixed) == embed.im_gens()[0]
|
|
763
|
+
True
|
|
764
|
+
"""
|
|
765
|
+
if self._degree_fixed == 1:
|
|
766
|
+
k = FiniteField(self.domain().characteristic())
|
|
767
|
+
from sage.rings.finite_rings.hom_prime_finite_field import FiniteFieldHomomorphism_prime
|
|
768
|
+
f = FiniteFieldHomomorphism_prime(Hom(k, self.domain()))
|
|
769
|
+
else:
|
|
770
|
+
k = FiniteField(self.domain().characteristic()**self._degree_fixed,
|
|
771
|
+
name=self.domain().variable_name() + "_fixed")
|
|
772
|
+
f = FiniteFieldHomomorphism_generic(Hom(k, self.domain()))
|
|
773
|
+
return k, f
|
|
774
|
+
|
|
775
|
+
def is_injective(self):
|
|
776
|
+
"""
|
|
777
|
+
Return ``True`` since any power of the Frobenius endomorphism
|
|
778
|
+
over a finite field is always injective.
|
|
779
|
+
|
|
780
|
+
EXAMPLES::
|
|
781
|
+
|
|
782
|
+
sage: k.<t> = GF(5^3)
|
|
783
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
784
|
+
sage: Frob.is_injective()
|
|
785
|
+
True
|
|
786
|
+
"""
|
|
787
|
+
return True
|
|
788
|
+
|
|
789
|
+
def is_surjective(self):
|
|
790
|
+
"""
|
|
791
|
+
Return ``True`` since any power of the Frobenius endomorphism
|
|
792
|
+
over a finite field is always surjective.
|
|
793
|
+
|
|
794
|
+
EXAMPLES::
|
|
795
|
+
|
|
796
|
+
sage: k.<t> = GF(5^3)
|
|
797
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
798
|
+
sage: Frob.is_surjective()
|
|
799
|
+
True
|
|
800
|
+
"""
|
|
801
|
+
return True
|
|
802
|
+
|
|
803
|
+
def is_identity(self):
|
|
804
|
+
"""
|
|
805
|
+
Return ``True`` if this morphism is the identity morphism.
|
|
806
|
+
|
|
807
|
+
EXAMPLES::
|
|
808
|
+
|
|
809
|
+
sage: k.<t> = GF(5^3)
|
|
810
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
811
|
+
sage: Frob.is_identity()
|
|
812
|
+
False
|
|
813
|
+
sage: (Frob^3).is_identity()
|
|
814
|
+
True
|
|
815
|
+
"""
|
|
816
|
+
return self.power() == 0
|
|
817
|
+
|
|
818
|
+
def __hash__(self):
|
|
819
|
+
r"""
|
|
820
|
+
Return a hash of this morphism.
|
|
821
|
+
|
|
822
|
+
EXAMPLES::
|
|
823
|
+
|
|
824
|
+
sage: k.<t> = GF(5^3)
|
|
825
|
+
sage: Frob = k.frobenius_endomorphism()
|
|
826
|
+
sage: hash(Frob) # random
|
|
827
|
+
383183030479672104
|
|
828
|
+
"""
|
|
829
|
+
return Morphism.__hash__(self)
|
|
830
|
+
|
|
831
|
+
cdef _update_slots(self, dict slots):
|
|
832
|
+
r"""
|
|
833
|
+
Helper function for copying and pickling.
|
|
834
|
+
|
|
835
|
+
TESTS::
|
|
836
|
+
|
|
837
|
+
sage: k.<t> = GF(5^3)
|
|
838
|
+
sage: Frob = k.frobenius_endomorphism(2)
|
|
839
|
+
sage: Frob
|
|
840
|
+
Frobenius endomorphism t |--> t^(5^2) on Finite Field in t of size 5^3
|
|
841
|
+
|
|
842
|
+
sage: phi = copy(Frob)
|
|
843
|
+
sage: phi
|
|
844
|
+
Frobenius endomorphism t |--> t^(5^2) on Finite Field in t of size 5^3
|
|
845
|
+
sage: Frob == phi
|
|
846
|
+
True
|
|
847
|
+
"""
|
|
848
|
+
FrobeniusEndomorphism_generic._update_slots(self, slots)
|
|
849
|
+
domain = self.domain()
|
|
850
|
+
self._degree = domain.degree()
|
|
851
|
+
self._degree_fixed = domain.degree().gcd(self._power)
|
|
852
|
+
self._order = self._degree / self._degree_fixed
|
|
853
|
+
self._q = domain.characteristic() ** self._power
|
|
854
|
+
|
|
855
|
+
from sage.misc.persist import register_unpickle_override
|
|
856
|
+
register_unpickle_override('sage.rings.finite_field_morphism', 'FiniteFieldHomomorphism_generic', FiniteFieldHomomorphism_generic)
|