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,827 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
# sage.doctest: needs sage.rings.finite_rings
|
|
3
|
+
r"""
|
|
4
|
+
Finite fields
|
|
5
|
+
|
|
6
|
+
Sage supports arithmetic in finite prime and extension fields.
|
|
7
|
+
Several implementation for prime fields are implemented natively in
|
|
8
|
+
Sage for several sizes of primes `p`. These implementations
|
|
9
|
+
are
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
- ``sage.rings.finite_rings.integer_mod.IntegerMod_int``,
|
|
13
|
+
|
|
14
|
+
- ``sage.rings.finite_rings.integer_mod.IntegerMod_int64``, and
|
|
15
|
+
|
|
16
|
+
- ``sage.rings.finite_rings.integer_mod.IntegerMod_gmp``.
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
Small extension fields of cardinality `< 2^{16}` are
|
|
20
|
+
implemented using tables of Zech logs via the Givaro C++ library
|
|
21
|
+
(``sage.rings.finite_rings.finite_field_givaro.FiniteField_givaro``).
|
|
22
|
+
While this representation is very fast it is limited to finite
|
|
23
|
+
fields of small cardinality. Larger finite extension fields of
|
|
24
|
+
order `q >= 2^{16}` are internally represented as
|
|
25
|
+
polynomials over smaller finite prime fields. If the
|
|
26
|
+
characteristic of such a field is 2 then NTL is used internally to
|
|
27
|
+
represent the field
|
|
28
|
+
(``sage.rings.finite_rings.finite_field_ntl_gf2e.FiniteField_ntl_gf2e``).
|
|
29
|
+
In all other case the PARI C library is used
|
|
30
|
+
(``sage.rings.finite_rings.finite_field_pari_ffelt.FiniteField_pari_ffelt``).
|
|
31
|
+
|
|
32
|
+
However, this distinction is internal only and the user usually
|
|
33
|
+
does not have to worry about it because consistency across all
|
|
34
|
+
implementations is aimed for. In all extension field
|
|
35
|
+
implementations the user may either specify a minimal polynomial or
|
|
36
|
+
leave the choice to Sage.
|
|
37
|
+
|
|
38
|
+
For small finite fields the default choice are Conway polynomials.
|
|
39
|
+
|
|
40
|
+
The Conway polynomial `C_n` is the lexicographically first
|
|
41
|
+
monic irreducible, primitive polynomial of degree `n` over
|
|
42
|
+
`GF(p)` with the property that for a root `\alpha`
|
|
43
|
+
of `C_n` we have that
|
|
44
|
+
`\beta=
|
|
45
|
+
\alpha^{(p^n - 1)/(p^m - 1)}` is a root of
|
|
46
|
+
`C_m` for all `m` dividing `n`. Sage
|
|
47
|
+
contains a database of Conway polynomials which also can be queried
|
|
48
|
+
independently of finite field construction.
|
|
49
|
+
|
|
50
|
+
A pseudo-Conway polynomial satisfies all of the conditions required
|
|
51
|
+
of a Conway polynomial except the condition that it is lexicographically
|
|
52
|
+
first. They are therefore not unique. If no variable name is
|
|
53
|
+
specified for an extension field, Sage will fit the finite field
|
|
54
|
+
into a compatible lattice of field extensions defined by pseudo-Conway
|
|
55
|
+
polynomials. This lattice is stored in an
|
|
56
|
+
:class:`~sage.rings.algebraic_closure_finite_field.AlgebraicClosureFiniteField`
|
|
57
|
+
object; different algebraic closure objects can be created by using
|
|
58
|
+
a different ``prefix`` keyword to the finite field constructor.
|
|
59
|
+
|
|
60
|
+
Note that the computation of pseudo-Conway polynomials is expensive
|
|
61
|
+
when the degree is large and highly composite. If a variable
|
|
62
|
+
name is specified then a random polynomial is used instead, which
|
|
63
|
+
will be much faster to find.
|
|
64
|
+
|
|
65
|
+
While Sage supports basic arithmetic in finite fields some more
|
|
66
|
+
advanced features for computing with finite fields are still not
|
|
67
|
+
implemented. For instance, Sage does not calculate embeddings of
|
|
68
|
+
finite fields yet.
|
|
69
|
+
|
|
70
|
+
EXAMPLES::
|
|
71
|
+
|
|
72
|
+
sage: k = GF(5); type(k)
|
|
73
|
+
<class 'sage.rings.finite_rings.finite_field_prime_modn.FiniteField_prime_modn_with_category'>
|
|
74
|
+
|
|
75
|
+
::
|
|
76
|
+
|
|
77
|
+
sage: k = GF(5^2,'c'); type(k) # needs sage.libs.linbox
|
|
78
|
+
<class 'sage.rings.finite_rings.finite_field_givaro.FiniteField_givaro_with_category'>
|
|
79
|
+
|
|
80
|
+
One can also give the cardinality `q=p^n` as the tuple `(p,n)`::
|
|
81
|
+
|
|
82
|
+
sage: k = GF((5, 2),'c'); k
|
|
83
|
+
Finite Field in c of size 5^2
|
|
84
|
+
|
|
85
|
+
::
|
|
86
|
+
|
|
87
|
+
sage: k = GF(2^16,'c'); type(k) # needs sage.libs.ntl
|
|
88
|
+
<class 'sage.rings.finite_rings.finite_field_ntl_gf2e.FiniteField_ntl_gf2e_with_category'>
|
|
89
|
+
|
|
90
|
+
::
|
|
91
|
+
|
|
92
|
+
sage: k = GF((3, 16),'c'); type(k)
|
|
93
|
+
<class 'sage.rings.finite_rings.finite_field_pari_ffelt.FiniteField_pari_ffelt_with_category'>
|
|
94
|
+
|
|
95
|
+
Finite Fields support iteration, starting with 0.
|
|
96
|
+
|
|
97
|
+
::
|
|
98
|
+
|
|
99
|
+
sage: k = GF(9, 'a')
|
|
100
|
+
sage: for i,x in enumerate(k): print("{} {}".format(i, x))
|
|
101
|
+
0 0
|
|
102
|
+
1 a
|
|
103
|
+
2 a + 1
|
|
104
|
+
3 2*a + 1
|
|
105
|
+
4 2
|
|
106
|
+
5 2*a
|
|
107
|
+
6 2*a + 2
|
|
108
|
+
7 a + 2
|
|
109
|
+
8 1
|
|
110
|
+
sage: for a in GF(5):
|
|
111
|
+
....: print(a)
|
|
112
|
+
0
|
|
113
|
+
1
|
|
114
|
+
2
|
|
115
|
+
3
|
|
116
|
+
4
|
|
117
|
+
|
|
118
|
+
We output the base rings of several finite fields.
|
|
119
|
+
|
|
120
|
+
::
|
|
121
|
+
|
|
122
|
+
sage: k = GF(3); type(k)
|
|
123
|
+
<class 'sage.rings.finite_rings.finite_field_prime_modn.FiniteField_prime_modn_with_category'>
|
|
124
|
+
sage: k.base_ring()
|
|
125
|
+
Finite Field of size 3
|
|
126
|
+
|
|
127
|
+
::
|
|
128
|
+
|
|
129
|
+
sage: # needs sage.libs.linbox
|
|
130
|
+
sage: k = GF(9,'alpha'); type(k)
|
|
131
|
+
<class 'sage.rings.finite_rings.finite_field_givaro.FiniteField_givaro_with_category'>
|
|
132
|
+
sage: k.base_ring()
|
|
133
|
+
Finite Field of size 3
|
|
134
|
+
|
|
135
|
+
::
|
|
136
|
+
|
|
137
|
+
sage: k = GF((3, 40),'b'); type(k)
|
|
138
|
+
<class 'sage.rings.finite_rings.finite_field_pari_ffelt.FiniteField_pari_ffelt_with_category'>
|
|
139
|
+
sage: k.base_ring()
|
|
140
|
+
Finite Field of size 3
|
|
141
|
+
|
|
142
|
+
Further examples::
|
|
143
|
+
|
|
144
|
+
sage: GF(2).is_field()
|
|
145
|
+
True
|
|
146
|
+
sage: GF(next_prime(10^20)).is_field()
|
|
147
|
+
True
|
|
148
|
+
sage: GF(19^20,'a').is_field()
|
|
149
|
+
True
|
|
150
|
+
sage: GF(8,'a').is_field()
|
|
151
|
+
True
|
|
152
|
+
|
|
153
|
+
AUTHORS:
|
|
154
|
+
|
|
155
|
+
- William Stein: initial version
|
|
156
|
+
|
|
157
|
+
- Robert Bradshaw: prime field implementation
|
|
158
|
+
|
|
159
|
+
- Martin Albrecht: Givaro and ntl.GF2E implementations
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
# ****************************************************************************
|
|
163
|
+
# Copyright (C) 2006 William Stein <wstein@gmail.com>
|
|
164
|
+
#
|
|
165
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
166
|
+
#
|
|
167
|
+
# This code is distributed in the hope that it will be useful,
|
|
168
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
169
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
170
|
+
# General Public License for more details.
|
|
171
|
+
#
|
|
172
|
+
# The full text of the GPL is available at:
|
|
173
|
+
#
|
|
174
|
+
# https://www.gnu.org/licenses/
|
|
175
|
+
# ****************************************************************************
|
|
176
|
+
|
|
177
|
+
from collections import defaultdict
|
|
178
|
+
from sage.structure.category_object import normalize_names
|
|
179
|
+
from sage.rings.polynomial.polynomial_element import Polynomial
|
|
180
|
+
from sage.rings.integer import Integer
|
|
181
|
+
|
|
182
|
+
# the import below is just a redirection
|
|
183
|
+
from sage.rings.finite_rings.finite_field_base import is_FiniteField
|
|
184
|
+
assert is_FiniteField # just to silent pyflakes
|
|
185
|
+
|
|
186
|
+
try:
|
|
187
|
+
# We don't late import this because this means trouble with the Givaro library
|
|
188
|
+
# On a Macbook Pro OSX 10.5.8, this manifests as a Bus Error on exiting Sage.
|
|
189
|
+
# TODO: figure out why
|
|
190
|
+
from .finite_field_givaro import FiniteField_givaro
|
|
191
|
+
except ImportError:
|
|
192
|
+
FiniteField_givaro = None
|
|
193
|
+
|
|
194
|
+
try:
|
|
195
|
+
from .finite_field_ntl_gf2e import FiniteField_ntl_gf2e
|
|
196
|
+
except ImportError:
|
|
197
|
+
FiniteField_ntl_gf2e = None
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
from sage.structure.factory import UniqueFactory
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
class FiniteFieldFactory(UniqueFactory):
|
|
204
|
+
"""
|
|
205
|
+
Return the globally unique finite field of given order with
|
|
206
|
+
generator labeled by the given name and possibly with given
|
|
207
|
+
modulus.
|
|
208
|
+
|
|
209
|
+
INPUT:
|
|
210
|
+
|
|
211
|
+
- ``order`` -- a prime power
|
|
212
|
+
|
|
213
|
+
- ``name`` -- string, optional. Note that there can be a
|
|
214
|
+
substantial speed penalty (in creating extension fields) when
|
|
215
|
+
omitting the variable name, since doing so triggers the
|
|
216
|
+
computation of pseudo-Conway polynomials in order to define a
|
|
217
|
+
coherent lattice of extensions of the prime field. The speed
|
|
218
|
+
penalty grows with the size of extension degree and with
|
|
219
|
+
the number of factors of the extension degree.
|
|
220
|
+
|
|
221
|
+
- ``modulus`` -- (optional) either a defining polynomial for the
|
|
222
|
+
field, or a string specifying an algorithm to use to generate
|
|
223
|
+
such a polynomial. If ``modulus`` is a string, it is passed to
|
|
224
|
+
:meth:`~sage.rings.polynomial.irreducible_element()` as the
|
|
225
|
+
parameter ``algorithm``; see there for the permissible values of
|
|
226
|
+
this parameter. In particular, you can specify
|
|
227
|
+
``modulus="primitive"`` to get a primitive polynomial. You
|
|
228
|
+
may not specify a modulus if you do not specify a variable name.
|
|
229
|
+
|
|
230
|
+
- ``impl`` -- (optional) a string specifying the implementation of
|
|
231
|
+
the finite field. Possible values are:
|
|
232
|
+
|
|
233
|
+
- ``'modn'`` -- ring of integers modulo `p` (only for prime fields)
|
|
234
|
+
|
|
235
|
+
- ``'givaro'`` -- Givaro, which uses Zech logs (only for fields
|
|
236
|
+
of at most 65521 elements)
|
|
237
|
+
|
|
238
|
+
- ``'ntl'`` -- NTL using GF2X (only in characteristic 2)
|
|
239
|
+
|
|
240
|
+
- ``'pari'`` or ``'pari_ffelt'`` -- PARI's ``FFELT`` type (only
|
|
241
|
+
for extension fields)
|
|
242
|
+
|
|
243
|
+
- ``elem_cache`` -- (default: order < 500) cache all elements to
|
|
244
|
+
avoid creation time; ignored unless ``impl='givaro'``
|
|
245
|
+
|
|
246
|
+
- ``repr`` -- (default: ``'poly'``) ignored unless ``impl='givaro'``;
|
|
247
|
+
controls the way elements are printed to the user:
|
|
248
|
+
|
|
249
|
+
- 'log': repr is
|
|
250
|
+
:meth:`~sage.rings.finite_rings.element_givaro.FiniteField_givaroElement.log_repr()`
|
|
251
|
+
|
|
252
|
+
- 'int': repr is
|
|
253
|
+
:meth:`~sage.rings.finite_rings.element_givaro.FiniteField_givaroElement.int_repr()`
|
|
254
|
+
|
|
255
|
+
- 'poly': repr is
|
|
256
|
+
:meth:`~sage.rings.finite_rings.element_givaro.FiniteField_givaroElement.poly_repr()`
|
|
257
|
+
|
|
258
|
+
- ``check_irreducible`` -- verify that the polynomial modulus is
|
|
259
|
+
irreducible
|
|
260
|
+
|
|
261
|
+
- ``proof`` -- boolean (default: ``True``); if ``True``, use provable
|
|
262
|
+
primality test; otherwise only use pseudoprimality test
|
|
263
|
+
|
|
264
|
+
ALIAS: You can also use ``GF`` instead of ``FiniteField`` -- they
|
|
265
|
+
are identical.
|
|
266
|
+
|
|
267
|
+
EXAMPLES::
|
|
268
|
+
|
|
269
|
+
sage: k.<a> = FiniteField(9); k
|
|
270
|
+
Finite Field in a of size 3^2
|
|
271
|
+
sage: parent(a)
|
|
272
|
+
Finite Field in a of size 3^2
|
|
273
|
+
sage: charpoly(a, 'y')
|
|
274
|
+
y^2 + 2*y + 2
|
|
275
|
+
|
|
276
|
+
We illustrate the proof flag. The following example would hang
|
|
277
|
+
for a very long time if we didn't use ``proof=False``.
|
|
278
|
+
|
|
279
|
+
.. NOTE::
|
|
280
|
+
|
|
281
|
+
Magma only supports ``proof=False`` for making finite fields,
|
|
282
|
+
so falsely appears to be faster than Sage -- see :issue:`10975`.
|
|
283
|
+
|
|
284
|
+
::
|
|
285
|
+
|
|
286
|
+
sage: k = FiniteField(10^1000 + 453, proof=False)
|
|
287
|
+
sage: k = FiniteField((10^1000 + 453)^2, 'a', proof=False) # long time -- about 5 seconds
|
|
288
|
+
|
|
289
|
+
::
|
|
290
|
+
|
|
291
|
+
sage: F.<x> = GF(5)[]
|
|
292
|
+
sage: K.<a> = GF(5**5, name='a', modulus=x^5 - x +1 )
|
|
293
|
+
sage: f = K.modulus(); f
|
|
294
|
+
x^5 + 4*x + 1
|
|
295
|
+
sage: type(f) # needs sage.libs.flint
|
|
296
|
+
<class 'sage.rings.polynomial.polynomial_zmod_flint.Polynomial_zmod_flint'>
|
|
297
|
+
|
|
298
|
+
By default, the given generator is not guaranteed to be primitive
|
|
299
|
+
(a generator of the multiplicative group), use
|
|
300
|
+
``modulus="primitive"`` if you need this::
|
|
301
|
+
|
|
302
|
+
sage: K.<a> = GF(5^45)
|
|
303
|
+
sage: a.multiplicative_order()
|
|
304
|
+
7105427357601001858711242675781
|
|
305
|
+
sage: a.is_square()
|
|
306
|
+
True
|
|
307
|
+
sage: K.<b> = GF(5^45, modulus='primitive')
|
|
308
|
+
sage: b.multiplicative_order()
|
|
309
|
+
28421709430404007434844970703124
|
|
310
|
+
|
|
311
|
+
The modulus must be irreducible::
|
|
312
|
+
|
|
313
|
+
sage: K.<a> = GF(5**5, name='a', modulus=x^5 - x)
|
|
314
|
+
Traceback (most recent call last):
|
|
315
|
+
...
|
|
316
|
+
ValueError: finite field modulus must be irreducible but it is not
|
|
317
|
+
|
|
318
|
+
You can't accidentally fool the constructor into thinking the
|
|
319
|
+
modulus is irreducible when it is not, since it actually tests
|
|
320
|
+
irreducibility modulo `p`. Also, the modulus has to be of the
|
|
321
|
+
right degree (this is always checked)::
|
|
322
|
+
|
|
323
|
+
sage: F.<x> = QQ[]
|
|
324
|
+
sage: factor(x^5 + 2)
|
|
325
|
+
x^5 + 2
|
|
326
|
+
sage: K.<a> = GF(5^5, modulus=x^5 + 2)
|
|
327
|
+
Traceback (most recent call last):
|
|
328
|
+
...
|
|
329
|
+
ValueError: finite field modulus must be irreducible but it is not
|
|
330
|
+
sage: K.<a> = GF(5^5, modulus=x^3 + 3*x + 3, check_irreducible=False)
|
|
331
|
+
Traceback (most recent call last):
|
|
332
|
+
...
|
|
333
|
+
ValueError: the degree of the modulus does not equal the degree of the field
|
|
334
|
+
|
|
335
|
+
Any type which can be converted to the polynomial ring `GF(p)[x]`
|
|
336
|
+
is accepted as modulus::
|
|
337
|
+
|
|
338
|
+
sage: K.<a> = GF(13^3, modulus=[1,0,0,2])
|
|
339
|
+
sage: K.<a> = GF(13^10, modulus=pari("ffinit(13,10)"))
|
|
340
|
+
sage: var('x') # needs sage.symbolic
|
|
341
|
+
x
|
|
342
|
+
sage: K.<a> = GF(13^2, modulus=x^2 - 2) # needs sage.symbolic
|
|
343
|
+
sage: K.<a> = GF(13^2, modulus=sin(x)) # needs sage.symbolic
|
|
344
|
+
Traceback (most recent call last):
|
|
345
|
+
...
|
|
346
|
+
TypeError: self must be a numeric expression
|
|
347
|
+
|
|
348
|
+
If you wish to live dangerously, you can tell the constructor not
|
|
349
|
+
to test irreducibility using ``check_irreducible=False``, but this
|
|
350
|
+
can easily lead to crashes and hangs -- so do not do it unless you
|
|
351
|
+
know that the modulus really is irreducible!
|
|
352
|
+
|
|
353
|
+
::
|
|
354
|
+
|
|
355
|
+
sage: K.<a> = GF(5**2, name='a', modulus=x^2 + 2, check_irreducible=False) # needs sage.symbolic
|
|
356
|
+
|
|
357
|
+
Even for prime fields, you can specify a modulus. This will not
|
|
358
|
+
change how Sage computes in this field, but it will change the
|
|
359
|
+
result of the :meth:`modulus` and :meth:`gen` methods::
|
|
360
|
+
|
|
361
|
+
sage: k.<a> = GF(5, modulus='primitive')
|
|
362
|
+
sage: k.modulus()
|
|
363
|
+
x + 3
|
|
364
|
+
sage: a
|
|
365
|
+
2
|
|
366
|
+
|
|
367
|
+
The order of a finite field must be a prime power::
|
|
368
|
+
|
|
369
|
+
sage: GF(1)
|
|
370
|
+
Traceback (most recent call last):
|
|
371
|
+
...
|
|
372
|
+
ValueError: the order of a finite field must be at least 2
|
|
373
|
+
sage: GF(100)
|
|
374
|
+
Traceback (most recent call last):
|
|
375
|
+
...
|
|
376
|
+
ValueError: the order of a finite field must be a prime power
|
|
377
|
+
|
|
378
|
+
Finite fields with explicit random modulus are not cached::
|
|
379
|
+
|
|
380
|
+
sage: k.<a> = GF(5**10, modulus='random')
|
|
381
|
+
sage: n.<a> = GF(5**10, modulus='random')
|
|
382
|
+
sage: while k.modulus() == n.modulus():
|
|
383
|
+
....: n.<a> = GF(5**10, modulus='random')
|
|
384
|
+
sage: n is k
|
|
385
|
+
False
|
|
386
|
+
sage: GF(5**10, 'a') is GF(5**10, 'a')
|
|
387
|
+
True
|
|
388
|
+
|
|
389
|
+
We check that various ways of creating the same finite field yield
|
|
390
|
+
the same object, which is cached::
|
|
391
|
+
|
|
392
|
+
sage: K = GF(7, 'a')
|
|
393
|
+
sage: L = GF(7, 'b')
|
|
394
|
+
sage: K is L # name is ignored for prime fields
|
|
395
|
+
True
|
|
396
|
+
sage: K is GF(7, modulus=K.modulus())
|
|
397
|
+
True
|
|
398
|
+
sage: K = GF(4,'a'); K.modulus()
|
|
399
|
+
x^2 + x + 1
|
|
400
|
+
sage: L = GF(4,'a', K.modulus())
|
|
401
|
+
sage: K is L
|
|
402
|
+
True
|
|
403
|
+
sage: M = GF(4,'a', K.modulus().change_variable_name('y'))
|
|
404
|
+
sage: K is M
|
|
405
|
+
True
|
|
406
|
+
|
|
407
|
+
You may print finite field elements as integers. This currently
|
|
408
|
+
only works if the order of field is `<2^{16}`, though::
|
|
409
|
+
|
|
410
|
+
sage: k.<a> = GF(2^8, repr='int')
|
|
411
|
+
sage: a
|
|
412
|
+
2
|
|
413
|
+
|
|
414
|
+
The following demonstrate coercions for finite fields using Conway
|
|
415
|
+
polynomials::
|
|
416
|
+
|
|
417
|
+
sage: k = GF(5^2); a = k.gen()
|
|
418
|
+
sage: l = GF(5^5); b = l.gen()
|
|
419
|
+
sage: a + b
|
|
420
|
+
3*z10^5 + z10^4 + z10^2 + 3*z10 + 1
|
|
421
|
+
|
|
422
|
+
Note that embeddings are compatible in lattices of such finite
|
|
423
|
+
fields::
|
|
424
|
+
|
|
425
|
+
sage: m = GF(5^3); c = m.gen()
|
|
426
|
+
sage: (a+b)+c == a+(b+c)
|
|
427
|
+
True
|
|
428
|
+
sage: (a*b)*c == a*(b*c)
|
|
429
|
+
True
|
|
430
|
+
sage: from sage.categories.pushout import pushout
|
|
431
|
+
sage: n = pushout(k, l)
|
|
432
|
+
sage: o = pushout(l, m)
|
|
433
|
+
sage: q = pushout(n, o)
|
|
434
|
+
sage: q(o(b)) == q(n(b))
|
|
435
|
+
True
|
|
436
|
+
|
|
437
|
+
Another check that embeddings are defined properly::
|
|
438
|
+
|
|
439
|
+
sage: k = GF(3**10)
|
|
440
|
+
sage: l = GF(3**20)
|
|
441
|
+
sage: l(k.gen()**10) == l(k.gen())**10
|
|
442
|
+
True
|
|
443
|
+
|
|
444
|
+
Using pseudo-Conway polynomials is slow for highly
|
|
445
|
+
composite extension degrees::
|
|
446
|
+
|
|
447
|
+
sage: k = GF(3^120) # long time (about 3 seconds)
|
|
448
|
+
sage: GF(3^40).gen().minimal_polynomial()(k.gen()^((3^120-1)/(3^40-1))) # long time (because of previous line)
|
|
449
|
+
0
|
|
450
|
+
|
|
451
|
+
Before :issue:`17569`, the boolean keyword argument ``conway``
|
|
452
|
+
was required when creating finite fields without a variable
|
|
453
|
+
name. This keyword argument is now removed (:issue:`21433`).
|
|
454
|
+
You can still pass in ``prefix`` as an argument, which has the
|
|
455
|
+
effect of changing the variable name of the algebraic closure::
|
|
456
|
+
|
|
457
|
+
sage: K = GF(3^10, prefix='w'); L = GF(3^10); K is L
|
|
458
|
+
False
|
|
459
|
+
sage: K.variable_name(), L.variable_name()
|
|
460
|
+
('w10', 'z10')
|
|
461
|
+
sage: list(K.polynomial()) == list(L.polynomial())
|
|
462
|
+
True
|
|
463
|
+
|
|
464
|
+
TESTS:
|
|
465
|
+
|
|
466
|
+
Check that :issue:`16934` has been fixed::
|
|
467
|
+
|
|
468
|
+
sage: k1.<a> = GF(17^14, impl='pari')
|
|
469
|
+
sage: _ = a/2
|
|
470
|
+
sage: k2.<a> = GF(17^14, impl='pari')
|
|
471
|
+
sage: k1 is k2
|
|
472
|
+
True
|
|
473
|
+
|
|
474
|
+
Check that :issue:`21433` has been fixed::
|
|
475
|
+
|
|
476
|
+
sage: K = GF(5^2)
|
|
477
|
+
sage: L = GF(5^4)
|
|
478
|
+
sage: from sage.categories.pushout import pushout
|
|
479
|
+
sage: pushout(K,L) is L
|
|
480
|
+
True
|
|
481
|
+
|
|
482
|
+
Check that :issue:`25182` has been fixed::
|
|
483
|
+
|
|
484
|
+
sage: GF(next_prime(2^63)^6)
|
|
485
|
+
Finite Field in z6 of size 9223372036854775837^6
|
|
486
|
+
|
|
487
|
+
Check that :issue:`31547` has been fixed::
|
|
488
|
+
|
|
489
|
+
sage: q=2**152
|
|
490
|
+
sage: GF(q,'a',modulus='primitive') == GF(q,'a',modulus='primitive')
|
|
491
|
+
True
|
|
492
|
+
"""
|
|
493
|
+
def __init__(self, *args, **kwds):
|
|
494
|
+
"""
|
|
495
|
+
Initialization.
|
|
496
|
+
|
|
497
|
+
EXAMPLES::
|
|
498
|
+
|
|
499
|
+
sage: TestSuite(GF).run()
|
|
500
|
+
"""
|
|
501
|
+
self._modulus_cache = defaultdict(dict)
|
|
502
|
+
super().__init__(*args, **kwds)
|
|
503
|
+
|
|
504
|
+
def create_key_and_extra_args(self, order, name=None, modulus=None, names=None,
|
|
505
|
+
impl=None, proof=None,
|
|
506
|
+
check_prime=True, check_irreducible=True,
|
|
507
|
+
prefix=None, repr=None, elem_cache=None,
|
|
508
|
+
**kwds):
|
|
509
|
+
"""
|
|
510
|
+
EXAMPLES::
|
|
511
|
+
|
|
512
|
+
sage: GF.create_key_and_extra_args(9, 'a') # needs sage.libs.linbox
|
|
513
|
+
((9, ('a',), x^2 + 2*x + 2, 'givaro', 3, 2, True, None, 'poly', True, True, True), {})
|
|
514
|
+
|
|
515
|
+
The order `q` can also be given as a pair `(p,n)`::
|
|
516
|
+
|
|
517
|
+
sage: GF.create_key_and_extra_args((3, 2), 'a') # needs sage.libs.linbox
|
|
518
|
+
((9, ('a',), x^2 + 2*x + 2, 'givaro', 3, 2, True, None, 'poly', True, True, True), {})
|
|
519
|
+
|
|
520
|
+
We do not take invalid keyword arguments and raise a value error
|
|
521
|
+
to better ensure uniqueness::
|
|
522
|
+
|
|
523
|
+
sage: GF.create_key_and_extra_args(9, 'a', foo='value')
|
|
524
|
+
Traceback (most recent call last):
|
|
525
|
+
...
|
|
526
|
+
TypeError: ...create_key_and_extra_args() got an unexpected keyword argument 'foo'
|
|
527
|
+
|
|
528
|
+
Moreover, ``repr`` and ``elem_cache`` are ignored when not
|
|
529
|
+
using givaro::
|
|
530
|
+
|
|
531
|
+
sage: GF.create_key_and_extra_args(16, 'a', impl='ntl', repr='poly') # needs sage.libs.ntl
|
|
532
|
+
((16, ('a',), x^4 + x + 1, 'ntl', 2, 4, True, None, None, None, True, True), {})
|
|
533
|
+
sage: GF.create_key_and_extra_args(16, 'a', impl='ntl', elem_cache=False) # needs sage.libs.ntl
|
|
534
|
+
((16, ('a',), x^4 + x + 1, 'ntl', 2, 4, True, None, None, None, True, True), {})
|
|
535
|
+
sage: GF(16, impl='ntl') is GF(16, impl='ntl', repr='foo') # needs sage.libs.ntl
|
|
536
|
+
True
|
|
537
|
+
|
|
538
|
+
We handle extra arguments for the givaro finite field and
|
|
539
|
+
create unique objects for their defaults::
|
|
540
|
+
|
|
541
|
+
sage: GF(25, impl='givaro') is GF(25, impl='givaro', repr='poly') # needs sage.libs.linbox
|
|
542
|
+
True
|
|
543
|
+
sage: GF(25, impl='givaro') is GF(25, impl='givaro', elem_cache=True) # needs sage.libs.linbox
|
|
544
|
+
True
|
|
545
|
+
sage: GF(625, impl='givaro') is GF(625, impl='givaro', elem_cache=False) # needs sage.libs.linbox
|
|
546
|
+
True
|
|
547
|
+
|
|
548
|
+
We explicitly take ``structure``, ``implementation`` and ``prec`` attributes
|
|
549
|
+
for compatibility with :class:`~sage.categories.pushout.AlgebraicExtensionFunctor`
|
|
550
|
+
but we ignore them as they are not used, see :issue:`21433`::
|
|
551
|
+
|
|
552
|
+
sage: GF.create_key_and_extra_args(9, 'a', structure=None) # needs sage.libs.linbox
|
|
553
|
+
((9, ('a',), x^2 + 2*x + 2, 'givaro', 3, 2, True, None, 'poly', True, True, True), {})
|
|
554
|
+
|
|
555
|
+
TESTS::
|
|
556
|
+
|
|
557
|
+
sage: GF((6, 1), 'a') # implicit doctest
|
|
558
|
+
Traceback (most recent call last):
|
|
559
|
+
...
|
|
560
|
+
ValueError: the order of a finite field must be a prime power
|
|
561
|
+
|
|
562
|
+
sage: GF((9, 1), 'a') # implicit doctest
|
|
563
|
+
Traceback (most recent call last):
|
|
564
|
+
...
|
|
565
|
+
ValueError: the order of a finite field must be a prime power
|
|
566
|
+
|
|
567
|
+
sage: GF((5, 0), 'a') # implicit doctest
|
|
568
|
+
Traceback (most recent call last):
|
|
569
|
+
...
|
|
570
|
+
ValueError: the order of a finite field must be a prime power
|
|
571
|
+
|
|
572
|
+
sage: GF((3, 2, 1), 'a') # implicit doctest
|
|
573
|
+
Traceback (most recent call last):
|
|
574
|
+
...
|
|
575
|
+
ValueError: wrong input for finite field constructor
|
|
576
|
+
"""
|
|
577
|
+
for key, val in kwds.items():
|
|
578
|
+
if key not in ['structure', 'implementation', 'prec', 'embedding', 'latex_names']:
|
|
579
|
+
raise TypeError("create_key_and_extra_args() got an unexpected keyword argument '%s'" % key)
|
|
580
|
+
if not (val is None or isinstance(val, list) and all(c is None for c in val)):
|
|
581
|
+
raise NotImplementedError("ring extension with prescribed %s is not implemented" % key)
|
|
582
|
+
|
|
583
|
+
from sage.structure.proof.all import WithProof, arithmetic
|
|
584
|
+
if proof is None:
|
|
585
|
+
proof = arithmetic()
|
|
586
|
+
with WithProof('arithmetic', proof):
|
|
587
|
+
if isinstance(order, tuple):
|
|
588
|
+
if len(order) != 2:
|
|
589
|
+
raise ValueError('wrong input for finite field constructor')
|
|
590
|
+
p, n = map(Integer, order)
|
|
591
|
+
if p < 2 or n < 1:
|
|
592
|
+
raise ValueError("the order of a finite field must be a prime power")
|
|
593
|
+
order = p**n
|
|
594
|
+
else:
|
|
595
|
+
order = Integer(order)
|
|
596
|
+
if order < 2:
|
|
597
|
+
raise ValueError("the order of a finite field must be at least 2")
|
|
598
|
+
p, n = order.perfect_power()
|
|
599
|
+
# at this point, order = p**n
|
|
600
|
+
# note that we haven't tested p for primality
|
|
601
|
+
|
|
602
|
+
if n == 1:
|
|
603
|
+
if impl is None:
|
|
604
|
+
impl = 'modn'
|
|
605
|
+
name = ('x',) # Ignore name
|
|
606
|
+
# Every polynomial of degree 1 is irreducible
|
|
607
|
+
check_irreducible = False
|
|
608
|
+
else:
|
|
609
|
+
if names is not None:
|
|
610
|
+
name = names
|
|
611
|
+
if name is None:
|
|
612
|
+
if prefix is None:
|
|
613
|
+
prefix = 'z'
|
|
614
|
+
name = prefix + str(n)
|
|
615
|
+
if modulus is not None:
|
|
616
|
+
raise ValueError("no modulus may be specified if variable name not given")
|
|
617
|
+
# Fpbar will have a strong reference, since algebraic_closure caches its results,
|
|
618
|
+
# and the coefficients of modulus lie in GF(p)
|
|
619
|
+
Fpbar = GF(p).algebraic_closure(prefix)
|
|
620
|
+
# This will give a Conway polynomial if p,n is small enough to be in the database
|
|
621
|
+
# and a pseudo-Conway polynomial if it's not.
|
|
622
|
+
modulus = Fpbar._get_polynomial(n)
|
|
623
|
+
check_irreducible = False
|
|
624
|
+
name = normalize_names(1, name)
|
|
625
|
+
|
|
626
|
+
if impl is None:
|
|
627
|
+
if order < zech_log_bound and FiniteField_givaro is not None:
|
|
628
|
+
impl = 'givaro'
|
|
629
|
+
elif p == 2 and FiniteField_ntl_gf2e is not None:
|
|
630
|
+
impl = 'ntl'
|
|
631
|
+
else:
|
|
632
|
+
impl = 'pari_ffelt'
|
|
633
|
+
|
|
634
|
+
# Determine modulus.
|
|
635
|
+
# For the 'modn' implementation, we use the following
|
|
636
|
+
# optimization which we also need to avoid an infinite loop:
|
|
637
|
+
# a modulus of None is a shorthand for x-1.
|
|
638
|
+
if modulus is not None or impl != 'modn':
|
|
639
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
640
|
+
R = PolynomialRing(FiniteField(p), 'x')
|
|
641
|
+
if modulus is None:
|
|
642
|
+
modulus = R.irreducible_element(n)
|
|
643
|
+
if isinstance(modulus, str):
|
|
644
|
+
# A string specifies an algorithm to find a suitable modulus.
|
|
645
|
+
if modulus != "random" and modulus in self._modulus_cache[order]:
|
|
646
|
+
modulus = self._modulus_cache[order][modulus]
|
|
647
|
+
else:
|
|
648
|
+
self._modulus_cache[order][modulus] = modulus = R.irreducible_element(n, algorithm=modulus)
|
|
649
|
+
else:
|
|
650
|
+
if isinstance(modulus, Polynomial):
|
|
651
|
+
modulus = modulus.change_variable_name('x')
|
|
652
|
+
modulus = R(modulus).monic()
|
|
653
|
+
|
|
654
|
+
if modulus.degree() != n:
|
|
655
|
+
raise ValueError("the degree of the modulus does not equal the degree of the field")
|
|
656
|
+
# If modulus is x - 1 for impl="modn", set it to None
|
|
657
|
+
if impl == 'modn' and modulus.list() == [-1,1]:
|
|
658
|
+
modulus = None
|
|
659
|
+
if modulus is None:
|
|
660
|
+
check_irreducible = False
|
|
661
|
+
|
|
662
|
+
# Check extra arguments for givaro and setup their defaults
|
|
663
|
+
# TODO: ntl takes a repr, but ignores it
|
|
664
|
+
if impl == 'givaro':
|
|
665
|
+
if repr is None:
|
|
666
|
+
repr = 'poly'
|
|
667
|
+
if elem_cache is None:
|
|
668
|
+
elem_cache = (order < 500)
|
|
669
|
+
else:
|
|
670
|
+
# This has the effect of ignoring these keywords
|
|
671
|
+
repr = None
|
|
672
|
+
elem_cache = None
|
|
673
|
+
|
|
674
|
+
return (order, name, modulus, impl, p, n, proof, prefix, repr, elem_cache, check_prime, check_irreducible), {}
|
|
675
|
+
|
|
676
|
+
def create_object(self, version, key, **kwds):
|
|
677
|
+
"""
|
|
678
|
+
EXAMPLES::
|
|
679
|
+
|
|
680
|
+
sage: K = GF(19) # indirect doctest
|
|
681
|
+
sage: TestSuite(K).run()
|
|
682
|
+
|
|
683
|
+
We try to create finite fields with various implementations::
|
|
684
|
+
|
|
685
|
+
sage: k = GF(2, impl='modn')
|
|
686
|
+
sage: k = GF(2, impl='givaro') # needs sage.libs.linbox
|
|
687
|
+
sage: k = GF(2, impl='ntl') # needs sage.libs.ntl
|
|
688
|
+
sage: k = GF(2, impl='pari')
|
|
689
|
+
Traceback (most recent call last):
|
|
690
|
+
...
|
|
691
|
+
ValueError: the degree must be at least 2
|
|
692
|
+
sage: k = GF(2, impl='supercalifragilisticexpialidocious')
|
|
693
|
+
Traceback (most recent call last):
|
|
694
|
+
...
|
|
695
|
+
ValueError: no such finite field implementation: 'supercalifragilisticexpialidocious'
|
|
696
|
+
sage: k.<a> = GF(2^15, impl='modn')
|
|
697
|
+
Traceback (most recent call last):
|
|
698
|
+
...
|
|
699
|
+
ValueError: the 'modn' implementation requires a prime order
|
|
700
|
+
sage: k.<a> = GF(2^15, impl='givaro') # needs sage.libs.linbox
|
|
701
|
+
sage: k.<a> = GF(2^15, impl='ntl') # needs sage.libs.ntl
|
|
702
|
+
sage: k.<a> = GF(2^15, impl='pari')
|
|
703
|
+
sage: k.<a> = GF(3^60, impl='modn')
|
|
704
|
+
Traceback (most recent call last):
|
|
705
|
+
...
|
|
706
|
+
ValueError: the 'modn' implementation requires a prime order
|
|
707
|
+
sage: k.<a> = GF(3^60, impl='givaro') # needs sage.libs.linbox
|
|
708
|
+
Traceback (most recent call last):
|
|
709
|
+
...
|
|
710
|
+
ValueError: q must be < 2^16
|
|
711
|
+
sage: k.<a> = GF(3^60, impl='ntl') # needs sage.libs.ntl
|
|
712
|
+
Traceback (most recent call last):
|
|
713
|
+
...
|
|
714
|
+
ValueError: q must be a 2-power
|
|
715
|
+
sage: k.<a> = GF(3^60, impl='pari')
|
|
716
|
+
"""
|
|
717
|
+
# IMPORTANT! If you add a new class to the list of classes
|
|
718
|
+
# that get cached by this factor object, then you *must* add
|
|
719
|
+
# the following method to that class in order to fully support
|
|
720
|
+
# pickling:
|
|
721
|
+
#
|
|
722
|
+
# def __reduce__(self): # and include good doctests, please!
|
|
723
|
+
# return self._factory_data[0].reduce_data(self)
|
|
724
|
+
#
|
|
725
|
+
# This is not in the base class for finite fields, since some finite
|
|
726
|
+
# fields need not be created using this factory object, e.g., residue
|
|
727
|
+
# class fields.
|
|
728
|
+
|
|
729
|
+
if len(key) == 5:
|
|
730
|
+
# for backward compatibility of pickles (see trac 10975).
|
|
731
|
+
order, name, modulus, impl, _ = key
|
|
732
|
+
p, n = Integer(order).factor()[0]
|
|
733
|
+
proof = True
|
|
734
|
+
prefix = kwds.get('prefix', None)
|
|
735
|
+
# We can set the defaults here to be those for givaro
|
|
736
|
+
# as they are otherwise ignored
|
|
737
|
+
repr = 'poly'
|
|
738
|
+
elem_cache = (order < 500)
|
|
739
|
+
check_prime = check_irreducible = False
|
|
740
|
+
elif len(key) == 8:
|
|
741
|
+
# For backward compatibility of pickles (see trac #21433)
|
|
742
|
+
order, name, modulus, impl, _, p, n, proof = key
|
|
743
|
+
prefix = kwds.get('prefix', None)
|
|
744
|
+
# We can set the defaults here to be those for givaro
|
|
745
|
+
# as they are otherwise ignored
|
|
746
|
+
repr = kwds.get('repr', 'poly')
|
|
747
|
+
elem_cache = kwds.get('elem_cache', (order < 500))
|
|
748
|
+
check_prime = check_irreducible = False
|
|
749
|
+
elif len(key) == 10:
|
|
750
|
+
order, name, modulus, impl, p, n, proof, prefix, repr, elem_cache = key
|
|
751
|
+
check_prime = check_irreducible = False
|
|
752
|
+
else:
|
|
753
|
+
order, name, modulus, impl, p, n, proof, prefix, repr, elem_cache, check_prime, check_irreducible = key
|
|
754
|
+
|
|
755
|
+
from sage.structure.proof.all import WithProof
|
|
756
|
+
with WithProof('arithmetic', proof):
|
|
757
|
+
if check_prime and not p.is_prime():
|
|
758
|
+
raise ValueError("the order of a finite field must be a prime power")
|
|
759
|
+
if check_irreducible and not modulus.is_irreducible():
|
|
760
|
+
raise ValueError("finite field modulus must be irreducible but it is not")
|
|
761
|
+
|
|
762
|
+
if impl == 'modn':
|
|
763
|
+
if n != 1:
|
|
764
|
+
raise ValueError("the 'modn' implementation requires a prime order")
|
|
765
|
+
from .finite_field_prime_modn import FiniteField_prime_modn
|
|
766
|
+
# Using a check option here is probably a worthwhile
|
|
767
|
+
# compromise since this constructor is simple and used a
|
|
768
|
+
# huge amount.
|
|
769
|
+
K = FiniteField_prime_modn(order, check=False, modulus=modulus)
|
|
770
|
+
else:
|
|
771
|
+
# We have to do this with block so that the finite field
|
|
772
|
+
# constructors below will use the proof flag that was
|
|
773
|
+
# passed in when checking for primality, factoring, etc.
|
|
774
|
+
# Otherwise, we would have to complicate all of their
|
|
775
|
+
# constructors with check options.
|
|
776
|
+
with WithProof('arithmetic', proof):
|
|
777
|
+
if impl == 'givaro':
|
|
778
|
+
K = FiniteField_givaro(order, name, modulus, repr, elem_cache)
|
|
779
|
+
elif impl == 'ntl':
|
|
780
|
+
K = FiniteField_ntl_gf2e(order, name, modulus)
|
|
781
|
+
elif impl == 'pari_ffelt' or impl == 'pari':
|
|
782
|
+
from .finite_field_pari_ffelt import FiniteField_pari_ffelt
|
|
783
|
+
K = FiniteField_pari_ffelt(p, modulus, name)
|
|
784
|
+
else:
|
|
785
|
+
raise ValueError("no such finite field implementation: %r" % impl)
|
|
786
|
+
|
|
787
|
+
# Temporary; see create_key_and_extra_args() above.
|
|
788
|
+
if prefix is not None:
|
|
789
|
+
K._prefix = prefix
|
|
790
|
+
|
|
791
|
+
return K
|
|
792
|
+
|
|
793
|
+
|
|
794
|
+
GF = FiniteField = FiniteFieldFactory("FiniteField")
|
|
795
|
+
|
|
796
|
+
|
|
797
|
+
def is_PrimeFiniteField(x):
|
|
798
|
+
"""
|
|
799
|
+
Return ``True`` if ``x`` is a prime finite field.
|
|
800
|
+
|
|
801
|
+
This function is deprecated.
|
|
802
|
+
|
|
803
|
+
EXAMPLES::
|
|
804
|
+
|
|
805
|
+
sage: from sage.rings.finite_rings.finite_field_constructor import is_PrimeFiniteField
|
|
806
|
+
sage: is_PrimeFiniteField(QQ)
|
|
807
|
+
doctest:...: DeprecationWarning: the function is_PrimeFiniteField is deprecated; use isinstance(x, sage.rings.finite_rings.finite_field_base.FiniteField) and x.is_prime_field() instead
|
|
808
|
+
See https://github.com/sagemath/sage/issues/32664 for details.
|
|
809
|
+
False
|
|
810
|
+
sage: is_PrimeFiniteField(GF(7))
|
|
811
|
+
True
|
|
812
|
+
sage: is_PrimeFiniteField(GF(7^2, 'a'))
|
|
813
|
+
False
|
|
814
|
+
sage: is_PrimeFiniteField(GF(next_prime(10^90, proof=False)))
|
|
815
|
+
True
|
|
816
|
+
"""
|
|
817
|
+
from sage.misc.superseded import deprecation
|
|
818
|
+
deprecation(32664, "the function is_PrimeFiniteField is deprecated; use isinstance(x, sage.rings.finite_rings.finite_field_base.FiniteField) and x.is_prime_field() instead")
|
|
819
|
+
|
|
820
|
+
from .finite_field_prime_modn import FiniteField_prime_modn
|
|
821
|
+
from sage.rings.finite_rings.finite_field_base import FiniteField as FiniteField_generic
|
|
822
|
+
|
|
823
|
+
return isinstance(x, FiniteField_prime_modn) or \
|
|
824
|
+
(isinstance(x, FiniteField_generic) and x.degree() == 1)
|
|
825
|
+
|
|
826
|
+
|
|
827
|
+
zech_log_bound = 2**16
|