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,1176 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
# sage.doctest: needs sage.rings.finite_rings
|
|
3
|
+
"""
|
|
4
|
+
Base class for finite field elements
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- David Roe (2010-01-14): factored out of sage.structure.element
|
|
9
|
+
- Sebastian Oehms (2018-07-19): added :meth:`conjugate` (see :issue:`26761`)
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
# ****************************************************************************
|
|
13
|
+
# Copyright (C) 2010 David Roe <roed@math.harvard.edu>
|
|
14
|
+
#
|
|
15
|
+
# This program is free software: you can redistribute it and/or modify
|
|
16
|
+
# it under the terms of the GNU General Public License as published by
|
|
17
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
18
|
+
# (at your option) any later version.
|
|
19
|
+
# https://www.gnu.org/licenses/
|
|
20
|
+
# ****************************************************************************
|
|
21
|
+
|
|
22
|
+
from sage.structure.element cimport Element
|
|
23
|
+
from sage.structure.parent cimport Parent
|
|
24
|
+
from sage.rings.integer_ring import ZZ
|
|
25
|
+
from sage.rings.integer import Integer
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def is_FiniteFieldElement(x):
|
|
29
|
+
"""
|
|
30
|
+
Return ``True`` if ``x`` is a finite field element.
|
|
31
|
+
|
|
32
|
+
This function is deprecated.
|
|
33
|
+
|
|
34
|
+
EXAMPLES::
|
|
35
|
+
|
|
36
|
+
sage: from sage.rings.finite_rings.element_base import is_FiniteFieldElement
|
|
37
|
+
sage: is_FiniteFieldElement(1)
|
|
38
|
+
doctest:...: DeprecationWarning: the function is_FiniteFieldElement is deprecated; use isinstance(x, sage.structure.element.FieldElement) and x.parent().is_finite() instead
|
|
39
|
+
See https://github.com/sagemath/sage/issues/32664 for details.
|
|
40
|
+
False
|
|
41
|
+
sage: is_FiniteFieldElement(IntegerRing())
|
|
42
|
+
False
|
|
43
|
+
sage: is_FiniteFieldElement(GF(5)(2))
|
|
44
|
+
True
|
|
45
|
+
"""
|
|
46
|
+
from sage.misc.superseded import deprecation
|
|
47
|
+
deprecation(32664, "the function is_FiniteFieldElement is deprecated; use isinstance(x, sage.structure.element.FieldElement) and x.parent().is_finite() instead")
|
|
48
|
+
|
|
49
|
+
from sage.rings.finite_rings.finite_field_base import FiniteField
|
|
50
|
+
return isinstance(x, Element) and isinstance(x.parent(), FiniteField)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
cdef class FiniteRingElement(CommutativeRingElement):
|
|
54
|
+
def _nth_root_common(self, n, all, algorithm, cunningham):
|
|
55
|
+
"""
|
|
56
|
+
This function exists to reduce code duplication between finite field
|
|
57
|
+
`n`-th roots and ``integer_mod`` `n`-th roots. It assumes that ``self``
|
|
58
|
+
is a field element.
|
|
59
|
+
|
|
60
|
+
The inputs are described there.
|
|
61
|
+
|
|
62
|
+
TESTS::
|
|
63
|
+
|
|
64
|
+
sage: a = Zmod(17)(13)
|
|
65
|
+
sage: sorted(a._nth_root_common(4, True, "Johnston", False))
|
|
66
|
+
[3, 5, 12, 14]
|
|
67
|
+
sage: sorted(a._nth_root_common(4, True, "Johnston", cunningham=True)) # optional - cunningham_tables
|
|
68
|
+
[3, 5, 12, 14]
|
|
69
|
+
|
|
70
|
+
Test various prime powers::
|
|
71
|
+
|
|
72
|
+
sage: p = 5^5*10000000100 + 1
|
|
73
|
+
sage: a = GF(p)(3)**(5^7)
|
|
74
|
+
sage: for e in range(20):
|
|
75
|
+
....: r = a._nth_root_common(5^e, False, "Johnston", False)
|
|
76
|
+
....: assert r**(5^e) == a
|
|
77
|
+
|
|
78
|
+
Test very large modulus (assumed impossible to factor in reasonable time)::
|
|
79
|
+
|
|
80
|
+
sage: p = 2^1024 + 643
|
|
81
|
+
sage: a = GF(p, proof=False)(3)**(29*283*3539)
|
|
82
|
+
sage: r = a._nth_root_common(29*283*3539*12345, False, "Johnston", False)
|
|
83
|
+
sage: r**(29*283*3539*12345) == a
|
|
84
|
+
True
|
|
85
|
+
"""
|
|
86
|
+
K = self.parent()
|
|
87
|
+
q = K.order()
|
|
88
|
+
gcd = n.gcd(q-1)
|
|
89
|
+
if self.is_one():
|
|
90
|
+
if gcd == 1:
|
|
91
|
+
return [self] if all else self
|
|
92
|
+
nthroot = K.zeta(gcd)
|
|
93
|
+
return [nthroot**a for a in range(gcd)] if all else nthroot
|
|
94
|
+
if gcd == q-1:
|
|
95
|
+
if all:
|
|
96
|
+
return []
|
|
97
|
+
raise ValueError("no nth root")
|
|
98
|
+
gcd, alpha, _ = n.xgcd(q-1) # gcd = alpha*n + beta*(q-1), so 1/n = alpha/gcd (mod q-1)
|
|
99
|
+
if gcd == 1:
|
|
100
|
+
return [self**alpha] if all else self**alpha
|
|
101
|
+
|
|
102
|
+
n = gcd
|
|
103
|
+
q1overn = (q-1)//n
|
|
104
|
+
if self**q1overn != 1:
|
|
105
|
+
if all:
|
|
106
|
+
return []
|
|
107
|
+
raise ValueError("no nth root")
|
|
108
|
+
self = self**alpha
|
|
109
|
+
if cunningham:
|
|
110
|
+
from sage.rings.factorint import factor_cunningham
|
|
111
|
+
F = factor_cunningham(n)
|
|
112
|
+
else:
|
|
113
|
+
F = n.factor()
|
|
114
|
+
from sage.groups.generic import discrete_log
|
|
115
|
+
if algorithm is None or algorithm == 'Johnston':
|
|
116
|
+
# In the style of the Adleman-Manders-Miller algorithm,
|
|
117
|
+
# we will use small order elements instead of a multiplicative
|
|
118
|
+
# generator, which can be expensive to compute.
|
|
119
|
+
for r, v in F:
|
|
120
|
+
# 0 < v <= k
|
|
121
|
+
k, h = (q-1).val_unit(r)
|
|
122
|
+
hinv = (-h).inverse_mod(r**v)
|
|
123
|
+
z = h * hinv
|
|
124
|
+
x = (1 + z) // r**v
|
|
125
|
+
if k == v:
|
|
126
|
+
self = self**x
|
|
127
|
+
else:
|
|
128
|
+
# We need an element of order r^k (g^h in Johnston's article)
|
|
129
|
+
# self^x differs from the actual nth root by an element of
|
|
130
|
+
# order dividing r^(k-v)
|
|
131
|
+
gh = K.zeta(r**k)
|
|
132
|
+
t = discrete_log(self**h, gh**(r**v), r**(k-v), operation='*')
|
|
133
|
+
self = self**x * gh**(-hinv*t)
|
|
134
|
+
if all:
|
|
135
|
+
nthroot = K.zeta(n)
|
|
136
|
+
L = [self]
|
|
137
|
+
for i in range(1, n):
|
|
138
|
+
self *= nthroot
|
|
139
|
+
L.append(self)
|
|
140
|
+
return L
|
|
141
|
+
return self
|
|
142
|
+
else:
|
|
143
|
+
raise ValueError("unknown algorithm")
|
|
144
|
+
|
|
145
|
+
def to_bytes(self, byteorder='big'):
|
|
146
|
+
r"""
|
|
147
|
+
Return an array of bytes representing an integer.
|
|
148
|
+
|
|
149
|
+
Internally relies on the python ``int.to_bytes()`` method.
|
|
150
|
+
Length of byte array is determined from the field's order.
|
|
151
|
+
|
|
152
|
+
INPUT:
|
|
153
|
+
|
|
154
|
+
- ``byteorder`` -- string (default: ``'big'``); determines the byte order of
|
|
155
|
+
``input_bytes``; can only be ``'big'`` or ``'little'``
|
|
156
|
+
|
|
157
|
+
EXAMPLES::
|
|
158
|
+
|
|
159
|
+
sage: F = GF(65537)
|
|
160
|
+
sage: a = F(8726)
|
|
161
|
+
sage: a.to_bytes()
|
|
162
|
+
b'\x00"\x16'
|
|
163
|
+
sage: a.to_bytes(byteorder='little')
|
|
164
|
+
b'\x16"\x00'
|
|
165
|
+
"""
|
|
166
|
+
length = (self.parent().order().nbits() + 7) // 8
|
|
167
|
+
return int(self).to_bytes(length=length, byteorder=byteorder)
|
|
168
|
+
|
|
169
|
+
def canonical_associate(self):
|
|
170
|
+
"""
|
|
171
|
+
Return a canonical associate.
|
|
172
|
+
|
|
173
|
+
Implemented here because not all finite field elements inherit from FieldElement.
|
|
174
|
+
|
|
175
|
+
EXAMPLES::
|
|
176
|
+
|
|
177
|
+
sage: GF(7)(1).canonical_associate()
|
|
178
|
+
(1, 1)
|
|
179
|
+
sage: GF(7)(3).canonical_associate()
|
|
180
|
+
(1, 3)
|
|
181
|
+
sage: GF(7)(0).canonical_associate()
|
|
182
|
+
(0, 1)
|
|
183
|
+
sage: IntegerModRing(15)(7).canonical_associate()
|
|
184
|
+
NotImplemented
|
|
185
|
+
"""
|
|
186
|
+
R = self.parent()
|
|
187
|
+
if R.is_field():
|
|
188
|
+
if self.is_zero():
|
|
189
|
+
return (R.zero(), R.one())
|
|
190
|
+
return (R.one(), self)
|
|
191
|
+
return NotImplemented
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
cdef class FinitePolyExtElement(FiniteRingElement):
|
|
195
|
+
"""
|
|
196
|
+
Elements represented as polynomials modulo a given ideal.
|
|
197
|
+
|
|
198
|
+
TESTS::
|
|
199
|
+
|
|
200
|
+
sage: k.<a> = GF(64)
|
|
201
|
+
sage: TestSuite(a).run()
|
|
202
|
+
"""
|
|
203
|
+
def _im_gens_(self, codomain, im_gens, base_map=None):
|
|
204
|
+
"""
|
|
205
|
+
Used for applying homomorphisms of finite fields.
|
|
206
|
+
|
|
207
|
+
EXAMPLES::
|
|
208
|
+
|
|
209
|
+
sage: k.<a> = FiniteField(73^2)
|
|
210
|
+
sage: K.<b> = FiniteField(73^4)
|
|
211
|
+
sage: phi = k.hom([ b^(73*73+1) ]) # indirect doctest
|
|
212
|
+
sage: phi(0)
|
|
213
|
+
0
|
|
214
|
+
sage: phi(a)
|
|
215
|
+
7*b^3 + 13*b^2 + 65*b + 71
|
|
216
|
+
|
|
217
|
+
sage: phi(a+3)
|
|
218
|
+
7*b^3 + 13*b^2 + 65*b + 1
|
|
219
|
+
"""
|
|
220
|
+
## NOTE: see the note in sage/rings/number_field_element.pyx,
|
|
221
|
+
## in the comments for _im_gens_ there -- something analogous
|
|
222
|
+
## applies here.
|
|
223
|
+
f = self.polynomial()
|
|
224
|
+
if base_map is not None:
|
|
225
|
+
Cx = codomain['x']
|
|
226
|
+
f = Cx([base_map(c) for c in f])
|
|
227
|
+
return codomain(f(im_gens[0]))
|
|
228
|
+
|
|
229
|
+
def minpoly(self, var='x', algorithm='pari'):
|
|
230
|
+
"""
|
|
231
|
+
Return the minimal polynomial of this element
|
|
232
|
+
(over the corresponding prime subfield).
|
|
233
|
+
|
|
234
|
+
INPUT:
|
|
235
|
+
|
|
236
|
+
- ``var`` -- string (default: ``'x'``)
|
|
237
|
+
|
|
238
|
+
- ``algorithm`` -- string (default: ``'pari'``):
|
|
239
|
+
|
|
240
|
+
- ``'pari'`` -- use pari's minpoly
|
|
241
|
+
|
|
242
|
+
- ``'matrix'`` -- return the minpoly computed from the matrix of
|
|
243
|
+
left multiplication by self
|
|
244
|
+
|
|
245
|
+
EXAMPLES::
|
|
246
|
+
|
|
247
|
+
sage: from sage.rings.finite_rings.element_base import FinitePolyExtElement
|
|
248
|
+
sage: k.<a> = FiniteField(19^2)
|
|
249
|
+
sage: parent(a)
|
|
250
|
+
Finite Field in a of size 19^2
|
|
251
|
+
sage: b=a**20
|
|
252
|
+
sage: p=FinitePolyExtElement.minpoly(b,"x", algorithm='pari')
|
|
253
|
+
sage: q=FinitePolyExtElement.minpoly(b,"x", algorithm='matrix')
|
|
254
|
+
sage: q == p
|
|
255
|
+
True
|
|
256
|
+
sage: p
|
|
257
|
+
x + 17
|
|
258
|
+
"""
|
|
259
|
+
if self.polynomial().degree() == 0:
|
|
260
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
261
|
+
R = PolynomialRing(self.parent().prime_subfield(), var)
|
|
262
|
+
return R.gen() - self.polynomial()[0]
|
|
263
|
+
|
|
264
|
+
if algorithm == 'pari':
|
|
265
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
266
|
+
R = PolynomialRing(self.parent().prime_subfield(), var)
|
|
267
|
+
return R(self.__pari__().minpoly('x').lift())
|
|
268
|
+
|
|
269
|
+
if algorithm == 'matrix':
|
|
270
|
+
return self.matrix().minpoly(var)
|
|
271
|
+
|
|
272
|
+
raise ValueError("unknown algorithm '%s'" % algorithm)
|
|
273
|
+
|
|
274
|
+
# We have two names for the same method
|
|
275
|
+
# for compatibility with sage.matrix
|
|
276
|
+
def minimal_polynomial(self, var='x'):
|
|
277
|
+
"""
|
|
278
|
+
Return the minimal polynomial of this element
|
|
279
|
+
(over the corresponding prime subfield).
|
|
280
|
+
|
|
281
|
+
EXAMPLES::
|
|
282
|
+
|
|
283
|
+
sage: k.<a> = FiniteField(3^4)
|
|
284
|
+
sage: parent(a)
|
|
285
|
+
Finite Field in a of size 3^4
|
|
286
|
+
sage: b=a**20;p=charpoly(b,"y");p
|
|
287
|
+
y^4 + 2*y^2 + 1
|
|
288
|
+
sage: factor(p)
|
|
289
|
+
(y^2 + 1)^2
|
|
290
|
+
sage: b.minimal_polynomial('y')
|
|
291
|
+
y^2 + 1
|
|
292
|
+
"""
|
|
293
|
+
return self.minpoly(var)
|
|
294
|
+
|
|
295
|
+
def __getitem__(self, n):
|
|
296
|
+
r"""
|
|
297
|
+
Return the `n`-th coefficient of this finite field element when
|
|
298
|
+
written as a polynomial in the generator.
|
|
299
|
+
|
|
300
|
+
EXAMPLES::
|
|
301
|
+
|
|
302
|
+
sage: x = polygen(GF(19))
|
|
303
|
+
sage: F.<i> = GF(19^2, modulus=x^2+1)
|
|
304
|
+
sage: a = 5 + 7*i
|
|
305
|
+
sage: a[0]
|
|
306
|
+
5
|
|
307
|
+
sage: a[1]
|
|
308
|
+
7
|
|
309
|
+
|
|
310
|
+
::
|
|
311
|
+
|
|
312
|
+
sage: b = F(11)
|
|
313
|
+
sage: b[0]
|
|
314
|
+
11
|
|
315
|
+
sage: b[1]
|
|
316
|
+
0
|
|
317
|
+
|
|
318
|
+
TESTS::
|
|
319
|
+
|
|
320
|
+
sage: # needs sage.modules
|
|
321
|
+
sage: F,t = GF(random_prime(99)^randrange(2,99), 't').objgen()
|
|
322
|
+
sage: a = F.random_element()
|
|
323
|
+
sage: all(a[i] == a.polynomial()[i] for i in range(F.degree()))
|
|
324
|
+
True
|
|
325
|
+
sage: a == sum(a[i]*t^i for i in range(F.degree()))
|
|
326
|
+
True
|
|
327
|
+
"""
|
|
328
|
+
if n < 0 or n >= self.parent().degree():
|
|
329
|
+
raise IndexError("index must lie between 0 and the degree minus 1")
|
|
330
|
+
return self.polynomial()[n]
|
|
331
|
+
|
|
332
|
+
def list(self):
|
|
333
|
+
r"""
|
|
334
|
+
Return the list of coefficients (in little-endian) of this
|
|
335
|
+
finite field element when written as a polynomial in the
|
|
336
|
+
generator.
|
|
337
|
+
|
|
338
|
+
Equivalent to calling ``list()`` on this element.
|
|
339
|
+
|
|
340
|
+
EXAMPLES::
|
|
341
|
+
|
|
342
|
+
sage: x = polygen(GF(71))
|
|
343
|
+
sage: F.<u> = GF(71^7, modulus=x^7 + x + 1)
|
|
344
|
+
sage: a = 3 + u + 3*u^2 + 3*u^3 + 7*u^4
|
|
345
|
+
sage: a.list()
|
|
346
|
+
[3, 1, 3, 3, 7, 0, 0]
|
|
347
|
+
sage: a.list() == list(a) == [a[i] for i in range(F.degree())]
|
|
348
|
+
True
|
|
349
|
+
|
|
350
|
+
The coefficients returned are those of a fully reduced
|
|
351
|
+
representative of the finite field element::
|
|
352
|
+
|
|
353
|
+
sage: b = u^777
|
|
354
|
+
sage: b.list()
|
|
355
|
+
[9, 69, 4, 27, 40, 10, 56]
|
|
356
|
+
sage: (u.polynomial()^777).list()
|
|
357
|
+
[0, 0, 0, 0, ..., 0, 1]
|
|
358
|
+
|
|
359
|
+
TESTS::
|
|
360
|
+
|
|
361
|
+
sage: # needs sage.modules
|
|
362
|
+
sage: R.<x> = GF(17)[]
|
|
363
|
+
sage: F.<t> = GF(17^60)
|
|
364
|
+
sage: a = F.random_element()
|
|
365
|
+
sage: a == R(a.list())(t)
|
|
366
|
+
True
|
|
367
|
+
sage: list(a) == a.list()
|
|
368
|
+
True
|
|
369
|
+
"""
|
|
370
|
+
return self.polynomial().padded_list(self.parent().degree())
|
|
371
|
+
|
|
372
|
+
def __iter__(self):
|
|
373
|
+
r"""
|
|
374
|
+
Return an iterator over the coefficients of this finite field
|
|
375
|
+
element, in the same order as :meth:`list`.
|
|
376
|
+
|
|
377
|
+
EXAMPLES::
|
|
378
|
+
|
|
379
|
+
sage: x = polygen(GF(19))
|
|
380
|
+
sage: F.<i> = GF(19^2, modulus=x^2+1)
|
|
381
|
+
sage: a = 5 + 7*i
|
|
382
|
+
sage: it = iter(a)
|
|
383
|
+
sage: next(it)
|
|
384
|
+
5
|
|
385
|
+
sage: next(it)
|
|
386
|
+
7
|
|
387
|
+
sage: next(it)
|
|
388
|
+
Traceback (most recent call last):
|
|
389
|
+
...
|
|
390
|
+
StopIteration
|
|
391
|
+
sage: list(a) # implicit doctest
|
|
392
|
+
[5, 7]
|
|
393
|
+
sage: tuple(a) # implicit doctest
|
|
394
|
+
(5, 7)
|
|
395
|
+
sage: b = F(11)
|
|
396
|
+
sage: list(b) # implicit doctest
|
|
397
|
+
[11, 0]
|
|
398
|
+
sage: tuple(b) # implicit doctest
|
|
399
|
+
(11, 0)
|
|
400
|
+
sage: list(b.polynomial())
|
|
401
|
+
[11]
|
|
402
|
+
|
|
403
|
+
TESTS::
|
|
404
|
+
|
|
405
|
+
sage: # needs sage.modules
|
|
406
|
+
sage: F = GF(random_prime(333)^randrange(111,999),'t')
|
|
407
|
+
sage: a = F.random_element()
|
|
408
|
+
sage: list(a) == a.list() # implicit doctest
|
|
409
|
+
True
|
|
410
|
+
|
|
411
|
+
::
|
|
412
|
+
|
|
413
|
+
sage: # needs sage.modules
|
|
414
|
+
sage: F.<t> = GF(17^60)
|
|
415
|
+
sage: a = F.random_element()
|
|
416
|
+
sage: a == sum(c*t^i for i,c in enumerate(a)) # implicit doctest
|
|
417
|
+
True
|
|
418
|
+
|
|
419
|
+
::
|
|
420
|
+
|
|
421
|
+
sage: # needs sage.modules
|
|
422
|
+
sage: F.<t> = GF((2^127 - 1)^10, 't')
|
|
423
|
+
sage: a = F.random_element()
|
|
424
|
+
sage: a == sum(c*t^i for i,c in enumerate(a)) # implicit doctest
|
|
425
|
+
True
|
|
426
|
+
"""
|
|
427
|
+
return iter(self.list())
|
|
428
|
+
|
|
429
|
+
def _vector_(self, reverse=False):
|
|
430
|
+
"""
|
|
431
|
+
Return a vector matching this element in the vector space attached
|
|
432
|
+
to the parent. The most significant coefficient is to the right.
|
|
433
|
+
|
|
434
|
+
INPUT:
|
|
435
|
+
|
|
436
|
+
- ``reverse`` -- reverse the order of the bits
|
|
437
|
+
from little endian to big endian
|
|
438
|
+
|
|
439
|
+
EXAMPLES::
|
|
440
|
+
|
|
441
|
+
sage: # needs sage.modules
|
|
442
|
+
sage: k.<a> = GF(2^16)
|
|
443
|
+
sage: e = a^2 + 1
|
|
444
|
+
sage: v = vector(e)
|
|
445
|
+
sage: v
|
|
446
|
+
(1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
|
447
|
+
sage: k(v)
|
|
448
|
+
a^2 + 1
|
|
449
|
+
|
|
450
|
+
sage: # needs sage.modules
|
|
451
|
+
sage: k.<a> = GF(3^16)
|
|
452
|
+
sage: e = 2*a^2 + 1
|
|
453
|
+
sage: v = vector(e)
|
|
454
|
+
sage: v
|
|
455
|
+
(1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
|
456
|
+
sage: k(v)
|
|
457
|
+
2*a^2 + 1
|
|
458
|
+
|
|
459
|
+
You can also compute the vector in the other order::
|
|
460
|
+
|
|
461
|
+
sage: e._vector_(reverse=True) # needs sage.modules
|
|
462
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1)
|
|
463
|
+
"""
|
|
464
|
+
# vector(foo) might pass in ZZ
|
|
465
|
+
if isinstance(reverse, Parent):
|
|
466
|
+
raise TypeError("Base field is fixed to prime subfield.")
|
|
467
|
+
|
|
468
|
+
k = self.parent()
|
|
469
|
+
ret = self.polynomial().padded_list(k.degree())
|
|
470
|
+
|
|
471
|
+
if reverse:
|
|
472
|
+
ret.reverse()
|
|
473
|
+
return k.vector_space(map=False)(ret)
|
|
474
|
+
|
|
475
|
+
def matrix(self, reverse=False):
|
|
476
|
+
r"""
|
|
477
|
+
Return the matrix of left multiplication by the element on
|
|
478
|
+
the power basis `1, x, x^2, \ldots, x^{d-1}` for the field
|
|
479
|
+
extension.
|
|
480
|
+
|
|
481
|
+
Thus the \emph{columns} of this matrix give the images
|
|
482
|
+
of each of the `x^i`.
|
|
483
|
+
|
|
484
|
+
INPUT:
|
|
485
|
+
|
|
486
|
+
- ``reverse`` -- if ``True``, act on vectors in reversed order
|
|
487
|
+
|
|
488
|
+
EXAMPLES::
|
|
489
|
+
|
|
490
|
+
sage: # needs sage.modules
|
|
491
|
+
sage: k.<a> = GF(2^4)
|
|
492
|
+
sage: b = k.random_element()
|
|
493
|
+
sage: vector(a*b) == a.matrix() * vector(b)
|
|
494
|
+
True
|
|
495
|
+
sage: (a*b)._vector_(reverse=True) == a.matrix(reverse=True) * b._vector_(reverse=True)
|
|
496
|
+
True
|
|
497
|
+
"""
|
|
498
|
+
K = self.parent()
|
|
499
|
+
a = K.gen()
|
|
500
|
+
x = K(1)
|
|
501
|
+
d = K.degree()
|
|
502
|
+
|
|
503
|
+
columns = []
|
|
504
|
+
|
|
505
|
+
for i in range(d):
|
|
506
|
+
columns.append( (self * x)._vector_(reverse=reverse) )
|
|
507
|
+
x *= a
|
|
508
|
+
|
|
509
|
+
if reverse:
|
|
510
|
+
columns.reverse()
|
|
511
|
+
|
|
512
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
513
|
+
M = MatrixSpace(K.base_ring(), d)
|
|
514
|
+
|
|
515
|
+
return M(columns).transpose()
|
|
516
|
+
|
|
517
|
+
def _latex_(self):
|
|
518
|
+
r"""
|
|
519
|
+
Return the latex representation of ``self``, which is just the
|
|
520
|
+
latex representation of the polynomial representation of ``self``.
|
|
521
|
+
|
|
522
|
+
EXAMPLES::
|
|
523
|
+
|
|
524
|
+
sage: k.<b> = GF(5^2); k
|
|
525
|
+
Finite Field in b of size 5^2
|
|
526
|
+
sage: b._latex_()
|
|
527
|
+
'b'
|
|
528
|
+
sage: (b^2+1)._latex_()
|
|
529
|
+
'b + 4'
|
|
530
|
+
"""
|
|
531
|
+
if self.parent().degree()>1:
|
|
532
|
+
return self.polynomial()._latex_()
|
|
533
|
+
return str(self)
|
|
534
|
+
|
|
535
|
+
def __pari__(self, var=None):
|
|
536
|
+
r"""
|
|
537
|
+
Return PARI representation of this finite field element.
|
|
538
|
+
|
|
539
|
+
INPUT:
|
|
540
|
+
|
|
541
|
+
- ``var`` -- (default: ``None``) optional variable string
|
|
542
|
+
|
|
543
|
+
EXAMPLES::
|
|
544
|
+
|
|
545
|
+
sage: k.<a> = GF(5^3)
|
|
546
|
+
sage: a.__pari__()
|
|
547
|
+
a
|
|
548
|
+
sage: a.__pari__('b')
|
|
549
|
+
b
|
|
550
|
+
sage: t = 3*a^2 + 2*a + 4
|
|
551
|
+
sage: t_string = t._pari_init_('y')
|
|
552
|
+
sage: t_string
|
|
553
|
+
'Mod(Mod(3, 5)*y^2 + Mod(2, 5)*y + Mod(4, 5), Mod(1, 5)*y^3 + Mod(3, 5)*y + Mod(3, 5))'
|
|
554
|
+
sage: type(t_string)
|
|
555
|
+
<... 'str'>
|
|
556
|
+
sage: t_element = t.__pari__('b')
|
|
557
|
+
sage: t_element
|
|
558
|
+
3*b^2 + 2*b + 4
|
|
559
|
+
sage: type(t_element)
|
|
560
|
+
<class 'cypari2.gen.Gen'>
|
|
561
|
+
"""
|
|
562
|
+
if var is None:
|
|
563
|
+
var = self.parent().variable_name()
|
|
564
|
+
ffgen = self._parent.modulus()._pari_with_name(var).ffgen()
|
|
565
|
+
polypari = self.polynomial()._pari_with_name()
|
|
566
|
+
# Add ffgen - ffgen to ensure that we really get an FFELT
|
|
567
|
+
return polypari.subst("x", ffgen) + ffgen - ffgen
|
|
568
|
+
|
|
569
|
+
def _pari_init_(self, var=None):
|
|
570
|
+
r"""
|
|
571
|
+
Return a string that defines this element when evaluated in PARI.
|
|
572
|
+
|
|
573
|
+
INPUT:
|
|
574
|
+
|
|
575
|
+
- ``var`` -- (default: ``None``) a string for a new variable name to use
|
|
576
|
+
|
|
577
|
+
EXAMPLES::
|
|
578
|
+
|
|
579
|
+
sage: S.<b> = GF(5^2); S
|
|
580
|
+
Finite Field in b of size 5^2
|
|
581
|
+
sage: b._pari_init_()
|
|
582
|
+
'Mod(Mod(1, 5)*b, Mod(1, 5)*b^2 + Mod(4, 5)*b + Mod(2, 5))'
|
|
583
|
+
sage: (2*b+3)._pari_init_()
|
|
584
|
+
'Mod(Mod(2, 5)*b + Mod(3, 5), Mod(1, 5)*b^2 + Mod(4, 5)*b + Mod(2, 5))'
|
|
585
|
+
|
|
586
|
+
TESTS:
|
|
587
|
+
|
|
588
|
+
The following tests against a bug fixed in :issue:`11530`::
|
|
589
|
+
|
|
590
|
+
sage: F.<d> = GF(3^4)
|
|
591
|
+
sage: F.modulus()
|
|
592
|
+
x^4 + 2*x^3 + 2
|
|
593
|
+
sage: d._pari_init_()
|
|
594
|
+
'Mod(Mod(1, 3)*d, Mod(1, 3)*d^4 + Mod(2, 3)*d^3 + Mod(2, 3))'
|
|
595
|
+
sage: (d^2+2*d+1)._pari_init_("p")
|
|
596
|
+
'Mod(Mod(1, 3)*p^2 + Mod(2, 3)*p + Mod(1, 3), Mod(1, 3)*p^4 + Mod(2, 3)*p^3 + Mod(2, 3))'
|
|
597
|
+
sage: d.__pari__()
|
|
598
|
+
d
|
|
599
|
+
|
|
600
|
+
sage: K.<M> = GF(2^8)
|
|
601
|
+
sage: K.modulus()
|
|
602
|
+
x^8 + x^4 + x^3 + x^2 + 1
|
|
603
|
+
sage: (M^3+1)._pari_init_()
|
|
604
|
+
'Mod(Mod(1, 2)*M^3 + Mod(1, 2), Mod(1, 2)*M^8 + Mod(1, 2)*M^4 + Mod(1, 2)*M^3 + Mod(1, 2)*M^2 + Mod(1, 2))'
|
|
605
|
+
sage: M._pari_init_(var='foo')
|
|
606
|
+
'Mod(Mod(1, 2)*foo, Mod(1, 2)*foo^8 + Mod(1, 2)*foo^4 + Mod(1, 2)*foo^3 + Mod(1, 2)*foo^2 + Mod(1, 2))'
|
|
607
|
+
"""
|
|
608
|
+
if var is None:
|
|
609
|
+
var = self.parent().variable_name()
|
|
610
|
+
g = self.parent().modulus()._pari_with_name(var)
|
|
611
|
+
f = self.polynomial()._pari_with_name(var)
|
|
612
|
+
return 'Mod({0}, {1})'.format(f, g)
|
|
613
|
+
|
|
614
|
+
def charpoly(self, var='x', algorithm='pari'):
|
|
615
|
+
"""
|
|
616
|
+
Return the characteristic polynomial of ``self`` as a polynomial with given variable.
|
|
617
|
+
|
|
618
|
+
INPUT:
|
|
619
|
+
|
|
620
|
+
- ``var`` -- string (default: ``'x'``)
|
|
621
|
+
|
|
622
|
+
- ``algorithm`` -- string (default: ``'pari'``):
|
|
623
|
+
|
|
624
|
+
- ``'pari'`` -- use pari's charpoly
|
|
625
|
+
|
|
626
|
+
- ``'matrix'`` -- return the charpoly computed from the matrix of
|
|
627
|
+
left multiplication by ``self``
|
|
628
|
+
|
|
629
|
+
The result is not cached.
|
|
630
|
+
|
|
631
|
+
EXAMPLES::
|
|
632
|
+
|
|
633
|
+
sage: from sage.rings.finite_rings.element_base import FinitePolyExtElement
|
|
634
|
+
sage: k.<a> = FiniteField(19^2)
|
|
635
|
+
sage: parent(a)
|
|
636
|
+
Finite Field in a of size 19^2
|
|
637
|
+
sage: b = a**20
|
|
638
|
+
sage: p = FinitePolyExtElement.charpoly(b, "x", algorithm='pari')
|
|
639
|
+
sage: q = FinitePolyExtElement.charpoly(b, "x", algorithm='matrix') # needs sage.modules
|
|
640
|
+
sage: q == p # needs sage.modules
|
|
641
|
+
True
|
|
642
|
+
sage: p
|
|
643
|
+
x^2 + 15*x + 4
|
|
644
|
+
sage: factor(p)
|
|
645
|
+
(x + 17)^2
|
|
646
|
+
sage: b.minpoly('x')
|
|
647
|
+
x + 17
|
|
648
|
+
"""
|
|
649
|
+
if algorithm == 'pari':
|
|
650
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
651
|
+
R = PolynomialRing(self.parent().prime_subfield(), var)
|
|
652
|
+
return R(self.__pari__().charpoly('x').lift())
|
|
653
|
+
|
|
654
|
+
if algorithm == 'matrix':
|
|
655
|
+
return self.matrix().charpoly(var)
|
|
656
|
+
|
|
657
|
+
raise ValueError("unknown algorithm '%s'" % algorithm)
|
|
658
|
+
|
|
659
|
+
def norm(self):
|
|
660
|
+
"""
|
|
661
|
+
Return the norm of ``self`` down to the prime subfield.
|
|
662
|
+
|
|
663
|
+
This is the product of the Galois conjugates of ``self``.
|
|
664
|
+
|
|
665
|
+
EXAMPLES::
|
|
666
|
+
|
|
667
|
+
sage: S.<b> = GF(5^2); S
|
|
668
|
+
Finite Field in b of size 5^2
|
|
669
|
+
sage: b.norm()
|
|
670
|
+
2
|
|
671
|
+
sage: b.charpoly('t')
|
|
672
|
+
t^2 + 4*t + 2
|
|
673
|
+
|
|
674
|
+
Next we consider a cubic extension::
|
|
675
|
+
|
|
676
|
+
sage: S.<a> = GF(5^3); S
|
|
677
|
+
Finite Field in a of size 5^3
|
|
678
|
+
sage: a.norm()
|
|
679
|
+
2
|
|
680
|
+
sage: a.charpoly('t')
|
|
681
|
+
t^3 + 3*t + 3
|
|
682
|
+
sage: a * a^5 * (a^25)
|
|
683
|
+
2
|
|
684
|
+
"""
|
|
685
|
+
f = self.charpoly('x')
|
|
686
|
+
n = f[0]
|
|
687
|
+
return -n if f.degree() % 2 else n
|
|
688
|
+
|
|
689
|
+
def trace(self):
|
|
690
|
+
"""
|
|
691
|
+
Return the trace of this element, which is the sum of the
|
|
692
|
+
Galois conjugates.
|
|
693
|
+
|
|
694
|
+
EXAMPLES::
|
|
695
|
+
|
|
696
|
+
sage: S.<a> = GF(5^3); S
|
|
697
|
+
Finite Field in a of size 5^3
|
|
698
|
+
sage: a.trace()
|
|
699
|
+
0
|
|
700
|
+
sage: a.charpoly('t')
|
|
701
|
+
t^3 + 3*t + 3
|
|
702
|
+
sage: a + a^5 + a^25
|
|
703
|
+
0
|
|
704
|
+
sage: z = a^2 + a + 1
|
|
705
|
+
sage: z.trace()
|
|
706
|
+
2
|
|
707
|
+
sage: z.charpoly('t')
|
|
708
|
+
t^3 + 3*t^2 + 2*t + 2
|
|
709
|
+
sage: z + z^5 + z^25
|
|
710
|
+
2
|
|
711
|
+
"""
|
|
712
|
+
return self.parent().prime_subfield()(self.__pari__().trace().lift())
|
|
713
|
+
|
|
714
|
+
def multiplicative_order(self):
|
|
715
|
+
r"""
|
|
716
|
+
Return the multiplicative order of this field element.
|
|
717
|
+
|
|
718
|
+
EXAMPLES::
|
|
719
|
+
|
|
720
|
+
sage: S.<a> = GF(5^3); S
|
|
721
|
+
Finite Field in a of size 5^3
|
|
722
|
+
sage: a.multiplicative_order()
|
|
723
|
+
124
|
|
724
|
+
sage: (a^8).multiplicative_order()
|
|
725
|
+
31
|
|
726
|
+
sage: S(0).multiplicative_order()
|
|
727
|
+
Traceback (most recent call last):
|
|
728
|
+
...
|
|
729
|
+
ArithmeticError: Multiplicative order of 0 not defined.
|
|
730
|
+
"""
|
|
731
|
+
if self.is_zero():
|
|
732
|
+
raise ArithmeticError("Multiplicative order of 0 not defined.")
|
|
733
|
+
n = self._parent.order() - 1
|
|
734
|
+
F = self._parent.factored_unit_order()[0]
|
|
735
|
+
order = Integer(1)
|
|
736
|
+
for p, e in F:
|
|
737
|
+
# Determine the power of p that divides the order.
|
|
738
|
+
a = self**(n//(p**e))
|
|
739
|
+
while a != 1:
|
|
740
|
+
order = order * p
|
|
741
|
+
a = a**p
|
|
742
|
+
|
|
743
|
+
return order
|
|
744
|
+
|
|
745
|
+
def additive_order(self):
|
|
746
|
+
"""
|
|
747
|
+
Return the additive order of this finite field element.
|
|
748
|
+
|
|
749
|
+
EXAMPLES::
|
|
750
|
+
|
|
751
|
+
sage: k.<a> = FiniteField(2^12, 'a')
|
|
752
|
+
sage: b = a^3 + a + 1
|
|
753
|
+
sage: b.additive_order()
|
|
754
|
+
2
|
|
755
|
+
sage: k(0).additive_order()
|
|
756
|
+
1
|
|
757
|
+
"""
|
|
758
|
+
if self.is_zero():
|
|
759
|
+
return Integer(1)
|
|
760
|
+
return self.parent().characteristic()
|
|
761
|
+
|
|
762
|
+
def is_square(self):
|
|
763
|
+
"""
|
|
764
|
+
Return ``True`` if and only if this element is a perfect square.
|
|
765
|
+
|
|
766
|
+
EXAMPLES::
|
|
767
|
+
|
|
768
|
+
sage: k.<a> = FiniteField(9, impl='givaro', modulus='primitive') # needs sage.libs.linbox
|
|
769
|
+
sage: a.is_square() # needs sage.libs.linbox
|
|
770
|
+
False
|
|
771
|
+
sage: (a**2).is_square() # needs sage.libs.linbox
|
|
772
|
+
True
|
|
773
|
+
sage: k.<a> = FiniteField(4, impl='ntl', modulus='primitive') # needs sage.libs.ntl
|
|
774
|
+
sage: (a**2).is_square() # needs sage.libs.ntl
|
|
775
|
+
True
|
|
776
|
+
sage: k.<a> = FiniteField(17^5, impl='pari_ffelt', modulus='primitive') # needs sage.libs.pari
|
|
777
|
+
sage: a.is_square() # needs sage.libs.pari
|
|
778
|
+
False
|
|
779
|
+
sage: (a**2).is_square() # needs sage.libs.pari
|
|
780
|
+
True
|
|
781
|
+
|
|
782
|
+
::
|
|
783
|
+
|
|
784
|
+
sage: k(0).is_square() # needs sage.libs.linbox
|
|
785
|
+
True
|
|
786
|
+
"""
|
|
787
|
+
K = self.parent()
|
|
788
|
+
if K.characteristic() == 2:
|
|
789
|
+
return True
|
|
790
|
+
n = K.order() - 1
|
|
791
|
+
a = self**(n // 2)
|
|
792
|
+
return a == 1 or a == 0
|
|
793
|
+
|
|
794
|
+
def square_root(self, extend=False, all=False):
|
|
795
|
+
"""
|
|
796
|
+
The square root function.
|
|
797
|
+
|
|
798
|
+
INPUT:
|
|
799
|
+
|
|
800
|
+
- ``extend`` -- boolean (default: ``True``); if ``True``, return a
|
|
801
|
+
square root in an extension ring, if necessary. Otherwise, raise a
|
|
802
|
+
:exc:`ValueError` if the root is not in the base ring.
|
|
803
|
+
|
|
804
|
+
.. WARNING::
|
|
805
|
+
|
|
806
|
+
This option is not implemented!
|
|
807
|
+
|
|
808
|
+
- ``all`` -- boolean (default: ``False``); if ``True``, return all
|
|
809
|
+
square roots of ``self``, instead of just one
|
|
810
|
+
|
|
811
|
+
.. WARNING::
|
|
812
|
+
|
|
813
|
+
The ``'extend'`` option is not implemented (yet).
|
|
814
|
+
|
|
815
|
+
EXAMPLES::
|
|
816
|
+
|
|
817
|
+
sage: F = FiniteField(7^2, 'a')
|
|
818
|
+
sage: F(2).square_root()
|
|
819
|
+
4
|
|
820
|
+
sage: F(3).square_root()
|
|
821
|
+
2*a + 6
|
|
822
|
+
sage: F(3).square_root()**2
|
|
823
|
+
3
|
|
824
|
+
sage: F(4).square_root()
|
|
825
|
+
2
|
|
826
|
+
sage: K = FiniteField(7^3, 'alpha', impl='pari_ffelt')
|
|
827
|
+
sage: K(3).square_root()
|
|
828
|
+
Traceback (most recent call last):
|
|
829
|
+
...
|
|
830
|
+
ValueError: must be a perfect square.
|
|
831
|
+
"""
|
|
832
|
+
try:
|
|
833
|
+
return self.nth_root(2, extend=extend, all=all)
|
|
834
|
+
except ValueError:
|
|
835
|
+
raise ValueError("must be a perfect square.")
|
|
836
|
+
|
|
837
|
+
def sqrt(self, extend=False, all=False):
|
|
838
|
+
"""
|
|
839
|
+
See :meth:`square_root`.
|
|
840
|
+
|
|
841
|
+
EXAMPLES::
|
|
842
|
+
|
|
843
|
+
sage: k.<a> = GF(3^17)
|
|
844
|
+
sage: (a^3 - a - 1).sqrt()
|
|
845
|
+
a^16 + 2*a^15 + a^13 + 2*a^12 + a^10 + 2*a^9 + 2*a^8 + a^7 + a^6 + 2*a^5 + a^4 + 2*a^2 + 2*a + 2
|
|
846
|
+
"""
|
|
847
|
+
return self.square_root(extend=extend, all=all)
|
|
848
|
+
|
|
849
|
+
def nth_root(self, n, extend=False, all=False, algorithm=None, cunningham=False):
|
|
850
|
+
r"""
|
|
851
|
+
Return an `n`-th root of ``self``.
|
|
852
|
+
|
|
853
|
+
INPUT:
|
|
854
|
+
|
|
855
|
+
- ``n`` -- integer `\geq 1`
|
|
856
|
+
|
|
857
|
+
- ``extend`` -- boolean (default: ``False``); if ``True``, return an
|
|
858
|
+
`n`-th root in an extension ring, if necessary. Otherwise, raise a
|
|
859
|
+
:exc:`ValueError` if the root is not in the base ring. Warning:
|
|
860
|
+
this option is not implemented!
|
|
861
|
+
|
|
862
|
+
- ``all`` -- boolean (default: ``False``); if ``True``, return all `n`-th
|
|
863
|
+
roots of ``self``, instead of just one
|
|
864
|
+
|
|
865
|
+
- ``algorithm`` -- string (default: ``None``); ``'Johnston'`` is the
|
|
866
|
+
only currently supported option. For IntegerMod elements, the problem
|
|
867
|
+
is reduced to the prime modulus case using CRT and `p`-adic logs,
|
|
868
|
+
and then this algorithm used.
|
|
869
|
+
|
|
870
|
+
OUTPUT:
|
|
871
|
+
|
|
872
|
+
If ``self`` has an `n`-th root, returns one (if ``all`` is ``False``) or a
|
|
873
|
+
list of all of them (if ``all`` is ``True``).
|
|
874
|
+
Otherwise, raises a :exc:`ValueError` (if ``extend`` is ``False``)
|
|
875
|
+
or a :exc:`NotImplementedError` (if ``extend`` is ``True``).
|
|
876
|
+
|
|
877
|
+
.. warning::
|
|
878
|
+
|
|
879
|
+
The ``extend`` option is not implemented (yet).
|
|
880
|
+
|
|
881
|
+
EXAMPLES::
|
|
882
|
+
|
|
883
|
+
sage: K = GF(31)
|
|
884
|
+
sage: a = K(22)
|
|
885
|
+
sage: K(22).nth_root(7)
|
|
886
|
+
13
|
|
887
|
+
sage: K(25).nth_root(5)
|
|
888
|
+
5
|
|
889
|
+
sage: K(23).nth_root(3)
|
|
890
|
+
29
|
|
891
|
+
|
|
892
|
+
sage: K.<a> = GF(625)
|
|
893
|
+
sage: (3*a^2+a+1).nth_root(13)**13
|
|
894
|
+
3*a^2 + a + 1
|
|
895
|
+
|
|
896
|
+
sage: k.<a> = GF(29^2)
|
|
897
|
+
sage: b = a^2 + 5*a + 1
|
|
898
|
+
sage: b.nth_root(11)
|
|
899
|
+
3*a + 20
|
|
900
|
+
sage: b.nth_root(5)
|
|
901
|
+
Traceback (most recent call last):
|
|
902
|
+
...
|
|
903
|
+
ValueError: no nth root
|
|
904
|
+
sage: b.nth_root(5, all = True)
|
|
905
|
+
[]
|
|
906
|
+
sage: b.nth_root(3, all = True)
|
|
907
|
+
[14*a + 18, 10*a + 13, 5*a + 27]
|
|
908
|
+
|
|
909
|
+
sage: k.<a> = GF(29^5)
|
|
910
|
+
sage: b = a^2 + 5*a + 1
|
|
911
|
+
sage: b.nth_root(5)
|
|
912
|
+
19*a^4 + 2*a^3 + 2*a^2 + 16*a + 3
|
|
913
|
+
sage: b.nth_root(7)
|
|
914
|
+
Traceback (most recent call last):
|
|
915
|
+
...
|
|
916
|
+
ValueError: no nth root
|
|
917
|
+
sage: b.nth_root(4, all=True)
|
|
918
|
+
[]
|
|
919
|
+
|
|
920
|
+
TESTS::
|
|
921
|
+
|
|
922
|
+
sage: for p in [2,3,5,7,11]: # long time, random because of PARI warnings
|
|
923
|
+
....: for n in [2,5,10]:
|
|
924
|
+
....: q = p^n
|
|
925
|
+
....: K.<a> = GF(q)
|
|
926
|
+
....: for r in (q-1).divisors():
|
|
927
|
+
....: if r == 1: continue
|
|
928
|
+
....: x = K.random_element()
|
|
929
|
+
....: y = x^r
|
|
930
|
+
....: assert y.nth_root(r)^r == y
|
|
931
|
+
....: assert (y^41).nth_root(41*r)^(41*r) == y^41
|
|
932
|
+
....: assert (y^307).nth_root(307*r)^(307*r) == y^307
|
|
933
|
+
sage: k.<a> = GF(4)
|
|
934
|
+
sage: a.nth_root(0,all=True)
|
|
935
|
+
[]
|
|
936
|
+
sage: k(1).nth_root(0,all=True)
|
|
937
|
+
[a, a + 1, 1]
|
|
938
|
+
|
|
939
|
+
ALGORITHM:
|
|
940
|
+
|
|
941
|
+
The default is currently an algorithm described in [Joh1999]_.
|
|
942
|
+
|
|
943
|
+
AUTHOR:
|
|
944
|
+
|
|
945
|
+
- David Roe (2010-02-13)
|
|
946
|
+
"""
|
|
947
|
+
if self.is_zero():
|
|
948
|
+
if n <= 0:
|
|
949
|
+
if all:
|
|
950
|
+
return []
|
|
951
|
+
raise ValueError
|
|
952
|
+
return [self] if all else self
|
|
953
|
+
if n < 0:
|
|
954
|
+
self = ~self
|
|
955
|
+
n = -n
|
|
956
|
+
elif n == 0:
|
|
957
|
+
if self == 1:
|
|
958
|
+
if all:
|
|
959
|
+
return [a for a in self.parent().list() if a != 0]
|
|
960
|
+
return self
|
|
961
|
+
else:
|
|
962
|
+
if all:
|
|
963
|
+
return []
|
|
964
|
+
raise ValueError
|
|
965
|
+
if extend:
|
|
966
|
+
raise NotImplementedError
|
|
967
|
+
n = Integer(n)
|
|
968
|
+
return self._nth_root_common(n, all, algorithm, cunningham)
|
|
969
|
+
|
|
970
|
+
def pth_power(self, int k=1):
|
|
971
|
+
"""
|
|
972
|
+
Return the `(p^k)`-th power of self, where `p` is the
|
|
973
|
+
characteristic of the field.
|
|
974
|
+
|
|
975
|
+
INPUT:
|
|
976
|
+
|
|
977
|
+
- ``k`` -- integer (default: 1, must fit in C int type)
|
|
978
|
+
|
|
979
|
+
Note that if `k` is negative, then this computes the appropriate root.
|
|
980
|
+
|
|
981
|
+
EXAMPLES::
|
|
982
|
+
|
|
983
|
+
sage: F.<a> = GF(29^2)
|
|
984
|
+
sage: z = a^2 + 5*a + 1
|
|
985
|
+
sage: z.pth_power()
|
|
986
|
+
19*a + 20
|
|
987
|
+
sage: z.pth_power(10)
|
|
988
|
+
10*a + 28
|
|
989
|
+
sage: z.pth_power(-10) == z
|
|
990
|
+
True
|
|
991
|
+
sage: F.<b> = GF(2^12)
|
|
992
|
+
sage: y = b^3 + b + 1
|
|
993
|
+
sage: y == (y.pth_power(-3))^(2^3)
|
|
994
|
+
True
|
|
995
|
+
sage: y.pth_power(2)
|
|
996
|
+
b^7 + b^6 + b^5 + b^4 + b^3 + b
|
|
997
|
+
"""
|
|
998
|
+
p = self.additive_order()
|
|
999
|
+
n = self.parent().degree()
|
|
1000
|
+
return self**(p**(k % n))
|
|
1001
|
+
|
|
1002
|
+
frobenius = pth_power
|
|
1003
|
+
|
|
1004
|
+
def pth_root(self, int k=1):
|
|
1005
|
+
"""
|
|
1006
|
+
Return the `(p^k)`-th root of self, where `p` is the characteristic
|
|
1007
|
+
of the field.
|
|
1008
|
+
|
|
1009
|
+
INPUT:
|
|
1010
|
+
|
|
1011
|
+
- ``k`` -- integer (default: 1, must fit in C int type)
|
|
1012
|
+
|
|
1013
|
+
Note that if `k` is negative, then this computes the appropriate power.
|
|
1014
|
+
|
|
1015
|
+
EXAMPLES::
|
|
1016
|
+
|
|
1017
|
+
sage: F.<b> = GF(2^12)
|
|
1018
|
+
sage: y = b^3 + b + 1
|
|
1019
|
+
sage: y == (y.pth_root(3))^(2^3)
|
|
1020
|
+
True
|
|
1021
|
+
sage: y.pth_root(2)
|
|
1022
|
+
b^11 + b^10 + b^9 + b^7 + b^5 + b^4 + b^2 + b
|
|
1023
|
+
"""
|
|
1024
|
+
return self.pth_power(-k)
|
|
1025
|
+
|
|
1026
|
+
def conjugate(self):
|
|
1027
|
+
"""
|
|
1028
|
+
This methods returns the result of the Frobenius morphism
|
|
1029
|
+
in the case where the field is a quadratic extension, say
|
|
1030
|
+
`GF(q^2)`, where `q=p^k` is a prime power and `p` the
|
|
1031
|
+
characteristic of the field.
|
|
1032
|
+
|
|
1033
|
+
OUTPUT:
|
|
1034
|
+
|
|
1035
|
+
Instance of this class representing the image under
|
|
1036
|
+
the Frobenius morphisms.
|
|
1037
|
+
|
|
1038
|
+
EXAMPLES::
|
|
1039
|
+
|
|
1040
|
+
sage: F.<a> = GF(16)
|
|
1041
|
+
sage: b = a.conjugate(); b
|
|
1042
|
+
a + 1
|
|
1043
|
+
sage: a == b.conjugate()
|
|
1044
|
+
True
|
|
1045
|
+
|
|
1046
|
+
sage: F.<a> = GF(27)
|
|
1047
|
+
sage: a.conjugate()
|
|
1048
|
+
Traceback (most recent call last):
|
|
1049
|
+
...
|
|
1050
|
+
TypeError: cardinality of the field must be a square number
|
|
1051
|
+
|
|
1052
|
+
TESTS:
|
|
1053
|
+
|
|
1054
|
+
Check that :issue:`26761` is fixed::
|
|
1055
|
+
|
|
1056
|
+
sage: # needs sage.libs.gap
|
|
1057
|
+
sage: G32 = GU(3,2)
|
|
1058
|
+
sage: g1, g2 = G32.gens()
|
|
1059
|
+
sage: m1 = g1.matrix()
|
|
1060
|
+
sage: m1.is_unitary()
|
|
1061
|
+
True
|
|
1062
|
+
sage: G32(m1) == g1
|
|
1063
|
+
True
|
|
1064
|
+
"""
|
|
1065
|
+
k2 = self.parent().degree()
|
|
1066
|
+
if k2 % 2:
|
|
1067
|
+
raise TypeError("cardinality of the field must be a square number")
|
|
1068
|
+
k = k2 / 2
|
|
1069
|
+
|
|
1070
|
+
return self.pth_power(k=k)
|
|
1071
|
+
|
|
1072
|
+
def to_integer(self, reverse=False):
|
|
1073
|
+
r"""
|
|
1074
|
+
Return an integer representation of this finite field element
|
|
1075
|
+
obtained by lifting its representative polynomial to `\ZZ` and
|
|
1076
|
+
evaluating it at the characteristic `p`.
|
|
1077
|
+
|
|
1078
|
+
If ``reverse`` is set to ``True`` (default: ``False``),
|
|
1079
|
+
the list of coefficients is reversed prior to evaluation.
|
|
1080
|
+
|
|
1081
|
+
Inverse of :meth:`sage.rings.finite_rings.finite_field_base.FiniteField.from_integer`.
|
|
1082
|
+
|
|
1083
|
+
EXAMPLES::
|
|
1084
|
+
|
|
1085
|
+
sage: F.<t> = GF(7^5)
|
|
1086
|
+
sage: F(5).to_integer()
|
|
1087
|
+
5
|
|
1088
|
+
sage: t.to_integer()
|
|
1089
|
+
7
|
|
1090
|
+
sage: (t^2).to_integer()
|
|
1091
|
+
49
|
|
1092
|
+
sage: (t^2+1).to_integer()
|
|
1093
|
+
50
|
|
1094
|
+
sage: (t^2+t+1).to_integer()
|
|
1095
|
+
57
|
|
1096
|
+
|
|
1097
|
+
::
|
|
1098
|
+
|
|
1099
|
+
sage: F.<t> = GF(2^8)
|
|
1100
|
+
sage: u = F.from_integer(0xd1)
|
|
1101
|
+
sage: bin(u.to_integer(False))
|
|
1102
|
+
'0b11010001'
|
|
1103
|
+
sage: bin(u.to_integer(True))
|
|
1104
|
+
'0b10001011'
|
|
1105
|
+
|
|
1106
|
+
TESTS::
|
|
1107
|
+
|
|
1108
|
+
sage: # needs sage.modules
|
|
1109
|
+
sage: p = random_prime(2^99)
|
|
1110
|
+
sage: k = randrange(2,10)
|
|
1111
|
+
sage: F.<t> = GF((p, k))
|
|
1112
|
+
sage: rev = bool(randrange(2))
|
|
1113
|
+
sage: u = F.random_element()
|
|
1114
|
+
sage: 0 <= u.to_integer(rev) < F.cardinality()
|
|
1115
|
+
True
|
|
1116
|
+
sage: F.from_integer(u.to_integer(rev), rev) == u
|
|
1117
|
+
True
|
|
1118
|
+
sage: n = randrange(F.cardinality())
|
|
1119
|
+
sage: F.from_integer(n, rev).to_integer(rev) == n
|
|
1120
|
+
True
|
|
1121
|
+
"""
|
|
1122
|
+
if not reverse:
|
|
1123
|
+
try:
|
|
1124
|
+
return self._integer_representation()
|
|
1125
|
+
except AttributeError:
|
|
1126
|
+
pass
|
|
1127
|
+
p = self.parent().characteristic()
|
|
1128
|
+
f = self.polynomial().change_ring(ZZ)
|
|
1129
|
+
if reverse:
|
|
1130
|
+
f = f.reverse(self.parent().degree() - 1)
|
|
1131
|
+
return f(p)
|
|
1132
|
+
|
|
1133
|
+
def to_bytes(self, byteorder='big'):
|
|
1134
|
+
r"""
|
|
1135
|
+
Return an array of bytes representing an integer.
|
|
1136
|
+
|
|
1137
|
+
Internally relies on the python ``int.to_bytes()`` method.
|
|
1138
|
+
Length of byte array is determined from the field's order.
|
|
1139
|
+
|
|
1140
|
+
INPUT:
|
|
1141
|
+
|
|
1142
|
+
- ``byteorder`` -- string (default: ``'big'``); determines the byte order of
|
|
1143
|
+
the output; can only be ``'big'`` or ``'little'``
|
|
1144
|
+
|
|
1145
|
+
EXAMPLES::
|
|
1146
|
+
|
|
1147
|
+
sage: F.<z5> = GF(3^5)
|
|
1148
|
+
sage: a = z5^4 + 2*z5^3 + 1
|
|
1149
|
+
sage: a.to_bytes()
|
|
1150
|
+
b'\x88'
|
|
1151
|
+
|
|
1152
|
+
::
|
|
1153
|
+
|
|
1154
|
+
sage: F.<z3> = GF(163^3)
|
|
1155
|
+
sage: a = 136*z3^2 + 10*z3 + 125
|
|
1156
|
+
sage: a.to_bytes()
|
|
1157
|
+
b'7)\xa3'
|
|
1158
|
+
"""
|
|
1159
|
+
length = (self.parent().order().nbits() + 7) // 8
|
|
1160
|
+
return self.to_integer().to_bytes(length=length, byteorder=byteorder)
|
|
1161
|
+
|
|
1162
|
+
cdef class Cache_base(SageObject):
|
|
1163
|
+
cpdef FinitePolyExtElement fetch_int(self, number):
|
|
1164
|
+
r"""
|
|
1165
|
+
Given an integer less than `p^n` with base `2`
|
|
1166
|
+
representation `a_0 + a_1 \cdot 2 + \cdots + a_k 2^k`, this returns
|
|
1167
|
+
`a_0 + a_1 x + \cdots + a_k x^k`, where `x` is the
|
|
1168
|
+
generator of this finite field.
|
|
1169
|
+
|
|
1170
|
+
EXAMPLES::
|
|
1171
|
+
|
|
1172
|
+
sage: k.<a> = GF(2^48)
|
|
1173
|
+
sage: k._cache.fetch_int(2^33 + 2 + 1) # needs sage.libs.ntl
|
|
1174
|
+
a^33 + a + 1
|
|
1175
|
+
"""
|
|
1176
|
+
raise NotImplementedError("this must be implemented by subclasses")
|